@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.
- package/README.md +5 -3
- package/dist/buyer-identities/store.d.ts +39 -2
- package/dist/buyer-identities/store.d.ts.map +1 -1
- package/dist/buyer-identities/store.js +99 -10
- package/dist/buyer-identities/store.js.map +1 -1
- package/dist/cli/commands/apps/index.js +8 -8
- package/dist/cli/commands/buyer/identity.d.ts +3 -1
- package/dist/cli/commands/buyer/identity.d.ts.map +1 -1
- package/dist/cli/commands/buyer/identity.js +55 -8
- package/dist/cli/commands/buyer/identity.js.map +1 -1
- package/dist/cli/commands/buyer/identity.test.d.ts +2 -0
- package/dist/cli/commands/buyer/identity.test.d.ts.map +1 -0
- package/dist/cli/commands/buyer/identity.test.js +168 -0
- package/dist/cli/commands/buyer/identity.test.js.map +1 -0
- package/dist/cli/commands/buyer/set-authorized-wallet.d.ts +10 -0
- package/dist/cli/commands/buyer/set-authorized-wallet.d.ts.map +1 -1
- package/dist/cli/commands/buyer/set-authorized-wallet.js +26 -4
- package/dist/cli/commands/buyer/set-authorized-wallet.js.map +1 -1
- package/dist/cli/commands/buyer/set-authorized-wallet.test.js +37 -2
- package/dist/cli/commands/buyer/set-authorized-wallet.test.js.map +1 -1
- package/dist/cli/commands/buyer/start.d.ts +15 -0
- package/dist/cli/commands/buyer/start.d.ts.map +1 -1
- package/dist/cli/commands/buyer/start.js +158 -49
- package/dist/cli/commands/buyer/start.js.map +1 -1
- package/dist/cli/commands/buyer/start.test.js +16 -1
- package/dist/cli/commands/buyer/start.test.js.map +1 -1
- package/dist/cli/commands/chat.d.ts +3 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +189 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/gateway/activity.d.ts +15 -0
- package/dist/cli/commands/gateway/activity.d.ts.map +1 -0
- package/dist/cli/commands/gateway/activity.js +233 -0
- package/dist/cli/commands/gateway/activity.js.map +1 -0
- package/dist/cli/commands/gateway/admin-token.d.ts +3 -0
- package/dist/cli/commands/gateway/admin-token.d.ts.map +1 -0
- package/dist/cli/commands/gateway/admin-token.js +90 -0
- package/dist/cli/commands/gateway/admin-token.js.map +1 -0
- package/dist/cli/commands/gateway/console-link.d.ts +20 -0
- package/dist/cli/commands/gateway/console-link.d.ts.map +1 -0
- package/dist/cli/commands/gateway/console-link.js +92 -0
- package/dist/cli/commands/gateway/console-link.js.map +1 -0
- package/dist/cli/commands/gateway/gateway-commands.test.d.ts +2 -0
- package/dist/cli/commands/gateway/gateway-commands.test.d.ts.map +1 -0
- package/dist/cli/commands/gateway/gateway-commands.test.js +230 -0
- package/dist/cli/commands/gateway/gateway-commands.test.js.map +1 -0
- package/dist/cli/commands/gateway/gateway-console-commands.test.d.ts +2 -0
- package/dist/cli/commands/gateway/gateway-console-commands.test.d.ts.map +1 -0
- package/dist/cli/commands/gateway/gateway-console-commands.test.js +373 -0
- package/dist/cli/commands/gateway/gateway-console-commands.test.js.map +1 -0
- package/dist/cli/commands/gateway/index.d.ts +8 -0
- package/dist/cli/commands/gateway/index.d.ts.map +1 -1
- package/dist/cli/commands/gateway/index.js +93 -14
- package/dist/cli/commands/gateway/index.js.map +1 -1
- package/dist/cli/commands/gateway/key.d.ts +4 -0
- package/dist/cli/commands/gateway/key.d.ts.map +1 -1
- package/dist/cli/commands/gateway/key.js +297 -182
- package/dist/cli/commands/gateway/key.js.map +1 -1
- package/dist/cli/commands/gateway/member.d.ts +3 -0
- package/dist/cli/commands/gateway/member.d.ts.map +1 -0
- package/dist/cli/commands/gateway/member.js +302 -0
- package/dist/cli/commands/gateway/member.js.map +1 -0
- package/dist/cli/commands/gateway/migrate.d.ts +18 -0
- package/dist/cli/commands/gateway/migrate.d.ts.map +1 -0
- package/dist/cli/commands/gateway/migrate.js +158 -0
- package/dist/cli/commands/gateway/migrate.js.map +1 -0
- package/dist/cli/commands/gateway/operator.d.ts +11 -0
- package/dist/cli/commands/gateway/operator.d.ts.map +1 -0
- package/dist/cli/commands/gateway/operator.js +199 -0
- package/dist/cli/commands/gateway/operator.js.map +1 -0
- package/dist/cli/commands/gateway/operator.test.d.ts +2 -0
- package/dist/cli/commands/gateway/operator.test.d.ts.map +1 -0
- package/dist/cli/commands/gateway/operator.test.js +151 -0
- package/dist/cli/commands/gateway/operator.test.js.map +1 -0
- package/dist/cli/commands/gateway/peer-list.d.ts +3 -0
- package/dist/cli/commands/gateway/peer-list.d.ts.map +1 -0
- package/dist/cli/commands/gateway/peer-list.js +107 -0
- package/dist/cli/commands/gateway/peer-list.js.map +1 -0
- package/dist/cli/commands/gateway/policy-options.d.ts +23 -0
- package/dist/cli/commands/gateway/policy-options.d.ts.map +1 -0
- package/dist/cli/commands/gateway/policy-options.js +156 -0
- package/dist/cli/commands/gateway/policy-options.js.map +1 -0
- package/dist/cli/commands/gateway/preset.d.ts +3 -0
- package/dist/cli/commands/gateway/preset.d.ts.map +1 -0
- package/dist/cli/commands/gateway/preset.js +181 -0
- package/dist/cli/commands/gateway/preset.js.map +1 -0
- package/dist/cli/commands/gateway/routing.d.ts +3 -0
- package/dist/cli/commands/gateway/routing.d.ts.map +1 -0
- package/dist/cli/commands/gateway/routing.js +110 -0
- package/dist/cli/commands/gateway/routing.js.map +1 -0
- package/dist/cli/commands/gateway/settings.d.ts +4 -0
- package/dist/cli/commands/gateway/settings.d.ts.map +1 -0
- package/dist/cli/commands/gateway/settings.js +314 -0
- package/dist/cli/commands/gateway/settings.js.map +1 -0
- package/dist/cli/commands/gateway/shared.d.ts +55 -6
- package/dist/cli/commands/gateway/shared.d.ts.map +1 -1
- package/dist/cli/commands/gateway/shared.js +206 -26
- package/dist/cli/commands/gateway/shared.js.map +1 -1
- package/dist/cli/commands/gateway/workspace.d.ts +3 -0
- package/dist/cli/commands/gateway/workspace.d.ts.map +1 -0
- package/dist/cli/commands/gateway/workspace.js +250 -0
- package/dist/cli/commands/gateway/workspace.js.map +1 -0
- package/dist/cli/commands/network/bootstrap.js +1 -1
- package/dist/cli/commands/seller/setup.js +1 -1
- package/dist/cli/commands/seller/start.d.ts.map +1 -1
- package/dist/cli/commands/seller/start.js +1 -2
- package/dist/cli/commands/seller/start.js.map +1 -1
- package/dist/cli/commands/system-proxy/index.js +1 -1
- package/dist/cli/commands/tunnel/start.d.ts.map +1 -1
- package/dist/cli/commands/tunnel/start.js +23 -5
- package/dist/cli/commands/tunnel/start.js.map +1 -1
- package/dist/cli/commands/wrapped-tools.js +8 -8
- package/dist/cli/commands/wrapped-tools.test.js +5 -5
- package/dist/cli/index.js +12 -44
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/program.d.ts +4 -0
- package/dist/cli/program.d.ts.map +1 -0
- package/dist/cli/program.js +49 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/program.test.d.ts +2 -0
- package/dist/cli/program.test.d.ts.map +1 -0
- package/dist/cli/program.test.js +38 -0
- package/dist/cli/program.test.js.map +1 -0
- package/dist/cli/prompt-hidden.d.ts +3 -0
- package/dist/cli/prompt-hidden.d.ts.map +1 -0
- package/dist/cli/prompt-hidden.js +38 -0
- package/dist/cli/prompt-hidden.js.map +1 -0
- package/dist/cli/wallet-passphrase.d.ts +48 -0
- package/dist/cli/wallet-passphrase.d.ts.map +1 -0
- package/dist/cli/wallet-passphrase.js +119 -0
- package/dist/cli/wallet-passphrase.js.map +1 -0
- package/dist/cli/wallet-passphrase.test.d.ts +2 -0
- package/dist/cli/wallet-passphrase.test.d.ts.map +1 -0
- package/dist/cli/wallet-passphrase.test.js +79 -0
- package/dist/cli/wallet-passphrase.test.js.map +1 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +0 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/effective.d.ts +12 -0
- package/dist/config/effective.d.ts.map +1 -1
- package/dist/config/effective.js +39 -6
- package/dist/config/effective.js.map +1 -1
- package/dist/config/effective.test.js +9 -1
- package/dist/config/effective.test.js.map +1 -1
- package/dist/config/loader.d.ts +6 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +12 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/loader.test.js +7 -1
- package/dist/config/loader.test.js.map +1 -1
- package/dist/config/types.d.ts +14 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +19 -0
- package/dist/config/validation.js.map +1 -1
- package/dist/gateway/accounting.d.ts +33 -3
- package/dist/gateway/accounting.d.ts.map +1 -1
- package/dist/gateway/accounting.js +86 -7
- package/dist/gateway/accounting.js.map +1 -1
- package/dist/gateway/admission-benchmark.test.d.ts +2 -0
- package/dist/gateway/admission-benchmark.test.d.ts.map +1 -0
- package/dist/gateway/admission-benchmark.test.js +75 -0
- package/dist/gateway/admission-benchmark.test.js.map +1 -0
- package/dist/gateway/auth/auth.test.d.ts +4 -0
- package/dist/gateway/auth/auth.test.d.ts.map +1 -0
- package/dist/gateway/auth/auth.test.js +337 -0
- package/dist/gateway/auth/auth.test.js.map +1 -0
- package/dist/gateway/auth/credentials.test.d.ts +2 -0
- package/dist/gateway/auth/credentials.test.d.ts.map +1 -0
- package/dist/gateway/auth/credentials.test.js +132 -0
- package/dist/gateway/auth/credentials.test.js.map +1 -0
- package/dist/gateway/auth/db.d.ts +156 -0
- package/dist/gateway/auth/db.d.ts.map +1 -0
- package/dist/gateway/auth/db.js +390 -0
- package/dist/gateway/auth/db.js.map +1 -0
- package/dist/gateway/auth/hardening.test.d.ts +2 -0
- package/dist/gateway/auth/hardening.test.d.ts.map +1 -0
- package/dist/gateway/auth/hardening.test.js +155 -0
- package/dist/gateway/auth/hardening.test.js.map +1 -0
- package/dist/gateway/auth/http.d.ts +53 -0
- package/dist/gateway/auth/http.d.ts.map +1 -0
- package/dist/gateway/auth/http.js +165 -0
- package/dist/gateway/auth/http.js.map +1 -0
- package/dist/gateway/auth/index.d.ts +26 -0
- package/dist/gateway/auth/index.d.ts.map +1 -0
- package/dist/gateway/auth/index.js +1014 -0
- package/dist/gateway/auth/index.js.map +1 -0
- package/dist/gateway/auth/oidc.d.ts +57 -0
- package/dist/gateway/auth/oidc.d.ts.map +1 -0
- package/dist/gateway/auth/oidc.js +159 -0
- package/dist/gateway/auth/oidc.js.map +1 -0
- package/dist/gateway/auth/oidc.test.d.ts +2 -0
- package/dist/gateway/auth/oidc.test.d.ts.map +1 -0
- package/dist/gateway/auth/oidc.test.js +223 -0
- package/dist/gateway/auth/oidc.test.js.map +1 -0
- package/dist/gateway/auth/reauth.test.d.ts +2 -0
- package/dist/gateway/auth/reauth.test.d.ts.map +1 -0
- package/dist/gateway/auth/reauth.test.js +108 -0
- package/dist/gateway/auth/reauth.test.js.map +1 -0
- package/dist/gateway/auth/store-integration.test.d.ts +2 -0
- package/dist/gateway/auth/store-integration.test.d.ts.map +1 -0
- package/dist/gateway/auth/store-integration.test.js +100 -0
- package/dist/gateway/auth/store-integration.test.js.map +1 -0
- package/dist/gateway/auth/test-helpers.d.ts +167 -0
- package/dist/gateway/auth/test-helpers.d.ts.map +1 -0
- package/dist/gateway/auth/test-helpers.js +368 -0
- package/dist/gateway/auth/test-helpers.js.map +1 -0
- package/dist/gateway/auth/types.d.ts +145 -0
- package/dist/gateway/auth/types.d.ts.map +1 -0
- package/dist/gateway/auth/types.js +2 -0
- package/dist/gateway/auth/types.js.map +1 -0
- package/dist/gateway/auth/wallet.d.ts +15 -0
- package/dist/gateway/auth/wallet.d.ts.map +1 -0
- package/dist/gateway/auth/wallet.js +43 -0
- package/dist/gateway/auth/wallet.js.map +1 -0
- package/dist/gateway/bundle.d.ts +127 -0
- package/dist/gateway/bundle.d.ts.map +1 -0
- package/dist/gateway/bundle.js +604 -0
- package/dist/gateway/bundle.js.map +1 -0
- package/dist/gateway/bundle.test.d.ts +2 -0
- package/dist/gateway/bundle.test.d.ts.map +1 -0
- package/dist/gateway/bundle.test.js +277 -0
- package/dist/gateway/bundle.test.js.map +1 -0
- package/dist/gateway/buyer-control.d.ts +33 -0
- package/dist/gateway/buyer-control.d.ts.map +1 -0
- package/dist/gateway/buyer-control.js +93 -0
- package/dist/gateway/buyer-control.js.map +1 -0
- package/dist/gateway/buyer-policy-probe.d.ts +41 -0
- package/dist/gateway/buyer-policy-probe.d.ts.map +1 -0
- package/dist/gateway/buyer-policy-probe.js +99 -0
- package/dist/gateway/buyer-policy-probe.js.map +1 -0
- package/dist/gateway/buyer-policy-probe.test.d.ts +2 -0
- package/dist/gateway/buyer-policy-probe.test.d.ts.map +1 -0
- package/dist/gateway/buyer-policy-probe.test.js +128 -0
- package/dist/gateway/buyer-policy-probe.test.js.map +1 -0
- package/dist/gateway/buyer-process.d.ts +30 -0
- package/dist/gateway/buyer-process.d.ts.map +1 -0
- package/dist/gateway/buyer-process.js +101 -0
- package/dist/gateway/buyer-process.js.map +1 -0
- package/dist/gateway/buyer-process.test.d.ts +2 -0
- package/dist/gateway/buyer-process.test.d.ts.map +1 -0
- package/dist/gateway/buyer-process.test.js +112 -0
- package/dist/gateway/buyer-process.test.js.map +1 -0
- package/dist/gateway/chat/routes.d.ts +45 -0
- package/dist/gateway/chat/routes.d.ts.map +1 -0
- package/dist/gateway/chat/routes.js +439 -0
- package/dist/gateway/chat/routes.js.map +1 -0
- package/dist/gateway/chat/routes.test.d.ts +2 -0
- package/dist/gateway/chat/routes.test.d.ts.map +1 -0
- package/dist/gateway/chat/routes.test.js +304 -0
- package/dist/gateway/chat/routes.test.js.map +1 -0
- package/dist/gateway/chat/tools.d.ts +35 -0
- package/dist/gateway/chat/tools.d.ts.map +1 -0
- package/dist/gateway/chat/tools.js +347 -0
- package/dist/gateway/chat/tools.js.map +1 -0
- package/dist/gateway/chat/tools.test.d.ts +2 -0
- package/dist/gateway/chat/tools.test.d.ts.map +1 -0
- package/dist/gateway/chat/tools.test.js +136 -0
- package/dist/gateway/chat/tools.test.js.map +1 -0
- package/dist/gateway/console-api/access.d.ts +52 -0
- package/dist/gateway/console-api/access.d.ts.map +1 -0
- package/dist/gateway/console-api/access.js +171 -0
- package/dist/gateway/console-api/access.js.map +1 -0
- package/dist/gateway/console-api/deps.d.ts +52 -0
- package/dist/gateway/console-api/deps.d.ts.map +1 -0
- package/dist/gateway/console-api/deps.js +2 -0
- package/dist/gateway/console-api/deps.js.map +1 -0
- package/dist/gateway/console-api/handlers/admin-tokens.d.ts +8 -0
- package/dist/gateway/console-api/handlers/admin-tokens.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/admin-tokens.js +48 -0
- package/dist/gateway/console-api/handlers/admin-tokens.js.map +1 -0
- package/dist/gateway/console-api/handlers/audit.d.ts +8 -0
- package/dist/gateway/console-api/handlers/audit.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/audit.js +19 -0
- package/dist/gateway/console-api/handlers/audit.js.map +1 -0
- package/dist/gateway/console-api/handlers/audit.test.d.ts +2 -0
- package/dist/gateway/console-api/handlers/audit.test.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/audit.test.js +241 -0
- package/dist/gateway/console-api/handlers/audit.test.js.map +1 -0
- package/dist/gateway/console-api/handlers/data-settings.test.d.ts +2 -0
- package/dist/gateway/console-api/handlers/data-settings.test.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/data-settings.test.js +264 -0
- package/dist/gateway/console-api/handlers/data-settings.test.js.map +1 -0
- package/dist/gateway/console-api/handlers/index.d.ts +4 -0
- package/dist/gateway/console-api/handlers/index.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/index.js +24 -0
- package/dist/gateway/console-api/handlers/index.js.map +1 -0
- package/dist/gateway/console-api/handlers/keys.d.ts +13 -0
- package/dist/gateway/console-api/handlers/keys.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/keys.js +128 -0
- package/dist/gateway/console-api/handlers/keys.js.map +1 -0
- package/dist/gateway/console-api/handlers/keys.test.d.ts +2 -0
- package/dist/gateway/console-api/handlers/keys.test.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/keys.test.js +166 -0
- package/dist/gateway/console-api/handlers/keys.test.js.map +1 -0
- package/dist/gateway/console-api/handlers/network-buyer.d.ts +22 -0
- package/dist/gateway/console-api/handlers/network-buyer.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/network-buyer.js +39 -0
- package/dist/gateway/console-api/handlers/network-buyer.js.map +1 -0
- package/dist/gateway/console-api/handlers/network-mapping.d.ts +33 -0
- package/dist/gateway/console-api/handlers/network-mapping.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/network-mapping.js +219 -0
- package/dist/gateway/console-api/handlers/network-mapping.js.map +1 -0
- package/dist/gateway/console-api/handlers/network-test-helpers.d.ts +35 -0
- package/dist/gateway/console-api/handlers/network-test-helpers.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/network-test-helpers.js +121 -0
- package/dist/gateway/console-api/handlers/network-test-helpers.js.map +1 -0
- package/dist/gateway/console-api/handlers/network.d.ts +15 -0
- package/dist/gateway/console-api/handlers/network.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/network.js +57 -0
- package/dist/gateway/console-api/handlers/network.js.map +1 -0
- package/dist/gateway/console-api/handlers/network.test.d.ts +2 -0
- package/dist/gateway/console-api/handlers/network.test.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/network.test.js +383 -0
- package/dist/gateway/console-api/handlers/network.test.js.map +1 -0
- package/dist/gateway/console-api/handlers/org.d.ts +10 -0
- package/dist/gateway/console-api/handlers/org.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/org.js +150 -0
- package/dist/gateway/console-api/handlers/org.js.map +1 -0
- package/dist/gateway/console-api/handlers/peer-lists.d.ts +5 -0
- package/dist/gateway/console-api/handlers/peer-lists.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/peer-lists.js +43 -0
- package/dist/gateway/console-api/handlers/peer-lists.js.map +1 -0
- package/dist/gateway/console-api/handlers/presets.d.ts +9 -0
- package/dist/gateway/console-api/handlers/presets.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/presets.js +79 -0
- package/dist/gateway/console-api/handlers/presets.js.map +1 -0
- package/dist/gateway/console-api/handlers/routing.d.ts +5 -0
- package/dist/gateway/console-api/handlers/routing.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/routing.js +20 -0
- package/dist/gateway/console-api/handlers/routing.js.map +1 -0
- package/dist/gateway/console-api/handlers/settings.d.ts +10 -0
- package/dist/gateway/console-api/handlers/settings.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/settings.js +38 -0
- package/dist/gateway/console-api/handlers/settings.js.map +1 -0
- package/dist/gateway/console-api/handlers/status.d.ts +9 -0
- package/dist/gateway/console-api/handlers/status.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/status.js +47 -0
- package/dist/gateway/console-api/handlers/status.js.map +1 -0
- package/dist/gateway/console-api/handlers/status.test.d.ts +2 -0
- package/dist/gateway/console-api/handlers/status.test.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/status.test.js +82 -0
- package/dist/gateway/console-api/handlers/status.test.js.map +1 -0
- package/dist/gateway/console-api/handlers/usage.d.ts +10 -0
- package/dist/gateway/console-api/handlers/usage.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/usage.js +68 -0
- package/dist/gateway/console-api/handlers/usage.js.map +1 -0
- package/dist/gateway/console-api/handlers/wallet-card-link.d.ts +29 -0
- package/dist/gateway/console-api/handlers/wallet-card-link.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/wallet-card-link.js +46 -0
- package/dist/gateway/console-api/handlers/wallet-card-link.js.map +1 -0
- package/dist/gateway/console-api/handlers/wallet-chain.d.ts +26 -0
- package/dist/gateway/console-api/handlers/wallet-chain.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/wallet-chain.js +80 -0
- package/dist/gateway/console-api/handlers/wallet-chain.js.map +1 -0
- package/dist/gateway/console-api/handlers/wallet-mapping.d.ts +45 -0
- package/dist/gateway/console-api/handlers/wallet-mapping.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/wallet-mapping.js +202 -0
- package/dist/gateway/console-api/handlers/wallet-mapping.js.map +1 -0
- package/dist/gateway/console-api/handlers/wallet-operator.d.ts +41 -0
- package/dist/gateway/console-api/handlers/wallet-operator.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/wallet-operator.js +198 -0
- package/dist/gateway/console-api/handlers/wallet-operator.js.map +1 -0
- package/dist/gateway/console-api/handlers/wallet-operator.test.d.ts +2 -0
- package/dist/gateway/console-api/handlers/wallet-operator.test.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/wallet-operator.test.js +195 -0
- package/dist/gateway/console-api/handlers/wallet-operator.test.js.map +1 -0
- package/dist/gateway/console-api/handlers/wallet.d.ts +61 -0
- package/dist/gateway/console-api/handlers/wallet.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/wallet.js +221 -0
- package/dist/gateway/console-api/handlers/wallet.js.map +1 -0
- package/dist/gateway/console-api/handlers/wallet.test.d.ts +2 -0
- package/dist/gateway/console-api/handlers/wallet.test.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/wallet.test.js +581 -0
- package/dist/gateway/console-api/handlers/wallet.test.js.map +1 -0
- package/dist/gateway/console-api/handlers/workspaces.d.ts +12 -0
- package/dist/gateway/console-api/handlers/workspaces.d.ts.map +1 -0
- package/dist/gateway/console-api/handlers/workspaces.js +96 -0
- package/dist/gateway/console-api/handlers/workspaces.js.map +1 -0
- package/dist/gateway/console-api/operator-types.d.ts +68 -0
- package/dist/gateway/console-api/operator-types.d.ts.map +1 -0
- package/dist/gateway/console-api/operator-types.js +21 -0
- package/dist/gateway/console-api/operator-types.js.map +1 -0
- package/dist/gateway/console-api/router.d.ts +97 -0
- package/dist/gateway/console-api/router.d.ts.map +1 -0
- package/dist/gateway/console-api/router.js +69 -0
- package/dist/gateway/console-api/router.js.map +1 -0
- package/dist/gateway/console-api/routes.test.d.ts +2 -0
- package/dist/gateway/console-api/routes.test.d.ts.map +1 -0
- package/dist/gateway/console-api/routes.test.js +331 -0
- package/dist/gateway/console-api/routes.test.js.map +1 -0
- package/dist/gateway/console-api/serialize.d.ts +33 -0
- package/dist/gateway/console-api/serialize.d.ts.map +1 -0
- package/dist/gateway/console-api/serialize.js +179 -0
- package/dist/gateway/console-api/serialize.js.map +1 -0
- package/dist/gateway/console-api/server.d.ts +38 -0
- package/dist/gateway/console-api/server.d.ts.map +1 -0
- package/dist/gateway/console-api/server.js +308 -0
- package/dist/gateway/console-api/server.js.map +1 -0
- package/dist/gateway/console-api/server.test.d.ts +2 -0
- package/dist/gateway/console-api/server.test.d.ts.map +1 -0
- package/dist/gateway/console-api/server.test.js +149 -0
- package/dist/gateway/console-api/server.test.js.map +1 -0
- package/dist/gateway/console-api/test-support.d.ts +59 -0
- package/dist/gateway/console-api/test-support.d.ts.map +1 -0
- package/dist/gateway/console-api/test-support.js +120 -0
- package/dist/gateway/console-api/test-support.js.map +1 -0
- package/dist/gateway/console-api/types.d.ts +779 -0
- package/dist/gateway/console-api/types.d.ts.map +1 -0
- package/dist/gateway/console-api/types.js +6 -0
- package/dist/gateway/console-api/types.js.map +1 -0
- package/dist/gateway/console-location.d.ts +21 -0
- package/dist/gateway/console-location.d.ts.map +1 -0
- package/dist/gateway/console-location.js +41 -0
- package/dist/gateway/console-location.js.map +1 -0
- package/dist/gateway/console-recovery.d.ts +34 -0
- package/dist/gateway/console-recovery.d.ts.map +1 -0
- package/dist/gateway/console-recovery.js +94 -0
- package/dist/gateway/console-recovery.js.map +1 -0
- package/dist/gateway/console-recovery.test.d.ts +2 -0
- package/dist/gateway/console-recovery.test.d.ts.map +1 -0
- package/dist/gateway/console-recovery.test.js +106 -0
- package/dist/gateway/console-recovery.test.js.map +1 -0
- package/dist/gateway/console.d.ts +18 -0
- package/dist/gateway/console.d.ts.map +1 -0
- package/dist/gateway/console.js +101 -0
- package/dist/gateway/console.js.map +1 -0
- package/dist/gateway/console.test.d.ts +2 -0
- package/dist/gateway/console.test.d.ts.map +1 -0
- package/dist/gateway/console.test.js +165 -0
- package/dist/gateway/console.test.js.map +1 -0
- package/dist/gateway/errors.d.ts +3 -0
- package/dist/gateway/errors.d.ts.map +1 -0
- package/dist/gateway/errors.js +5 -0
- package/dist/gateway/errors.js.map +1 -0
- package/dist/gateway/exposure.d.ts +33 -0
- package/dist/gateway/exposure.d.ts.map +1 -0
- package/dist/gateway/exposure.js +146 -0
- package/dist/gateway/exposure.js.map +1 -0
- package/dist/gateway/exposure.test.d.ts +2 -0
- package/dist/gateway/exposure.test.d.ts.map +1 -0
- package/dist/gateway/exposure.test.js +93 -0
- package/dist/gateway/exposure.test.js.map +1 -0
- package/dist/gateway/gateway-policy.test.d.ts +2 -0
- package/dist/gateway/gateway-policy.test.d.ts.map +1 -0
- package/dist/gateway/gateway-policy.test.js +404 -0
- package/dist/gateway/gateway-policy.test.js.map +1 -0
- package/dist/gateway/gateway.test.js +47 -25
- package/dist/gateway/gateway.test.js.map +1 -1
- package/dist/gateway/keys.d.ts +2 -0
- package/dist/gateway/keys.d.ts.map +1 -1
- package/dist/gateway/keys.js +2 -0
- package/dist/gateway/keys.js.map +1 -1
- package/dist/gateway/limits.d.ts +32 -8
- package/dist/gateway/limits.d.ts.map +1 -1
- package/dist/gateway/limits.js +27 -11
- package/dist/gateway/limits.js.map +1 -1
- package/dist/gateway/observability.d.ts +51 -0
- package/dist/gateway/observability.d.ts.map +1 -0
- package/dist/gateway/observability.js +136 -0
- package/dist/gateway/observability.js.map +1 -0
- package/dist/gateway/policy-resolver.d.ts +73 -0
- package/dist/gateway/policy-resolver.d.ts.map +1 -0
- package/dist/gateway/policy-resolver.js +142 -0
- package/dist/gateway/policy-resolver.js.map +1 -0
- package/dist/gateway/policy-resolver.test.d.ts +2 -0
- package/dist/gateway/policy-resolver.test.d.ts.map +1 -0
- package/dist/gateway/policy-resolver.test.js +273 -0
- package/dist/gateway/policy-resolver.test.js.map +1 -0
- package/dist/gateway/request-errors.test.d.ts +2 -0
- package/dist/gateway/request-errors.test.d.ts.map +1 -0
- package/dist/gateway/request-errors.test.js +108 -0
- package/dist/gateway/request-errors.test.js.map +1 -0
- package/dist/gateway/request-shaping.d.ts +25 -0
- package/dist/gateway/request-shaping.d.ts.map +1 -0
- package/dist/gateway/request-shaping.js +66 -0
- package/dist/gateway/request-shaping.js.map +1 -0
- package/dist/gateway/response-usage.d.ts +35 -0
- package/dist/gateway/response-usage.d.ts.map +1 -0
- package/dist/gateway/response-usage.js +167 -0
- package/dist/gateway/response-usage.js.map +1 -0
- package/dist/gateway/response-usage.test.d.ts +2 -0
- package/dist/gateway/response-usage.test.d.ts.map +1 -0
- package/dist/gateway/response-usage.test.js +78 -0
- package/dist/gateway/response-usage.test.js.map +1 -0
- package/dist/gateway/runtime.d.ts +25 -0
- package/dist/gateway/runtime.d.ts.map +1 -1
- package/dist/gateway/runtime.js +39 -19
- package/dist/gateway/runtime.js.map +1 -1
- package/dist/gateway/server.d.ts +68 -2
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/gateway/server.js +532 -116
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/services/audit.d.ts +16 -0
- package/dist/gateway/services/audit.d.ts.map +1 -0
- package/dist/gateway/services/audit.js +18 -0
- package/dist/gateway/services/audit.js.map +1 -0
- package/dist/gateway/services/context.d.ts +66 -0
- package/dist/gateway/services/context.d.ts.map +1 -0
- package/dist/gateway/services/context.js +52 -0
- package/dist/gateway/services/context.js.map +1 -0
- package/dist/gateway/services/keys.d.ts +78 -0
- package/dist/gateway/services/keys.d.ts.map +1 -0
- package/dist/gateway/services/keys.js +232 -0
- package/dist/gateway/services/keys.js.map +1 -0
- package/dist/gateway/services/members.d.ts +72 -0
- package/dist/gateway/services/members.d.ts.map +1 -0
- package/dist/gateway/services/members.js +161 -0
- package/dist/gateway/services/members.js.map +1 -0
- package/dist/gateway/services/network.d.ts +36 -0
- package/dist/gateway/services/network.d.ts.map +1 -0
- package/dist/gateway/services/network.js +147 -0
- package/dist/gateway/services/network.js.map +1 -0
- package/dist/gateway/services/operator.d.ts +98 -0
- package/dist/gateway/services/operator.d.ts.map +1 -0
- package/dist/gateway/services/operator.js +170 -0
- package/dist/gateway/services/operator.js.map +1 -0
- package/dist/gateway/services/operator.test.d.ts +2 -0
- package/dist/gateway/services/operator.test.d.ts.map +1 -0
- package/dist/gateway/services/operator.test.js +184 -0
- package/dist/gateway/services/operator.test.js.map +1 -0
- package/dist/gateway/services/peer-lists.d.ts +20 -0
- package/dist/gateway/services/peer-lists.d.ts.map +1 -0
- package/dist/gateway/services/peer-lists.js +134 -0
- package/dist/gateway/services/peer-lists.js.map +1 -0
- package/dist/gateway/services/presets.d.ts +34 -0
- package/dist/gateway/services/presets.d.ts.map +1 -0
- package/dist/gateway/services/presets.js +134 -0
- package/dist/gateway/services/presets.js.map +1 -0
- package/dist/gateway/services/routing.d.ts +13 -0
- package/dist/gateway/services/routing.d.ts.map +1 -0
- package/dist/gateway/services/routing.js +18 -0
- package/dist/gateway/services/routing.js.map +1 -0
- package/dist/gateway/services/services.test.d.ts +2 -0
- package/dist/gateway/services/services.test.d.ts.map +1 -0
- package/dist/gateway/services/services.test.js +476 -0
- package/dist/gateway/services/services.test.js.map +1 -0
- package/dist/gateway/services/settings.d.ts +68 -0
- package/dist/gateway/services/settings.d.ts.map +1 -0
- package/dist/gateway/services/settings.js +580 -0
- package/dist/gateway/services/settings.js.map +1 -0
- package/dist/gateway/services/tokens.d.ts +29 -0
- package/dist/gateway/services/tokens.d.ts.map +1 -0
- package/dist/gateway/services/tokens.js +48 -0
- package/dist/gateway/services/tokens.js.map +1 -0
- package/dist/gateway/services/usage.d.ts +55 -0
- package/dist/gateway/services/usage.d.ts.map +1 -0
- package/dist/gateway/services/usage.js +225 -0
- package/dist/gateway/services/usage.js.map +1 -0
- package/dist/gateway/services/wallet-address-env.test.d.ts +2 -0
- package/dist/gateway/services/wallet-address-env.test.d.ts.map +1 -0
- package/dist/gateway/services/wallet-address-env.test.js +119 -0
- package/dist/gateway/services/wallet-address-env.test.js.map +1 -0
- package/dist/gateway/services/wallet-address.d.ts +40 -0
- package/dist/gateway/services/wallet-address.d.ts.map +1 -0
- package/dist/gateway/services/wallet-address.js +116 -0
- package/dist/gateway/services/wallet-address.js.map +1 -0
- package/dist/gateway/services/wallet-address.test.d.ts +2 -0
- package/dist/gateway/services/wallet-address.test.d.ts.map +1 -0
- package/dist/gateway/services/wallet-address.test.js +84 -0
- package/dist/gateway/services/wallet-address.test.js.map +1 -0
- package/dist/gateway/services/workspaces.d.ts +75 -0
- package/dist/gateway/services/workspaces.d.ts.map +1 -0
- package/dist/gateway/services/workspaces.js +228 -0
- package/dist/gateway/services/workspaces.js.map +1 -0
- package/dist/gateway/spend-durability.test.d.ts +2 -0
- package/dist/gateway/spend-durability.test.d.ts.map +1 -0
- package/dist/gateway/spend-durability.test.js +330 -0
- package/dist/gateway/spend-durability.test.js.map +1 -0
- package/dist/gateway/spend-feed.d.ts +11 -1
- package/dist/gateway/spend-feed.d.ts.map +1 -1
- package/dist/gateway/spend-feed.js +17 -4
- package/dist/gateway/spend-feed.js.map +1 -1
- package/dist/gateway/spend-feed.test.d.ts +2 -0
- package/dist/gateway/spend-feed.test.d.ts.map +1 -0
- package/dist/gateway/spend-feed.test.js +34 -0
- package/dist/gateway/spend-feed.test.js.map +1 -0
- package/dist/gateway/store-data.test.d.ts +2 -0
- package/dist/gateway/store-data.test.d.ts.map +1 -0
- package/dist/gateway/store-data.test.js +346 -0
- package/dist/gateway/store-data.test.js.map +1 -0
- package/dist/gateway/store-migrations.d.ts +6 -0
- package/dist/gateway/store-migrations.d.ts.map +1 -0
- package/dist/gateway/store-migrations.js +301 -0
- package/dist/gateway/store-migrations.js.map +1 -0
- package/dist/gateway/store.d.ts +595 -10
- package/dist/gateway/store.d.ts.map +1 -1
- package/dist/gateway/store.js +1242 -120
- package/dist/gateway/store.js.map +1 -1
- package/dist/gateway/store.test.d.ts +2 -0
- package/dist/gateway/store.test.d.ts.map +1 -0
- package/dist/gateway/store.test.js +185 -0
- package/dist/gateway/store.test.js.map +1 -0
- package/dist/proxy/buyer-chain-reader.d.ts +68 -0
- package/dist/proxy/buyer-chain-reader.d.ts.map +1 -0
- package/dist/proxy/buyer-chain-reader.js +152 -0
- package/dist/proxy/buyer-chain-reader.js.map +1 -0
- package/dist/proxy/buyer-chain-reader.test.d.ts +2 -0
- package/dist/proxy/buyer-chain-reader.test.d.ts.map +1 -0
- package/dist/proxy/buyer-chain-reader.test.js +102 -0
- package/dist/proxy/buyer-chain-reader.test.js.map +1 -0
- package/dist/proxy/buyer-proxy.d.ts +169 -3
- package/dist/proxy/buyer-proxy.d.ts.map +1 -1
- package/dist/proxy/buyer-proxy.js +873 -117
- package/dist/proxy/buyer-proxy.js.map +1 -1
- package/dist/proxy/buyer-proxy.test.js +31 -0
- package/dist/proxy/buyer-proxy.test.js.map +1 -1
- package/dist/proxy/chain-read-cache.d.ts +47 -0
- package/dist/proxy/chain-read-cache.d.ts.map +1 -0
- package/dist/proxy/chain-read-cache.js +110 -0
- package/dist/proxy/chain-read-cache.js.map +1 -0
- package/dist/proxy/chain-read-cache.test.d.ts +2 -0
- package/dist/proxy/chain-read-cache.test.d.ts.map +1 -0
- package/dist/proxy/chain-read-cache.test.js +75 -0
- package/dist/proxy/chain-read-cache.test.js.map +1 -0
- package/dist/proxy/chain-rpc-test-support.d.ts +31 -0
- package/dist/proxy/chain-rpc-test-support.d.ts.map +1 -0
- package/dist/proxy/chain-rpc-test-support.js +136 -0
- package/dist/proxy/chain-rpc-test-support.js.map +1 -0
- package/dist/proxy/chain-rpc.d.ts +121 -0
- package/dist/proxy/chain-rpc.d.ts.map +1 -0
- package/dist/proxy/chain-rpc.js +420 -0
- package/dist/proxy/chain-rpc.js.map +1 -0
- package/dist/proxy/chain-rpc.test.d.ts +2 -0
- package/dist/proxy/chain-rpc.test.d.ts.map +1 -0
- package/dist/proxy/chain-rpc.test.js +180 -0
- package/dist/proxy/chain-rpc.test.js.map +1 -0
- package/dist/proxy/deposit-watch-hub.d.ts +47 -0
- package/dist/proxy/deposit-watch-hub.d.ts.map +1 -0
- package/dist/proxy/deposit-watch-hub.js +111 -0
- package/dist/proxy/deposit-watch-hub.js.map +1 -0
- package/dist/proxy/deposit-watch-hub.test.d.ts +2 -0
- package/dist/proxy/deposit-watch-hub.test.d.ts.map +1 -0
- package/dist/proxy/deposit-watch-hub.test.js +133 -0
- package/dist/proxy/deposit-watch-hub.test.js.map +1 -0
- package/dist/proxy/deposit-watcher.d.ts +44 -4
- package/dist/proxy/deposit-watcher.d.ts.map +1 -1
- package/dist/proxy/deposit-watcher.js +76 -11
- package/dist/proxy/deposit-watcher.js.map +1 -1
- package/dist/proxy/deposit-watcher.test.js +54 -1
- package/dist/proxy/deposit-watcher.test.js.map +1 -1
- package/dist/proxy/gateway-policy.test.d.ts +2 -0
- package/dist/proxy/gateway-policy.test.d.ts.map +1 -0
- package/dist/proxy/gateway-policy.test.js +576 -0
- package/dist/proxy/gateway-policy.test.js.map +1 -0
- package/dist/proxy/network-models.d.ts +2 -0
- package/dist/proxy/network-models.d.ts.map +1 -1
- package/dist/proxy/network-models.js +3 -1
- package/dist/proxy/network-models.js.map +1 -1
- package/dist/proxy/route-policy.d.ts +97 -0
- package/dist/proxy/route-policy.d.ts.map +1 -0
- package/dist/proxy/route-policy.js +230 -0
- package/dist/proxy/route-policy.js.map +1 -0
- package/dist/proxy/route-policy.test.d.ts +2 -0
- package/dist/proxy/route-policy.test.d.ts.map +1 -0
- package/dist/proxy/route-policy.test.js +120 -0
- package/dist/proxy/route-policy.test.js.map +1 -0
- package/dist/proxy/spend-attribution.d.ts +41 -10
- package/dist/proxy/spend-attribution.d.ts.map +1 -1
- package/dist/proxy/spend-attribution.js +133 -37
- package/dist/proxy/spend-attribution.js.map +1 -1
- package/dist/proxy/tee-control.d.ts +3 -1
- package/dist/proxy/tee-control.d.ts.map +1 -1
- package/dist/proxy/tee-control.js +5 -3
- package/dist/proxy/tee-control.js.map +1 -1
- package/dist/proxy/telemetry.d.ts +2 -1
- package/dist/proxy/telemetry.d.ts.map +1 -1
- package/dist/proxy/telemetry.js +10 -5
- package/dist/proxy/telemetry.js.map +1 -1
- package/dist/routing-policy/policy.d.ts +149 -0
- package/dist/routing-policy/policy.d.ts.map +1 -0
- package/dist/routing-policy/policy.js +450 -0
- package/dist/routing-policy/policy.js.map +1 -0
- package/dist/routing-policy/policy.test.d.ts +2 -0
- package/dist/routing-policy/policy.test.d.ts.map +1 -0
- package/dist/routing-policy/policy.test.js +134 -0
- package/dist/routing-policy/policy.test.js.map +1 -0
- package/package.json +15 -7
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdtempSync, readFileSync, rmSync, statSync } from 'node:fs';
|
|
3
|
+
import * as http from 'node:http';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { test } from 'node:test';
|
|
7
|
+
import { GATEWAY_CONTROL_HEADER, GATEWAY_CONTROL_SECRET_ENV, ROUTING_POLICY_HEADER, decodePolicyHeader, modelServiceId, policyAllowsModel } from '../routing-policy/policy.js';
|
|
8
|
+
import { buyerFetch, loadOrCreateControlSecret, recordGatewayBuyerPort, runningGatewayBuyerPort } from './buyer-control.js';
|
|
9
|
+
import { OtlpExporter, tracesUrl } from './observability.js';
|
|
10
|
+
import { GATEWAY_ROUTING_SETTING, checkPolicyInput, isEmptyPolicy, policyInputProblem, resolvePolicy } from './policy-resolver.js';
|
|
11
|
+
import { applyPreset, effectiveRequestModel, extractEndUser, sniffMultipartModel } from './request-shaping.js';
|
|
12
|
+
import { DEFAULT_WORKSPACE_ID } from './store.js';
|
|
13
|
+
import { tempDataDir } from './console-api/test-support.js';
|
|
14
|
+
const NO_LIMITS = { daily: null, weekly: null, monthly: null, total: null };
|
|
15
|
+
test('policies narrow from the gateway default through workspace, member, key and preset', () => {
|
|
16
|
+
const { store, cleanup } = tempDataDir();
|
|
17
|
+
try {
|
|
18
|
+
store.setSetting(GATEWAY_ROUTING_SETTING, { blockedPeerIds: ['0xAA'], maxInputUsdPerMillion: 10, sort: 'price' });
|
|
19
|
+
const ws = store.createWorkspace({ name: 'R', buyerIdentity: 'ws-r', routingPolicy: { allowedModels: ['m1', 'm2', 'm3'], minTrustScore: 20 } });
|
|
20
|
+
// The org admins' workspace policy comes first; the workspace admins' own can only narrow it.
|
|
21
|
+
store.updateWorkspace(ws.id, { orgRoutingPolicy: { maxOutputUsdPerMillion: 7, allowedModels: ['m1', 'm2', 'm4'] } });
|
|
22
|
+
const owner = store.createOwner({ label: 'O', email: null });
|
|
23
|
+
store.updateMember(owner.id, { routingPolicy: { maxInputUsdPerMillion: 5, allowedModels: ['m1', 'm2'] } });
|
|
24
|
+
const { key } = store.createKey({
|
|
25
|
+
label: 'k', workspaceId: ws.id, ownerMemberId: owner.id, limits: NO_LIMITS, expiresAt: null,
|
|
26
|
+
routingPolicy: { minTrustScore: 10, blockedPeerIds: ['bb'], maxInputUsdPerMillion: 50, sort: 'latency' },
|
|
27
|
+
});
|
|
28
|
+
const preset = store.createPreset({ slug: 'cheap', name: 'Cheap', workspaceId: ws.id, model: 'm1', routingPolicy: { allowedModels: ['m1'], requireVerified: true }, systemPrompt: null, params: {} });
|
|
29
|
+
const { policy, sources } = resolvePolicy(store, { keyId: key.id });
|
|
30
|
+
assert.deepEqual(sources.map((s) => s.level), ['buyer', 'gateway', 'workspace-org', 'workspace', 'member', 'key', 'key-owner']);
|
|
31
|
+
assert.deepEqual(sources[2].policy, { maxOutputUsdPerMillion: 7, allowedModels: ['m1', 'm2', 'm4'] });
|
|
32
|
+
assert.equal(policy.maxOutputUsdPerMillion, 7, 'the org policy of a workspace applies to its keys');
|
|
33
|
+
assert.deepEqual(policy.blockedPeerIds?.sort(), ['aa', 'bb']);
|
|
34
|
+
assert.equal(policy.maxInputUsdPerMillion, 5, 'a key cannot raise a cap');
|
|
35
|
+
assert.equal(policy.minTrustScore, 20, 'a key cannot lower a minimum');
|
|
36
|
+
assert.deepEqual(policy.allowedModels, ['m1', 'm2']);
|
|
37
|
+
assert.equal(policy.sort, 'latency', 'ranking preferences take the lowest level that sets one');
|
|
38
|
+
const withPreset = resolvePolicy(store, { keyId: key.id, presetSlug: 'cheap' });
|
|
39
|
+
assert.equal(withPreset.sources.at(-1)?.id, preset.id);
|
|
40
|
+
assert.deepEqual(withPreset.policy.allowedModels, ['m1']);
|
|
41
|
+
assert.equal(withPreset.policy.requireVerified, true);
|
|
42
|
+
const workspaceOnly = resolvePolicy(store, { workspaceId: DEFAULT_WORKSPACE_ID });
|
|
43
|
+
assert.deepEqual(workspaceOnly.sources.map((s) => s.level), ['buyer', 'gateway', 'workspace-org', 'workspace']);
|
|
44
|
+
assert.equal(workspaceOnly.policy.allowedModels, undefined);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
cleanup();
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
test('allowed models compare the service part of peer@model', () => {
|
|
51
|
+
const policy = { allowedModels: ['deepseek-v4-flash'] };
|
|
52
|
+
assert.equal(modelServiceId('abc123@deepseek-v4-flash'), 'deepseek-v4-flash');
|
|
53
|
+
assert.equal(modelServiceId('@preset/x'), '@preset/x');
|
|
54
|
+
assert.equal(policyAllowsModel(policy, 'deepseek-v4-flash'), true);
|
|
55
|
+
assert.equal(policyAllowsModel(policy, 'DEEPSEEK-V4-FLASH'), true);
|
|
56
|
+
assert.equal(policyAllowsModel(policy, 'abc123@deepseek-v4-flash'), true);
|
|
57
|
+
assert.equal(policyAllowsModel(policy, 'abc123@other-model'), false);
|
|
58
|
+
assert.equal(policyAllowsModel(policy, null), false, 'no model under an allow list fails closed');
|
|
59
|
+
assert.equal(policyAllowsModel({}, null), true);
|
|
60
|
+
});
|
|
61
|
+
const PRESET = {
|
|
62
|
+
id: 'pre_1', slug: 's', name: 'S', workspaceId: null, model: 'real-model', routingPolicy: null,
|
|
63
|
+
systemPrompt: 'Be brief.', params: { temperature: 0.2, max_tokens: 100 }, createdAt: 0,
|
|
64
|
+
};
|
|
65
|
+
test('presets rewrite the model, put their params under the client\'s and prepend their system prompt', () => {
|
|
66
|
+
const chat = applyPreset({ model: '@preset/s', max_tokens: 5, messages: [{ role: 'user', content: 'hi' }] }, PRESET, '/v1/chat/completions');
|
|
67
|
+
assert.equal(chat['model'], 'real-model');
|
|
68
|
+
assert.equal(chat['temperature'], 0.2);
|
|
69
|
+
assert.equal(chat['max_tokens'], 5, 'the client wins');
|
|
70
|
+
assert.deepEqual(chat['messages'], [{ role: 'system', content: 'Be brief.' }, { role: 'user', content: 'hi' }]);
|
|
71
|
+
assert.equal(applyPreset({ model: '@preset/s', system: 'Mine.' }, PRESET, '/v1/messages')['system'], 'Be brief.\n\nMine.');
|
|
72
|
+
assert.deepEqual(applyPreset({ system: [{ type: 'text', text: 'Mine.' }] }, PRESET, '/v1/messages')['system'], [{ type: 'text', text: 'Be brief.' }, { type: 'text', text: 'Mine.' }]);
|
|
73
|
+
assert.equal(applyPreset({}, PRESET, '/v1/messages')['system'], 'Be brief.');
|
|
74
|
+
assert.equal(applyPreset({ instructions: 'Mine.' }, PRESET, '/v1/responses')['instructions'], 'Be brief.\n\nMine.');
|
|
75
|
+
assert.equal(applyPreset({}, PRESET, '/v1/images/generations')['instructions'], undefined);
|
|
76
|
+
});
|
|
77
|
+
test('end user and multipart model are read from the request', () => {
|
|
78
|
+
assert.equal(extractEndUser({ user: 'u-1' }, 'header-user'), 'u-1');
|
|
79
|
+
assert.equal(extractEndUser(null, 'header-user'), 'header-user');
|
|
80
|
+
assert.equal(extractEndUser({}, undefined), null);
|
|
81
|
+
const boundary = 'XyZ';
|
|
82
|
+
const form = Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="prompt"\r\n\r\nhello\r\n--${boundary}\r\nContent-Disposition: form-data; name="model"\r\n\r\nimage-model\r\n--${boundary}--\r\n`);
|
|
83
|
+
assert.equal(sniffMultipartModel(form, `multipart/form-data; boundary=${boundary}`), 'image-model');
|
|
84
|
+
assert.equal(sniffMultipartModel(form, 'application/json'), null);
|
|
85
|
+
const multipart = `multipart/form-data; boundary=${boundary}`;
|
|
86
|
+
assert.equal(effectiveRequestModel(null, form, multipart), 'image-model');
|
|
87
|
+
const withService = Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="service"\r\n\r\nother-image\r\n${form.toString('latin1')}`);
|
|
88
|
+
assert.equal(effectiveRequestModel(null, withService, multipart), 'other-image', 'service wins, as the buyer reads it');
|
|
89
|
+
assert.equal(effectiveRequestModel({ model: 'm', service: 's' }, Buffer.alloc(0), 'application/json'), 's');
|
|
90
|
+
assert.equal(effectiveRequestModel({ model: ' m ' }, Buffer.alloc(0), 'application/json'), 'm');
|
|
91
|
+
assert.equal(effectiveRequestModel({ model: 'm', service: 7 }, Buffer.alloc(0), 'application/json'), null);
|
|
92
|
+
});
|
|
93
|
+
test('a preset drops a client service so the buyer routes by the preset\'s model', () => {
|
|
94
|
+
const body = applyPreset({ model: '@preset/s', service: 'elsewhere' }, PRESET, '/v1/chat/completions');
|
|
95
|
+
assert.equal(body['model'], 'real-model');
|
|
96
|
+
assert.equal('service' in body, false);
|
|
97
|
+
});
|
|
98
|
+
test('the control secret is created once with mode 0600 and the env var overrides it', () => {
|
|
99
|
+
const dir = mkdtempSync(join(tmpdir(), 'antseed-secret-'));
|
|
100
|
+
const previous = process.env[GATEWAY_CONTROL_SECRET_ENV];
|
|
101
|
+
delete process.env[GATEWAY_CONTROL_SECRET_ENV];
|
|
102
|
+
try {
|
|
103
|
+
const first = loadOrCreateControlSecret(dir);
|
|
104
|
+
assert.match(first, /^[0-9a-f]{64}$/);
|
|
105
|
+
assert.equal(loadOrCreateControlSecret(dir), first);
|
|
106
|
+
const path = join(dir, 'gateway', 'buyer-control.secret');
|
|
107
|
+
assert.equal(readFileSync(path, 'utf8').trim(), first);
|
|
108
|
+
assert.equal(statSync(path).mode & 0o777, 0o600);
|
|
109
|
+
process.env[GATEWAY_CONTROL_SECRET_ENV] = 'from-env';
|
|
110
|
+
assert.equal(loadOrCreateControlSecret(dir), 'from-env');
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
if (previous === undefined)
|
|
114
|
+
delete process.env[GATEWAY_CONTROL_SECRET_ENV];
|
|
115
|
+
else
|
|
116
|
+
process.env[GATEWAY_CONTROL_SECRET_ENV] = previous;
|
|
117
|
+
rmSync(dir, { recursive: true, force: true });
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
test('a running gateway records its buyer port for the CLI and clears it on stop', () => {
|
|
121
|
+
const dir = mkdtempSync(join(tmpdir(), 'antseed-buyer-port-'));
|
|
122
|
+
try {
|
|
123
|
+
assert.equal(runningGatewayBuyerPort(dir), null);
|
|
124
|
+
const clear = recordGatewayBuyerPort(dir, 28377);
|
|
125
|
+
assert.equal(runningGatewayBuyerPort(dir), 28377);
|
|
126
|
+
clear();
|
|
127
|
+
assert.equal(runningGatewayBuyerPort(dir), null);
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
rmSync(dir, { recursive: true, force: true });
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
test('buyerFetch sends the secret, the policy and the identity', async () => {
|
|
134
|
+
let seen = {};
|
|
135
|
+
let url = '';
|
|
136
|
+
const server = http.createServer((req, res) => {
|
|
137
|
+
seen = req.headers;
|
|
138
|
+
url = req.url ?? '';
|
|
139
|
+
res.writeHead(200, { 'content-type': 'application/json' }).end('{}');
|
|
140
|
+
});
|
|
141
|
+
await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
|
|
142
|
+
try {
|
|
143
|
+
const port = server.address().port;
|
|
144
|
+
await buyerFetch({ buyerPort: port, secret: 's3cret' }, '/_antseed/route-preview?model=m', { policy: { allowedModels: ['m'] }, identity: 'ws-a' });
|
|
145
|
+
assert.equal(seen[GATEWAY_CONTROL_HEADER], 's3cret');
|
|
146
|
+
assert.deepEqual(decodePolicyHeader(seen[ROUTING_POLICY_HEADER]), { allowedModels: ['m'] });
|
|
147
|
+
assert.equal(url, '/_antseed/route-preview?model=m&identity=ws-a');
|
|
148
|
+
await buyerFetch({ buyerPort: port, secret: 's3cret' }, '/_antseed/status');
|
|
149
|
+
assert.equal(seen[ROUTING_POLICY_HEADER], undefined);
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
test('OTLP exporter posts one span per request, without content unless enabled, and bounds its queue', async () => {
|
|
156
|
+
const posted = [];
|
|
157
|
+
let settings = { otlpEndpoint: 'https://otel.example.test', otlpHeaders: { 'x-token': 't' }, logContent: false, retentionDays: null };
|
|
158
|
+
const fetchImpl = (async (url, init) => {
|
|
159
|
+
posted.push({ url, body: JSON.parse(String(init.body)), headers: init.headers });
|
|
160
|
+
return new Response(null, { status: 200 });
|
|
161
|
+
});
|
|
162
|
+
const exporter = new OtlpExporter(() => settings, { fetchImpl, flushIntervalMs: 60_000 });
|
|
163
|
+
const span = {
|
|
164
|
+
tag: 'gw_1', method: 'POST', path: '/v1/responses', model: 'm', status: 200, startedAt: 1_000, finishedAt: 1_250,
|
|
165
|
+
keyId: 'key_1', workspaceId: 'ws_default', memberId: null, endUser: 'u', sellerPeerId: 'aa', latencyMs: 250,
|
|
166
|
+
requestBody: 'SECRET PROMPT', responseBody: 'SECRET ANSWER',
|
|
167
|
+
};
|
|
168
|
+
exporter.record(span);
|
|
169
|
+
await exporter.flush();
|
|
170
|
+
assert.equal(posted[0].url, 'https://otel.example.test/v1/traces');
|
|
171
|
+
assert.equal(posted[0].headers['x-token'], 't');
|
|
172
|
+
const exported = posted[0].body.resourceSpans[0].scopeSpans[0].spans;
|
|
173
|
+
assert.equal(exported.length, 1);
|
|
174
|
+
assert.equal(exported[0].startTimeUnixNano, '1000000000');
|
|
175
|
+
assert.ok(!JSON.stringify(exported).includes('SECRET'));
|
|
176
|
+
settings = { ...settings, logContent: true };
|
|
177
|
+
exporter.record(span);
|
|
178
|
+
await exporter.flush();
|
|
179
|
+
assert.ok(JSON.stringify(posted[1].body).includes('SECRET PROMPT'));
|
|
180
|
+
for (let index = 0; index < 1_005; index += 1)
|
|
181
|
+
exporter.record(span);
|
|
182
|
+
assert.equal(exporter.dropped, 5);
|
|
183
|
+
await exporter.stop();
|
|
184
|
+
assert.equal(tracesUrl('http://collector:4318/v1/traces'), 'http://collector:4318/v1/traces');
|
|
185
|
+
settings = { ...settings, otlpEndpoint: null };
|
|
186
|
+
const before = posted.length;
|
|
187
|
+
exporter.record(span);
|
|
188
|
+
await exporter.flush();
|
|
189
|
+
assert.equal(posted.length, before, 'nothing is sent without an endpoint');
|
|
190
|
+
});
|
|
191
|
+
test('peer lists in policies are references: editing a list changes every policy using it', () => {
|
|
192
|
+
const { store, cleanup } = tempDataDir();
|
|
193
|
+
try {
|
|
194
|
+
const PEER_A = 'a1'.repeat(20);
|
|
195
|
+
const PEER_B = 'b2'.repeat(20);
|
|
196
|
+
const PEER_C = 'c3'.repeat(20);
|
|
197
|
+
const own = store.createPeerList({ name: 'Own', description: null, peerIds: [PEER_A, PEER_B] });
|
|
198
|
+
const banned = store.createPeerList({ name: 'Banned', description: null, peerIds: [PEER_C] });
|
|
199
|
+
const ws = store.createWorkspace({ name: 'L', buyerIdentity: 'ws-l', routingPolicy: { allowedPeerLists: [own.id] } });
|
|
200
|
+
const { key } = store.createKey({ label: 'k', workspaceId: ws.id, limits: NO_LIMITS, expiresAt: null, routingPolicy: { allowedPeerIds: [PEER_B, PEER_C], blockedPeerLists: [banned.id] } });
|
|
201
|
+
let { policy } = resolvePolicy(store, { keyId: key.id });
|
|
202
|
+
assert.deepEqual(policy.allowedPeerIds, [PEER_B], 'workspace list ∩ key ids');
|
|
203
|
+
assert.deepEqual(policy.blockedPeerIds, [PEER_C]);
|
|
204
|
+
assert.equal(policy.allowedPeerLists, undefined);
|
|
205
|
+
assert.equal(policy.blockedPeerLists, undefined);
|
|
206
|
+
store.updatePeerList(own.id, { peerIds: [PEER_A] });
|
|
207
|
+
policy = resolvePolicy(store, { keyId: key.id }).policy;
|
|
208
|
+
assert.deepEqual(policy.allowedPeerIds, [], 'the edited list applies at once');
|
|
209
|
+
store.deletePeerList(own.id);
|
|
210
|
+
policy = resolvePolicy(store, { workspaceId: ws.id }).policy;
|
|
211
|
+
assert.deepEqual(policy.allowedPeerIds, [], 'a deleted allow list fails closed');
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
cleanup();
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
test('the key owner\'s layer only narrows the admins\' layer, peer lists included', () => {
|
|
218
|
+
const { store, cleanup } = tempDataDir();
|
|
219
|
+
try {
|
|
220
|
+
const A = 'aa'.repeat(20);
|
|
221
|
+
const B = 'bb'.repeat(20);
|
|
222
|
+
const C = 'cc'.repeat(20);
|
|
223
|
+
const any = store.createPeerList({ name: 'Any', description: null, peerIds: [A, B, C] });
|
|
224
|
+
const onlyC = store.createPeerList({ name: 'C', description: null, peerIds: [C] });
|
|
225
|
+
const ws = store.createWorkspace({ name: 'O', buyerIdentity: 'ws-o' });
|
|
226
|
+
const { key } = store.createKey({
|
|
227
|
+
label: 'k', workspaceId: ws.id, limits: NO_LIMITS, expiresAt: null,
|
|
228
|
+
routingPolicy: { allowedPeerIds: [A] },
|
|
229
|
+
ownerRoutingPolicy: { allowedPeerIds: [A], allowedPeerLists: [any.id], maxInputUsdPerMillion: 2 },
|
|
230
|
+
});
|
|
231
|
+
let { policy } = resolvePolicy(store, { keyId: key.id });
|
|
232
|
+
assert.deepEqual(policy.allowedPeerIds, [A], 'adding a list in the owner layer does not widen the admin allow list');
|
|
233
|
+
assert.equal(policy.maxInputUsdPerMillion, 2);
|
|
234
|
+
// The other way round: the admins allow a list, the owner adds ids outside it.
|
|
235
|
+
store.updateKey(key.id, { routingPolicy: { allowedPeerLists: [onlyC.id] }, ownerRoutingPolicy: { allowedPeerIds: [A] } });
|
|
236
|
+
policy = resolvePolicy(store, { keyId: key.id }).policy;
|
|
237
|
+
assert.deepEqual(policy.allowedPeerIds, [], 'ids outside the admin list are not added');
|
|
238
|
+
// checkPolicyInput reports what the console must refuse.
|
|
239
|
+
const target = { keyId: key.id };
|
|
240
|
+
const widen = checkPolicyInput(store, target, 'key-owner', { allowedPeerLists: [any.id] });
|
|
241
|
+
assert.deepEqual(widen.narrowed, ['allowedPeerIds']);
|
|
242
|
+
assert.deepEqual(widen.effective.allowedPeerIds, [C]);
|
|
243
|
+
assert.equal(widen.emptyAllow, false);
|
|
244
|
+
const ok = checkPolicyInput(store, target, 'key-owner', { allowedPeerIds: [C], sort: 'price' });
|
|
245
|
+
assert.deepEqual(ok.narrowed, []);
|
|
246
|
+
const none = checkPolicyInput(store, target, 'key-owner', { allowedPeerIds: [A] });
|
|
247
|
+
assert.equal(none.emptyAllow, true, 'no overlap with the level above leaves no seller');
|
|
248
|
+
assert.equal(checkPolicyInput(store, target, 'key-owner', { allowedPeerIds: [] }).emptyAllow, true);
|
|
249
|
+
assert.equal(checkPolicyInput(store, target, 'key-owner', { allowedPeerLists: ['pl_missing'] }).emptyAllow, true);
|
|
250
|
+
assert.equal(checkPolicyInput(store, target, 'key-owner', { blockedPeerIds: [A] }).emptyAllow, false, 'only a sent allow list counts');
|
|
251
|
+
const empty = policyInputProblem([{ field: 'ownerRoutingPolicy', check: none }], {});
|
|
252
|
+
assert.equal(empty?.status, 400);
|
|
253
|
+
assert.equal(empty?.body.error.code, 'empty_allow_list');
|
|
254
|
+
// Leaving no seller is also a narrowing here (A is not in the admin list): both need confirming.
|
|
255
|
+
assert.equal(policyInputProblem([{ field: 'ownerRoutingPolicy', check: none }], { confirmEmpty: true })?.status, 409);
|
|
256
|
+
assert.equal(policyInputProblem([{ field: 'ownerRoutingPolicy', check: none }], { confirmEmpty: true, acceptNarrowed: true }), null);
|
|
257
|
+
const narrowed = policyInputProblem([{ field: 'ownerRoutingPolicy', check: widen }], {});
|
|
258
|
+
assert.equal(narrowed?.status, 409);
|
|
259
|
+
assert.deepEqual(narrowed?.body.error['fields'], ['ownerRoutingPolicy.allowedPeerIds']);
|
|
260
|
+
assert.deepEqual((narrowed?.body.error['effectiveRoutingPolicy']).allowedPeerIds, [C]);
|
|
261
|
+
assert.equal(policyInputProblem([{ field: 'ownerRoutingPolicy', check: widen }], { acceptNarrowed: true }), null);
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
cleanup();
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
test('policies that change nothing count as empty', () => {
|
|
268
|
+
assert.equal(isEmptyPolicy({}), true);
|
|
269
|
+
assert.equal(isEmptyPolicy({ sort: 'balanced', preferFreePeers: false, requireVerified: false, requireTee: false, modelRoutes: {} }), true);
|
|
270
|
+
assert.equal(isEmptyPolicy({ sort: 'price' }), false);
|
|
271
|
+
assert.equal(isEmptyPolicy({ allowedPeerIds: [] }), false);
|
|
272
|
+
});
|
|
273
|
+
//# sourceMappingURL=policy-resolver.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-resolver.test.js","sourceRoot":"","sources":["../../src/gateway/policy-resolver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-errors.test.d.ts","sourceRoot":"","sources":["../../src/gateway/request-errors.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import * as http from 'node:http';
|
|
3
|
+
import { test } from 'node:test';
|
|
4
|
+
import { GatewayAccounting } from './accounting.js';
|
|
5
|
+
import { OtlpExporter } from './observability.js';
|
|
6
|
+
import { GatewayServer, parseErrorBody } from './server.js';
|
|
7
|
+
import { tempDataDir } from './console-api/test-support.js';
|
|
8
|
+
const NO_LIMITS = { daily: null, weekly: null, monthly: null, total: null };
|
|
9
|
+
test('error bodies: OpenAI, Anthropic, plain-string and non-JSON envelopes', () => {
|
|
10
|
+
const parse = (body, status = 400) => parseErrorBody(Buffer.from(body), status);
|
|
11
|
+
assert.deepEqual(parse('{"error":{"message":"Bad model","type":"invalid_request_error","code":"model_not_found"}}'), { code: 'model_not_found', message: 'Bad model' });
|
|
12
|
+
assert.deepEqual(parse('{"type":"error","error":{"type":"overloaded_error","message":"Overloaded"}}', 529), { code: 'overloaded_error', message: 'Overloaded' });
|
|
13
|
+
assert.deepEqual(parse('{"ok":false,"error":"no_peers_available"}', 503), { code: 'http_503', message: 'no_peers_available' });
|
|
14
|
+
assert.deepEqual(parse('<html>Bad Gateway</html>', 502), { code: 'http_502', message: '<html>Bad Gateway</html>' });
|
|
15
|
+
assert.deepEqual(parse('', 500), { code: 'http_500', message: null });
|
|
16
|
+
assert.equal(parse(JSON.stringify({ error: { message: 'y'.repeat(2_000) } })).message.length, 500);
|
|
17
|
+
});
|
|
18
|
+
async function fakeBuyer(respond) {
|
|
19
|
+
const server = http.createServer((req, res) => {
|
|
20
|
+
req.resume();
|
|
21
|
+
req.on('end', () => respond(res));
|
|
22
|
+
});
|
|
23
|
+
await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
|
|
24
|
+
return { port: server.address().port, close: () => new Promise((resolve) => server.close(() => resolve())) };
|
|
25
|
+
}
|
|
26
|
+
async function post(port, secret) {
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
const req = http.request({ hostname: '127.0.0.1', port, path: '/v1/chat/completions', method: 'POST', headers: { authorization: `Bearer ${secret}`, 'content-type': 'application/json' } }, (res) => {
|
|
29
|
+
res.resume();
|
|
30
|
+
res.on('end', () => resolve(res.statusCode ?? 0));
|
|
31
|
+
});
|
|
32
|
+
req.on('error', reject);
|
|
33
|
+
req.end('{"model":"open-model"}');
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
test('failed requests keep the seller\'s error code and message, and buyer outages are recorded as such', async () => {
|
|
37
|
+
const { store, cleanup } = tempDataDir();
|
|
38
|
+
const buyer = await fakeBuyer((res) => {
|
|
39
|
+
res.writeHead(429, { 'content-type': 'application/json' });
|
|
40
|
+
res.end('{"error":{"type":"rate_limit_error","message":"Slow down"}}');
|
|
41
|
+
});
|
|
42
|
+
const accounting = new GatewayAccounting(store, { holdUsdc: 1_000, settleGraceMs: 10 });
|
|
43
|
+
const options = { store, accounting, identityAddress: async () => null, spendFeedState: () => 'reporting', refreshSpendFeed: async () => { } };
|
|
44
|
+
const gateway = new GatewayServer({ ...options, buyerPort: buyer.port });
|
|
45
|
+
const deadBuyer = new GatewayServer({ ...options, buyerPort: 1 });
|
|
46
|
+
try {
|
|
47
|
+
const { secret } = store.createKey({ label: 'k', limits: NO_LIMITS, expiresAt: null });
|
|
48
|
+
assert.equal(await post(await gateway.start(), secret), 429);
|
|
49
|
+
assert.equal(await post(await deadBuyer.start(), secret), 502);
|
|
50
|
+
const [outage, limited] = store.listRequests({});
|
|
51
|
+
assert.deepEqual([limited.status, limited.errorCode, limited.errorMessage], [429, 'rate_limit_error', 'Slow down']);
|
|
52
|
+
assert.deepEqual([outage.status, outage.errorCode], [502, 'buyer_unavailable']);
|
|
53
|
+
assert.equal(store.usageReport({}, null).totals.failedRequests, 2);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
await gateway.stop();
|
|
57
|
+
await deadBuyer.stop();
|
|
58
|
+
await buyer.close();
|
|
59
|
+
accounting.dispose();
|
|
60
|
+
cleanup();
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
test('admission reads only capped periods, and a request that fails to start releases its hold', () => {
|
|
64
|
+
const { store, cleanup } = tempDataDir();
|
|
65
|
+
const accounting = new GatewayAccounting(store, { holdUsdc: 1_000, settleGraceMs: 10 });
|
|
66
|
+
try {
|
|
67
|
+
const owner = store.createOwner({ label: 'O', email: null });
|
|
68
|
+
store.updateMember(owner.id, { limits: { monthly: 1_000 } });
|
|
69
|
+
const { key } = store.createKey({ label: 'k', ownerMemberId: owner.id, limits: NO_LIMITS, expiresAt: null });
|
|
70
|
+
const asked = [];
|
|
71
|
+
const original = store.spendByPeriod.bind(store);
|
|
72
|
+
store.spendByPeriod = (scope, now, periods) => {
|
|
73
|
+
asked.push([Object.keys(scope)[0], ...(periods ?? [])]);
|
|
74
|
+
return original(scope, now, periods);
|
|
75
|
+
};
|
|
76
|
+
const first = accounting.admit(key);
|
|
77
|
+
assert.ok(first.ok);
|
|
78
|
+
assert.deepEqual(asked, [['memberId', 'monthly']], 'the uncapped key and workspace cost no query');
|
|
79
|
+
assert.equal(accounting.admit(key).ok, false, 'the first hold leaves no room');
|
|
80
|
+
accounting.release(first.ok ? first.tag : '');
|
|
81
|
+
assert.equal(accounting.heldForMember(owner.id), 0);
|
|
82
|
+
assert.equal(accounting.admit(key).ok, true);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
accounting.dispose();
|
|
86
|
+
cleanup();
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
test('the OTLP exporter keeps sending while a full batch is queued', async () => {
|
|
90
|
+
const batches = [];
|
|
91
|
+
const fetchImpl = (async (_url, init) => {
|
|
92
|
+
batches.push(JSON.parse(String(init.body)).resourceSpans[0].scopeSpans[0].spans.length);
|
|
93
|
+
return new Response(null, { status: 200 });
|
|
94
|
+
});
|
|
95
|
+
const settings = { otlpEndpoint: 'https://otel.example.test', otlpHeaders: {}, logContent: false, retentionDays: null };
|
|
96
|
+
const exporter = new OtlpExporter(() => settings, { fetchImpl, flushIntervalMs: 60_000 });
|
|
97
|
+
const span = {
|
|
98
|
+
tag: 'gw_1', method: 'POST', path: '/v1/responses', model: 'm', status: 200, startedAt: 1, finishedAt: 2,
|
|
99
|
+
keyId: 'key_1', workspaceId: 'ws_default', memberId: null, endUser: null, sellerPeerId: null, latencyMs: 1,
|
|
100
|
+
};
|
|
101
|
+
for (let index = 0; index < 250; index += 1)
|
|
102
|
+
exporter.record(span);
|
|
103
|
+
await exporter.flush();
|
|
104
|
+
assert.deepEqual(batches, [100, 100], 'one flush drains every full batch');
|
|
105
|
+
await exporter.stop();
|
|
106
|
+
assert.deepEqual(batches, [100, 100, 50], 'stop sends the rest');
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=request-errors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-errors.test.js","sourceRoot":"","sources":["../../src/gateway/request-errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { PresetRecord } from './store.js';
|
|
2
|
+
export declare const PRESET_MODEL_PREFIX = "@preset/";
|
|
3
|
+
export declare const END_USER_HEADER = "x-antseed-end-user";
|
|
4
|
+
export declare function presetSlug(model: string | null): string | null;
|
|
5
|
+
/**
|
|
6
|
+
* Applies a preset to a JSON request body: the preset's model replaces
|
|
7
|
+
* `@preset/<slug>`, its params sit under the client's own, and its system
|
|
8
|
+
* prompt goes before the client's for chat, messages and responses shapes.
|
|
9
|
+
* A `service` field is dropped: the buyer routes by it before `model`, so it
|
|
10
|
+
* would route around the preset's model.
|
|
11
|
+
*/
|
|
12
|
+
export declare function applyPreset(body: Record<string, unknown>, preset: PresetRecord, routePrefix: string): Record<string, unknown>;
|
|
13
|
+
/** End user from the body's `user` field (OpenAI convention) or the end-user header. */
|
|
14
|
+
export declare function extractEndUser(body: Record<string, unknown> | null, header: string | undefined): string | null;
|
|
15
|
+
/** A text field of a multipart form (image edits), without a full parser; `model` by default. */
|
|
16
|
+
export declare function sniffMultipartModel(body: Buffer, contentType: string | undefined, field?: 'model' | 'service'): string | null;
|
|
17
|
+
/**
|
|
18
|
+
* The model the buyer will route the request to, the way it reads it
|
|
19
|
+
* (`service ?? model`, trimmed; see `extractRequestedService` in
|
|
20
|
+
* proxy/request-utils.ts): a `service` field wins over `model`, and one that
|
|
21
|
+
* is not a usable name leaves the request without a model. The gateway's
|
|
22
|
+
* model allow list and its accounting use this, not `model` alone.
|
|
23
|
+
*/
|
|
24
|
+
export declare function effectiveRequestModel(parsed: Record<string, unknown> | null, body: Buffer, contentType: string | undefined): string | null;
|
|
25
|
+
//# sourceMappingURL=request-shaping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-shaping.d.ts","sourceRoot":"","sources":["../../src/gateway/request-shaping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,eAAO,MAAM,mBAAmB,aAAa,CAAA;AAC7C,eAAO,MAAM,eAAe,uBAAuB,CAAA;AAGnD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAE9D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkB7H;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAI9G;AAED,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,GAAE,OAAO,GAAG,SAAmB,GAAG,MAAM,GAAG,IAAI,CAKtI;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAK1I"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export const PRESET_MODEL_PREFIX = '@preset/';
|
|
2
|
+
export const END_USER_HEADER = 'x-antseed-end-user';
|
|
3
|
+
const MAX_END_USER_LENGTH = 256;
|
|
4
|
+
export function presetSlug(model) {
|
|
5
|
+
return model?.startsWith(PRESET_MODEL_PREFIX) ? model.slice(PRESET_MODEL_PREFIX.length) : null;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Applies a preset to a JSON request body: the preset's model replaces
|
|
9
|
+
* `@preset/<slug>`, its params sit under the client's own, and its system
|
|
10
|
+
* prompt goes before the client's for chat, messages and responses shapes.
|
|
11
|
+
* A `service` field is dropped: the buyer routes by it before `model`, so it
|
|
12
|
+
* would route around the preset's model.
|
|
13
|
+
*/
|
|
14
|
+
export function applyPreset(body, preset, routePrefix) {
|
|
15
|
+
const merged = { ...preset.params, ...body, model: preset.model };
|
|
16
|
+
delete merged['service'];
|
|
17
|
+
const prompt = preset.systemPrompt?.trim();
|
|
18
|
+
if (!prompt)
|
|
19
|
+
return merged;
|
|
20
|
+
if (routePrefix === '/v1/chat/completions') {
|
|
21
|
+
const messages = Array.isArray(merged['messages']) ? merged['messages'] : [];
|
|
22
|
+
merged['messages'] = [{ role: 'system', content: prompt }, ...messages];
|
|
23
|
+
}
|
|
24
|
+
else if (routePrefix === '/v1/messages') {
|
|
25
|
+
const system = merged['system'];
|
|
26
|
+
if (typeof system === 'string' && system.length > 0)
|
|
27
|
+
merged['system'] = `${prompt}\n\n${system}`;
|
|
28
|
+
else if (Array.isArray(system))
|
|
29
|
+
merged['system'] = [{ type: 'text', text: prompt }, ...system];
|
|
30
|
+
else
|
|
31
|
+
merged['system'] = prompt;
|
|
32
|
+
}
|
|
33
|
+
else if (routePrefix === '/v1/responses') {
|
|
34
|
+
const instructions = merged['instructions'];
|
|
35
|
+
merged['instructions'] = typeof instructions === 'string' && instructions.length > 0 ? `${prompt}\n\n${instructions}` : prompt;
|
|
36
|
+
}
|
|
37
|
+
return merged;
|
|
38
|
+
}
|
|
39
|
+
/** End user from the body's `user` field (OpenAI convention) or the end-user header. */
|
|
40
|
+
export function extractEndUser(body, header) {
|
|
41
|
+
const fromBody = body && typeof body['user'] === 'string' ? body['user'] : null;
|
|
42
|
+
const value = (fromBody || header || '').trim();
|
|
43
|
+
return value ? value.slice(0, MAX_END_USER_LENGTH) : null;
|
|
44
|
+
}
|
|
45
|
+
/** A text field of a multipart form (image edits), without a full parser; `model` by default. */
|
|
46
|
+
export function sniffMultipartModel(body, contentType, field = 'model') {
|
|
47
|
+
if (!contentType?.toLowerCase().startsWith('multipart/form-data'))
|
|
48
|
+
return null;
|
|
49
|
+
const text = body.subarray(0, 4 * 1024 * 1024).toString('latin1');
|
|
50
|
+
const match = new RegExp(`content-disposition:\\s*form-data;\\s*name="${field}"[^\\r\\n]*\\r\\n(?:[^\\r\\n]+\\r\\n)*\\r\\n([^\\r\\n]*)\\r\\n`, 'i').exec(text);
|
|
51
|
+
return match ? Buffer.from(match[1], 'latin1').toString('utf8').slice(0, 200) : null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The model the buyer will route the request to, the way it reads it
|
|
55
|
+
* (`service ?? model`, trimmed; see `extractRequestedService` in
|
|
56
|
+
* proxy/request-utils.ts): a `service` field wins over `model`, and one that
|
|
57
|
+
* is not a usable name leaves the request without a model. The gateway's
|
|
58
|
+
* model allow list and its accounting use this, not `model` alone.
|
|
59
|
+
*/
|
|
60
|
+
export function effectiveRequestModel(parsed, body, contentType) {
|
|
61
|
+
const raw = parsed
|
|
62
|
+
? parsed['service'] ?? parsed['model']
|
|
63
|
+
: sniffMultipartModel(body, contentType, 'service') ?? sniffMultipartModel(body, contentType);
|
|
64
|
+
return typeof raw === 'string' && raw.trim() ? raw.trim() : null;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=request-shaping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-shaping.js","sourceRoot":"","sources":["../../src/gateway/request-shaping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token counts a response reported about itself. `inputTokens` is the total
|
|
3
|
+
* logical input (cached included), like the buyer's spend events.
|
|
4
|
+
*/
|
|
5
|
+
export interface ResponseTokens {
|
|
6
|
+
inputTokens: number;
|
|
7
|
+
cachedInputTokens: number;
|
|
8
|
+
outputTokens: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Reads the `usage` a model response carries as it streams past: the final
|
|
12
|
+
* usage of an OpenAI chat completion or response, or an Anthropic message,
|
|
13
|
+
* in JSON or as server-sent events (OpenAI chat `usage` chunk, Responses
|
|
14
|
+
* `response.completed`, Anthropic `message_start` + `message_delta`).
|
|
15
|
+
* Memory stays bounded whatever the response size.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ResponseUsageReader {
|
|
18
|
+
private _mode;
|
|
19
|
+
private _jsonChunks;
|
|
20
|
+
private _jsonBytes;
|
|
21
|
+
private _jsonTruncated;
|
|
22
|
+
private _tail;
|
|
23
|
+
private readonly _decoder;
|
|
24
|
+
private _line;
|
|
25
|
+
private _skippingLine;
|
|
26
|
+
private _usage;
|
|
27
|
+
constructor(contentType: string | undefined);
|
|
28
|
+
push(chunk: Buffer): void;
|
|
29
|
+
/** The usage seen, or null when the response reported none. */
|
|
30
|
+
result(): ResponseTokens | null;
|
|
31
|
+
private _pushJson;
|
|
32
|
+
private _pushSse;
|
|
33
|
+
private _sseLine;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=response-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-usage.d.ts","sourceRoot":"","sources":["../../src/gateway/response-usage.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;CACrB;AAQD;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,MAAM,CAA8B;gBAEhC,WAAW,EAAE,MAAM,GAAG,SAAS;IAK3C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAWzB,+DAA+D;IAC/D,MAAM,IAAI,cAAc,GAAG,IAAI;IAe/B,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,QAAQ;IAoBhB,OAAO,CAAC,QAAQ;CAejB"}
|