From bb7968b61262714eaaaf22f80f1db074036afa90 Mon Sep 17 00:00:00 2001 From: Codex Date: Fri, 11 Sep 2026 05:07:48 +0800 Subject: [PATCH] feat: publish v1.0.0-rc.36-custom.1 --- .agents/github/ISSUE.md | 178 + .agents/github/PR.md | 136 + .agents/skills/i18n-translate/SKILL.md | 314 + .agents/skills/shadcn-ui/SKILL.md | 105 + .../shadcn-ui/vendor/shadcn/UPSTREAM.txt | 4 + .agents/skills/shadcn-ui/vendor/shadcn/cli.md | 276 + .../shadcn-ui/vendor/shadcn/customization.md | 209 + .agents/skills/shadcn-ui/vendor/shadcn/mcp.md | 94 + .../shadcn/official-shadcn-ui-workflow.md | 257 + .../vendor/shadcn/rules/base-vs-radix.md | 306 + .../vendor/shadcn/rules/composition.md | 195 + .../shadcn-ui/vendor/shadcn/rules/forms.md | 192 + .../shadcn-ui/vendor/shadcn/rules/icons.md | 101 + .../shadcn-ui/vendor/shadcn/rules/styling.md | 162 + .../vercel-react-best-practices/SKILL.md | 31 + .../references/full-guide.md | 2934 +++++++ .dockerignore | 12 + .env.example | 139 + .gitattributes | 43 + .github/CODE_OF_CONDUCT.md | 83 + .github/FUNDING.yml | 12 + .github/ISSUE_TEMPLATE/bug_report.yml | 111 + .github/ISSUE_TEMPLATE/bug_report_en.yml | 111 + .github/ISSUE_TEMPLATE/config.yml | 8 + .github/ISSUE_TEMPLATE/feature_request.yml | 54 + .github/ISSUE_TEMPLATE/feature_request_en.yml | 54 + .github/PULL_REQUEST_TEMPLATE.md | 40 + .github/PULL_REQUEST_TEMPLATE/en.md | 40 + .github/SECURITY.md | 96 + .github/workflows/ci.yml | 88 + .github/workflows/docker-build.yml | 152 + .github/workflows/docker-image-branch.yml | 170 + .github/workflows/electron-build.yml | 141 + .github/workflows/release.yml | 168 + .github/workflows/sync-release-to-gitcode.yml | 250 + .gitignore | 46 + AGENTS.md | 182 + CLAUDE.md | 15 + CUSTOMIZATION.md | 19 + Dockerfile | 44 + Dockerfile.dev | 38 + Dockerfile.group-pricing | 24 + Dockerfile.request-status | 39 + LICENSE | 661 ++ NOTICE | 58 + README.en.md | 491 ++ README.fr.md | 502 ++ README.ja.md | 502 ++ README.md | 512 ++ README.zh_CN.md | 502 ++ README.zh_TW.md | 501 ++ THIRD-PARTY-LICENSES.md | 324 + VERSION | 1 + bin/migration_v0.2-v0.3.sql | 6 + bin/migration_v0.3-v0.4.sql | 17 + bin/time_test.sh | 40 + common/account_password.go | 86 + common/api_type.go | 107 + common/api_type_task_plugin_test.go | 14 + common/audio.go | 347 + common/body_storage.go | 377 + common/body_storage_test.go | 37 + common/constants.go | 266 + common/copy.go | 32 + common/crypto.go | 36 + common/custom-event.go | 84 + common/database.go | 64 + common/disk_cache.go | 176 + common/disk_cache_config.go | 177 + common/email-outlook-auth.go | 40 + common/email.go | 136 + common/email_ntlm_auth.go | 83 + common/email_test.go | 563 ++ common/embed-file-system.go | 43 + common/endpoint_defaults.go | 35 + common/endpoint_type.go | 60 + common/env.go | 38 + common/etag.go | 50 + common/gin.go | 384 + common/go-channel.go | 53 + common/gopool.go | 25 + common/hash.go | 34 + common/init.go | 238 + common/ip.go | 51 + common/json.go | 83 + common/json_test.go | 236 + common/limiter/limiter.go | 90 + common/limiter/lua/rate_limit.lua | 44 + common/model.go | 59 + common/node_identity.go | 33 + common/page_info.go | 82 + common/password_crypto.go | 157 + common/performance_config.go | 33 + common/pprof.go | 45 + common/proxy_url.go | 77 + common/pyro.go | 56 + common/quota.go | 5 + common/quota_math.go | 175 + common/quota_math_test.go | 146 + common/rate-limit.go | 70 + common/redis.go | 327 + common/request_body_limit.go | 13 + common/session_cookie.go | 84 + common/ssrf_protection.go | 387 + common/ssrf_protection_test.go | 59 + common/str.go | 140 + common/sys_log.go | 70 + common/system_monitor.go | 81 + common/system_monitor_unix.go | 37 + common/system_monitor_windows.go | 50 + common/topup-ratio.go | 41 + common/totp.go | 150 + common/trusted_proxies.go | 54 + common/url_validator.go | 39 + common/url_validator_test.go | 221 + common/user_session_test.go | 60 + common/utils.go | 351 + common/validate.go | 9 + common/verification.go | 78 + constant/README.md | 26 + constant/api_type.go | 43 + constant/azure.go | 5 + constant/cache_key.go | 14 + constant/channel.go | 228 + constant/channel_test.go | 12 + constant/context_key.go | 82 + constant/endpoint_type.go | 20 + constant/env.go | 32 + constant/finish_reason.go | 12 + constant/midjourney.go | 48 + constant/multi_key_mode.go | 8 + constant/setup.go | 3 + constant/task.go | 37 + constant/task_test.go | 27 + constant/waffo_pay_method.go | 16 + controller/access_token.go | 113 + controller/access_token_audit_test.go | 851 ++ controller/audit.go | 162 + controller/auth_flow_test.go | 818 ++ controller/auth_session.go | 197 + controller/auth_session_test.go | 155 + controller/authz.go | 24 + controller/billing.go | 108 + controller/billing_option_test.go | 203 + controller/channel-billing.go | 620 ++ controller/channel-test.go | 1160 +++ controller/channel.go | 2262 +++++ controller/channel_affinity_cache.go | 88 + controller/channel_authz.go | 136 + controller/channel_authz_test.go | 204 + controller/channel_pin_retry_test.go | 95 + controller/channel_task_plugin_bind_test.go | 166 + .../channel_task_plugin_validation_test.go | 69 + controller/channel_test_internal_test.go | 468 ++ controller/channel_test_request_test.go | 236 + controller/channel_upstream_update.go | 1142 +++ controller/channel_upstream_update_test.go | 606 ++ controller/checkin.go | 72 + controller/codex_usage.go | 165 + controller/custom_oauth.go | 606 ++ controller/deployment.go | 807 ++ controller/email_binding.go | 112 + controller/group.go | 63 + controller/group_availability_test.go | 85 + controller/image.go | 9 + controller/log.go | 156 + controller/login_verification.go | 151 + controller/midjourney.go | 329 + controller/misc.go | 313 + controller/misc_oidc_test.go | 60 + controller/missing_models.go | 28 + controller/model.go | 373 + controller/model_list_test.go | 531 ++ controller/model_management_test.go | 1136 +++ controller/model_meta.go | 337 + controller/model_owned_by_test.go | 118 + controller/model_pricing_config.go | 43 + controller/model_sync.go | 452 + controller/oauth.go | 589 ++ controller/option.go | 431 + controller/option_claude_test.go | 34 + controller/option_gemini_test.go | 34 + controller/passkey.go | 648 ++ controller/passkey_test.go | 72 + controller/payment_compliance.go | 82 + controller/payment_webhook_availability.go | 110 + .../payment_webhook_availability_test.go | 169 + controller/perf_metrics.go | 82 + controller/performance.go | 385 + controller/playground.go | 56 + controller/plugin_endpoint_test.go | 47 + controller/plugin_native_e2e_test.go | 244 + controller/plugin_protocol.go | 1276 +++ controller/plugin_protocol_limiter.go | 157 + controller/plugin_protocol_limiter_test.go | 248 + controller/plugin_protocol_sdk_test.go | 305 + controller/plugin_protocol_test.go | 1581 ++++ controller/prefill_group.go | 90 + controller/pricing.go | 134 + controller/rankings.go | 24 + controller/ratio_config.go | 26 + controller/ratio_sync.go | 1149 +++ controller/ratio_sync_test.go | 142 + controller/redemption.go | 238 + controller/redemption_batch_test.go | 201 + controller/relay.go | 934 +++ controller/relay_client_error_test.go | 45 + controller/relay_count_tokens_test.go | 73 + controller/relay_error_log_test.go | 99 + controller/relay_log_privacy_test.go | 16 + controller/relay_task_plugin_test.go | 389 + controller/request_status_test.go | 44 + controller/return_path.go | 12 + controller/return_path_test.go | 25 + controller/revalidated_response.go | 54 + controller/secure_verification.go | 136 + controller/security_account_test.go | 847 ++ controller/security_enrollment_test.go | 1642 ++++ controller/setup.go | 174 + controller/subscription.go | 547 ++ controller/subscription_payment_creem.go | 136 + controller/subscription_payment_epay.go | 220 + controller/subscription_payment_stripe.go | 142 + .../subscription_payment_waffo_pancake.go | 130 + controller/system_info.go | 65 + controller/system_task.go | 117 + controller/system_task_handlers.go | 163 + controller/task.go | 478 ++ controller/task_generic_test.go | 590 ++ controller/task_log_view_test.go | 137 + controller/task_plugin.go | 835 ++ controller/task_plugin_debug.go | 269 + controller/task_plugin_debug_test.go | 88 + controller/task_plugin_test.go | 1235 +++ controller/telegram.go | 17 + controller/telegram_test.go | 464 + controller/theme_compat_test.go | 47 + controller/token.go | 570 ++ controller/token_auto_groups_test.go | 281 + controller/token_test.go | 894 ++ controller/topup.go | 586 ++ controller/topup_creem.go | 466 ++ controller/topup_quota_limit_test.go | 203 + controller/topup_stripe.go | 451 + controller/topup_waffo.go | 434 + controller/topup_waffo_pancake.go | 534 ++ controller/topup_waffo_pancake_test.go | 90 + controller/twofa.go | 245 + controller/uptime_kuma.go | 294 + controller/uptime_kuma_test.go | 41 + controller/usedata.go | 131 + controller/usedata_flow_test.go | 135 + controller/user.go | 1422 ++++ controller/user_manage_test.go | 608 ++ controller/user_quota.go | 84 + controller/vendor_meta.go | 138 + controller/video_proxy.go | 621 ++ controller/wechat.go | 200 + docker-compose.dev.yml | 78 + docker-compose.yml | 129 + docs/authentication.md | 176 + docs/channel/other_setting.md | 41 + docs/images/aionui.png | Bin 0 -> 7263 bytes docs/images/aliyun.png | Bin 0 -> 5102 bytes docs/images/cherry-studio.png | Bin 0 -> 11339 bytes docs/images/io-net.png | Bin 0 -> 2016 bytes docs/images/pku.png | Bin 0 -> 12247 bytes docs/images/ucloud.png | Bin 0 -> 11630 bytes docs/installation/BT.md | 151 + docs/ionet-client.md | 7 + docs/openapi/api.json | 7438 +++++++++++++++++ docs/openapi/relay.json | 6568 +++++++++++++++ docs/plugin-api/README.md | 138 + docs/plugin-api/v1.d.ts | 51 + docs/plugin-api/v1.md | 226 + docs/plugin-api/v1.schema.json | 114 + docs/translation-glossary.fr.md | 107 + docs/translation-glossary.md | 86 + docs/translation-glossary.ru.md | 107 + dto/channel_constraints.go | 115 + dto/channel_constraints_test.go | 46 + dto/midjourney.go | 107 + dto/plugin_protocol.go | 82 + dto/suno.go | 97 + dto/task.go | 91 + dto/task_plugin.go | 23 + dto/video.go | 47 + e2e/doc_parse_test.go | 148 + electron/README.md | 81 + electron/build.sh | 42 + electron/create-tray-icon.js | 60 + electron/entitlements.mac.plist | 18 + electron/icon.png | Bin 0 -> 31262 bytes electron/main.js | 590 ++ electron/package-lock.json | 4067 +++++++++ electron/package.json | 157 + electron/preload.js | 18 + electron/tray-icon-windows.png | Bin 0 -> 1203 bytes electron/tray-iconTemplate.png | Bin 0 -> 459 bytes electron/tray-iconTemplate@2x.png | Bin 0 -> 754 bytes go.mod | 179 + go.sum | 3194 +++++++ i18n/i18n.go | 231 + i18n/keys.go | 339 + i18n/locales/en.yaml | 286 + i18n/locales/zh-CN.yaml | 287 + i18n/locales/zh-TW.yaml | 287 + logger/logger.go | 189 + main.go | 379 + makefile | 73 + middleware/audit.go | 306 + middleware/auth.go | 545 ++ middleware/auth_origin.go | 76 + middleware/auth_origin_test.go | 135 + middleware/auth_test.go | 257 + middleware/body_cleanup.go | 22 + middleware/cache.go | 17 + middleware/cors.go | 23 + middleware/disable-cache.go | 12 + middleware/distributor.go | 735 ++ middleware/distributor_test.go | 202 + middleware/email-verification-rate-limit.go | 72 + middleware/gzip.go | 97 + middleware/header_nav.go | 135 + middleware/header_nav_test.go | 189 + middleware/i18n.go | 50 + middleware/logger.go | 48 + middleware/model-rate-limit.go | 224 + middleware/model_rate_limit_test.go | 34 + middleware/performance.go | 71 + middleware/rate-limit.go | 254 + middleware/rate_limit_test.go | 225 + middleware/recover.go | 29 + middleware/request-id.go | 19 + middleware/request_body_limit.go | 47 + middleware/secure_verification.go | 86 + middleware/stats.go | 41 + middleware/task_artifact_access.go | 245 + middleware/task_artifact_access_test.go | 158 + middleware/task_plugin.go | 1460 ++++ middleware/task_plugin_model.go | 45 + middleware/task_plugin_origin_task_test.go | 500 ++ middleware/task_plugin_test.go | 1700 ++++ middleware/token_auto_groups_context_test.go | 48 + middleware/trusted_proxies.go | 20 + middleware/trusted_proxies_test.go | 127 + middleware/turnstile-check.go | 64 + middleware/utils.go | 46 + model/ability.go | 432 + model/ability_group_test.go | 31 + model/account_security.go | 151 + model/audit_log.go | 269 + model/audit_other.go | 95 + model/auth_flow.go | 288 + model/auth_flow_test.go | 109 + model/authz_role.go | 17 + model/casbin_rule.go | 16 + model/channel.go | 1170 +++ model/channel_cache.go | 309 + model/channel_constraint.go | 108 + model/channel_constraint_test.go | 218 + model/channel_satisfy.go | 68 + model/channel_settings_test.go | 100 + model/channel_status_test.go | 102 + model/checkin.go | 179 + model/clickhouse_log_test.go | 154 + model/custom_oauth_provider.go | 250 + model/db_time.go | 22 + model/email_binding.go | 205 + model/errors.go | 30 + model/external_identity_claim.go | 135 + model/external_identity_claim_test.go | 91 + model/frontend_option_migration.go | 239 + model/frontend_option_migration_test.go | 180 + model/gorm_logger.go | 91 + model/gorm_logger_test.go | 108 + model/group_status.go | 119 + model/group_status_test.go | 92 + model/json_column_test.go | 94 + model/locking.go | 25 + model/locking_test.go | 38 + model/log.go | 739 ++ model/log_format_test.go | 244 + model/log_other.go | 263 + model/log_other_test.go | 84 + model/login_verification.go | 89 + model/main.go | 827 ++ model/midjourney.go | 249 + model/migration_dialector.go | 71 + model/migration_dialector_test.go | 177 + model/missing_models.go | 30 + model/model_extra.go | 31 + model/model_meta.go | 547 ++ model/model_metadata_sync.go | 278 + model/model_owner_test.go | 141 + model/model_pricing_config.go | 379 + model/option.go | 663 ++ model/option_auto_group_test.go | 17 + model/option_task_plugin_test.go | 76 + model/passkey.go | 274 + model/password_crypto.go | 60 + model/payment_method_guard_test.go | 355 + model/perf_metric.go | 130 + model/prefill_group.go | 129 + model/prefill_group_migration.go | 214 + model/prefill_group_migration_test.go | 303 + model/pricing.go | 435 + model/pricing_default.go | 159 + model/pricing_endpoint_test.go | 294 + model/pricing_refresh.go | 14 + model/pricing_usage_schema_test.go | 141 + model/quota_reserve.go | 240 + model/quota_reserve_test.go | 261 + model/redemption.go | 255 + model/redemption_test.go | 210 + model/setup.go | 16 + model/subscription.go | 1531 ++++ model/subscription_auth_test.go | 150 + model/subscription_reset_test.go | 201 + model/system_instance.go | 123 + model/system_task.go | 480 ++ model/system_task_test.go | 383 + model/task.go | 635 ++ model/task_cas_test.go | 348 + model/task_model_alias.go | 212 + model/task_openai_video_test.go | 93 + model/task_plugin.go | 251 + model/task_plugin_channel_select_test.go | 58 + model/task_plugin_test.go | 168 + model/token.go | 515 ++ model/token_auto_groups_cache_test.go | 68 + model/token_cache.go | 107 + model/token_migration.go | 217 + model/token_migration_test.go | 295 + model/topup.go | 714 ++ model/twofa.go | 358 + model/twofa_enrollment.go | 114 + model/usedata.go | 183 + model/usedata_flow.go | 178 + model/usedata_flow_test.go | 193 + model/usedata_rankings.go | 66 + model/user.go | 1544 ++++ model/user_auth_cache.go | 277 + model/user_authentication_test.go | 323 + model/user_cache.go | 278 + model/user_cache_auth_version_test.go | 223 + model/user_oauth_binding.go | 146 + model/user_pagination_test.go | 66 + model/user_quota_adjustment.go | 87 + model/user_session.go | 872 ++ model/user_session_migration_test.go | 157 + model/user_session_test.go | 655 ++ model/user_update_test.go | 400 + model/utils.go | 140 + model/vendor_management.go | 248 + model/vendor_meta.go | 135 + new-api.service | 18 + oauth/discord.go | 175 + oauth/generic.go | 674 ++ oauth/github.go | 181 + oauth/linuxdo.go | 198 + oauth/oidc.go | 180 + oauth/oidc_test.go | 22 + oauth/provider.go | 42 + oauth/registry.go | 156 + oauth/telegram.go | 202 + oauth/types.go | 69 + pkg/billingexpr/billingexpr_test.go | 1065 +++ pkg/billingexpr/compile.go | 331 + pkg/billingexpr/compile_usage_test.go | 21 + pkg/billingexpr/expr.md | 353 + pkg/billingexpr/round.go | 19 + pkg/billingexpr/run.go | 166 + pkg/billingexpr/settle.go | 42 + pkg/billingexpr/settle_clamp_test.go | 52 + pkg/billingexpr/task_usage_test.go | 19 + pkg/billingexpr/types.go | 85 + pkg/cachex/codec.go | 53 + pkg/cachex/hybrid_cache.go | 285 + pkg/cachex/namespace.go | 38 + pkg/ionet/client.go | 219 + pkg/ionet/container.go | 302 + pkg/ionet/deployment.go | 377 + pkg/ionet/hardware.go | 202 + pkg/ionet/jsonutil.go | 96 + pkg/ionet/types.go | 353 + pkg/jsplugin/cli.go | 92 + pkg/jsplugin/cli_test.go | 57 + pkg/jsplugin/engine.go | 574 ++ pkg/jsplugin/engine_test.go | 375 + pkg/jsplugin/fixture.go | 116 + pkg/jsplugin/fixture_test.go | 49 + pkg/jsplugin/icon.go | 126 + pkg/jsplugin/model_fold.go | 26 + pkg/jsplugin/protocol_supports_test.go | 245 + pkg/jsplugin/registry.go | 1901 +++++ .../registry_disabled_factory_test.go | 105 + pkg/jsplugin/registry_master_enabled_test.go | 141 + pkg/jsplugin/registry_test.go | 1060 +++ pkg/jsplugin/request.go | 43 + pkg/jsplugin/routing.go | 963 +++ pkg/jsplugin/routing_test.go | 1026 +++ pkg/jsplugin/utils.go | 139 + pkg/perf_metrics/flush.go | 98 + pkg/perf_metrics/group_test.go | 18 + pkg/perf_metrics/metrics.go | 465 ++ pkg/perf_metrics/types.go | 159 + plugins/.oxfmtrc.json | 11 + plugins/.oxlintrc.json | 22 + plugins/alibaba_responses_test.go | 252 + plugins/alibaba_wan3_test.go | 139 + plugins/builtin_plugins_test.go | 157 + plugins/doubao_responses_test.go | 31 + plugins/embed.go | 70 + plugins/google_responses_test.go | 30 + plugins/hailuo_responses_test.go | 557 ++ plugins/jimeng_responses_test.go | 92 + plugins/kling_responses_test.go | 31 + plugins/sora_responses_test.go | 25 + plugins/sunoapi_responses_test.go | 247 + plugins/tasks/alibaba/plugin.js | 505 ++ plugins/tasks/doubao/plugin.js | 502 ++ plugins/tasks/google/plugin.js | 382 + plugins/tasks/hailuo/plugin.js | 716 ++ plugins/tasks/jimeng/plugin.js | 562 ++ plugins/tasks/kling/plugin.js | 477 ++ plugins/tasks/sora/plugin.js | 314 + plugins/tasks/sunoapi/plugin.js | 351 + plugins/tasks/vertex-ai/plugin.js | 396 + plugins/tasks/vidu/plugin.js | 452 + plugins/veo_poll_test.go | 61 + plugins/vertex_ai_responses_test.go | 203 + plugins/video_responses_test_helpers_test.go | 244 + plugins/vidu_responses_test.go | 31 + relay/alpha_search_handler.go | 138 + relay/alpha_search_handler_test.go | 47 + relay/audio_handler.go | 77 + relay/channel/adapter.go | 135 + relay/channel/advancedcustom/adaptor.go | 575 ++ relay/channel/advancedcustom/adaptor_test.go | 863 ++ relay/channel/ai360/constants.go | 5 + relay/channel/ali/adaptor.go | 277 + relay/channel/ali/adaptor_test.go | 248 + relay/channel/ali/constants.go | 14 + relay/channel/ali/dto.go | 236 + relay/channel/ali/image.go | 351 + relay/channel/ali/image_wan.go | 49 + relay/channel/ali/rerank.go | 75 + relay/channel/ali/text.go | 36 + relay/channel/ali/text_test.go | 59 + relay/channel/api_request.go | 596 ++ relay/channel/api_request_getbody_test.go | 593 ++ relay/channel/api_request_redirect_test.go | 88 + relay/channel/api_request_test.go | 207 + relay/channel/aws/adaptor.go | 192 + relay/channel/aws/constants.go | 161 + relay/channel/aws/dto.go | 146 + relay/channel/aws/relay-aws.go | 371 + relay/channel/aws/relay_aws_test.go | 452 + relay/channel/baidu/adaptor.go | 169 + relay/channel/baidu/constants.go | 22 + relay/channel/baidu/dto.go | 80 + relay/channel/baidu/relay-baidu.go | 246 + relay/channel/baidu_v2/adaptor.go | 130 + relay/channel/baidu_v2/constants.go | 29 + relay/channel/claude/adaptor.go | 172 + relay/channel/claude/adaptor_test.go | 225 + relay/channel/claude/constants.go | 45 + relay/channel/claude/dto.go | 95 + .../claude/message_delta_usage_patch_test.go | 129 + relay/channel/claude/relay-claude.go | 415 + relay/channel/claude/relay_claude_test.go | 402 + relay/channel/claude/relay_responses.go | 180 + relay/channel/claude/tool_billing_test.go | 76 + relay/channel/cloudflare/adaptor.go | 135 + relay/channel/cloudflare/constant.go | 39 + relay/channel/cloudflare/dto.go | 21 + relay/channel/cloudflare/relay_cloudflare.go | 148 + relay/channel/codex/adaptor.go | 200 + relay/channel/codex/adaptor_test.go | 56 + relay/channel/codex/constants.go | 14 + relay/channel/codex/oauth_key.go | 30 + relay/channel/cohere/adaptor.go | 99 + relay/channel/cohere/constant.go | 12 + relay/channel/cohere/dto.go | 60 + relay/channel/cohere/relay-cohere.go | 253 + relay/channel/coze/adaptor.go | 139 + relay/channel/coze/constants.go | 30 + relay/channel/coze/dto.go | 78 + relay/channel/coze/relay-coze.go | 292 + relay/channel/deepseek/adaptor.go | 223 + relay/channel/deepseek/constants.go | 9 + relay/channel/dify/adaptor.go | 119 + relay/channel/dify/constants.go | 5 + relay/channel/dify/dto.go | 47 + relay/channel/dify/relay-dify.go | 301 + relay/channel/gemini/adaptor.go | 290 + .../channel/gemini/adaptor_responses_test.go | 176 + relay/channel/gemini/constant.go | 44 + relay/channel/gemini/relay-gemini-native.go | 94 + relay/channel/gemini/relay-gemini.go | 611 ++ .../channel/gemini/relay_gemini_usage_test.go | 641 ++ relay/channel/gemini/relay_responses.go | 201 + relay/channel/gemini/relay_responses_test.go | 205 + relay/channel/jimeng/adaptor.go | 144 + relay/channel/jimeng/constants.go | 9 + relay/channel/jimeng/image.go | 90 + relay/channel/jimeng/sign.go | 177 + relay/channel/jina/adaptor.go | 98 + relay/channel/jina/constant.go | 9 + relay/channel/jina/relay-jina.go | 1 + relay/channel/lingyiwanwu/constrants.go | 9 + relay/channel/minimax/adaptor.go | 147 + relay/channel/minimax/adaptor_test.go | 137 + relay/channel/minimax/constants.go | 28 + relay/channel/minimax/image.go | 213 + relay/channel/minimax/relay-minimax.go | 32 + relay/channel/minimax/tts.go | 198 + relay/channel/mistral/adaptor.go | 93 + relay/channel/mistral/constants.go | 12 + relay/channel/mistral/text.go | 83 + relay/channel/mokaai/adaptor.go | 111 + relay/channel/mokaai/constants.go | 9 + relay/channel/mokaai/relay-mokaai.go | 84 + relay/channel/moonshot/adaptor.go | 135 + relay/channel/moonshot/adaptor_test.go | 68 + relay/channel/moonshot/constants.go | 12 + relay/channel/newapi/adaptor.go | 121 + relay/channel/newapi/constants.go | 6 + relay/channel/ollama/adaptor.go | 134 + relay/channel/ollama/constants.go | 7 + relay/channel/ollama/dto.go | 108 + relay/channel/ollama/relay-ollama.go | 575 ++ relay/channel/ollama/stream.go | 346 + relay/channel/ollama/stream_test.go | 99 + relay/channel/openai/adaptor.go | 813 ++ relay/channel/openai/audio.go | 149 + relay/channel/openai/chat_via_responses.go | 319 + .../channel/openai/chat_via_responses_test.go | 280 + relay/channel/openai/constant.go | 79 + relay/channel/openai/helper.go | 269 + relay/channel/openai/image_edit_test.go | 98 + relay/channel/openai/image_stream_test.go | 449 + relay/channel/openai/relay-openai.go | 357 + relay/channel/openai/relay_image.go | 333 + relay/channel/openai/relay_realtime.go | 242 + relay/channel/openai/relay_responses.go | 162 + .../openai/relay_responses_billing_test.go | 267 + .../channel/openai/relay_responses_compact.go | 45 + relay/channel/openai/responses_via_chat.go | 195 + .../openai/stream_tool_billing_test.go | 27 + relay/channel/openai/usage.go | 133 + relay/channel/openrouter/constant.go | 5 + relay/channel/openrouter/dto.go | 17 + relay/channel/palm/adaptor.go | 96 + relay/channel/palm/constants.go | 7 + relay/channel/palm/dto.go | 38 + relay/channel/palm/relay-palm.go | 134 + relay/channel/perplexity/adaptor.go | 98 + relay/channel/perplexity/constants.go | 8 + relay/channel/perplexity/relay-perplexity.go | 32 + relay/channel/replicate/adaptor.go | 531 ++ relay/channel/replicate/constants.go | 12 + relay/channel/replicate/dto.go | 19 + relay/channel/siliconflow/adaptor.go | 130 + relay/channel/siliconflow/constant.go | 51 + relay/channel/siliconflow/dto.go | 32 + .../channel/siliconflow/relay-siliconflow.go | 45 + relay/channel/sub2api/adaptor.go | 17 + relay/channel/sub2api/adaptor_test.go | 85 + relay/channel/sub2api/constants.go | 6 + relay/channel/submodel/adaptor.go | 87 + relay/channel/submodel/constants.go | 16 + relay/channel/task/jsplugin/adaptor.go | 1585 ++++ relay/channel/task/jsplugin/adaptor_test.go | 1415 ++++ relay/channel/task/jsplugin/auth.go | 45 + relay/channel/task/jsplugin/auth_test.go | 77 + relay/channel/task/taskcommon/helpers.go | 97 + relay/channel/tencent/adaptor.go | 118 + relay/channel/tencent/constants.go | 10 + relay/channel/tencent/dispatch.go | 37 + relay/channel/tencent/dispatch_test.go | 72 + relay/channel/tencent/dto.go | 75 + relay/channel/tencent/relay-tencent.go | 234 + relay/channel/vertex/adaptor.go | 385 + relay/channel/vertex/constants.go | 15 + relay/channel/vertex/dto.go | 42 + relay/channel/vertex/relay-vertex.go | 22 + relay/channel/vertex/service_account.go | 177 + relay/channel/vertex/url_builder.go | 86 + relay/channel/volcengine/adaptor.go | 403 + relay/channel/volcengine/constants.go | 19 + relay/channel/volcengine/protocols.go | 533 ++ relay/channel/volcengine/tts.go | 305 + relay/channel/xai/adaptor.go | 142 + relay/channel/xai/constants.go | 32 + relay/channel/xai/dto.go | 27 + relay/channel/xai/text.go | 106 + relay/channel/xinference/constant.go | 8 + relay/channel/xinference/dto.go | 11 + relay/channel/xunfei/adaptor.go | 104 + relay/channel/xunfei/constants.go | 12 + relay/channel/xunfei/dto.go | 59 + relay/channel/xunfei/relay-xunfei.go | 292 + relay/channel/zhipu/adaptor.go | 102 + relay/channel/zhipu/constants.go | 7 + relay/channel/zhipu/dto.go | 47 + relay/channel/zhipu/relay-zhipu.go | 251 + relay/channel/zhipu_4v/adaptor.go | 135 + relay/channel/zhipu_4v/constants.go | 7 + relay/channel/zhipu_4v/dto.go | 61 + relay/channel/zhipu_4v/image.go | 127 + relay/channel/zhipu_4v/relay-zhipu_v4.go | 60 + relay/chat_completions_via_responses.go | 204 + relay/chat_completions_via_responses_test.go | 225 + relay/claude_handler.go | 157 + relay/common/billing.go | 24 + relay/common/conversion_diagnostics.go | 71 + relay/common/outbound_body.go | 31 + relay/common/outbound_body_test.go | 162 + relay/common/override.go | 2230 +++++ relay/common/override_test.go | 2525 ++++++ relay/common/relay_info.go | 1184 +++ .../common/relay_info_gemini_settings_test.go | 25 + relay/common/relay_info_test.go | 287 + relay/common/relay_utils.go | 313 + relay/common/relay_utils_test.go | 142 + relay/common/request_conversion.go | 23 + relay/common/stream_status.go | 112 + relay/common/stream_status_test.go | 182 + relay/common/tool_usage.go | 194 + relay/common/tool_usage_test.go | 348 + relay/common_handler/rerank.go | 74 + relay/compatible_handler.go | 187 + relay/constant/relay_mode.go | 137 + relay/constant/relay_mode_test.go | 22 + relay/convert_request_error.go | 23 + relay/convert_request_error_test.go | 98 + relay/embedding_handler.go | 93 + relay/gemini_handler.go | 260 + relay/helper/billing_expr_request.go | 90 + relay/helper/billing_expr_request_test.go | 63 + relay/helper/common.go | 227 + relay/helper/group_price_test.go | 51 + relay/helper/max_tokens_bounds_test.go | 72 + relay/helper/model_mapped.go | 69 + relay/helper/model_modifier.go | 278 + relay/helper/openai_image_request_test.go | 160 + relay/helper/price.go | 390 + relay/helper/price_test.go | 656 ++ relay/helper/reasoning_suffix.go | 231 + relay/helper/reasoning_suffix_test.go | 588 ++ relay/helper/stream_result.go | 52 + relay/helper/stream_scanner.go | 310 + relay/helper/stream_scanner_test.go | 573 ++ relay/helper/valid_request.go | 406 + relay/image_handler.go | 151 + relay/mjproxy_handler.go | 701 ++ relay/param_override_error.go | 13 + relay/plugin_protocol.go | 1074 +++ relay/plugin_protocol_test.go | 562 ++ relay/relay_adaptor.go | 235 + relay/relay_adaptor_jsplugin_test.go | 98 + relay/relay_task.go | 643 ++ relay/relay_task_test.go | 232 + relay/request_clone_test.go | 306 + relay/rerank_handler.go | 105 + relay/responses_handler.go | 174 + relay/task_platform_error_test.go | 36 + relay/task_platform_test.go | 18 + relay/websocket.go | 46 + relaykit/README.md | 253 + relaykit/dto/alpha_search_request.go | 38 + relaykit/dto/audio.go | 76 + relaykit/dto/billing_usage.go | 448 + relaykit/dto/billing_usage_test.go | 121 + relaykit/dto/channel_settings.go | 613 ++ relaykit/dto/channel_settings_test.go | 656 ++ relaykit/dto/claude.go | 622 ++ relaykit/dto/embedding.go | 87 + relaykit/dto/error.go | 93 + relaykit/dto/gemini.go | 652 ++ relaykit/dto/gemini_generation_config_test.go | 89 + relaykit/dto/gemini_isstream_test.go | 68 + relaykit/dto/gemini_response_test.go | 34 + relaykit/dto/notify.go | 25 + relaykit/dto/openai_compaction.go | 20 + relaykit/dto/openai_image.go | 192 + relaykit/dto/openai_request.go | 1235 +++ .../dto/openai_request_zero_value_test.go | 309 + relaykit/dto/openai_response.go | 578 ++ .../openai_responses_compaction_request.go | 50 + relaykit/dto/openai_video.go | 53 + relaykit/dto/playground.go | 6 + relaykit/dto/pricing.go | 35 + relaykit/dto/ratio_sync.go | 39 + relaykit/dto/realtime.go | 88 + relaykit/dto/reasoning_state.go | 14 + relaykit/dto/request_common.go | 25 + relaykit/dto/rerank.go | 67 + relaykit/dto/sensitive.go | 6 + relaykit/dto/usage_merge.go | 307 + relaykit/dto/usage_merge_test.go | 234 + relaykit/dto/user_settings.go | 26 + relaykit/dto/values.go | 79 + relaykit/go.mod | 23 + relaykit/go.sum | 38 + relaykit/reasonmap/reasonmap.go | 46 + relaykit/relayconvert/boundary_test.go | 100 + .../claude_default_max_tokens_test.go | 210 + relaykit/relayconvert/convmeta/format.go | 31 + relaykit/relayconvert/convmeta/meta.go | 249 + relaykit/relayconvert/convmeta/meta_test.go | 39 + relaykit/relayconvert/convmeta/options.go | 109 + relaykit/relayconvert/golden_test.go | 464 + .../internal/claude_messages/citations.go | 58 + .../stream_billing_usage_test.go | 66 + .../claude_messages/to_oai_chat_req.go | 239 + .../claude_messages/to_oai_chat_resp.go | 564 ++ .../to_oai_responses_hosted_stream.go | 194 + .../claude_messages/to_oai_responses_req.go | 326 + .../internal/convdiag/collector.go | 56 + .../internal/gemini_chat/grounding.go | 367 + .../internal/gemini_chat/to_oai_chat_req.go | 300 + .../internal/gemini_chat/to_oai_chat_resp.go | 739 ++ .../to_oai_responses_hosted_stream.go | 71 + .../internal/jsonutil/stringify.go | 15 + relaykit/relayconvert/internal/media/media.go | 46 + .../internal/oai_chat/citations.go | 81 + .../oai_chat/to_claude_messages_req.go | 324 + .../oai_chat/to_claude_messages_req_test.go | 81 + .../oai_chat/to_claude_messages_resp.go | 503 ++ .../oai_chat/to_claude_messages_resp_test.go | 424 + .../internal/oai_chat/to_gemini_chat_req.go | 379 + .../internal/oai_chat/to_gemini_chat_resp.go | 558 ++ .../oai_chat/to_gemini_chat_resp_test.go | 112 + .../internal/oai_chat/to_oai_responses_req.go | 424 + .../oai_chat/to_oai_responses_req_test.go | 177 + .../oai_chat/to_oai_responses_resp.go | 269 + .../oai_chat/to_oai_responses_resp_test.go | 161 + .../oai_chat/to_oai_responses_stream_resp.go | 862 ++ .../internal/oai_responses/req_helpers.go | 263 + .../oai_responses/to_claude_messages_req.go | 304 + .../oai_responses/to_claude_messages_resp.go | 156 + .../to_claude_messages_stream_resp.go | 500 ++ .../to_claude_messages_stream_resp_test.go | 130 + .../oai_responses/to_gemini_chat_req.go | 331 + .../to_gemini_chat_req_preprocess.go | 101 + .../internal/oai_responses/to_oai_chat_req.go | 577 ++ .../oai_responses/to_oai_chat_req_test.go | 358 + .../oai_responses/to_oai_chat_resp.go | 399 + .../oai_responses/to_oai_chat_resp_test.go | 547 ++ .../oai_responses/to_oai_chat_stream_resp.go | 934 +++ .../internal/shared/claude/cache.go | 9 + .../internal/shared/claude/errors.go | 10 + .../internal/shared/claude/reasoning.go | 168 + .../internal/shared/claude/schema.go | 16 + .../internal/shared/claude/tool_choice.go | 46 + .../internal/shared/claude/usage.go | 52 + .../internal/shared/gemini/request.go | 250 + .../internal/shared/gemini/schema.go | 256 + .../relayconvert/internal/toolconv/decode.go | 997 +++ .../relayconvert/internal/toolconv/encode.go | 1343 +++ .../internal/toolconv/hosted_values.go | 171 + .../relayconvert/internal/toolconv/model.go | 118 + .../internal/toolconv/policy_test.go | 103 + .../internal/toolconv/response.go | 515 ++ .../internal/toolconv/response_artifacts.go | 816 ++ relaykit/relayconvert/kitutil/json.go | 135 + relaykit/relayconvert/kitutil/json_test.go | 83 + relaykit/relayconvert/kitutil/log.go | 65 + relaykit/relayconvert/kitutil/log_test.go | 31 + relaykit/relayconvert/kitutil/mask.go | 131 + relaykit/relayconvert/kitutil/value.go | 52 + relaykit/relayconvert/media.go | 9 + relaykit/relayconvert/reasoning/claude.go | 366 + relaykit/relayconvert/reasoning/gemini.go | 374 + relaykit/relayconvert/reasoning/intent.go | 599 ++ .../relayconvert/reasoning/intent_test.go | 172 + relaykit/relayconvert/reasoning/suffix.go | 282 + .../relayconvert/reasoning/suffix_test.go | 192 + relaykit/relayconvert/request_compat.go | 73 + relaykit/relayconvert/request_registry.go | 543 ++ .../relayconvert/request_registry_test.go | 711 ++ relaykit/relayconvert/response_compat.go | 210 + relaykit/relayconvert/response_registry.go | 1319 +++ .../relayconvert/response_registry_test.go | 701 ++ relaykit/relayconvert/safety_settings_test.go | 94 + relaykit/relayconvert/terminal_stream_test.go | 445 + .../openai_responses_to_claude.golden.json | 70 + .../openai_responses_to_openai.golden.json | 63 + .../request/openai_to_claude.golden.json | 81 + .../openai_to_openai_responses.golden.json | 59 + .../response/claude_to_openai.golden.json | 64 + .../claude_to_openai_responses.golden.json | 92 + .../response/gemini_to_claude.golden.json | 44 + .../response/gemini_to_openai.golden.json | 63 + .../gemini_to_openai_responses.golden.json | 91 + .../openai_responses_to_claude.golden.json | 59 + .../openai_responses_to_openai.golden.json | 75 + .../openai_to_openai_responses.golden.json | 117 + .../stream/claude_to_gemini.golden.json | 68 + .../stream/claude_to_openai.golden.json | 181 + .../claude_to_openai_responses.golden.json | 204 + .../stream/gemini_to_claude.golden.json | 82 + .../stream/gemini_to_openai.golden.json | 186 + .../gemini_to_openai_responses.golden.json | 226 + .../openai_responses_to_claude.golden.json | 141 + .../openai_responses_to_gemini.golden.json | 132 + .../openai_responses_to_openai.golden.json | 123 + .../stream/openai_to_claude.golden.json | 141 + .../stream/openai_to_gemini.golden.json | 158 + .../openai_to_openai_responses.golden.json | 238 + .../relayconvert/text_converter_registry.go | 378 + .../text_converter_registry_test.go | 135 + .../relayconvert/tool_loss_policy_test.go | 91 + relaykit/types/channel_error.go | 21 + relaykit/types/conversion.go | 75 + relaykit/types/endpoint_type.go | 30 + relaykit/types/error.go | 417 + relaykit/types/file_data.go | 8 + relaykit/types/file_source.go | 232 + relaykit/types/relay_format.go | 20 + relaykit/types/request_meta.go | 84 + router/api-router.go | 424 + router/authz-router.go | 19 + router/channel-router.go | 79 + router/channel_router_test.go | 50 + router/dashboard.go | 23 + router/main.go | 41 + router/plugin-router.go | 585 ++ router/plugin_router_test.go | 917 ++ router/relay-router.go | 218 + router/relay_router_test.go | 126 + router/task-plugin-protocol-router.go | 52 + router/task-router.go | 37 + router/task_plugin_options_router_test.go | 55 + router/task_plugin_protocol_router_test.go | 31 + router/task_router_test.go | 52 + router/video-router.go | 33 + router/video_router_test.go | 151 + router/web-router.go | 42 + service/account_security.go | 41 + service/audio.go | 48 + service/auth_cleanup.go | 51 + service/auth_session.go | 476 ++ service/auth_session_test.go | 431 + service/auth_token.go | 205 + service/auth_token_test.go | 162 + service/authz/adapter.go | 121 + service/authz/assignment.go | 20 + service/authz/authz_test.go | 273 + service/authz/enforcer.go | 94 + service/authz/override.go | 163 + service/authz/permission.go | 27 + service/authz/registry.go | 105 + service/authz/resolver.go | 83 + service/authz/resources_audit.go | 17 + service/authz/resources_channel.go | 56 + service/authz/resources_task_plugin.go | 23 + service/authz/role.go | 86 + service/authz/seed.go | 62 + service/billing.go | 95 + service/billing_session.go | 457 + service/billing_usage.go | 68 + service/channel.go | 78 + service/channel_affinity.go | 1003 +++ service/channel_affinity_template_test.go | 334 + service/channel_affinity_usage_cache_test.go | 105 + service/channel_select.go | 265 + service/channel_select_auto_groups_test.go | 195 + service/channel_select_test.go | 152 + service/codex_channel_models.go | 81 + service/codex_credential_refresh.go | 103 + service/codex_credential_refresh_task.go | 147 + service/codex_models.go | 180 + service/codex_oauth.go | 170 + service/codex_wham_usage.go | 161 + service/convert.go | 27 + service/convert_test.go | 114 + service/download.go | 69 + service/email_binding.go | 198 + service/epay.go | 13 + service/error.go | 230 + service/error_test.go | 160 + service/file_decoder.go | 212 + service/file_service.go | 607 ++ service/funding_source.go | 149 + service/group.go | 133 + service/group_auto_groups_test.go | 72 + service/http.go | 79 + service/http_client.go | 469 ++ service/http_client_transport_test.go | 491 ++ service/http_transport_policy.go | 91 + service/http_transport_sharded.go | 128 + service/image.go | 194 + service/log_info_generate.go | 330 + service/log_info_generate_stream_test.go | 28 + service/login_verification.go | 149 + service/midjourney.go | 368 + service/notify-limit.go | 118 + service/oauth_verification.go | 44 + service/openai_chat_responses_compat.go | 30 + service/openai_chat_responses_mode.go | 54 + service/passkey/service.go | 171 + service/passkey/session.go | 97 + service/passkey/user.go | 71 + service/protected_fetch_client.go | 239 + service/protected_fetch_client_test.go | 317 + service/quota.go | 566 ++ service/quota_saturation_test.go | 140 + service/rankings.go | 596 ++ service/request_converter.go | 72 + service/response_converter.go | 40 + service/return_path.go | 12 + service/return_path_test.go | 16 + service/security_verification.go | 499 ++ service/sensitive.go | 77 + service/str.go | 152 + service/subscription_reset_task.go | 93 + service/system_instance.go | 130 + service/system_task.go | 524 ++ service/system_task_test.go | 234 + service/task.go | 11 + service/task_artifact_access.go | 137 + service/task_artifact_access_test.go | 99 + service/task_artifact_store.go | 63 + service/task_artifact_store_test.go | 31 + service/task_billing.go | 381 + service/task_billing_test.go | 1746 ++++ service/task_plugin_audit.go | 87 + service/task_plugin_view.go | 61 + service/task_plugin_view_test.go | 85 + service/task_polling.go | 836 ++ service/task_polling_test.go | 999 +++ service/text_quota.go | 540 ++ service/text_quota_test.go | 1228 +++ service/tiered_settle.go | 189 + service/tiered_settle_test.go | 1026 +++ service/token_counter.go | 416 + service/token_estimator.go | 230 + service/tokenizer.go | 63 + service/twofa.go | 66 + service/usage_helpr.go | 33 + service/user_notify.go | 278 + service/violation_fee.go | 164 + service/waffo_pancake.go | 483 ++ service/webhook.go | 124 + setting/auto_group.go | 66 + setting/auto_group_test.go | 29 + setting/billing_setting/builtin_billing.go | 11 + .../billing_setting/builtin_billing_test.go | 111 + setting/billing_setting/tiered_billing.go | 309 + .../billing_setting/tiered_billing_test.go | 105 + setting/chat.go | 57 + setting/config/config.go | 305 + setting/config/config_test.go | 96 + setting/console_setting/config.go | 39 + setting/console_setting/validation.go | 310 + setting/midjourney.go | 7 + setting/model_setting/claude.go | 111 + setting/model_setting/claude_test.go | 92 + setting/model_setting/gemini.go | 113 + setting/model_setting/gemini_test.go | 99 + setting/model_setting/global.go | 187 + setting/model_setting/global_test.go | 44 + setting/model_setting/grok.go | 24 + setting/model_setting/qwen.go | 51 + .../channel_affinity_setting.go | 158 + setting/operation_setting/checkin_setting.go | 37 + setting/operation_setting/general_setting.go | 91 + setting/operation_setting/monitor_setting.go | 81 + .../operation_setting/monitor_setting_test.go | 91 + .../operation_setting/operation_setting.go | 32 + setting/operation_setting/payment_setting.go | 36 + .../operation_setting/payment_setting_old.go | 59 + setting/operation_setting/quota_setting.go | 21 + .../operation_setting/status_code_ranges.go | 208 + .../status_code_ranges_test.go | 87 + setting/operation_setting/token_setting.go | 28 + setting/operation_setting/tools.go | 269 + setting/operation_setting/tools_price_test.go | 154 + setting/payment_creem.go | 6 + setting/payment_stripe.go | 8 + setting/payment_waffo.go | 67 + setting/payment_waffo_pancake.go | 15 + setting/perf_metrics_setting/config.go | 45 + setting/performance_setting/config.go | 85 + setting/rate_limit.go | 78 + setting/ratio_setting/cache_ratio.go | 181 + setting/ratio_setting/expose_ratio.go | 17 + setting/ratio_setting/exposed_cache.go | 55 + setting/ratio_setting/group_ratio.go | 120 + setting/ratio_setting/matching_test.go | 38 + setting/ratio_setting/model_ratio.go | 760 ++ setting/reasoning/suffix.go | 233 + setting/reasoning/suffix_test.go | 134 + setting/sensitive.go | 43 + setting/system_setting/discord.go | 21 + setting/system_setting/fetch_setting.go | 34 + setting/system_setting/legal.go | 21 + setting/system_setting/oidc.go | 41 + setting/system_setting/oidc_test.go | 47 + setting/system_setting/passkey.go | 50 + setting/system_setting/system_setting_old.go | 11 + setting/system_setting/task_artifact.go | 56 + setting/system_setting/task_artifact_store.go | 165 + .../task_artifact_store_test.go | 76 + setting/system_setting/task_artifact_test.go | 33 + setting/system_setting/telegram.go | 26 + setting/task_plugin.go | 116 + setting/task_plugin_test.go | 65 + setting/task_pricing_setting/config.go | 61 + setting/task_pricing_setting/config_test.go | 33 + setting/user_usable_group.go | 53 + types/price_data.go | 112 + types/rw_map.go | 100 + types/set.go | 36 + types/task_artifact.go | 9 + web/.gitignore | 29 + web/.node-version | 1 + web/.npmrc | 1 + web/.oxfmtrc.json | 27 + web/.oxlintrc.json | 207 + web/AGENTS.md | 217 + web/bun.lock | 2863 +++++++ web/components.json | 26 + web/cz.yaml | 7 + web/index.html | 25 + web/knip.config.ts | 8 + web/netlify.toml | 4 + web/package.json | 125 + web/public/favicon.ico | Bin 0 -> 15406 bytes web/public/logo.png | Bin 0 -> 9597 bytes web/public/pay-apple.png | Bin 0 -> 1597 bytes web/public/pay-card.png | Bin 0 -> 3685 bytes web/public/pay-google.png | Bin 0 -> 4644 bytes web/public/waffo-logo-dark.svg | 5 + web/public/waffo-logo-light.svg | 5 + web/rsbuild.config.ts | 102 + web/scripts/add-copyright.mjs | 246 + web/scripts/format-with-protected-headers.mjs | 172 + web/scripts/sync-i18n.mjs | 358 + web/src/assets/brand-icons/icon-discord.tsx | 47 + web/src/assets/brand-icons/icon-docker.tsx | 52 + web/src/assets/brand-icons/icon-facebook.tsx | 44 + web/src/assets/brand-icons/icon-figma.tsx | 46 + web/src/assets/brand-icons/icon-github.tsx | 44 + web/src/assets/brand-icons/icon-gitlab.tsx | 44 + web/src/assets/brand-icons/icon-gmail.tsx | 47 + web/src/assets/brand-icons/icon-linuxdo.tsx | 51 + web/src/assets/brand-icons/icon-medium.tsx | 49 + web/src/assets/brand-icons/icon-notion.tsx | 47 + web/src/assets/brand-icons/icon-skype.tsx | 45 + web/src/assets/brand-icons/icon-slack.tsx | 47 + web/src/assets/brand-icons/icon-stripe.tsx | 44 + web/src/assets/brand-icons/icon-telegram.tsx | 44 + web/src/assets/brand-icons/icon-trello.tsx | 46 + web/src/assets/brand-icons/icon-wechat.tsx | 39 + web/src/assets/brand-icons/icon-whatsapp.tsx | 45 + web/src/assets/brand-icons/icon-zoom.tsx | 45 + web/src/assets/brand-icons/index.ts | 36 + web/src/assets/clerk-full-logo.tsx | 59 + web/src/assets/clerk-logo.tsx | 42 + web/src/assets/custom/icon-dir.tsx | 129 + web/src/assets/custom/icon-layout-compact.tsx | 149 + web/src/assets/custom/icon-layout-default.tsx | 142 + web/src/assets/custom/icon-layout-full.tsx | 118 + .../assets/custom/icon-sidebar-floating.tsx | 100 + web/src/assets/custom/icon-sidebar-inset.tsx | 76 + .../assets/custom/icon-sidebar-sidebar.tsx | 71 + web/src/assets/custom/icon-sub2api.tsx | 62 + web/src/assets/custom/icon-theme-dark.tsx | 97 + web/src/assets/custom/icon-theme-light.tsx | 96 + web/src/assets/custom/icon-theme-system.tsx | 135 + web/src/assets/logo.tsx | 43 + web/src/components/activity-time-cell.tsx | 138 + .../__tests__/code-block-editor.test.tsx | 58 + .../__tests__/response-fade-render.test.tsx | 114 + .../__tests__/response-fade.test.ts | 190 + web/src/components/ai-elements/actions.tsx | 84 + web/src/components/ai-elements/artifact.tsx | 170 + web/src/components/ai-elements/branch.tsx | 246 + web/src/components/ai-elements/canvas.tsx | 43 + .../ai-elements/chain-of-thought.tsx | 252 + web/src/components/ai-elements/code-block.tsx | 694 ++ .../components/ai-elements/confirmation.tsx | 173 + web/src/components/ai-elements/connection.tsx | 46 + web/src/components/ai-elements/context.tsx | 440 + web/src/components/ai-elements/controls.tsx | 37 + .../components/ai-elements/conversation.tsx | 126 + web/src/components/ai-elements/edge.tsx | 159 + web/src/components/ai-elements/image.tsx | 43 + .../ai-elements/inline-citation.tsx | 316 + web/src/components/ai-elements/loader.tsx | 119 + web/src/components/ai-elements/message.tsx | 95 + web/src/components/ai-elements/node.tsx | 90 + .../components/ai-elements/open-in-chat.tsx | 409 + web/src/components/ai-elements/panel.tsx | 34 + web/src/components/ai-elements/plan.tsx | 171 + .../components/ai-elements/prompt-input.tsx | 1407 ++++ web/src/components/ai-elements/queue.tsx | 294 + web/src/components/ai-elements/reasoning.tsx | 222 + .../ai-elements/response-content.ts | 188 + .../components/ai-elements/response-fade.ts | 222 + .../ai-elements/response-node-guards.ts | 98 + .../ai-elements/response-renderer-alert.tsx | 168 + .../ai-elements/response-renderer-blocks.tsx | 213 + .../ai-elements/response-renderer-details.tsx | 64 + .../response-renderer-footnotes.tsx | 55 + .../ai-elements/response-renderer-image.tsx | 50 + .../ai-elements/response-renderer-inline.tsx | 91 + .../ai-elements/response-renderer-table.tsx | 99 + .../ai-elements/response-renderer.tsx | 258 + .../components/ai-elements/response-types.ts | 50 + web/src/components/ai-elements/response.tsx | 125 + web/src/components/ai-elements/shimmer.tsx | 74 + web/src/components/ai-elements/sources.tsx | 102 + web/src/components/ai-elements/suggestion.tsx | 72 + web/src/components/ai-elements/task.tsx | 112 + web/src/components/ai-elements/tool.tsx | 193 + web/src/components/ai-elements/toolbar.tsx | 35 + .../components/ai-elements/web-preview.tsx | 297 + web/src/components/animate-in-view.tsx | 85 + web/src/components/auto-skeleton.tsx | 84 + web/src/components/coming-soon.tsx | 38 + web/src/components/command-menu.tsx | 125 + web/src/components/config-drawer.tsx | 745 ++ web/src/components/confirm-dialog.tsx | 88 + web/src/components/copy-button.tsx | 92 + web/src/components/data-table/README.md | 17 + .../core/__tests__/pagination.test.tsx | 67 + .../components/data-table/core/badge-cell.tsx | 36 + .../data-table/core/badge-list-cell.tsx | 116 + .../data-table/core/column-header.tsx | 97 + .../data-table/core/column-pinning.ts | 78 + .../data-table/core/content-sized-columns.ts | 21 + .../data-table/core/data-table-colgroup.tsx | 69 + .../data-table/core/data-table-header.tsx | 277 + .../data-table/core/data-table-row.tsx | 148 + .../data-table/core/data-table-view.tsx | 328 + .../components/data-table/core/pagination.tsx | 213 + .../data-table/core/row-action-menu.tsx | 61 + .../data-table/core/table-empty.tsx | 88 + .../data-table/core/table-sizing.ts | 37 + .../data-table/core/table-skeleton.tsx | 89 + .../data-table/core/truncated-cell.tsx | 96 + web/src/components/data-table/core/types.ts | 71 + .../hooks/use-data-table-view-mode.ts | 103 + .../data-table/hooks/use-data-table.ts | 527 ++ .../hooks/use-debounced-column-filter.ts | 113 + web/src/components/data-table/index.ts | 69 + .../data-table/layout/card-cell-utils.ts | 59 + .../data-table/layout/card-grid.tsx | 202 + .../data-table/layout/card-row-content.tsx | 217 + .../data-table/layout/data-table-page.tsx | 562 ++ .../data-table/layout/mobile-card-list.tsx | 208 + .../static/static-data-table-classnames.ts | 47 + .../data-table/static/static-data-table.tsx | 241 + .../data-table/static/static-row-actions.tsx | 65 + .../data-table/toolbar/bulk-actions.tsx | 248 + .../data-table/toolbar/faceted-filter.tsx | 213 + .../components/data-table/toolbar/toolbar.tsx | 398 + .../data-table/toolbar/view-mode-toggle.tsx | 105 + .../data-table/toolbar/view-options.tsx | 87 + web/src/components/date-picker.tsx | 88 + web/src/components/datetime-picker.tsx | 165 + web/src/components/dialog.tsx | 128 + web/src/components/drawer-layout.ts | 105 + web/src/components/empty-state.tsx | 69 + web/src/components/error-state.tsx | 73 + web/src/components/group-badge.tsx | 133 + web/src/components/html-content.tsx | 207 + web/src/components/json-code-editor.tsx | 335 + .../__tests__/json-code-editor-utils.test.ts | 99 + .../__tests__/json-code-editor.test.tsx | 113 + .../json-code-editor-utils.ts | 198 + web/src/components/json-editor.tsx | 299 + web/src/components/language-switcher.tsx | 83 + .../layout/components/app-header.tsx | 150 + .../layout/components/app-sidebar.tsx | 77 + .../components/authenticated-layout.tsx | 60 + .../layout/components/chat-presets-item.tsx | 290 + .../components/layout/components/footer.tsx | 308 + web/src/components/layout/components/glow.tsx | 65 + .../layout/components/header-logo.tsx | 51 + .../components/layout/components/header.tsx | 39 + web/src/components/layout/components/logo.tsx | 62 + web/src/components/layout/components/main.tsx | 37 + .../layout/components/mobile-drawer.tsx | 309 + .../components/layout/components/mockup.tsx | 82 + .../layout/components/nav-group.tsx | 267 + .../layout/components/nav-link-item.tsx | 88 + .../components/layout/components/navbar.tsx | 70 + .../layout/components/page-footer.tsx | 41 + .../layout/components/public-header.tsx | 448 + .../layout/components/public-layout.tsx | 58 + .../layout/components/public-navigation.tsx | 88 + .../layout/components/section-page-layout.tsx | 130 + .../components/layout/components/section.tsx | 37 + .../layout/components/sidebar-view-header.tsx | 73 + .../layout/components/system-brand.tsx | 103 + .../components/layout/components/top-nav.tsx | 130 + .../layout/config/system-settings.config.ts | 108 + .../layout/config/top-nav.config.ts | 30 + web/src/components/layout/constants.ts | 65 + web/src/components/layout/index.ts | 67 + .../layout/lib/sidebar-view-registry.ts | 59 + web/src/components/layout/lib/url-utils.ts | 122 + web/src/components/layout/types.ts | 142 + web/src/components/learn-more.tsx | 63 + web/src/components/loading-state.tsx | 67 + web/src/components/lobe-icon-field.tsx | 123 + web/src/components/long-text.tsx | 104 + web/src/components/masked-value-display.tsx | 91 + web/src/components/model-group-selector.tsx | 852 ++ .../__tests__/layout.test.ts | 67 + .../components/model-group-selector/layout.ts | 78 + web/src/components/multi-select.tsx | 393 + web/src/components/navigation-progress.tsx | 43 + web/src/components/notification-popover.tsx | 376 + web/src/components/page-transition.tsx | 211 + web/src/components/password-input.tsx | 67 + web/src/components/profile-dropdown.tsx | 151 + web/src/components/provider-badge.tsx | 62 + web/src/components/quota-details-popover.tsx | 82 + web/src/components/react-icon-by-name.tsx | 173 + web/src/components/rich-content.tsx | 48 + .../risk-acknowledgement-dialog.tsx | 319 + web/src/components/search.tsx | 59 + web/src/components/sign-out-dialog.tsx | 75 + web/src/components/skip-to-main.tsx | 31 + web/src/components/status-badge.tsx | 298 + web/src/components/table-id.tsx | 37 + web/src/components/tag-input.tsx | 115 + web/src/components/theme-quick-switcher.tsx | 130 + web/src/components/theme-switch.tsx | 79 + web/src/components/truncated-text.tsx | 40 + web/src/components/turnstile.tsx | 76 + .../components/ui/__tests__/combobox.test.tsx | 192 + .../ui/__tests__/portal-container.test.tsx | 175 + web/src/components/ui/accordion.tsx | 101 + web/src/components/ui/alert-dialog.tsx | 205 + web/src/components/ui/alert.tsx | 94 + web/src/components/ui/aspect-ratio.tsx | 40 + web/src/components/ui/avatar.tsx | 125 + web/src/components/ui/badge.tsx | 72 + web/src/components/ui/breadcrumb.tsx | 144 + web/src/components/ui/button-group.tsx | 105 + web/src/components/ui/button.tsx | 88 + web/src/components/ui/calendar.tsx | 257 + web/src/components/ui/card.tsx | 121 + web/src/components/ui/carousel.tsx | 261 + web/src/components/ui/chart.tsx | 389 + web/src/components/ui/checkbox.tsx | 47 + web/src/components/ui/collapsible.tsx | 37 + web/src/components/ui/combobox-input.tsx | 292 + web/src/components/ui/combobox.tsx | 488 ++ web/src/components/ui/command.tsx | 220 + web/src/components/ui/context-menu.tsx | 295 + web/src/components/ui/dialog.tsx | 173 + web/src/components/ui/direction.tsx | 22 + web/src/components/ui/drawer.tsx | 161 + web/src/components/ui/dropdown-menu-events.ts | 43 + web/src/components/ui/dropdown-menu.test.tsx | 68 + web/src/components/ui/dropdown-menu.tsx | 309 + web/src/components/ui/empty.tsx | 119 + web/src/components/ui/field.tsx | 254 + web/src/components/ui/form.tsx | 286 + web/src/components/ui/hover-card.tsx | 69 + web/src/components/ui/icon-badge.tsx | 85 + web/src/components/ui/input-group.tsx | 175 + web/src/components/ui/input-otp.tsx | 103 + web/src/components/ui/input.tsx | 38 + web/src/components/ui/item.tsx | 219 + web/src/components/ui/kbd.tsx | 44 + web/src/components/ui/label.tsx | 38 + web/src/components/ui/markdown.tsx | 789 ++ web/src/components/ui/menubar.tsx | 303 + web/src/components/ui/native-select.tsx | 86 + web/src/components/ui/navigation-menu.tsx | 192 + web/src/components/ui/pagination.tsx | 160 + web/src/components/ui/popover.tsx | 118 + web/src/components/ui/portal-container.ts | 35 + web/src/components/ui/progress.tsx | 101 + web/src/components/ui/radio-group.tsx | 54 + web/src/components/ui/resizable.tsx | 68 + web/src/components/ui/scroll-area.tsx | 70 + web/src/components/ui/select.tsx | 250 + web/src/components/ui/separator.tsx | 41 + web/src/components/ui/sheet.tsx | 166 + web/src/components/ui/sidebar.tsx | 741 ++ web/src/components/ui/skeleton.tsx | 31 + web/src/components/ui/slider.tsx | 70 + web/src/components/ui/sonner.tsx | 109 + web/src/components/ui/spinner.tsx | 44 + web/src/components/ui/switch.tsx | 48 + web/src/components/ui/table.tsx | 148 + web/src/components/ui/tabs.tsx | 98 + web/src/components/ui/textarea.tsx | 36 + web/src/components/ui/titled-card.tsx | 106 + web/src/components/ui/toggle-group.tsx | 105 + web/src/components/ui/toggle.tsx | 63 + web/src/components/ui/tooltip.tsx | 82 + web/src/config/fonts.ts | 37 + web/src/context/direction-provider.tsx | 80 + web/src/context/font-provider.tsx | 77 + web/src/context/layout-provider.tsx | 104 + web/src/context/search-provider.tsx | 65 + .../context/theme-customization-provider.tsx | 262 + web/src/context/theme-provider.tsx | 147 + web/src/env.d.ts | 23 + web/src/features/about/api.ts | 31 + web/src/features/about/index.tsx | 185 + web/src/features/about/types.ts | 23 + web/src/features/auth/api.test.ts | 181 + web/src/features/auth/api.ts | 282 + web/src/features/auth/auth-layout.tsx | 63 + .../auth/components/legal-consent.tsx | 97 + .../auth/components/oauth-callback-screen.tsx | 132 + .../auth/components/oauth-providers.tsx | 179 + .../auth/components/telegram-login-dialog.tsx | 110 + .../features/auth/components/terms-footer.tsx | 94 + web/src/features/auth/constants.ts | 78 + .../components/forgot-password-form.tsx | 136 + .../features/auth/forgot-password/index.tsx | 55 + .../features/auth/hooks/use-auth-redirect.ts | 127 + .../auth/hooks/use-email-verification.ts | 84 + .../features/auth/hooks/use-oauth-login.ts | 228 + web/src/features/auth/hooks/use-turnstile.ts | 57 + web/src/features/auth/index.ts | 118 + .../lib/__tests__/oauth-callback-mode.test.ts | 193 + .../auth/lib/__tests__/oauth-popup.test.ts | 237 + .../features/auth/lib/auth-redirect.test.ts | 91 + web/src/features/auth/lib/auth-redirect.ts | 80 + .../auth/lib/oauth-bind-window.test.ts | 179 + .../features/auth/lib/oauth-bind-window.ts | 134 + .../features/auth/lib/oauth-callback-mode.ts | 139 + web/src/features/auth/lib/oauth-popup.ts | 186 + web/src/features/auth/lib/oauth.ts | 103 + .../features/auth/lib/password-encryption.ts | 196 + web/src/features/auth/lib/storage.ts | 61 + .../features/auth/lib/telegram-login.test.ts | 60 + web/src/features/auth/lib/telegram-login.ts | 71 + web/src/features/auth/lib/validation.ts | 80 + .../otp/__tests__/login-verification.test.tsx | 276 + .../features/auth/otp/components/otp-form.tsx | 100 + web/src/features/auth/otp/index.tsx | 53 + web/src/features/auth/passkey/api.ts | 132 + .../passkey/hooks/use-passkey-management.ts | 191 + web/src/features/auth/passkey/index.ts | 21 + web/src/features/auth/passkey/types.ts | 40 + .../auth/reset-password-confirm/index.tsx | 204 + .../__tests__/verification-api.test.ts | 500 ++ .../__tests__/verification-flow.test.tsx | 420 + .../features/auth/secure-verification/api.ts | 368 + .../components/secure-verification-dialog.tsx | 274 + .../hooks/use-secure-verification.ts | 343 + .../auth/secure-verification/index.ts | 22 + .../auth/secure-verification/types.ts | 112 + .../sign-in/components/user-auth-form.tsx | 493 ++ web/src/features/auth/sign-in/index.tsx | 65 + .../auth/sign-up/components/sign-up-form.tsx | 459 + web/src/features/auth/sign-up/index.tsx | 61 + web/src/features/auth/types.ts | 216 + web/src/features/channels/api.ts | 669 ++ .../channels/components/channel-card.tsx | 186 + .../components/channel-row-actions-context.ts | 28 + .../components/channel-type-badge.test.tsx | 101 + .../components/channel-type-badge.tsx | 124 + .../channels/components/channels-columns.tsx | 1243 +++ .../channels/components/channels-dialogs.tsx | 103 + .../components/channels-primary-buttons.tsx | 330 + .../channels/components/channels-provider.tsx | 151 + .../channels/components/channels-table.tsx | 495 ++ .../components/data-table-bulk-actions.tsx | 291 + .../components/data-table-row-actions.tsx | 403 + .../components/data-table-tag-row-actions.tsx | 118 + .../dialogs/advanced-custom-editor-dialog.tsx | 1746 ++++ .../dialogs/balance-query-dialog.tsx | 247 + .../dialogs/channel-test-dialog.tsx | 1394 +++ .../components/dialogs/codex-usage-dialog.tsx | 1354 +++ .../dialogs/copy-channel-dialog.tsx | 130 + .../components/dialogs/edit-tag-dialog.tsx | 415 + .../dialogs/fetch-models-dialog.tsx | 507 ++ .../missing-models-confirmation-dialog.tsx | 103 + .../dialogs/multi-key-manage-dialog.tsx | 485 ++ .../dialogs/multi-key-statistics-card.tsx | 42 + .../dialogs/multi-key-table-row-actions.tsx | 76 + .../dialogs/ollama-models-dialog.tsx | 610 ++ .../dialogs/param-override-editor-dialog.tsx | 3272 ++++++++ .../dialogs/status-code-risk-dialog.tsx | 187 + .../dialogs/tag-batch-edit-dialog.tsx | 302 + .../dialogs/upstream-update-dialog.tsx | 292 + .../drawers/channel-mutate-drawer.tsx | 4960 +++++++++++ .../sections/channel-advanced-section.tsx | 99 + .../sections/channel-api-access-section.tsx | 46 + .../drawers/sections/channel-auth-section.tsx | 44 + .../sections/channel-basic-section.tsx | 46 + .../sections/channel-editor-loading-state.tsx | 45 + .../sections/channel-models-section.tsx | 46 + .../components/drawers/sections/index.ts | 24 + .../components/model-mapping-editor.tsx | 357 + .../components/numeric-spinner-input.tsx | 213 + web/src/features/channels/constants.ts | 450 + .../__tests__/channel-key-disclosure.test.tsx | 153 + .../hooks/use-channel-key-disclosure.ts | 94 + .../channels/hooks/use-channel-mutate-form.ts | 143 + .../hooks/use-channel-upstream-updates.ts | 321 + web/src/features/channels/index.tsx | 107 + .../__tests__/channel-field-update.test.ts | 116 + .../__tests__/channel-table-row-id.test.ts | 51 + .../__tests__/channel-type-options.test.ts | 44 + .../lib/__tests__/new-api-channel.test.ts | 91 + .../__tests__/task-plugin-base-url.test.ts | 113 + .../features/channels/lib/advanced-custom.ts | 940 +++ .../features/channels/lib/channel-actions.ts | 676 ++ .../channels/lib/channel-field-update.ts | 65 + .../channels/lib/channel-form-errors.ts | 71 + web/src/features/channels/lib/channel-form.ts | 959 +++ .../channels/lib/channel-type-config.ts | 228 + .../features/channels/lib/channel-utils.ts | 779 ++ web/src/features/channels/lib/index.ts | 29 + .../features/channels/lib/model-categories.ts | 174 + .../channels/lib/model-mapping-validation.ts | 253 + .../features/channels/lib/multi-key-utils.ts | 75 + web/src/features/channels/lib/ollama-utils.ts | 161 + .../channels/lib/status-code-risk-guard.ts | 103 + .../channels/lib/task-plugin-base-url.ts | 97 + .../channels/lib/upstream-update-utils.ts | 56 + web/src/features/channels/types.ts | 381 + .../chat/hooks/use-active-chat-key.ts | 58 + .../features/chat/hooks/use-chat-presets.ts | 84 + web/src/features/chat/lib/chat-links.ts | 220 + web/src/features/chat/lib/send-to-fluent.ts | 42 + web/src/features/dashboard/api.ts | 93 + .../dashboard/components/flow/flow-charts.tsx | 731 ++ .../components/flow/flow-node-filter.tsx | 235 + .../models/consumption-distribution-chart.tsx | 172 + .../components/models/log-stat-cards.tsx | 215 + .../components/models/model-charts.tsx | 169 + .../models/models-chart-preferences.tsx | 224 + .../models/models-filter-dialog.tsx | 306 + .../models/performance-overview.tsx | 230 + .../overview/__tests__/setup-guide.test.tsx | 241 + .../overview/announcement-detail-dialog.tsx | 82 + .../overview/announcements-panel.tsx | 122 + .../components/overview/api-info-item.tsx | 142 + .../components/overview/api-info-panel.tsx | 87 + .../components/overview/faq-panel.tsx | 85 + .../overview/overview-dashboard.tsx | 840 ++ .../overview/performance-health-panel.tsx | 212 + .../components/overview/summary-cards.tsx | 355 + .../components/overview/uptime-panel.tsx | 177 + .../dashboard/components/ui/panel-wrapper.tsx | 115 + .../dashboard/components/ui/stat-card.tsx | 331 + .../components/users/user-charts.tsx | 264 + web/src/features/dashboard/constants.ts | 69 + .../dashboard/hooks/use-dashboard-config.tsx | 129 + .../dashboard/hooks/use-status-data.ts | 74 + web/src/features/dashboard/index.tsx | 418 + web/src/features/dashboard/lib/api-info.ts | 72 + web/src/features/dashboard/lib/charts.ts | 954 +++ web/src/features/dashboard/lib/filters.ts | 169 + .../dashboard/lib/flow-selection.test.ts | 119 + .../features/dashboard/lib/flow-selection.ts | 66 + web/src/features/dashboard/lib/flow.test.ts | 776 ++ web/src/features/dashboard/lib/flow.ts | 1335 +++ web/src/features/dashboard/lib/index.ts | 44 + web/src/features/dashboard/lib/stats.ts | 47 + web/src/features/dashboard/lib/text.ts | 34 + .../features/dashboard/section-registry.tsx | 77 + web/src/features/dashboard/types.ts | 298 + web/src/features/errors/forbidden.tsx | 48 + web/src/features/errors/general-error.tsx | 99 + web/src/features/errors/maintenance-error.tsx | 42 + web/src/features/errors/not-found-error.tsx | 48 + .../features/errors/unauthorized-error.tsx | 48 + .../group-status/__tests__/metrics.test.tsx | 115 + .../group-status/__tests__/status.test.ts | 70 + web/src/features/group-status/index.tsx | 287 + web/src/features/group-status/lib/status.ts | 63 + web/src/features/home/api.ts | 39 + .../home/components/connection-line.tsx | 39 + .../features/home/components/feature-item.tsx | 47 + .../features/home/components/gateway-card.tsx | 75 + .../features/home/components/hero-buttons.tsx | 53 + .../home/components/hero-terminal-demo.tsx | 548 ++ .../features/home/components/icon-card.tsx | 47 + web/src/features/home/components/index.ts | 23 + .../home/components/scrolling-icons.tsx | 63 + .../features/home/components/sections/cta.tsx | 84 + .../home/components/sections/features.tsx | 241 + .../home/components/sections/hero.tsx | 245 + .../home/components/sections/how-it-works.tsx | 90 + .../home/components/sections/stats.tsx | 128 + .../features/home/components/stat-item.tsx | 60 + web/src/features/home/constants.ts | 147 + web/src/features/home/hooks/index.ts | 19 + .../home/hooks/use-home-page-content.ts | 84 + web/src/features/home/index.tsx | 133 + web/src/features/home/lib/icon-mapper.tsx | 59 + web/src/features/home/types.ts | 39 + web/src/features/keys/api.ts | 127 + .../__tests__/api-key-group-cell.test.tsx | 160 + .../__tests__/api-key-group-combobox.test.tsx | 224 + .../__tests__/api-key-listing.test.tsx | 527 ++ .../__tests__/api-keys-mutate-drawer.test.tsx | 298 + .../auto-group-order-editor.test.tsx | 365 + .../keys/components/api-key-group-cell.tsx | 102 + .../components/api-key-group-combobox.tsx | 214 + .../keys/components/api-key-quota-cell.tsx | 171 + .../components/api-key-timestamp-cell.tsx | 49 + .../keys/components/api-keys-cells.tsx | 247 + .../keys/components/api-keys-columns.tsx | 226 + .../components/api-keys-delete-dialog.tsx | 92 + .../keys/components/api-keys-dialogs.tsx | 42 + .../api-keys-multi-delete-dialog.tsx | 90 + .../components/api-keys-mutate-drawer.tsx | 824 ++ .../components/api-keys-primary-buttons.tsx | 37 + .../keys/components/api-keys-provider.tsx | 190 + .../keys/components/api-keys-table.tsx | 384 + .../components/auto-group-order-editor.tsx | 338 + .../keys/components/auto-group-visuals.tsx | 115 + .../components/data-table-bulk-actions.tsx | 138 + .../components/data-table-row-actions.tsx | 305 + .../components/dialogs/cc-switch-dialog.tsx | 225 + web/src/features/keys/constants.ts | 100 + web/src/features/keys/index.tsx | 45 + .../lib/__tests__/auto-group-form.test.ts | 197 + web/src/features/keys/lib/api-key-form.ts | 215 + web/src/features/keys/lib/index.ts | 29 + web/src/features/keys/types.ts | 113 + web/src/features/legal/api.ts | 40 + web/src/features/legal/index.ts | 20 + web/src/features/legal/legal-document.tsx | 144 + web/src/features/legal/privacy-policy.tsx | 36 + web/src/features/legal/types.ts | 23 + web/src/features/legal/user-agreement.tsx | 36 + .../__tests__/editor-currency.test.tsx | 507 ++ .../__tests__/editor-layout.test.tsx | 263 + .../model-pricing/__tests__/pricing.test.ts | 145 + web/src/features/model-pricing/api.ts | 159 + web/src/features/model-pricing/currency.ts | 69 + .../model-pricing/model-pricing-panel.tsx | 254 + .../model-pricing/pricing-amount-input.tsx | 146 + .../pricing-currency-selector.tsx | 126 + web/src/features/model-pricing/pricing.ts | 264 + .../__tests__/metadata-editing.test.tsx | 569 ++ .../models/__tests__/metadata-sync.test.tsx | 511 ++ .../models/__tests__/model-deletion.test.tsx | 227 + .../models/__tests__/model-listing.test.tsx | 857 ++ .../__tests__/vendor-management.test.tsx | 334 + web/src/features/models/api.ts | 652 ++ .../components/data-table-bulk-actions.tsx | 280 + .../components/data-table-row-actions.tsx | 122 + .../components/deployment-access-guard.tsx | 203 + .../models/components/deployments-columns.tsx | 310 + .../models/components/deployments-table.tsx | 323 + .../models/components/description-cell.tsx | 54 + .../dialogs/create-deployment-drawer.tsx | 778 ++ .../components/dialogs/description-dialog.tsx | 57 + .../dialogs/extend-deployment-dialog.tsx | 235 + .../dialogs/missing-models-dialog.tsx | 257 + .../dialogs/model-delete-dialog.tsx | 158 + .../prefill-group-management-dialog.tsx | 470 ++ .../dialogs/prefill-group-management.tsx | 81 + .../components/dialogs/price-sync-dialog.tsx | 42 + .../dialogs/rename-deployment-dialog.tsx | 147 + .../components/dialogs/sync-wizard-dialog.tsx | 804 ++ .../dialogs/update-config-dialog.tsx | 445 + .../dialogs/upstream-conflict-dialog.tsx | 20 + .../dialogs/vendor-mutate-dialog.tsx | 327 + .../dialogs/vendor-operation-dialog.tsx | 294 + .../dialogs/vendors-management-dialog.tsx | 165 + .../dialogs/view-details-dialog.tsx | 307 + .../components/dialogs/view-logs-dialog.tsx | 322 + .../drawers/model-mutate-drawer.tsx | 704 ++ .../drawers/prefill-group-form-drawer.tsx | 412 + .../models/components/model-connections.tsx | 99 + .../models/components/model-square-status.tsx | 120 + .../models/components/models-columns.tsx | 369 + .../models/components/models-dialogs.tsx | 96 + .../components/models-primary-buttons.tsx | 106 + .../models/components/models-provider.tsx | 131 + .../models/components/models-table.tsx | 291 + .../models/components/prefill-group-shared.ts | 129 + .../components/vendor-linked-models.tsx | 254 + .../models/components/vendors-table.tsx | 309 + web/src/features/models/constants.ts | 193 + .../hooks/use-model-deployment-settings.ts | 193 + web/src/features/models/index.tsx | 198 + .../features/models/lib/deployments-utils.ts | 42 + web/src/features/models/lib/index.ts | 30 + web/src/features/models/lib/model-actions.ts | 200 + web/src/features/models/lib/model-form.ts | 141 + web/src/features/models/lib/model-utils.ts | 228 + web/src/features/models/lib/query-keys.ts | 67 + web/src/features/models/lib/vendor-actions.ts | 53 + web/src/features/models/section-registry.tsx | 57 + web/src/features/models/types.ts | 432 + web/src/features/models/vendor-api.ts | 125 + web/src/features/performance-metrics/api.ts | 43 + .../performance-metrics/lib/format.ts | 98 + web/src/features/performance-metrics/types.ts | 63 + web/src/features/playground/api.ts | 82 + .../components/chat/playground-chat.tsx | 223 + .../chat/playground-empty-state.tsx | 84 + .../input/playground-input-controls.tsx | 125 + .../input/playground-input-tools.tsx | 193 + .../components/input/playground-input.tsx | 143 + .../input/playground-parameter-panel.tsx | 266 + .../playground-message-editor.test.tsx | 125 + .../message/message-action-button.tsx | 73 + .../components/message/message-actions.tsx | 221 + .../message/message-error-actions.tsx | 74 + .../components/message/message-error.tsx | 118 + .../components/message/message-metadata.tsx | 84 + .../message/playground-message-content.tsx | 167 + .../message/playground-message-editor.tsx | 187 + web/src/features/playground/constants.ts | 103 + web/src/features/playground/hooks/index.ts | 24 + .../playground/hooks/use-chat-handler.ts | 391 + .../hooks/use-message-action-guard.ts | 45 + .../hooks/use-playground-conversation.ts | 116 + .../hooks/use-playground-options.ts | 143 + .../playground/hooks/use-playground-state.ts | 180 + .../hooks/use-stream-request.test.ts | 199 + .../playground/hooks/use-stream-request.ts | 235 + web/src/features/playground/index.tsx | 120 + web/src/features/playground/lib/index.ts | 39 + .../lib/input/input-control-utils.ts | 68 + .../playground/lib/input/input-tool-utils.ts | 60 + .../lib/message/conversation-message-utils.ts | 177 + .../lib/message/message-action-utils.ts | 49 + .../lib/message/message-content-utils.ts | 115 + .../lib/message/message-editor-utils.ts | 41 + .../lib/message/message-error-utils.ts | 59 + .../lib/message/message-layout-utils.ts | 39 + .../lib/message/message-reasoning-utils.ts | 70 + .../lib/message/message-streaming-utils.ts | 256 + .../playground/lib/message/message-styles.ts | 64 + .../lib/message/message-timing-utils.ts | 75 + .../lib/message/message-update-utils.ts | 63 + .../playground/lib/message/message-utils.ts | 176 + .../lib/options/playground-option-utils.ts | 65 + .../lib/parameters/playground-parameters.ts | 129 + .../lib/state/playground-state-utils.ts | 48 + .../playground/lib/storage/storage-schema.ts | 91 + .../playground/lib/storage/storage.ts | 398 + .../lib/streaming/payload-builder.ts | 72 + .../lib/streaming/request-error-utils.ts | 48 + .../playground/lib/streaming/stream-utils.ts | 112 + web/src/features/playground/types.ts | 151 + .../__tests__/breakdown-tier-match.test.ts | 102 + .../pricing/__tests__/dynamic-price.test.ts | 475 ++ .../pricing/__tests__/group-pricing.test.ts | 28 + .../pricing/__tests__/model-cards.test.tsx | 546 ++ .../__tests__/pricing-controls.test.tsx | 146 + .../pricing/__tests__/task-expr.test.ts | 381 + .../__tests__/task-matrix-display.test.ts | 169 + .../pricing/__tests__/task-matrix.test.ts | 465 ++ .../__tests__/task-price-display.test.tsx | 270 + web/src/features/pricing/api.ts | 31 + .../components/dynamic-pricing-breakdown.tsx | 670 ++ .../pricing/components/empty-state.tsx | 58 + web/src/features/pricing/components/index.ts | 31 + .../pricing/components/loading-skeleton.tsx | 134 + .../components/model-billing-mode-badge.tsx | 57 + .../pricing/components/model-card-grid.tsx | 130 + .../pricing/components/model-card.tsx | 349 + .../pricing/components/model-details-api.tsx | 793 ++ .../pricing/components/model-details-apps.tsx | 235 + .../components/model-details-charts.tsx | 409 + .../components/model-details-performance.tsx | 375 + .../model-details-uptime-sparkline.tsx | 217 + .../pricing/components/model-details.tsx | 1581 ++++ .../pricing/components/model-perf-badge.tsx | 141 + .../pricing/components/model-price-cell.tsx | 203 + .../pricing/components/pricing-columns.tsx | 291 + .../pricing/components/pricing-sidebar.tsx | 320 + .../pricing/components/pricing-table.tsx | 115 + .../pricing/components/pricing-toolbar.tsx | 231 + .../pricing/components/search-bar.tsx | 88 + web/src/features/pricing/constants.ts | 147 + web/src/features/pricing/hooks/index.ts | 20 + web/src/features/pricing/hooks/use-filters.ts | 234 + .../pricing/hooks/use-pricing-data.ts | 79 + web/src/features/pricing/index.tsx | 289 + .../lib/__tests__/time-rule-expr.test.ts | 218 + web/src/features/pricing/lib/billing-expr.ts | 1190 +++ web/src/features/pricing/lib/billing-mode.ts | 38 + .../pricing/lib/breakdown-tier-match.ts | 74 + web/src/features/pricing/lib/dynamic-price.ts | 403 + web/src/features/pricing/lib/filters.ts | 211 + web/src/features/pricing/lib/index.ts | 29 + web/src/features/pricing/lib/mock-stats.ts | 842 ++ web/src/features/pricing/lib/model-helpers.ts | 109 + web/src/features/pricing/lib/price.ts | 276 + web/src/features/pricing/lib/seed.ts | 63 + web/src/features/pricing/lib/task-expr.ts | 462 + .../pricing/lib/task-matrix-display.ts | 101 + .../pricing/lib/task-price-display.ts | 89 + web/src/features/pricing/lib/tier-expr.ts | 323 + web/src/features/pricing/types.ts | 133 + .../profile/__tests__/settings.test.tsx | 194 + web/src/features/profile/api.ts | 307 + .../components/checkin-calendar-card.tsx | 487 ++ .../components/language-preferences-card.tsx | 135 + .../profile/components/profile-header.tsx | 190 + .../components/profile-settings-card.tsx | 73 + .../components/sidebar-modules-card.tsx | 292 + .../components/tabs/notification-tab.tsx | 348 + web/src/features/profile/constants.ts | 36 + web/src/features/profile/hooks/index.ts | 19 + web/src/features/profile/hooks/use-profile.ts | 136 + web/src/features/profile/index.tsx | 84 + web/src/features/profile/lib/format.ts | 59 + web/src/features/profile/lib/index.ts | 19 + web/src/features/profile/lib/user-settings.ts | 50 + web/src/features/profile/types.ts | 235 + web/src/features/rankings/api.ts | 34 + .../rankings/components/entity-links.tsx | 82 + .../rankings/components/growth-text.tsx | 60 + web/src/features/rankings/components/index.ts | 25 + .../components/market-share-section.tsx | 310 + .../rankings/components/model-leaderboard.tsx | 139 + .../rankings/components/models-section.tsx | 232 + .../rankings/components/pulse-section.tsx | 146 + .../rankings/components/rankings-hero.tsx | 93 + .../features/rankings/hooks/use-rankings.ts | 30 + web/src/features/rankings/index.tsx | 137 + web/src/features/rankings/lib/format.ts | 53 + web/src/features/rankings/lib/index.ts | 19 + web/src/features/rankings/types.ts | 138 + web/src/features/redemption-codes/api.ts | 107 + .../components/__tests__/bulk-delete.test.tsx | 218 + .../__tests__/redemptions-export.test.tsx | 311 + .../redemptions-mutate-drawer.test.tsx | 314 + .../components/data-table-bulk-actions.tsx | 142 + .../components/data-table-row-actions.tsx | 136 + .../components/redemptions-columns.tsx | 262 + .../components/redemptions-delete-dialog.tsx | 88 + .../components/redemptions-dialogs.tsx | 37 + .../components/redemptions-export-dialog.tsx | 168 + .../components/redemptions-mobile-list.tsx | 175 + .../components/redemptions-mutate-drawer.tsx | 457 + .../redemptions-primary-buttons.tsx | 98 + .../components/redemptions-provider.tsx | 76 + .../components/redemptions-table.tsx | 193 + .../features/redemption-codes/constants.ts | 142 + web/src/features/redemption-codes/index.tsx | 47 + .../features/redemption-codes/lib/index.ts | 33 + .../redemption-codes/lib/redemption-form.ts | 107 + .../features/redemption-codes/lib/utils.ts | 45 + web/src/features/redemption-codes/types.ts | 86 + .../__tests__/account-security.test.tsx | 725 ++ .../security/__tests__/enrollment.test.tsx | 715 ++ .../features/security/__tests__/page.test.tsx | 283 + web/src/features/security/api.ts | 116 + .../__tests__/access-token-card.test.tsx | 401 + .../__tests__/login-session-utils.test.ts | 86 + .../__tests__/privacy-card.test.tsx | 120 + .../security/components/access-token-card.tsx | 221 + .../components/account-action-card.tsx | 103 + .../security/components/account-bindings.tsx | 489 ++ .../dialogs/access-token-dialog.tsx | 66 + .../dialogs/change-password-dialog.tsx | 253 + .../dialogs/delete-account-dialog.tsx | 117 + .../components/dialogs/email-bind-dialog.tsx | 340 + .../dialogs/telegram-bind-dialog.tsx | 195 + .../dialogs/two-fa-backup-dialog.tsx | 131 + .../dialogs/two-fa-disable-dialog.tsx | 111 + .../dialogs/two-fa-setup-dialog.tsx | 221 + .../components/dialogs/wechat-bind-dialog.tsx | 174 + .../components/login-session-dialogs.tsx | 80 + .../components/login-session-item.tsx | 82 + .../components/login-session-utils.ts | 78 + .../components/login-sessions-card.tsx | 214 + .../security/components/passkey-card.tsx | 290 + .../security/components/privacy-card.tsx | 90 + .../security/components/two-fa-card.tsx | 203 + .../security/hooks/use-access-token.ts | 127 + .../security/hooks/use-account-security.ts | 124 + .../security/hooks/use-two-fa-setup.ts | 164 + web/src/features/security/hooks/use-two-fa.ts | 65 + web/src/features/security/index.tsx | 149 + web/src/features/setup/api.ts | 59 + .../features/setup/components/admin-step.tsx | 125 + .../setup/components/complete-step.tsx | 110 + .../setup/components/database-step.tsx | 166 + .../setup/components/step-navigation.tsx | 80 + .../setup/components/usage-mode-step.tsx | 129 + web/src/features/setup/index.ts | 19 + web/src/features/setup/setup-wizard.tsx | 399 + web/src/features/setup/types.ts | 41 + web/src/features/subscriptions/api.ts | 239 + .../components/data-table-row-actions.tsx | 117 + .../dialogs/reset-subscriptions-dialog.tsx | 88 + .../dialogs/subscription-purchase-dialog.tsx | 421 + .../dialogs/toggle-status-dialog.tsx | 73 + .../dialogs/user-subscriptions-dialog.tsx | 447 + .../components/subscriptions-columns.tsx | 205 + .../components/subscriptions-dialogs.tsx | 39 + .../subscriptions-mutate-drawer.tsx | 814 ++ .../subscriptions-primary-buttons.tsx | 41 + .../components/subscriptions-provider.tsx | 90 + .../components/subscriptions-table.tsx | 65 + web/src/features/subscriptions/constants.ts | 47 + web/src/features/subscriptions/index.tsx | 85 + web/src/features/subscriptions/lib/format.ts | 68 + web/src/features/subscriptions/lib/index.ts | 26 + .../features/subscriptions/lib/plan-form.ts | 124 + web/src/features/subscriptions/types.ts | 155 + web/src/features/system-info/api.ts | 45 + .../components/system-instances-panel.tsx | 745 ++ .../components/system-tasks-panel.tsx | 363 + web/src/features/system-info/index.tsx | 48 + web/src/features/system-info/types.ts | 87 + .../__tests__/pricing-sync.test.tsx | 543 ++ .../__tests__/task-public-address.test.ts | 54 + web/src/features/system-settings/api.ts | 107 + .../auth/basic-auth-section.tsx | 269 + .../auth/bot-protection-section.tsx | 155 + .../system-settings/auth/custom-oauth/api.ts | 80 + .../components/access-policy-templates.ts | 40 + .../components/discovery-button.tsx | 97 + .../components/preset-selector.tsx | 131 + .../components/provider-form-dialog.tsx | 726 ++ .../components/provider-table.tsx | 152 + .../custom-oauth/custom-oauth-section.tsx | 119 + .../hooks/use-custom-oauth-mutations.ts | 113 + .../hooks/use-custom-oauth-providers.ts | 31 + .../auth/custom-oauth/types.ts | 224 + .../features/system-settings/auth/index.tsx | 85 + .../auth/oauth-callback-url.ts | 34 + .../system-settings/auth/oauth-section.tsx | 1128 +++ .../system-settings/auth/passkey-section.tsx | 411 + .../system-settings/auth/section-registry.tsx | 139 + .../system-settings/billing/index.tsx | 121 + .../billing/section-registry.tsx | 222 + .../components/form-dirty-indicator.tsx | 51 + .../components/form-navigation-guard.tsx | 104 + .../components/settings-accordion.tsx | 49 + .../components/settings-card.tsx | 51 + .../components/settings-form-layout.tsx | 200 + .../components/settings-page-context.tsx | 147 + .../components/settings-page.tsx | 151 + .../components/settings-section.tsx | 53 + .../content/announcements-section.tsx | 612 ++ .../content/api-info-section.tsx | 539 ++ .../system-settings/content/chat-dialog.tsx | 165 + .../content/chat-settings-section.tsx | 203 + .../content/chat-settings-visual-editor.tsx | 197 + .../content/dashboard-section.tsx | 196 + .../content/drawing-settings-section.tsx | 169 + .../system-settings/content/faq-section.tsx | 418 + .../system-settings/content/index.tsx | 97 + .../content/json-toggle-section.tsx | 227 + .../content/section-registry.tsx | 137 + .../content/uptime-kuma-section.tsx | 458 + .../features/system-settings/content/utils.ts | 37 + .../general/channel-affinity/api.ts | 64 + .../channel-affinity/cache-stats-dialog.tsx | 173 + .../general/channel-affinity/constants.ts | 134 + .../general/channel-affinity/index.tsx | 718 ++ .../channel-affinity/rule-editor-dialog.tsx | 493 ++ .../general/channel-affinity/types.ts | 57 + .../general/checkin-settings-section.tsx | 199 + .../general/pricing-section.tsx | 376 + .../general/quota-settings-section.tsx | 310 + .../general/system-behavior-section.tsx | 152 + .../general/system-info-section.tsx | 356 + .../general/task-public-address.ts | 56 + .../hooks/use-accordion-state.ts | 103 + .../hooks/use-form-dirty-guard.ts | 74 + .../system-settings/hooks/use-reset-form.ts | 44 + .../hooks/use-safe-json-state.ts | 59 + .../hooks/use-settings-form.ts | 286 + .../hooks/use-system-options.ts | 132 + .../hooks/use-update-option.ts | 71 + web/src/features/system-settings/index.tsx | 23 + .../integrations/amount-discount-dialog.tsx | 213 + .../amount-discount-visual-editor.tsx | 264 + .../amount-options-visual-editor.tsx | 168 + .../integrations/creem-product-dialog.tsx | 264 + .../creem-products-visual-editor.tsx | 308 + .../integrations/email-settings-section.tsx | 412 + .../ionet-deployment-settings-section.tsx | 265 + .../monitoring-settings-section.tsx | 320 + .../integrations/payment-method-dialog.tsx | 317 + .../payment-methods-visual-editor.tsx | 474 ++ .../integrations/payment-settings-section.tsx | 1634 ++++ .../system-settings/integrations/utils.ts | 128 + .../integrations/waffo-pancake-api.ts | 102 + .../waffo-pancake-settings-section.tsx | 600 ++ .../integrations/waffo-settings-section.tsx | 498 ++ .../integrations/worker-settings-section.tsx | 195 + .../system-settings/maintenance/config.ts | 244 + .../maintenance/header-navigation-section.tsx | 301 + .../maintenance/log-settings-section.tsx | 616 ++ .../maintenance/notice-section.tsx | 107 + .../maintenance/performance-section.tsx | 717 ++ .../maintenance/sidebar-modules-section.tsx | 282 + .../maintenance/update-checker-section.tsx | 189 + .../group-auto-limit-validation.test.ts | 39 + .../__tests__/task-pricing-copy.test.tsx | 120 + .../__tests__/tool-price-validation.test.tsx | 64 + .../models/channel-selector-dialog.tsx | 378 + .../models/claude-settings-card.tsx | 298 + .../models/conflict-confirm-dialog.tsx | 105 + .../system-settings/models/constants.ts | 77 + .../models/gemini-settings-card.tsx | 439 + .../models/global-settings-card.tsx | 380 + .../models/grok-settings-card.tsx | 207 + .../models/group-ratio-form.tsx | 793 ++ .../models/group-ratio-visual-editor.tsx | 1356 +++ .../models/group-special-usable-editor.tsx | 434 + .../features/system-settings/models/index.tsx | 98 + .../models/model-pricing-core.ts | 306 + .../models/model-pricing-inputs.tsx | 125 + .../models/model-pricing-sheet.tsx | 945 +++ .../models/model-pricing-snapshots.ts | 292 + .../models/model-ratio-form.tsx | 357 + .../models/model-ratio-table-columns.tsx | 202 + .../models/model-ratio-visual-editor.tsx | 812 ++ .../system-settings/models/pricing-format.ts | 61 + .../models/ratio-settings-card.tsx | 579 ++ .../models/routing-reliability-section.tsx | 673 ++ .../models/section-registry.tsx | 199 + .../models/task-pricing-matrix.tsx | 568 ++ .../models/task-usage-pricing-editor.tsx | 653 ++ .../models/tiered-pricing-editor.tsx | 1905 +++++ .../models/tool-price-settings.tsx | 394 + .../models/upstream-price-cells.tsx | 192 + .../models/upstream-ratio-sync-columns.tsx | 84 + .../models/upstream-ratio-sync-helpers.ts | 206 + .../models/upstream-ratio-sync-table.tsx | 263 + .../models/upstream-ratio-sync.tsx | 384 + .../features/system-settings/models/utils.ts | 184 + .../system-settings/operations/index.tsx | 78 + .../operations/section-registry.tsx | 164 + .../request-limits/rate-limit-dialog.tsx | 225 + .../request-limits/rate-limit-section.tsx | 324 + .../rate-limit-visual-editor.tsx | 208 + .../sensitive-words-section.tsx | 166 + .../request-limits/ssrf-section.tsx | 438 + .../request-limits/token-limit-section.tsx | 133 + .../system-settings/security/index.tsx | 57 + .../security/section-registry.tsx | 111 + .../features/system-settings/site/index.tsx | 52 + .../system-settings/site/section-registry.tsx | 106 + web/src/features/system-settings/types.ts | 463 + .../system-settings/utils/json-parser.ts | 185 + .../system-settings/utils/json-validators.ts | 53 + .../system-settings/utils/numeric-field.ts | 96 + .../system-settings/utils/route-config.ts | 110 + .../system-settings/utils/section-registry.ts | 100 + .../__tests__/enabled-option.test.ts | 66 + .../marketplace-install-dialog.test.tsx | 696 ++ .../__tests__/marketplace-panel.test.tsx | 164 + .../marketplace-plugin-logo.test.tsx | 124 + .../__tests__/marketplace.test.ts | 698 ++ .../__tests__/plugin-card.test.tsx | 214 + .../__tests__/plugin-detail-sheet.test.tsx | 550 ++ .../__tests__/plugin-icon-file.test.ts | 136 + .../__tests__/plugin-icon-image.test.tsx | 229 + .../__tests__/plugin-icon.test.ts | 165 + .../__tests__/plugin-meta-preview.test.ts | 216 + .../task-plugins/__tests__/plugin-url.test.ts | 223 + .../__tests__/plugins-table.test.tsx | 246 + .../__tests__/upload-dialog.test.tsx | 263 + .../__tests__/usage-schema-table.test.tsx | 82 + .../task-plugins/__tests__/website.test.tsx | 113 + web/src/features/task-plugins/api.ts | 201 + .../components/javascript-viewer.tsx | 90 + .../components/marketplace-capabilities.tsx | 261 + .../components/marketplace-install-dialog.tsx | 424 + .../components/marketplace-panel.tsx | 282 + .../components/marketplace-plugin-card.tsx | 224 + .../components/marketplace-sources-dialog.tsx | 214 + .../task-plugins/components/plugin-card.tsx | 156 + .../components/plugin-detail-sheet.tsx | 334 + .../components/plugin-endpoints.tsx | 190 + .../task-plugins/components/plugin-icon.tsx | 136 + .../components/plugin-integrity-check.tsx | 140 + .../components/plugin-metadata-card.tsx | 131 + .../components/plugin-model-list.tsx | 115 + .../components/plugin-sandbox.tsx | 82 + .../components/plugin-source-picker.tsx | 112 + .../components/plugin-url-import-field.tsx | 140 + .../components/plugin-website-link.tsx | 44 + .../task-plugins/components/plugins-table.tsx | 491 ++ .../task-plugins/components/source-diff.tsx | 102 + .../task-plugins/components/upload-dialog.tsx | 294 + .../components/usage-schema-table.tsx | 104 + web/src/features/task-plugins/index.tsx | 208 + .../task-plugins/lib/host-protocols.ts | 49 + .../features/task-plugins/lib/marketplace.ts | 335 + .../task-plugins/lib/plugin-icon-file.ts | 116 + .../features/task-plugins/lib/plugin-icon.ts | 107 + .../task-plugins/lib/plugin-meta-preview.ts | 327 + .../features/task-plugins/lib/plugin-url.ts | 139 + .../task-plugins/lib/plugin-website.ts | 59 + web/src/features/task-plugins/types.ts | 194 + .../usage-logs/__tests__/access.test.ts | 37 + .../usage-logs/__tests__/artifacts.test.ts | 357 + .../__tests__/mobile-layout.test.ts | 39 + .../usage-logs/__tests__/task-details.test.ts | 78 + web/src/features/usage-logs/api.ts | 127 + .../audit/__tests__/details.test.tsx | 701 ++ .../audit/__tests__/viewer.test.tsx | 757 ++ web/src/features/usage-logs/audit/api.ts | 65 + .../audit/components/audit-detail-fields.tsx | 71 + .../audit/components/audit-detail-value.tsx | 51 + .../audit/components/audit-log-columns.tsx | 185 + .../components/audit-log-details-dialog.tsx | 181 + .../audit/components/audit-log-filter-bar.tsx | 228 + .../audit/components/audit-log-viewer.tsx | 171 + web/src/features/usage-logs/audit/index.tsx | 126 + .../usage-logs/audit/lib/audit-details.ts | 523 ++ .../__tests__/cost-display.test.tsx | 83 + .../__tests__/detail-preview.test.tsx | 277 + .../__tests__/group-filter.test.tsx | 304 + .../__tests__/log-type-filter.test.tsx | 130 + .../components/__tests__/mobile-card.test.tsx | 268 + .../__tests__/mobile-filter.test.tsx | 289 + .../__tests__/quota-adjustment.test.tsx | 229 + .../__tests__/reject-reason.test.tsx | 101 + .../components/__tests__/usage-facts.test.tsx | 166 + .../components/columns/column-helpers.tsx | 271 + .../columns/common-logs-columns.tsx | 858 ++ .../columns/drawing-logs-columns.tsx | 270 + .../components/columns/task-logs-columns.tsx | 271 + .../components/common-log-mobile-card.tsx | 387 + .../components/common-logs-filter-bar.tsx | 520 ++ .../components/common-logs-header-actions.tsx | 66 + .../components/common-logs-stats.tsx | 107 + .../compact-date-time-range-picker.tsx | 241 + .../dialogs/audio-preview-dialog.tsx | 183 + .../components/dialogs/details-dialog.tsx | 1304 +++ .../components/dialogs/fail-reason-dialog.tsx | 81 + .../components/dialogs/image-dialog.tsx | 114 + .../components/dialogs/log-detail-layout.tsx | 85 + .../components/dialogs/prompt-dialog.tsx | 109 + .../dialogs/task-details-dialog.tsx | 266 + .../components/dialogs/user-info-dialog.tsx | 186 + .../components/log-cost-display.tsx | 144 + .../components/logs-filter-toolbar.tsx | 371 + .../usage-logs/components/model-badge.tsx | 230 + .../components/plugin-author-link.tsx | 65 + .../usage-logs/components/task-artifacts.tsx | 502 ++ .../components/task-logs-filter-bar.tsx | 226 + .../components/timing-metrics-cell.tsx | 228 + .../components/usage-logs-mobile-card.tsx | 316 + .../components/usage-logs-provider.tsx | 120 + .../components/usage-logs-table.tsx | 247 + web/src/features/usage-logs/constants.ts | 359 + web/src/features/usage-logs/data/schema.ts | 50 + web/src/features/usage-logs/index.tsx | 194 + .../lib/__tests__/tool-surcharge.test.ts | 97 + web/src/features/usage-logs/lib/columns.ts | 53 + web/src/features/usage-logs/lib/filter.ts | 87 + web/src/features/usage-logs/lib/format.ts | 544 ++ web/src/features/usage-logs/lib/index.ts | 63 + web/src/features/usage-logs/lib/mappers.ts | 71 + .../features/usage-logs/lib/query-params.ts | 31 + .../usage-logs/lib/quota-audit-operation.ts | 128 + web/src/features/usage-logs/lib/status.ts | 39 + .../features/usage-logs/lib/task-artifacts.ts | 201 + .../features/usage-logs/lib/task-details.ts | 44 + .../usage-logs/lib/task-mobile-layout.ts | 33 + web/src/features/usage-logs/lib/utils.ts | 288 + .../features/usage-logs/section-registry.tsx | 62 + web/src/features/usage-logs/types.ts | 485 ++ web/src/features/users/api.ts | 214 + .../components/__tests__/permissions.test.tsx | 145 + .../__tests__/quota-display.test.tsx | 437 + .../components/data-table-bulk-actions.tsx | 35 + .../components/data-table-row-actions.tsx | 306 + .../__tests__/user-binding-dialog.test.tsx | 148 + .../dialogs/user-binding-dialog.tsx | 452 + .../users/components/user-quota-cell.tsx | 87 + .../users/components/user-quota-dialog.tsx | 181 + .../users/components/users-columns.tsx | 291 + .../users/components/users-delete-dialog.tsx | 73 + .../users/components/users-mutate-drawer.tsx | 580 ++ .../components/users-primary-buttons.tsx | 43 + .../users/components/users-provider.tsx | 68 + .../features/users/components/users-table.tsx | 242 + web/src/features/users/constants.ts | 139 + web/src/features/users/index.tsx | 61 + web/src/features/users/lib/index.ts | 33 + web/src/features/users/lib/user-actions.ts | 39 + web/src/features/users/lib/user-form.ts | 126 + web/src/features/users/types.ts | 152 + web/src/features/wallet/api.ts | 248 + .../components/affiliate-rewards-card.tsx | 136 + .../components/creem-products-section.tsx | 77 + .../dialogs/billing-history-dialog.tsx | 347 + .../dialogs/creem-confirm-dialog.tsx | 92 + .../dialogs/payment-confirm-dialog.tsx | 156 + .../components/dialogs/transfer-dialog.tsx | 148 + .../wallet/components/recharge-form-card.tsx | 564 ++ .../components/subscription-plans-card.tsx | 663 ++ .../wallet/components/wallet-stats-card.tsx | 102 + web/src/features/wallet/constants.ts | 66 + web/src/features/wallet/hooks/index.ts | 29 + .../features/wallet/hooks/use-affiliate.ts | 99 + .../wallet/hooks/use-billing-history.ts | 177 + .../wallet/hooks/use-creem-payment.ts | 56 + .../features/wallet/hooks/use-payment.test.ts | 49 + web/src/features/wallet/hooks/use-payment.ts | 168 + .../features/wallet/hooks/use-redemption.ts | 70 + .../features/wallet/hooks/use-topup-info.ts | 236 + .../wallet/hooks/use-waffo-pancake-payment.ts | 107 + .../wallet/hooks/use-waffo-payment.ts | 84 + web/src/features/wallet/index.tsx | 390 + web/src/features/wallet/lib/affiliate.ts | 29 + web/src/features/wallet/lib/billing.ts | 84 + web/src/features/wallet/lib/format.ts | 97 + web/src/features/wallet/lib/index.ts | 26 + web/src/features/wallet/lib/payment.test.ts | 85 + web/src/features/wallet/lib/payment.ts | 201 + web/src/features/wallet/lib/ui.tsx | 160 + web/src/features/wallet/types.ts | 289 + .../hooks/__tests__/sidebar-config.test.tsx | 182 + web/src/hooks/index.ts | 32 + web/src/hooks/use-admin.ts | 31 + web/src/hooks/use-copy-to-clipboard.ts | 96 + web/src/hooks/use-countdown.ts | 74 + web/src/hooks/use-debounce.ts | 41 + web/src/hooks/use-dialog.ts | 186 + web/src/hooks/use-hidden-click-unlock.ts | 66 + web/src/hooks/use-media-query.ts | 50 + web/src/hooks/use-minimum-loading-time.ts | 51 + web/src/hooks/use-mobile.ts | 37 + web/src/hooks/use-mobile.tsx | 37 + web/src/hooks/use-notifications.ts | 187 + web/src/hooks/use-sidebar-config.ts | 335 + web/src/hooks/use-sidebar-data.ts | 182 + web/src/hooks/use-sidebar-view.ts | 82 + web/src/hooks/use-status.ts | 82 + web/src/hooks/use-system-config.ts | 204 + web/src/hooks/use-table-compact-mode.ts | 81 + web/src/hooks/use-table-url-state.ts | 266 + web/src/hooks/use-top-nav-links.ts | 106 + web/src/hooks/use-user-display.ts | 75 + web/src/i18n/config.ts | 64 + web/src/i18n/languages.ts | 101 + web/src/i18n/locales/en.json | 6168 ++++++++++++++ web/src/i18n/locales/fr.json | 6149 ++++++++++++++ web/src/i18n/locales/ja.json | 6149 ++++++++++++++ web/src/i18n/locales/ru.json | 6149 ++++++++++++++ web/src/i18n/locales/vi.json | 6149 ++++++++++++++ web/src/i18n/locales/zh-TW.json | 6149 ++++++++++++++ web/src/i18n/locales/zh.json | 6168 ++++++++++++++ web/src/i18n/static-keys.ts | 688 ++ web/src/lib/__tests__/http-cache.test.ts | 78 + web/src/lib/__tests__/localized-text.test.ts | 116 + web/src/lib/admin-permissions.ts | 115 + web/src/lib/api.ts | 133 + web/src/lib/auth-session-sync.ts | 119 + web/src/lib/auth-session.test.ts | 326 + web/src/lib/auth-session.ts | 450 + web/src/lib/avatar.ts | 45 + web/src/lib/build-metadata.ts | 170 + web/src/lib/channel-connection-info.ts | 58 + web/src/lib/colors.ts | 185 + web/src/lib/constants.ts | 32 + web/src/lib/content-format.ts | 32 + web/src/lib/cookies.ts | 61 + web/src/lib/copy-to-clipboard.ts | 103 + web/src/lib/currency.ts | 637 ++ web/src/lib/dayjs.ts | 24 + web/src/lib/dom-utils.ts | 34 + web/src/lib/format.ts | 312 + web/src/lib/frontend-cache.ts | 58 + web/src/lib/handle-server-error.ts | 51 + web/src/lib/http-client.ts | 166 + web/src/lib/http-status-code-rules.ts | 136 + web/src/lib/legacy-route.test.ts | 91 + web/src/lib/legacy-route.ts | 104 + web/src/lib/lobe-icon.tsx | 183 + web/src/lib/localized-text.ts | 82 + web/src/lib/motion.ts | 122 + web/src/lib/nav-modules.ts | 211 + web/src/lib/oauth.ts | 135 + web/src/lib/passkey.ts | 265 + web/src/lib/password-policy.ts | 25 + web/src/lib/roles.ts | 45 + web/src/lib/secure-verification.ts | 82 + web/src/lib/server-error-message.test.ts | 68 + web/src/lib/server-error-message.ts | 102 + web/src/lib/session-hint.ts | 62 + web/src/lib/show-submitted-data.tsx | 33 + web/src/lib/theme-customization.ts | 197 + web/src/lib/theme-radius.ts | 51 + web/src/lib/time.ts | 203 + web/src/lib/use-chart-theme.ts | 61 + web/src/lib/use-controllable-state.ts | 86 + web/src/lib/utils.ts | 102 + web/src/lib/vchart.ts | 22 + web/src/main.tsx | 173 + web/src/routeTree.gen.ts | 1413 ++++ web/src/routes/(auth)/forgot-password.tsx | 25 + web/src/routes/(auth)/oauth.tsx | 72 + web/src/routes/(auth)/otp.tsx | 25 + web/src/routes/(auth)/register.tsx | 29 + web/src/routes/(auth)/reset.tsx | 35 + web/src/routes/(auth)/route.tsx | 21 + web/src/routes/(auth)/sign-in.tsx | 49 + web/src/routes/(auth)/sign-up.tsx | 34 + web/src/routes/(auth)/user/reset.tsx | 36 + web/src/routes/(errors)/401.tsx | 25 + web/src/routes/(errors)/403.tsx | 25 + web/src/routes/(errors)/404.tsx | 25 + web/src/routes/(errors)/500.tsx | 25 + web/src/routes/(errors)/503.tsx | 25 + web/src/routes/__root.tsx | 154 + .../routes/_authenticated/channels/index.tsx | 48 + .../routes/_authenticated/chat/$chatId.tsx | 165 + web/src/routes/_authenticated/chat2link.tsx | 94 + .../_authenticated/dashboard/$section.tsx | 38 + .../routes/_authenticated/dashboard/index.tsx | 30 + .../routes/_authenticated/errors/$error.tsx | 63 + web/src/routes/_authenticated/keys/index.tsx | 39 + .../routes/_authenticated/models/$section.tsx | 71 + .../routes/_authenticated/models/index.tsx | 40 + .../_authenticated/playground/index.tsx | 40 + .../routes/_authenticated/profile/index.tsx | 25 + .../_authenticated/redemption-codes/index.tsx | 46 + web/src/routes/_authenticated/route.tsx | 43 + .../routes/_authenticated/security/index.tsx | 25 + .../_authenticated/subscriptions/index.tsx | 33 + .../_authenticated/system-info/index.tsx | 36 + .../system-settings/auth/$section.tsx | 40 + .../system-settings/auth/index.tsx | 30 + .../system-settings/billing/$section.tsx | 40 + .../system-settings/billing/index.tsx | 32 + .../system-settings/content/$section.tsx | 40 + .../system-settings/content/index.tsx | 32 + .../_authenticated/system-settings/index.tsx | 27 + .../system-settings/models/$section.tsx | 40 + .../system-settings/models/index.tsx | 32 + .../system-settings/operations/$section.tsx | 47 + .../system-settings/operations/index.tsx | 32 + .../_authenticated/system-settings/route.tsx | 36 + .../system-settings/security/$section.tsx | 40 + .../system-settings/security/index.tsx | 32 + .../system-settings/site/$section.tsx | 40 + .../system-settings/site/index.tsx | 30 + .../_authenticated/task-plugins/index.tsx | 31 + .../_authenticated/usage-logs/$section.tsx | 75 + .../_authenticated/usage-logs/audit.tsx | 25 + .../_authenticated/usage-logs/index.tsx | 30 + web/src/routes/_authenticated/users/index.tsx | 53 + .../routes/_authenticated/wallet/index.tsx | 36 + web/src/routes/about/index.tsx | 25 + web/src/routes/group-status.tsx | 7 + web/src/routes/index.tsx | 25 + web/src/routes/oauth/$provider.tsx | 285 + web/src/routes/pricing/$modelId/index.tsx | 57 + web/src/routes/pricing/index.tsx | 57 + web/src/routes/privacy-policy.tsx | 25 + web/src/routes/rankings/index.tsx | 51 + web/src/routes/setup/index.tsx | 39 + web/src/routes/user-agreement.tsx | 25 + web/src/stores/auth-store.ts | 161 + web/src/stores/notification-store.ts | 88 + web/src/stores/pricing-preferences-store.ts | 40 + web/src/stores/system-config-store.ts | 113 + web/src/styles/index.css | 732 ++ web/src/styles/theme-presets.css | 742 ++ web/src/styles/theme.css | 247 + web/src/tanstack-table.d.ts | 33 + web/src/test-setup.ts | 119 + web/tsconfig.app.json | 33 + web/tsconfig.json | 12 + web/tsconfig.node.json | 24 + web/vitest.config.ts | 42 + 2381 files changed, 551494 insertions(+) create mode 100644 .agents/github/ISSUE.md create mode 100644 .agents/github/PR.md create mode 100644 .agents/skills/i18n-translate/SKILL.md create mode 100644 .agents/skills/shadcn-ui/SKILL.md create mode 100644 .agents/skills/shadcn-ui/vendor/shadcn/UPSTREAM.txt create mode 100644 .agents/skills/shadcn-ui/vendor/shadcn/cli.md create mode 100644 .agents/skills/shadcn-ui/vendor/shadcn/customization.md create mode 100644 .agents/skills/shadcn-ui/vendor/shadcn/mcp.md create mode 100644 .agents/skills/shadcn-ui/vendor/shadcn/official-shadcn-ui-workflow.md create mode 100644 .agents/skills/shadcn-ui/vendor/shadcn/rules/base-vs-radix.md create mode 100644 .agents/skills/shadcn-ui/vendor/shadcn/rules/composition.md create mode 100644 .agents/skills/shadcn-ui/vendor/shadcn/rules/forms.md create mode 100644 .agents/skills/shadcn-ui/vendor/shadcn/rules/icons.md create mode 100644 .agents/skills/shadcn-ui/vendor/shadcn/rules/styling.md create mode 100644 .agents/skills/vercel-react-best-practices/SKILL.md create mode 100644 .agents/skills/vercel-react-best-practices/references/full-guide.md create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report_en.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request_en.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/en.md create mode 100644 .github/SECURITY.md create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/docker-build.yml create mode 100644 .github/workflows/docker-image-branch.yml create mode 100644 .github/workflows/electron-build.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/sync-release-to-gitcode.yml create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 CUSTOMIZATION.md create mode 100644 Dockerfile create mode 100644 Dockerfile.dev create mode 100644 Dockerfile.group-pricing create mode 100644 Dockerfile.request-status create mode 100644 LICENSE create mode 100644 NOTICE create mode 100644 README.en.md create mode 100644 README.fr.md create mode 100644 README.ja.md create mode 100644 README.md create mode 100644 README.zh_CN.md create mode 100644 README.zh_TW.md create mode 100644 THIRD-PARTY-LICENSES.md create mode 100644 VERSION create mode 100644 bin/migration_v0.2-v0.3.sql create mode 100644 bin/migration_v0.3-v0.4.sql create mode 100644 bin/time_test.sh create mode 100644 common/account_password.go create mode 100644 common/api_type.go create mode 100644 common/api_type_task_plugin_test.go create mode 100644 common/audio.go create mode 100644 common/body_storage.go create mode 100644 common/body_storage_test.go create mode 100644 common/constants.go create mode 100644 common/copy.go create mode 100644 common/crypto.go create mode 100644 common/custom-event.go create mode 100644 common/database.go create mode 100644 common/disk_cache.go create mode 100644 common/disk_cache_config.go create mode 100644 common/email-outlook-auth.go create mode 100644 common/email.go create mode 100644 common/email_ntlm_auth.go create mode 100644 common/email_test.go create mode 100644 common/embed-file-system.go create mode 100644 common/endpoint_defaults.go create mode 100644 common/endpoint_type.go create mode 100644 common/env.go create mode 100644 common/etag.go create mode 100644 common/gin.go create mode 100644 common/go-channel.go create mode 100644 common/gopool.go create mode 100644 common/hash.go create mode 100644 common/init.go create mode 100644 common/ip.go create mode 100644 common/json.go create mode 100644 common/json_test.go create mode 100644 common/limiter/limiter.go create mode 100644 common/limiter/lua/rate_limit.lua create mode 100644 common/model.go create mode 100644 common/node_identity.go create mode 100644 common/page_info.go create mode 100644 common/password_crypto.go create mode 100644 common/performance_config.go create mode 100644 common/pprof.go create mode 100644 common/proxy_url.go create mode 100644 common/pyro.go create mode 100644 common/quota.go create mode 100644 common/quota_math.go create mode 100644 common/quota_math_test.go create mode 100644 common/rate-limit.go create mode 100644 common/redis.go create mode 100644 common/request_body_limit.go create mode 100644 common/session_cookie.go create mode 100644 common/ssrf_protection.go create mode 100644 common/ssrf_protection_test.go create mode 100644 common/str.go create mode 100644 common/sys_log.go create mode 100644 common/system_monitor.go create mode 100644 common/system_monitor_unix.go create mode 100644 common/system_monitor_windows.go create mode 100644 common/topup-ratio.go create mode 100644 common/totp.go create mode 100644 common/trusted_proxies.go create mode 100644 common/url_validator.go create mode 100644 common/url_validator_test.go create mode 100644 common/user_session_test.go create mode 100644 common/utils.go create mode 100644 common/validate.go create mode 100644 common/verification.go create mode 100644 constant/README.md create mode 100644 constant/api_type.go create mode 100644 constant/azure.go create mode 100644 constant/cache_key.go create mode 100644 constant/channel.go create mode 100644 constant/channel_test.go create mode 100644 constant/context_key.go create mode 100644 constant/endpoint_type.go create mode 100644 constant/env.go create mode 100644 constant/finish_reason.go create mode 100644 constant/midjourney.go create mode 100644 constant/multi_key_mode.go create mode 100644 constant/setup.go create mode 100644 constant/task.go create mode 100644 constant/task_test.go create mode 100644 constant/waffo_pay_method.go create mode 100644 controller/access_token.go create mode 100644 controller/access_token_audit_test.go create mode 100644 controller/audit.go create mode 100644 controller/auth_flow_test.go create mode 100644 controller/auth_session.go create mode 100644 controller/auth_session_test.go create mode 100644 controller/authz.go create mode 100644 controller/billing.go create mode 100644 controller/billing_option_test.go create mode 100644 controller/channel-billing.go create mode 100644 controller/channel-test.go create mode 100644 controller/channel.go create mode 100644 controller/channel_affinity_cache.go create mode 100644 controller/channel_authz.go create mode 100644 controller/channel_authz_test.go create mode 100644 controller/channel_pin_retry_test.go create mode 100644 controller/channel_task_plugin_bind_test.go create mode 100644 controller/channel_task_plugin_validation_test.go create mode 100644 controller/channel_test_internal_test.go create mode 100644 controller/channel_test_request_test.go create mode 100644 controller/channel_upstream_update.go create mode 100644 controller/channel_upstream_update_test.go create mode 100644 controller/checkin.go create mode 100644 controller/codex_usage.go create mode 100644 controller/custom_oauth.go create mode 100644 controller/deployment.go create mode 100644 controller/email_binding.go create mode 100644 controller/group.go create mode 100644 controller/group_availability_test.go create mode 100644 controller/image.go create mode 100644 controller/log.go create mode 100644 controller/login_verification.go create mode 100644 controller/midjourney.go create mode 100644 controller/misc.go create mode 100644 controller/misc_oidc_test.go create mode 100644 controller/missing_models.go create mode 100644 controller/model.go create mode 100644 controller/model_list_test.go create mode 100644 controller/model_management_test.go create mode 100644 controller/model_meta.go create mode 100644 controller/model_owned_by_test.go create mode 100644 controller/model_pricing_config.go create mode 100644 controller/model_sync.go create mode 100644 controller/oauth.go create mode 100644 controller/option.go create mode 100644 controller/option_claude_test.go create mode 100644 controller/option_gemini_test.go create mode 100644 controller/passkey.go create mode 100644 controller/passkey_test.go create mode 100644 controller/payment_compliance.go create mode 100644 controller/payment_webhook_availability.go create mode 100644 controller/payment_webhook_availability_test.go create mode 100644 controller/perf_metrics.go create mode 100644 controller/performance.go create mode 100644 controller/playground.go create mode 100644 controller/plugin_endpoint_test.go create mode 100644 controller/plugin_native_e2e_test.go create mode 100644 controller/plugin_protocol.go create mode 100644 controller/plugin_protocol_limiter.go create mode 100644 controller/plugin_protocol_limiter_test.go create mode 100644 controller/plugin_protocol_sdk_test.go create mode 100644 controller/plugin_protocol_test.go create mode 100644 controller/prefill_group.go create mode 100644 controller/pricing.go create mode 100644 controller/rankings.go create mode 100644 controller/ratio_config.go create mode 100644 controller/ratio_sync.go create mode 100644 controller/ratio_sync_test.go create mode 100644 controller/redemption.go create mode 100644 controller/redemption_batch_test.go create mode 100644 controller/relay.go create mode 100644 controller/relay_client_error_test.go create mode 100644 controller/relay_count_tokens_test.go create mode 100644 controller/relay_error_log_test.go create mode 100644 controller/relay_log_privacy_test.go create mode 100644 controller/relay_task_plugin_test.go create mode 100644 controller/request_status_test.go create mode 100644 controller/return_path.go create mode 100644 controller/return_path_test.go create mode 100644 controller/revalidated_response.go create mode 100644 controller/secure_verification.go create mode 100644 controller/security_account_test.go create mode 100644 controller/security_enrollment_test.go create mode 100644 controller/setup.go create mode 100644 controller/subscription.go create mode 100644 controller/subscription_payment_creem.go create mode 100644 controller/subscription_payment_epay.go create mode 100644 controller/subscription_payment_stripe.go create mode 100644 controller/subscription_payment_waffo_pancake.go create mode 100644 controller/system_info.go create mode 100644 controller/system_task.go create mode 100644 controller/system_task_handlers.go create mode 100644 controller/task.go create mode 100644 controller/task_generic_test.go create mode 100644 controller/task_log_view_test.go create mode 100644 controller/task_plugin.go create mode 100644 controller/task_plugin_debug.go create mode 100644 controller/task_plugin_debug_test.go create mode 100644 controller/task_plugin_test.go create mode 100644 controller/telegram.go create mode 100644 controller/telegram_test.go create mode 100644 controller/theme_compat_test.go create mode 100644 controller/token.go create mode 100644 controller/token_auto_groups_test.go create mode 100644 controller/token_test.go create mode 100644 controller/topup.go create mode 100644 controller/topup_creem.go create mode 100644 controller/topup_quota_limit_test.go create mode 100644 controller/topup_stripe.go create mode 100644 controller/topup_waffo.go create mode 100644 controller/topup_waffo_pancake.go create mode 100644 controller/topup_waffo_pancake_test.go create mode 100644 controller/twofa.go create mode 100644 controller/uptime_kuma.go create mode 100644 controller/uptime_kuma_test.go create mode 100644 controller/usedata.go create mode 100644 controller/usedata_flow_test.go create mode 100644 controller/user.go create mode 100644 controller/user_manage_test.go create mode 100644 controller/user_quota.go create mode 100644 controller/vendor_meta.go create mode 100644 controller/video_proxy.go create mode 100644 controller/wechat.go create mode 100644 docker-compose.dev.yml create mode 100644 docker-compose.yml create mode 100644 docs/authentication.md create mode 100644 docs/channel/other_setting.md create mode 100644 docs/images/aionui.png create mode 100644 docs/images/aliyun.png create mode 100644 docs/images/cherry-studio.png create mode 100644 docs/images/io-net.png create mode 100644 docs/images/pku.png create mode 100644 docs/images/ucloud.png create mode 100644 docs/installation/BT.md create mode 100644 docs/ionet-client.md create mode 100644 docs/openapi/api.json create mode 100644 docs/openapi/relay.json create mode 100644 docs/plugin-api/README.md create mode 100644 docs/plugin-api/v1.d.ts create mode 100644 docs/plugin-api/v1.md create mode 100644 docs/plugin-api/v1.schema.json create mode 100644 docs/translation-glossary.fr.md create mode 100644 docs/translation-glossary.md create mode 100644 docs/translation-glossary.ru.md create mode 100644 dto/channel_constraints.go create mode 100644 dto/channel_constraints_test.go create mode 100644 dto/midjourney.go create mode 100644 dto/plugin_protocol.go create mode 100644 dto/suno.go create mode 100644 dto/task.go create mode 100644 dto/task_plugin.go create mode 100644 dto/video.go create mode 100644 e2e/doc_parse_test.go create mode 100644 electron/README.md create mode 100644 electron/build.sh create mode 100644 electron/create-tray-icon.js create mode 100644 electron/entitlements.mac.plist create mode 100644 electron/icon.png create mode 100644 electron/main.js create mode 100644 electron/package-lock.json create mode 100644 electron/package.json create mode 100644 electron/preload.js create mode 100644 electron/tray-icon-windows.png create mode 100644 electron/tray-iconTemplate.png create mode 100644 electron/tray-iconTemplate@2x.png create mode 100644 go.mod create mode 100644 go.sum create mode 100644 i18n/i18n.go create mode 100644 i18n/keys.go create mode 100644 i18n/locales/en.yaml create mode 100644 i18n/locales/zh-CN.yaml create mode 100644 i18n/locales/zh-TW.yaml create mode 100644 logger/logger.go create mode 100644 main.go create mode 100644 makefile create mode 100644 middleware/audit.go create mode 100644 middleware/auth.go create mode 100644 middleware/auth_origin.go create mode 100644 middleware/auth_origin_test.go create mode 100644 middleware/auth_test.go create mode 100644 middleware/body_cleanup.go create mode 100644 middleware/cache.go create mode 100644 middleware/cors.go create mode 100644 middleware/disable-cache.go create mode 100644 middleware/distributor.go create mode 100644 middleware/distributor_test.go create mode 100644 middleware/email-verification-rate-limit.go create mode 100644 middleware/gzip.go create mode 100644 middleware/header_nav.go create mode 100644 middleware/header_nav_test.go create mode 100644 middleware/i18n.go create mode 100644 middleware/logger.go create mode 100644 middleware/model-rate-limit.go create mode 100644 middleware/model_rate_limit_test.go create mode 100644 middleware/performance.go create mode 100644 middleware/rate-limit.go create mode 100644 middleware/rate_limit_test.go create mode 100644 middleware/recover.go create mode 100644 middleware/request-id.go create mode 100644 middleware/request_body_limit.go create mode 100644 middleware/secure_verification.go create mode 100644 middleware/stats.go create mode 100644 middleware/task_artifact_access.go create mode 100644 middleware/task_artifact_access_test.go create mode 100644 middleware/task_plugin.go create mode 100644 middleware/task_plugin_model.go create mode 100644 middleware/task_plugin_origin_task_test.go create mode 100644 middleware/task_plugin_test.go create mode 100644 middleware/token_auto_groups_context_test.go create mode 100644 middleware/trusted_proxies.go create mode 100644 middleware/trusted_proxies_test.go create mode 100644 middleware/turnstile-check.go create mode 100644 middleware/utils.go create mode 100644 model/ability.go create mode 100644 model/ability_group_test.go create mode 100644 model/account_security.go create mode 100644 model/audit_log.go create mode 100644 model/audit_other.go create mode 100644 model/auth_flow.go create mode 100644 model/auth_flow_test.go create mode 100644 model/authz_role.go create mode 100644 model/casbin_rule.go create mode 100644 model/channel.go create mode 100644 model/channel_cache.go create mode 100644 model/channel_constraint.go create mode 100644 model/channel_constraint_test.go create mode 100644 model/channel_satisfy.go create mode 100644 model/channel_settings_test.go create mode 100644 model/channel_status_test.go create mode 100644 model/checkin.go create mode 100644 model/clickhouse_log_test.go create mode 100644 model/custom_oauth_provider.go create mode 100644 model/db_time.go create mode 100644 model/email_binding.go create mode 100644 model/errors.go create mode 100644 model/external_identity_claim.go create mode 100644 model/external_identity_claim_test.go create mode 100644 model/frontend_option_migration.go create mode 100644 model/frontend_option_migration_test.go create mode 100644 model/gorm_logger.go create mode 100644 model/gorm_logger_test.go create mode 100644 model/group_status.go create mode 100644 model/group_status_test.go create mode 100644 model/json_column_test.go create mode 100644 model/locking.go create mode 100644 model/locking_test.go create mode 100644 model/log.go create mode 100644 model/log_format_test.go create mode 100644 model/log_other.go create mode 100644 model/log_other_test.go create mode 100644 model/login_verification.go create mode 100644 model/main.go create mode 100644 model/midjourney.go create mode 100644 model/migration_dialector.go create mode 100644 model/migration_dialector_test.go create mode 100644 model/missing_models.go create mode 100644 model/model_extra.go create mode 100644 model/model_meta.go create mode 100644 model/model_metadata_sync.go create mode 100644 model/model_owner_test.go create mode 100644 model/model_pricing_config.go create mode 100644 model/option.go create mode 100644 model/option_auto_group_test.go create mode 100644 model/option_task_plugin_test.go create mode 100644 model/passkey.go create mode 100644 model/password_crypto.go create mode 100644 model/payment_method_guard_test.go create mode 100644 model/perf_metric.go create mode 100644 model/prefill_group.go create mode 100644 model/prefill_group_migration.go create mode 100644 model/prefill_group_migration_test.go create mode 100644 model/pricing.go create mode 100644 model/pricing_default.go create mode 100644 model/pricing_endpoint_test.go create mode 100644 model/pricing_refresh.go create mode 100644 model/pricing_usage_schema_test.go create mode 100644 model/quota_reserve.go create mode 100644 model/quota_reserve_test.go create mode 100644 model/redemption.go create mode 100644 model/redemption_test.go create mode 100644 model/setup.go create mode 100644 model/subscription.go create mode 100644 model/subscription_auth_test.go create mode 100644 model/subscription_reset_test.go create mode 100644 model/system_instance.go create mode 100644 model/system_task.go create mode 100644 model/system_task_test.go create mode 100644 model/task.go create mode 100644 model/task_cas_test.go create mode 100644 model/task_model_alias.go create mode 100644 model/task_openai_video_test.go create mode 100644 model/task_plugin.go create mode 100644 model/task_plugin_channel_select_test.go create mode 100644 model/task_plugin_test.go create mode 100644 model/token.go create mode 100644 model/token_auto_groups_cache_test.go create mode 100644 model/token_cache.go create mode 100644 model/token_migration.go create mode 100644 model/token_migration_test.go create mode 100644 model/topup.go create mode 100644 model/twofa.go create mode 100644 model/twofa_enrollment.go create mode 100644 model/usedata.go create mode 100644 model/usedata_flow.go create mode 100644 model/usedata_flow_test.go create mode 100644 model/usedata_rankings.go create mode 100644 model/user.go create mode 100644 model/user_auth_cache.go create mode 100644 model/user_authentication_test.go create mode 100644 model/user_cache.go create mode 100644 model/user_cache_auth_version_test.go create mode 100644 model/user_oauth_binding.go create mode 100644 model/user_pagination_test.go create mode 100644 model/user_quota_adjustment.go create mode 100644 model/user_session.go create mode 100644 model/user_session_migration_test.go create mode 100644 model/user_session_test.go create mode 100644 model/user_update_test.go create mode 100644 model/utils.go create mode 100644 model/vendor_management.go create mode 100644 model/vendor_meta.go create mode 100644 new-api.service create mode 100644 oauth/discord.go create mode 100644 oauth/generic.go create mode 100644 oauth/github.go create mode 100644 oauth/linuxdo.go create mode 100644 oauth/oidc.go create mode 100644 oauth/oidc_test.go create mode 100644 oauth/provider.go create mode 100644 oauth/registry.go create mode 100644 oauth/telegram.go create mode 100644 oauth/types.go create mode 100644 pkg/billingexpr/billingexpr_test.go create mode 100644 pkg/billingexpr/compile.go create mode 100644 pkg/billingexpr/compile_usage_test.go create mode 100644 pkg/billingexpr/expr.md create mode 100644 pkg/billingexpr/round.go create mode 100644 pkg/billingexpr/run.go create mode 100644 pkg/billingexpr/settle.go create mode 100644 pkg/billingexpr/settle_clamp_test.go create mode 100644 pkg/billingexpr/task_usage_test.go create mode 100644 pkg/billingexpr/types.go create mode 100644 pkg/cachex/codec.go create mode 100644 pkg/cachex/hybrid_cache.go create mode 100644 pkg/cachex/namespace.go create mode 100644 pkg/ionet/client.go create mode 100644 pkg/ionet/container.go create mode 100644 pkg/ionet/deployment.go create mode 100644 pkg/ionet/hardware.go create mode 100644 pkg/ionet/jsonutil.go create mode 100644 pkg/ionet/types.go create mode 100644 pkg/jsplugin/cli.go create mode 100644 pkg/jsplugin/cli_test.go create mode 100644 pkg/jsplugin/engine.go create mode 100644 pkg/jsplugin/engine_test.go create mode 100644 pkg/jsplugin/fixture.go create mode 100644 pkg/jsplugin/fixture_test.go create mode 100644 pkg/jsplugin/icon.go create mode 100644 pkg/jsplugin/model_fold.go create mode 100644 pkg/jsplugin/protocol_supports_test.go create mode 100644 pkg/jsplugin/registry.go create mode 100644 pkg/jsplugin/registry_disabled_factory_test.go create mode 100644 pkg/jsplugin/registry_master_enabled_test.go create mode 100644 pkg/jsplugin/registry_test.go create mode 100644 pkg/jsplugin/request.go create mode 100644 pkg/jsplugin/routing.go create mode 100644 pkg/jsplugin/routing_test.go create mode 100644 pkg/jsplugin/utils.go create mode 100644 pkg/perf_metrics/flush.go create mode 100644 pkg/perf_metrics/group_test.go create mode 100644 pkg/perf_metrics/metrics.go create mode 100644 pkg/perf_metrics/types.go create mode 100644 plugins/.oxfmtrc.json create mode 100644 plugins/.oxlintrc.json create mode 100644 plugins/alibaba_responses_test.go create mode 100644 plugins/alibaba_wan3_test.go create mode 100644 plugins/builtin_plugins_test.go create mode 100644 plugins/doubao_responses_test.go create mode 100644 plugins/embed.go create mode 100644 plugins/google_responses_test.go create mode 100644 plugins/hailuo_responses_test.go create mode 100644 plugins/jimeng_responses_test.go create mode 100644 plugins/kling_responses_test.go create mode 100644 plugins/sora_responses_test.go create mode 100644 plugins/sunoapi_responses_test.go create mode 100644 plugins/tasks/alibaba/plugin.js create mode 100644 plugins/tasks/doubao/plugin.js create mode 100644 plugins/tasks/google/plugin.js create mode 100644 plugins/tasks/hailuo/plugin.js create mode 100644 plugins/tasks/jimeng/plugin.js create mode 100644 plugins/tasks/kling/plugin.js create mode 100644 plugins/tasks/sora/plugin.js create mode 100644 plugins/tasks/sunoapi/plugin.js create mode 100644 plugins/tasks/vertex-ai/plugin.js create mode 100644 plugins/tasks/vidu/plugin.js create mode 100644 plugins/veo_poll_test.go create mode 100644 plugins/vertex_ai_responses_test.go create mode 100644 plugins/video_responses_test_helpers_test.go create mode 100644 plugins/vidu_responses_test.go create mode 100644 relay/alpha_search_handler.go create mode 100644 relay/alpha_search_handler_test.go create mode 100644 relay/audio_handler.go create mode 100644 relay/channel/adapter.go create mode 100644 relay/channel/advancedcustom/adaptor.go create mode 100644 relay/channel/advancedcustom/adaptor_test.go create mode 100644 relay/channel/ai360/constants.go create mode 100644 relay/channel/ali/adaptor.go create mode 100644 relay/channel/ali/adaptor_test.go create mode 100644 relay/channel/ali/constants.go create mode 100644 relay/channel/ali/dto.go create mode 100644 relay/channel/ali/image.go create mode 100644 relay/channel/ali/image_wan.go create mode 100644 relay/channel/ali/rerank.go create mode 100644 relay/channel/ali/text.go create mode 100644 relay/channel/ali/text_test.go create mode 100644 relay/channel/api_request.go create mode 100644 relay/channel/api_request_getbody_test.go create mode 100644 relay/channel/api_request_redirect_test.go create mode 100644 relay/channel/api_request_test.go create mode 100644 relay/channel/aws/adaptor.go create mode 100644 relay/channel/aws/constants.go create mode 100644 relay/channel/aws/dto.go create mode 100644 relay/channel/aws/relay-aws.go create mode 100644 relay/channel/aws/relay_aws_test.go create mode 100644 relay/channel/baidu/adaptor.go create mode 100644 relay/channel/baidu/constants.go create mode 100644 relay/channel/baidu/dto.go create mode 100644 relay/channel/baidu/relay-baidu.go create mode 100644 relay/channel/baidu_v2/adaptor.go create mode 100644 relay/channel/baidu_v2/constants.go create mode 100644 relay/channel/claude/adaptor.go create mode 100644 relay/channel/claude/adaptor_test.go create mode 100644 relay/channel/claude/constants.go create mode 100644 relay/channel/claude/dto.go create mode 100644 relay/channel/claude/message_delta_usage_patch_test.go create mode 100644 relay/channel/claude/relay-claude.go create mode 100644 relay/channel/claude/relay_claude_test.go create mode 100644 relay/channel/claude/relay_responses.go create mode 100644 relay/channel/claude/tool_billing_test.go create mode 100644 relay/channel/cloudflare/adaptor.go create mode 100644 relay/channel/cloudflare/constant.go create mode 100644 relay/channel/cloudflare/dto.go create mode 100644 relay/channel/cloudflare/relay_cloudflare.go create mode 100644 relay/channel/codex/adaptor.go create mode 100644 relay/channel/codex/adaptor_test.go create mode 100644 relay/channel/codex/constants.go create mode 100644 relay/channel/codex/oauth_key.go create mode 100644 relay/channel/cohere/adaptor.go create mode 100644 relay/channel/cohere/constant.go create mode 100644 relay/channel/cohere/dto.go create mode 100644 relay/channel/cohere/relay-cohere.go create mode 100644 relay/channel/coze/adaptor.go create mode 100644 relay/channel/coze/constants.go create mode 100644 relay/channel/coze/dto.go create mode 100644 relay/channel/coze/relay-coze.go create mode 100644 relay/channel/deepseek/adaptor.go create mode 100644 relay/channel/deepseek/constants.go create mode 100644 relay/channel/dify/adaptor.go create mode 100644 relay/channel/dify/constants.go create mode 100644 relay/channel/dify/dto.go create mode 100644 relay/channel/dify/relay-dify.go create mode 100644 relay/channel/gemini/adaptor.go create mode 100644 relay/channel/gemini/adaptor_responses_test.go create mode 100644 relay/channel/gemini/constant.go create mode 100644 relay/channel/gemini/relay-gemini-native.go create mode 100644 relay/channel/gemini/relay-gemini.go create mode 100644 relay/channel/gemini/relay_gemini_usage_test.go create mode 100644 relay/channel/gemini/relay_responses.go create mode 100644 relay/channel/gemini/relay_responses_test.go create mode 100644 relay/channel/jimeng/adaptor.go create mode 100644 relay/channel/jimeng/constants.go create mode 100644 relay/channel/jimeng/image.go create mode 100644 relay/channel/jimeng/sign.go create mode 100644 relay/channel/jina/adaptor.go create mode 100644 relay/channel/jina/constant.go create mode 100644 relay/channel/jina/relay-jina.go create mode 100644 relay/channel/lingyiwanwu/constrants.go create mode 100644 relay/channel/minimax/adaptor.go create mode 100644 relay/channel/minimax/adaptor_test.go create mode 100644 relay/channel/minimax/constants.go create mode 100644 relay/channel/minimax/image.go create mode 100644 relay/channel/minimax/relay-minimax.go create mode 100644 relay/channel/minimax/tts.go create mode 100644 relay/channel/mistral/adaptor.go create mode 100644 relay/channel/mistral/constants.go create mode 100644 relay/channel/mistral/text.go create mode 100644 relay/channel/mokaai/adaptor.go create mode 100644 relay/channel/mokaai/constants.go create mode 100644 relay/channel/mokaai/relay-mokaai.go create mode 100644 relay/channel/moonshot/adaptor.go create mode 100644 relay/channel/moonshot/adaptor_test.go create mode 100644 relay/channel/moonshot/constants.go create mode 100644 relay/channel/newapi/adaptor.go create mode 100644 relay/channel/newapi/constants.go create mode 100644 relay/channel/ollama/adaptor.go create mode 100644 relay/channel/ollama/constants.go create mode 100644 relay/channel/ollama/dto.go create mode 100644 relay/channel/ollama/relay-ollama.go create mode 100644 relay/channel/ollama/stream.go create mode 100644 relay/channel/ollama/stream_test.go create mode 100644 relay/channel/openai/adaptor.go create mode 100644 relay/channel/openai/audio.go create mode 100644 relay/channel/openai/chat_via_responses.go create mode 100644 relay/channel/openai/chat_via_responses_test.go create mode 100644 relay/channel/openai/constant.go create mode 100644 relay/channel/openai/helper.go create mode 100644 relay/channel/openai/image_edit_test.go create mode 100644 relay/channel/openai/image_stream_test.go create mode 100644 relay/channel/openai/relay-openai.go create mode 100644 relay/channel/openai/relay_image.go create mode 100644 relay/channel/openai/relay_realtime.go create mode 100644 relay/channel/openai/relay_responses.go create mode 100644 relay/channel/openai/relay_responses_billing_test.go create mode 100644 relay/channel/openai/relay_responses_compact.go create mode 100644 relay/channel/openai/responses_via_chat.go create mode 100644 relay/channel/openai/stream_tool_billing_test.go create mode 100644 relay/channel/openai/usage.go create mode 100644 relay/channel/openrouter/constant.go create mode 100644 relay/channel/openrouter/dto.go create mode 100644 relay/channel/palm/adaptor.go create mode 100644 relay/channel/palm/constants.go create mode 100644 relay/channel/palm/dto.go create mode 100644 relay/channel/palm/relay-palm.go create mode 100644 relay/channel/perplexity/adaptor.go create mode 100644 relay/channel/perplexity/constants.go create mode 100644 relay/channel/perplexity/relay-perplexity.go create mode 100644 relay/channel/replicate/adaptor.go create mode 100644 relay/channel/replicate/constants.go create mode 100644 relay/channel/replicate/dto.go create mode 100644 relay/channel/siliconflow/adaptor.go create mode 100644 relay/channel/siliconflow/constant.go create mode 100644 relay/channel/siliconflow/dto.go create mode 100644 relay/channel/siliconflow/relay-siliconflow.go create mode 100644 relay/channel/sub2api/adaptor.go create mode 100644 relay/channel/sub2api/adaptor_test.go create mode 100644 relay/channel/sub2api/constants.go create mode 100644 relay/channel/submodel/adaptor.go create mode 100644 relay/channel/submodel/constants.go create mode 100644 relay/channel/task/jsplugin/adaptor.go create mode 100644 relay/channel/task/jsplugin/adaptor_test.go create mode 100644 relay/channel/task/jsplugin/auth.go create mode 100644 relay/channel/task/jsplugin/auth_test.go create mode 100644 relay/channel/task/taskcommon/helpers.go create mode 100644 relay/channel/tencent/adaptor.go create mode 100644 relay/channel/tencent/constants.go create mode 100644 relay/channel/tencent/dispatch.go create mode 100644 relay/channel/tencent/dispatch_test.go create mode 100644 relay/channel/tencent/dto.go create mode 100644 relay/channel/tencent/relay-tencent.go create mode 100644 relay/channel/vertex/adaptor.go create mode 100644 relay/channel/vertex/constants.go create mode 100644 relay/channel/vertex/dto.go create mode 100644 relay/channel/vertex/relay-vertex.go create mode 100644 relay/channel/vertex/service_account.go create mode 100644 relay/channel/vertex/url_builder.go create mode 100644 relay/channel/volcengine/adaptor.go create mode 100644 relay/channel/volcengine/constants.go create mode 100644 relay/channel/volcengine/protocols.go create mode 100644 relay/channel/volcengine/tts.go create mode 100644 relay/channel/xai/adaptor.go create mode 100644 relay/channel/xai/constants.go create mode 100644 relay/channel/xai/dto.go create mode 100644 relay/channel/xai/text.go create mode 100644 relay/channel/xinference/constant.go create mode 100644 relay/channel/xinference/dto.go create mode 100644 relay/channel/xunfei/adaptor.go create mode 100644 relay/channel/xunfei/constants.go create mode 100644 relay/channel/xunfei/dto.go create mode 100644 relay/channel/xunfei/relay-xunfei.go create mode 100644 relay/channel/zhipu/adaptor.go create mode 100644 relay/channel/zhipu/constants.go create mode 100644 relay/channel/zhipu/dto.go create mode 100644 relay/channel/zhipu/relay-zhipu.go create mode 100644 relay/channel/zhipu_4v/adaptor.go create mode 100644 relay/channel/zhipu_4v/constants.go create mode 100644 relay/channel/zhipu_4v/dto.go create mode 100644 relay/channel/zhipu_4v/image.go create mode 100644 relay/channel/zhipu_4v/relay-zhipu_v4.go create mode 100644 relay/chat_completions_via_responses.go create mode 100644 relay/chat_completions_via_responses_test.go create mode 100644 relay/claude_handler.go create mode 100644 relay/common/billing.go create mode 100644 relay/common/conversion_diagnostics.go create mode 100644 relay/common/outbound_body.go create mode 100644 relay/common/outbound_body_test.go create mode 100644 relay/common/override.go create mode 100644 relay/common/override_test.go create mode 100644 relay/common/relay_info.go create mode 100644 relay/common/relay_info_gemini_settings_test.go create mode 100644 relay/common/relay_info_test.go create mode 100644 relay/common/relay_utils.go create mode 100644 relay/common/relay_utils_test.go create mode 100644 relay/common/request_conversion.go create mode 100644 relay/common/stream_status.go create mode 100644 relay/common/stream_status_test.go create mode 100644 relay/common/tool_usage.go create mode 100644 relay/common/tool_usage_test.go create mode 100644 relay/common_handler/rerank.go create mode 100644 relay/compatible_handler.go create mode 100644 relay/constant/relay_mode.go create mode 100644 relay/constant/relay_mode_test.go create mode 100644 relay/convert_request_error.go create mode 100644 relay/convert_request_error_test.go create mode 100644 relay/embedding_handler.go create mode 100644 relay/gemini_handler.go create mode 100644 relay/helper/billing_expr_request.go create mode 100644 relay/helper/billing_expr_request_test.go create mode 100644 relay/helper/common.go create mode 100644 relay/helper/group_price_test.go create mode 100644 relay/helper/max_tokens_bounds_test.go create mode 100644 relay/helper/model_mapped.go create mode 100644 relay/helper/model_modifier.go create mode 100644 relay/helper/openai_image_request_test.go create mode 100644 relay/helper/price.go create mode 100644 relay/helper/price_test.go create mode 100644 relay/helper/reasoning_suffix.go create mode 100644 relay/helper/reasoning_suffix_test.go create mode 100644 relay/helper/stream_result.go create mode 100644 relay/helper/stream_scanner.go create mode 100644 relay/helper/stream_scanner_test.go create mode 100644 relay/helper/valid_request.go create mode 100644 relay/image_handler.go create mode 100644 relay/mjproxy_handler.go create mode 100644 relay/param_override_error.go create mode 100644 relay/plugin_protocol.go create mode 100644 relay/plugin_protocol_test.go create mode 100644 relay/relay_adaptor.go create mode 100644 relay/relay_adaptor_jsplugin_test.go create mode 100644 relay/relay_task.go create mode 100644 relay/relay_task_test.go create mode 100644 relay/request_clone_test.go create mode 100644 relay/rerank_handler.go create mode 100644 relay/responses_handler.go create mode 100644 relay/task_platform_error_test.go create mode 100644 relay/task_platform_test.go create mode 100644 relay/websocket.go create mode 100644 relaykit/README.md create mode 100644 relaykit/dto/alpha_search_request.go create mode 100644 relaykit/dto/audio.go create mode 100644 relaykit/dto/billing_usage.go create mode 100644 relaykit/dto/billing_usage_test.go create mode 100644 relaykit/dto/channel_settings.go create mode 100644 relaykit/dto/channel_settings_test.go create mode 100644 relaykit/dto/claude.go create mode 100644 relaykit/dto/embedding.go create mode 100644 relaykit/dto/error.go create mode 100644 relaykit/dto/gemini.go create mode 100644 relaykit/dto/gemini_generation_config_test.go create mode 100644 relaykit/dto/gemini_isstream_test.go create mode 100644 relaykit/dto/gemini_response_test.go create mode 100644 relaykit/dto/notify.go create mode 100644 relaykit/dto/openai_compaction.go create mode 100644 relaykit/dto/openai_image.go create mode 100644 relaykit/dto/openai_request.go create mode 100644 relaykit/dto/openai_request_zero_value_test.go create mode 100644 relaykit/dto/openai_response.go create mode 100644 relaykit/dto/openai_responses_compaction_request.go create mode 100644 relaykit/dto/openai_video.go create mode 100644 relaykit/dto/playground.go create mode 100644 relaykit/dto/pricing.go create mode 100644 relaykit/dto/ratio_sync.go create mode 100644 relaykit/dto/realtime.go create mode 100644 relaykit/dto/reasoning_state.go create mode 100644 relaykit/dto/request_common.go create mode 100644 relaykit/dto/rerank.go create mode 100644 relaykit/dto/sensitive.go create mode 100644 relaykit/dto/usage_merge.go create mode 100644 relaykit/dto/usage_merge_test.go create mode 100644 relaykit/dto/user_settings.go create mode 100644 relaykit/dto/values.go create mode 100644 relaykit/go.mod create mode 100644 relaykit/go.sum create mode 100644 relaykit/reasonmap/reasonmap.go create mode 100644 relaykit/relayconvert/boundary_test.go create mode 100644 relaykit/relayconvert/claude_default_max_tokens_test.go create mode 100644 relaykit/relayconvert/convmeta/format.go create mode 100644 relaykit/relayconvert/convmeta/meta.go create mode 100644 relaykit/relayconvert/convmeta/meta_test.go create mode 100644 relaykit/relayconvert/convmeta/options.go create mode 100644 relaykit/relayconvert/golden_test.go create mode 100644 relaykit/relayconvert/internal/claude_messages/citations.go create mode 100644 relaykit/relayconvert/internal/claude_messages/stream_billing_usage_test.go create mode 100644 relaykit/relayconvert/internal/claude_messages/to_oai_chat_req.go create mode 100644 relaykit/relayconvert/internal/claude_messages/to_oai_chat_resp.go create mode 100644 relaykit/relayconvert/internal/claude_messages/to_oai_responses_hosted_stream.go create mode 100644 relaykit/relayconvert/internal/claude_messages/to_oai_responses_req.go create mode 100644 relaykit/relayconvert/internal/convdiag/collector.go create mode 100644 relaykit/relayconvert/internal/gemini_chat/grounding.go create mode 100644 relaykit/relayconvert/internal/gemini_chat/to_oai_chat_req.go create mode 100644 relaykit/relayconvert/internal/gemini_chat/to_oai_chat_resp.go create mode 100644 relaykit/relayconvert/internal/gemini_chat/to_oai_responses_hosted_stream.go create mode 100644 relaykit/relayconvert/internal/jsonutil/stringify.go create mode 100644 relaykit/relayconvert/internal/media/media.go create mode 100644 relaykit/relayconvert/internal/oai_chat/citations.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_claude_messages_req.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_claude_messages_req_test.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_claude_messages_resp.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_claude_messages_resp_test.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_gemini_chat_req.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_gemini_chat_resp.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_gemini_chat_resp_test.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_oai_responses_req.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_oai_responses_req_test.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_oai_responses_resp.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_oai_responses_resp_test.go create mode 100644 relaykit/relayconvert/internal/oai_chat/to_oai_responses_stream_resp.go create mode 100644 relaykit/relayconvert/internal/oai_responses/req_helpers.go create mode 100644 relaykit/relayconvert/internal/oai_responses/to_claude_messages_req.go create mode 100644 relaykit/relayconvert/internal/oai_responses/to_claude_messages_resp.go create mode 100644 relaykit/relayconvert/internal/oai_responses/to_claude_messages_stream_resp.go create mode 100644 relaykit/relayconvert/internal/oai_responses/to_claude_messages_stream_resp_test.go create mode 100644 relaykit/relayconvert/internal/oai_responses/to_gemini_chat_req.go create mode 100644 relaykit/relayconvert/internal/oai_responses/to_gemini_chat_req_preprocess.go create mode 100644 relaykit/relayconvert/internal/oai_responses/to_oai_chat_req.go create mode 100644 relaykit/relayconvert/internal/oai_responses/to_oai_chat_req_test.go create mode 100644 relaykit/relayconvert/internal/oai_responses/to_oai_chat_resp.go create mode 100644 relaykit/relayconvert/internal/oai_responses/to_oai_chat_resp_test.go create mode 100644 relaykit/relayconvert/internal/oai_responses/to_oai_chat_stream_resp.go create mode 100644 relaykit/relayconvert/internal/shared/claude/cache.go create mode 100644 relaykit/relayconvert/internal/shared/claude/errors.go create mode 100644 relaykit/relayconvert/internal/shared/claude/reasoning.go create mode 100644 relaykit/relayconvert/internal/shared/claude/schema.go create mode 100644 relaykit/relayconvert/internal/shared/claude/tool_choice.go create mode 100644 relaykit/relayconvert/internal/shared/claude/usage.go create mode 100644 relaykit/relayconvert/internal/shared/gemini/request.go create mode 100644 relaykit/relayconvert/internal/shared/gemini/schema.go create mode 100644 relaykit/relayconvert/internal/toolconv/decode.go create mode 100644 relaykit/relayconvert/internal/toolconv/encode.go create mode 100644 relaykit/relayconvert/internal/toolconv/hosted_values.go create mode 100644 relaykit/relayconvert/internal/toolconv/model.go create mode 100644 relaykit/relayconvert/internal/toolconv/policy_test.go create mode 100644 relaykit/relayconvert/internal/toolconv/response.go create mode 100644 relaykit/relayconvert/internal/toolconv/response_artifacts.go create mode 100644 relaykit/relayconvert/kitutil/json.go create mode 100644 relaykit/relayconvert/kitutil/json_test.go create mode 100644 relaykit/relayconvert/kitutil/log.go create mode 100644 relaykit/relayconvert/kitutil/log_test.go create mode 100644 relaykit/relayconvert/kitutil/mask.go create mode 100644 relaykit/relayconvert/kitutil/value.go create mode 100644 relaykit/relayconvert/media.go create mode 100644 relaykit/relayconvert/reasoning/claude.go create mode 100644 relaykit/relayconvert/reasoning/gemini.go create mode 100644 relaykit/relayconvert/reasoning/intent.go create mode 100644 relaykit/relayconvert/reasoning/intent_test.go create mode 100644 relaykit/relayconvert/reasoning/suffix.go create mode 100644 relaykit/relayconvert/reasoning/suffix_test.go create mode 100644 relaykit/relayconvert/request_compat.go create mode 100644 relaykit/relayconvert/request_registry.go create mode 100644 relaykit/relayconvert/request_registry_test.go create mode 100644 relaykit/relayconvert/response_compat.go create mode 100644 relaykit/relayconvert/response_registry.go create mode 100644 relaykit/relayconvert/response_registry_test.go create mode 100644 relaykit/relayconvert/safety_settings_test.go create mode 100644 relaykit/relayconvert/terminal_stream_test.go create mode 100644 relaykit/relayconvert/testdata/golden/request/openai_responses_to_claude.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/request/openai_responses_to_openai.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/request/openai_to_claude.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/request/openai_to_openai_responses.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/response/claude_to_openai.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/response/claude_to_openai_responses.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/response/gemini_to_claude.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/response/gemini_to_openai.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/response/gemini_to_openai_responses.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/response/openai_responses_to_claude.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/response/openai_responses_to_openai.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/response/openai_to_openai_responses.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/claude_to_gemini.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/claude_to_openai.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/claude_to_openai_responses.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/gemini_to_claude.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/gemini_to_openai.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/gemini_to_openai_responses.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/openai_responses_to_claude.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/openai_responses_to_gemini.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/openai_responses_to_openai.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/openai_to_claude.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/openai_to_gemini.golden.json create mode 100644 relaykit/relayconvert/testdata/golden/stream/openai_to_openai_responses.golden.json create mode 100644 relaykit/relayconvert/text_converter_registry.go create mode 100644 relaykit/relayconvert/text_converter_registry_test.go create mode 100644 relaykit/relayconvert/tool_loss_policy_test.go create mode 100644 relaykit/types/channel_error.go create mode 100644 relaykit/types/conversion.go create mode 100644 relaykit/types/endpoint_type.go create mode 100644 relaykit/types/error.go create mode 100644 relaykit/types/file_data.go create mode 100644 relaykit/types/file_source.go create mode 100644 relaykit/types/relay_format.go create mode 100644 relaykit/types/request_meta.go create mode 100644 router/api-router.go create mode 100644 router/authz-router.go create mode 100644 router/channel-router.go create mode 100644 router/channel_router_test.go create mode 100644 router/dashboard.go create mode 100644 router/main.go create mode 100644 router/plugin-router.go create mode 100644 router/plugin_router_test.go create mode 100644 router/relay-router.go create mode 100644 router/relay_router_test.go create mode 100644 router/task-plugin-protocol-router.go create mode 100644 router/task-router.go create mode 100644 router/task_plugin_options_router_test.go create mode 100644 router/task_plugin_protocol_router_test.go create mode 100644 router/task_router_test.go create mode 100644 router/video-router.go create mode 100644 router/video_router_test.go create mode 100644 router/web-router.go create mode 100644 service/account_security.go create mode 100644 service/audio.go create mode 100644 service/auth_cleanup.go create mode 100644 service/auth_session.go create mode 100644 service/auth_session_test.go create mode 100644 service/auth_token.go create mode 100644 service/auth_token_test.go create mode 100644 service/authz/adapter.go create mode 100644 service/authz/assignment.go create mode 100644 service/authz/authz_test.go create mode 100644 service/authz/enforcer.go create mode 100644 service/authz/override.go create mode 100644 service/authz/permission.go create mode 100644 service/authz/registry.go create mode 100644 service/authz/resolver.go create mode 100644 service/authz/resources_audit.go create mode 100644 service/authz/resources_channel.go create mode 100644 service/authz/resources_task_plugin.go create mode 100644 service/authz/role.go create mode 100644 service/authz/seed.go create mode 100644 service/billing.go create mode 100644 service/billing_session.go create mode 100644 service/billing_usage.go create mode 100644 service/channel.go create mode 100644 service/channel_affinity.go create mode 100644 service/channel_affinity_template_test.go create mode 100644 service/channel_affinity_usage_cache_test.go create mode 100644 service/channel_select.go create mode 100644 service/channel_select_auto_groups_test.go create mode 100644 service/channel_select_test.go create mode 100644 service/codex_channel_models.go create mode 100644 service/codex_credential_refresh.go create mode 100644 service/codex_credential_refresh_task.go create mode 100644 service/codex_models.go create mode 100644 service/codex_oauth.go create mode 100644 service/codex_wham_usage.go create mode 100644 service/convert.go create mode 100644 service/convert_test.go create mode 100644 service/download.go create mode 100644 service/email_binding.go create mode 100644 service/epay.go create mode 100644 service/error.go create mode 100644 service/error_test.go create mode 100644 service/file_decoder.go create mode 100644 service/file_service.go create mode 100644 service/funding_source.go create mode 100644 service/group.go create mode 100644 service/group_auto_groups_test.go create mode 100644 service/http.go create mode 100644 service/http_client.go create mode 100644 service/http_client_transport_test.go create mode 100644 service/http_transport_policy.go create mode 100644 service/http_transport_sharded.go create mode 100644 service/image.go create mode 100644 service/log_info_generate.go create mode 100644 service/log_info_generate_stream_test.go create mode 100644 service/login_verification.go create mode 100644 service/midjourney.go create mode 100644 service/notify-limit.go create mode 100644 service/oauth_verification.go create mode 100644 service/openai_chat_responses_compat.go create mode 100644 service/openai_chat_responses_mode.go create mode 100644 service/passkey/service.go create mode 100644 service/passkey/session.go create mode 100644 service/passkey/user.go create mode 100644 service/protected_fetch_client.go create mode 100644 service/protected_fetch_client_test.go create mode 100644 service/quota.go create mode 100644 service/quota_saturation_test.go create mode 100644 service/rankings.go create mode 100644 service/request_converter.go create mode 100644 service/response_converter.go create mode 100644 service/return_path.go create mode 100644 service/return_path_test.go create mode 100644 service/security_verification.go create mode 100644 service/sensitive.go create mode 100644 service/str.go create mode 100644 service/subscription_reset_task.go create mode 100644 service/system_instance.go create mode 100644 service/system_task.go create mode 100644 service/system_task_test.go create mode 100644 service/task.go create mode 100644 service/task_artifact_access.go create mode 100644 service/task_artifact_access_test.go create mode 100644 service/task_artifact_store.go create mode 100644 service/task_artifact_store_test.go create mode 100644 service/task_billing.go create mode 100644 service/task_billing_test.go create mode 100644 service/task_plugin_audit.go create mode 100644 service/task_plugin_view.go create mode 100644 service/task_plugin_view_test.go create mode 100644 service/task_polling.go create mode 100644 service/task_polling_test.go create mode 100644 service/text_quota.go create mode 100644 service/text_quota_test.go create mode 100644 service/tiered_settle.go create mode 100644 service/tiered_settle_test.go create mode 100644 service/token_counter.go create mode 100644 service/token_estimator.go create mode 100644 service/tokenizer.go create mode 100644 service/twofa.go create mode 100644 service/usage_helpr.go create mode 100644 service/user_notify.go create mode 100644 service/violation_fee.go create mode 100644 service/waffo_pancake.go create mode 100644 service/webhook.go create mode 100644 setting/auto_group.go create mode 100644 setting/auto_group_test.go create mode 100644 setting/billing_setting/builtin_billing.go create mode 100644 setting/billing_setting/builtin_billing_test.go create mode 100644 setting/billing_setting/tiered_billing.go create mode 100644 setting/billing_setting/tiered_billing_test.go create mode 100644 setting/chat.go create mode 100644 setting/config/config.go create mode 100644 setting/config/config_test.go create mode 100644 setting/console_setting/config.go create mode 100644 setting/console_setting/validation.go create mode 100644 setting/midjourney.go create mode 100644 setting/model_setting/claude.go create mode 100644 setting/model_setting/claude_test.go create mode 100644 setting/model_setting/gemini.go create mode 100644 setting/model_setting/gemini_test.go create mode 100644 setting/model_setting/global.go create mode 100644 setting/model_setting/global_test.go create mode 100644 setting/model_setting/grok.go create mode 100644 setting/model_setting/qwen.go create mode 100644 setting/operation_setting/channel_affinity_setting.go create mode 100644 setting/operation_setting/checkin_setting.go create mode 100644 setting/operation_setting/general_setting.go create mode 100644 setting/operation_setting/monitor_setting.go create mode 100644 setting/operation_setting/monitor_setting_test.go create mode 100644 setting/operation_setting/operation_setting.go create mode 100644 setting/operation_setting/payment_setting.go create mode 100644 setting/operation_setting/payment_setting_old.go create mode 100644 setting/operation_setting/quota_setting.go create mode 100644 setting/operation_setting/status_code_ranges.go create mode 100644 setting/operation_setting/status_code_ranges_test.go create mode 100644 setting/operation_setting/token_setting.go create mode 100644 setting/operation_setting/tools.go create mode 100644 setting/operation_setting/tools_price_test.go create mode 100644 setting/payment_creem.go create mode 100644 setting/payment_stripe.go create mode 100644 setting/payment_waffo.go create mode 100644 setting/payment_waffo_pancake.go create mode 100644 setting/perf_metrics_setting/config.go create mode 100644 setting/performance_setting/config.go create mode 100644 setting/rate_limit.go create mode 100644 setting/ratio_setting/cache_ratio.go create mode 100644 setting/ratio_setting/expose_ratio.go create mode 100644 setting/ratio_setting/exposed_cache.go create mode 100644 setting/ratio_setting/group_ratio.go create mode 100644 setting/ratio_setting/matching_test.go create mode 100644 setting/ratio_setting/model_ratio.go create mode 100644 setting/reasoning/suffix.go create mode 100644 setting/reasoning/suffix_test.go create mode 100644 setting/sensitive.go create mode 100644 setting/system_setting/discord.go create mode 100644 setting/system_setting/fetch_setting.go create mode 100644 setting/system_setting/legal.go create mode 100644 setting/system_setting/oidc.go create mode 100644 setting/system_setting/oidc_test.go create mode 100644 setting/system_setting/passkey.go create mode 100644 setting/system_setting/system_setting_old.go create mode 100644 setting/system_setting/task_artifact.go create mode 100644 setting/system_setting/task_artifact_store.go create mode 100644 setting/system_setting/task_artifact_store_test.go create mode 100644 setting/system_setting/task_artifact_test.go create mode 100644 setting/system_setting/telegram.go create mode 100644 setting/task_plugin.go create mode 100644 setting/task_plugin_test.go create mode 100644 setting/task_pricing_setting/config.go create mode 100644 setting/task_pricing_setting/config_test.go create mode 100644 setting/user_usable_group.go create mode 100644 types/price_data.go create mode 100644 types/rw_map.go create mode 100644 types/set.go create mode 100644 types/task_artifact.go create mode 100644 web/.gitignore create mode 100644 web/.node-version create mode 100644 web/.npmrc create mode 100644 web/.oxfmtrc.json create mode 100644 web/.oxlintrc.json create mode 100644 web/AGENTS.md create mode 100644 web/bun.lock create mode 100644 web/components.json create mode 100644 web/cz.yaml create mode 100644 web/index.html create mode 100644 web/knip.config.ts create mode 100644 web/netlify.toml create mode 100644 web/package.json create mode 100644 web/public/favicon.ico create mode 100644 web/public/logo.png create mode 100644 web/public/pay-apple.png create mode 100644 web/public/pay-card.png create mode 100644 web/public/pay-google.png create mode 100644 web/public/waffo-logo-dark.svg create mode 100644 web/public/waffo-logo-light.svg create mode 100644 web/rsbuild.config.ts create mode 100644 web/scripts/add-copyright.mjs create mode 100644 web/scripts/format-with-protected-headers.mjs create mode 100644 web/scripts/sync-i18n.mjs create mode 100644 web/src/assets/brand-icons/icon-discord.tsx create mode 100644 web/src/assets/brand-icons/icon-docker.tsx create mode 100644 web/src/assets/brand-icons/icon-facebook.tsx create mode 100644 web/src/assets/brand-icons/icon-figma.tsx create mode 100644 web/src/assets/brand-icons/icon-github.tsx create mode 100644 web/src/assets/brand-icons/icon-gitlab.tsx create mode 100644 web/src/assets/brand-icons/icon-gmail.tsx create mode 100644 web/src/assets/brand-icons/icon-linuxdo.tsx create mode 100644 web/src/assets/brand-icons/icon-medium.tsx create mode 100644 web/src/assets/brand-icons/icon-notion.tsx create mode 100644 web/src/assets/brand-icons/icon-skype.tsx create mode 100644 web/src/assets/brand-icons/icon-slack.tsx create mode 100644 web/src/assets/brand-icons/icon-stripe.tsx create mode 100644 web/src/assets/brand-icons/icon-telegram.tsx create mode 100644 web/src/assets/brand-icons/icon-trello.tsx create mode 100644 web/src/assets/brand-icons/icon-wechat.tsx create mode 100644 web/src/assets/brand-icons/icon-whatsapp.tsx create mode 100644 web/src/assets/brand-icons/icon-zoom.tsx create mode 100644 web/src/assets/brand-icons/index.ts create mode 100644 web/src/assets/clerk-full-logo.tsx create mode 100644 web/src/assets/clerk-logo.tsx create mode 100644 web/src/assets/custom/icon-dir.tsx create mode 100644 web/src/assets/custom/icon-layout-compact.tsx create mode 100644 web/src/assets/custom/icon-layout-default.tsx create mode 100644 web/src/assets/custom/icon-layout-full.tsx create mode 100644 web/src/assets/custom/icon-sidebar-floating.tsx create mode 100644 web/src/assets/custom/icon-sidebar-inset.tsx create mode 100644 web/src/assets/custom/icon-sidebar-sidebar.tsx create mode 100644 web/src/assets/custom/icon-sub2api.tsx create mode 100644 web/src/assets/custom/icon-theme-dark.tsx create mode 100644 web/src/assets/custom/icon-theme-light.tsx create mode 100644 web/src/assets/custom/icon-theme-system.tsx create mode 100644 web/src/assets/logo.tsx create mode 100644 web/src/components/activity-time-cell.tsx create mode 100644 web/src/components/ai-elements/__tests__/code-block-editor.test.tsx create mode 100644 web/src/components/ai-elements/__tests__/response-fade-render.test.tsx create mode 100644 web/src/components/ai-elements/__tests__/response-fade.test.ts create mode 100644 web/src/components/ai-elements/actions.tsx create mode 100644 web/src/components/ai-elements/artifact.tsx create mode 100644 web/src/components/ai-elements/branch.tsx create mode 100644 web/src/components/ai-elements/canvas.tsx create mode 100644 web/src/components/ai-elements/chain-of-thought.tsx create mode 100644 web/src/components/ai-elements/code-block.tsx create mode 100644 web/src/components/ai-elements/confirmation.tsx create mode 100644 web/src/components/ai-elements/connection.tsx create mode 100644 web/src/components/ai-elements/context.tsx create mode 100644 web/src/components/ai-elements/controls.tsx create mode 100644 web/src/components/ai-elements/conversation.tsx create mode 100644 web/src/components/ai-elements/edge.tsx create mode 100644 web/src/components/ai-elements/image.tsx create mode 100644 web/src/components/ai-elements/inline-citation.tsx create mode 100644 web/src/components/ai-elements/loader.tsx create mode 100644 web/src/components/ai-elements/message.tsx create mode 100644 web/src/components/ai-elements/node.tsx create mode 100644 web/src/components/ai-elements/open-in-chat.tsx create mode 100644 web/src/components/ai-elements/panel.tsx create mode 100644 web/src/components/ai-elements/plan.tsx create mode 100644 web/src/components/ai-elements/prompt-input.tsx create mode 100644 web/src/components/ai-elements/queue.tsx create mode 100644 web/src/components/ai-elements/reasoning.tsx create mode 100644 web/src/components/ai-elements/response-content.ts create mode 100644 web/src/components/ai-elements/response-fade.ts create mode 100644 web/src/components/ai-elements/response-node-guards.ts create mode 100644 web/src/components/ai-elements/response-renderer-alert.tsx create mode 100644 web/src/components/ai-elements/response-renderer-blocks.tsx create mode 100644 web/src/components/ai-elements/response-renderer-details.tsx create mode 100644 web/src/components/ai-elements/response-renderer-footnotes.tsx create mode 100644 web/src/components/ai-elements/response-renderer-image.tsx create mode 100644 web/src/components/ai-elements/response-renderer-inline.tsx create mode 100644 web/src/components/ai-elements/response-renderer-table.tsx create mode 100644 web/src/components/ai-elements/response-renderer.tsx create mode 100644 web/src/components/ai-elements/response-types.ts create mode 100644 web/src/components/ai-elements/response.tsx create mode 100644 web/src/components/ai-elements/shimmer.tsx create mode 100644 web/src/components/ai-elements/sources.tsx create mode 100644 web/src/components/ai-elements/suggestion.tsx create mode 100644 web/src/components/ai-elements/task.tsx create mode 100644 web/src/components/ai-elements/tool.tsx create mode 100644 web/src/components/ai-elements/toolbar.tsx create mode 100644 web/src/components/ai-elements/web-preview.tsx create mode 100644 web/src/components/animate-in-view.tsx create mode 100644 web/src/components/auto-skeleton.tsx create mode 100644 web/src/components/coming-soon.tsx create mode 100644 web/src/components/command-menu.tsx create mode 100644 web/src/components/config-drawer.tsx create mode 100644 web/src/components/confirm-dialog.tsx create mode 100644 web/src/components/copy-button.tsx create mode 100644 web/src/components/data-table/README.md create mode 100644 web/src/components/data-table/core/__tests__/pagination.test.tsx create mode 100644 web/src/components/data-table/core/badge-cell.tsx create mode 100644 web/src/components/data-table/core/badge-list-cell.tsx create mode 100644 web/src/components/data-table/core/column-header.tsx create mode 100644 web/src/components/data-table/core/column-pinning.ts create mode 100644 web/src/components/data-table/core/content-sized-columns.ts create mode 100644 web/src/components/data-table/core/data-table-colgroup.tsx create mode 100644 web/src/components/data-table/core/data-table-header.tsx create mode 100644 web/src/components/data-table/core/data-table-row.tsx create mode 100644 web/src/components/data-table/core/data-table-view.tsx create mode 100644 web/src/components/data-table/core/pagination.tsx create mode 100644 web/src/components/data-table/core/row-action-menu.tsx create mode 100644 web/src/components/data-table/core/table-empty.tsx create mode 100644 web/src/components/data-table/core/table-sizing.ts create mode 100644 web/src/components/data-table/core/table-skeleton.tsx create mode 100644 web/src/components/data-table/core/truncated-cell.tsx create mode 100644 web/src/components/data-table/core/types.ts create mode 100644 web/src/components/data-table/hooks/use-data-table-view-mode.ts create mode 100644 web/src/components/data-table/hooks/use-data-table.ts create mode 100644 web/src/components/data-table/hooks/use-debounced-column-filter.ts create mode 100644 web/src/components/data-table/index.ts create mode 100644 web/src/components/data-table/layout/card-cell-utils.ts create mode 100644 web/src/components/data-table/layout/card-grid.tsx create mode 100644 web/src/components/data-table/layout/card-row-content.tsx create mode 100644 web/src/components/data-table/layout/data-table-page.tsx create mode 100644 web/src/components/data-table/layout/mobile-card-list.tsx create mode 100644 web/src/components/data-table/static/static-data-table-classnames.ts create mode 100644 web/src/components/data-table/static/static-data-table.tsx create mode 100644 web/src/components/data-table/static/static-row-actions.tsx create mode 100644 web/src/components/data-table/toolbar/bulk-actions.tsx create mode 100644 web/src/components/data-table/toolbar/faceted-filter.tsx create mode 100644 web/src/components/data-table/toolbar/toolbar.tsx create mode 100644 web/src/components/data-table/toolbar/view-mode-toggle.tsx create mode 100644 web/src/components/data-table/toolbar/view-options.tsx create mode 100644 web/src/components/date-picker.tsx create mode 100644 web/src/components/datetime-picker.tsx create mode 100644 web/src/components/dialog.tsx create mode 100644 web/src/components/drawer-layout.ts create mode 100644 web/src/components/empty-state.tsx create mode 100644 web/src/components/error-state.tsx create mode 100644 web/src/components/group-badge.tsx create mode 100644 web/src/components/html-content.tsx create mode 100644 web/src/components/json-code-editor.tsx create mode 100644 web/src/components/json-code-editor/__tests__/json-code-editor-utils.test.ts create mode 100644 web/src/components/json-code-editor/__tests__/json-code-editor.test.tsx create mode 100644 web/src/components/json-code-editor/json-code-editor-utils.ts create mode 100644 web/src/components/json-editor.tsx create mode 100644 web/src/components/language-switcher.tsx create mode 100644 web/src/components/layout/components/app-header.tsx create mode 100644 web/src/components/layout/components/app-sidebar.tsx create mode 100644 web/src/components/layout/components/authenticated-layout.tsx create mode 100644 web/src/components/layout/components/chat-presets-item.tsx create mode 100644 web/src/components/layout/components/footer.tsx create mode 100644 web/src/components/layout/components/glow.tsx create mode 100644 web/src/components/layout/components/header-logo.tsx create mode 100644 web/src/components/layout/components/header.tsx create mode 100644 web/src/components/layout/components/logo.tsx create mode 100644 web/src/components/layout/components/main.tsx create mode 100644 web/src/components/layout/components/mobile-drawer.tsx create mode 100644 web/src/components/layout/components/mockup.tsx create mode 100644 web/src/components/layout/components/nav-group.tsx create mode 100644 web/src/components/layout/components/nav-link-item.tsx create mode 100644 web/src/components/layout/components/navbar.tsx create mode 100644 web/src/components/layout/components/page-footer.tsx create mode 100644 web/src/components/layout/components/public-header.tsx create mode 100644 web/src/components/layout/components/public-layout.tsx create mode 100644 web/src/components/layout/components/public-navigation.tsx create mode 100644 web/src/components/layout/components/section-page-layout.tsx create mode 100644 web/src/components/layout/components/section.tsx create mode 100644 web/src/components/layout/components/sidebar-view-header.tsx create mode 100644 web/src/components/layout/components/system-brand.tsx create mode 100644 web/src/components/layout/components/top-nav.tsx create mode 100644 web/src/components/layout/config/system-settings.config.ts create mode 100644 web/src/components/layout/config/top-nav.config.ts create mode 100644 web/src/components/layout/constants.ts create mode 100644 web/src/components/layout/index.ts create mode 100644 web/src/components/layout/lib/sidebar-view-registry.ts create mode 100644 web/src/components/layout/lib/url-utils.ts create mode 100644 web/src/components/layout/types.ts create mode 100644 web/src/components/learn-more.tsx create mode 100644 web/src/components/loading-state.tsx create mode 100644 web/src/components/lobe-icon-field.tsx create mode 100644 web/src/components/long-text.tsx create mode 100644 web/src/components/masked-value-display.tsx create mode 100644 web/src/components/model-group-selector.tsx create mode 100644 web/src/components/model-group-selector/__tests__/layout.test.ts create mode 100644 web/src/components/model-group-selector/layout.ts create mode 100644 web/src/components/multi-select.tsx create mode 100644 web/src/components/navigation-progress.tsx create mode 100644 web/src/components/notification-popover.tsx create mode 100644 web/src/components/page-transition.tsx create mode 100644 web/src/components/password-input.tsx create mode 100644 web/src/components/profile-dropdown.tsx create mode 100644 web/src/components/provider-badge.tsx create mode 100644 web/src/components/quota-details-popover.tsx create mode 100644 web/src/components/react-icon-by-name.tsx create mode 100644 web/src/components/rich-content.tsx create mode 100644 web/src/components/risk-acknowledgement-dialog.tsx create mode 100644 web/src/components/search.tsx create mode 100644 web/src/components/sign-out-dialog.tsx create mode 100644 web/src/components/skip-to-main.tsx create mode 100644 web/src/components/status-badge.tsx create mode 100644 web/src/components/table-id.tsx create mode 100644 web/src/components/tag-input.tsx create mode 100644 web/src/components/theme-quick-switcher.tsx create mode 100644 web/src/components/theme-switch.tsx create mode 100644 web/src/components/truncated-text.tsx create mode 100644 web/src/components/turnstile.tsx create mode 100644 web/src/components/ui/__tests__/combobox.test.tsx create mode 100644 web/src/components/ui/__tests__/portal-container.test.tsx create mode 100644 web/src/components/ui/accordion.tsx create mode 100644 web/src/components/ui/alert-dialog.tsx create mode 100644 web/src/components/ui/alert.tsx create mode 100644 web/src/components/ui/aspect-ratio.tsx create mode 100644 web/src/components/ui/avatar.tsx create mode 100644 web/src/components/ui/badge.tsx create mode 100644 web/src/components/ui/breadcrumb.tsx create mode 100644 web/src/components/ui/button-group.tsx create mode 100644 web/src/components/ui/button.tsx create mode 100644 web/src/components/ui/calendar.tsx create mode 100644 web/src/components/ui/card.tsx create mode 100644 web/src/components/ui/carousel.tsx create mode 100644 web/src/components/ui/chart.tsx create mode 100644 web/src/components/ui/checkbox.tsx create mode 100644 web/src/components/ui/collapsible.tsx create mode 100644 web/src/components/ui/combobox-input.tsx create mode 100644 web/src/components/ui/combobox.tsx create mode 100644 web/src/components/ui/command.tsx create mode 100644 web/src/components/ui/context-menu.tsx create mode 100644 web/src/components/ui/dialog.tsx create mode 100644 web/src/components/ui/direction.tsx create mode 100644 web/src/components/ui/drawer.tsx create mode 100644 web/src/components/ui/dropdown-menu-events.ts create mode 100644 web/src/components/ui/dropdown-menu.test.tsx create mode 100644 web/src/components/ui/dropdown-menu.tsx create mode 100644 web/src/components/ui/empty.tsx create mode 100644 web/src/components/ui/field.tsx create mode 100644 web/src/components/ui/form.tsx create mode 100644 web/src/components/ui/hover-card.tsx create mode 100644 web/src/components/ui/icon-badge.tsx create mode 100644 web/src/components/ui/input-group.tsx create mode 100644 web/src/components/ui/input-otp.tsx create mode 100644 web/src/components/ui/input.tsx create mode 100644 web/src/components/ui/item.tsx create mode 100644 web/src/components/ui/kbd.tsx create mode 100644 web/src/components/ui/label.tsx create mode 100644 web/src/components/ui/markdown.tsx create mode 100644 web/src/components/ui/menubar.tsx create mode 100644 web/src/components/ui/native-select.tsx create mode 100644 web/src/components/ui/navigation-menu.tsx create mode 100644 web/src/components/ui/pagination.tsx create mode 100644 web/src/components/ui/popover.tsx create mode 100644 web/src/components/ui/portal-container.ts create mode 100644 web/src/components/ui/progress.tsx create mode 100644 web/src/components/ui/radio-group.tsx create mode 100644 web/src/components/ui/resizable.tsx create mode 100644 web/src/components/ui/scroll-area.tsx create mode 100644 web/src/components/ui/select.tsx create mode 100644 web/src/components/ui/separator.tsx create mode 100644 web/src/components/ui/sheet.tsx create mode 100644 web/src/components/ui/sidebar.tsx create mode 100644 web/src/components/ui/skeleton.tsx create mode 100644 web/src/components/ui/slider.tsx create mode 100644 web/src/components/ui/sonner.tsx create mode 100644 web/src/components/ui/spinner.tsx create mode 100644 web/src/components/ui/switch.tsx create mode 100644 web/src/components/ui/table.tsx create mode 100644 web/src/components/ui/tabs.tsx create mode 100644 web/src/components/ui/textarea.tsx create mode 100644 web/src/components/ui/titled-card.tsx create mode 100644 web/src/components/ui/toggle-group.tsx create mode 100644 web/src/components/ui/toggle.tsx create mode 100644 web/src/components/ui/tooltip.tsx create mode 100644 web/src/config/fonts.ts create mode 100644 web/src/context/direction-provider.tsx create mode 100644 web/src/context/font-provider.tsx create mode 100644 web/src/context/layout-provider.tsx create mode 100644 web/src/context/search-provider.tsx create mode 100644 web/src/context/theme-customization-provider.tsx create mode 100644 web/src/context/theme-provider.tsx create mode 100644 web/src/env.d.ts create mode 100644 web/src/features/about/api.ts create mode 100644 web/src/features/about/index.tsx create mode 100644 web/src/features/about/types.ts create mode 100644 web/src/features/auth/api.test.ts create mode 100644 web/src/features/auth/api.ts create mode 100644 web/src/features/auth/auth-layout.tsx create mode 100644 web/src/features/auth/components/legal-consent.tsx create mode 100644 web/src/features/auth/components/oauth-callback-screen.tsx create mode 100644 web/src/features/auth/components/oauth-providers.tsx create mode 100644 web/src/features/auth/components/telegram-login-dialog.tsx create mode 100644 web/src/features/auth/components/terms-footer.tsx create mode 100644 web/src/features/auth/constants.ts create mode 100644 web/src/features/auth/forgot-password/components/forgot-password-form.tsx create mode 100644 web/src/features/auth/forgot-password/index.tsx create mode 100644 web/src/features/auth/hooks/use-auth-redirect.ts create mode 100644 web/src/features/auth/hooks/use-email-verification.ts create mode 100644 web/src/features/auth/hooks/use-oauth-login.ts create mode 100644 web/src/features/auth/hooks/use-turnstile.ts create mode 100644 web/src/features/auth/index.ts create mode 100644 web/src/features/auth/lib/__tests__/oauth-callback-mode.test.ts create mode 100644 web/src/features/auth/lib/__tests__/oauth-popup.test.ts create mode 100644 web/src/features/auth/lib/auth-redirect.test.ts create mode 100644 web/src/features/auth/lib/auth-redirect.ts create mode 100644 web/src/features/auth/lib/oauth-bind-window.test.ts create mode 100644 web/src/features/auth/lib/oauth-bind-window.ts create mode 100644 web/src/features/auth/lib/oauth-callback-mode.ts create mode 100644 web/src/features/auth/lib/oauth-popup.ts create mode 100644 web/src/features/auth/lib/oauth.ts create mode 100644 web/src/features/auth/lib/password-encryption.ts create mode 100644 web/src/features/auth/lib/storage.ts create mode 100644 web/src/features/auth/lib/telegram-login.test.ts create mode 100644 web/src/features/auth/lib/telegram-login.ts create mode 100644 web/src/features/auth/lib/validation.ts create mode 100644 web/src/features/auth/otp/__tests__/login-verification.test.tsx create mode 100644 web/src/features/auth/otp/components/otp-form.tsx create mode 100644 web/src/features/auth/otp/index.tsx create mode 100644 web/src/features/auth/passkey/api.ts create mode 100644 web/src/features/auth/passkey/hooks/use-passkey-management.ts create mode 100644 web/src/features/auth/passkey/index.ts create mode 100644 web/src/features/auth/passkey/types.ts create mode 100644 web/src/features/auth/reset-password-confirm/index.tsx create mode 100644 web/src/features/auth/secure-verification/__tests__/verification-api.test.ts create mode 100644 web/src/features/auth/secure-verification/__tests__/verification-flow.test.tsx create mode 100644 web/src/features/auth/secure-verification/api.ts create mode 100644 web/src/features/auth/secure-verification/components/secure-verification-dialog.tsx create mode 100644 web/src/features/auth/secure-verification/hooks/use-secure-verification.ts create mode 100644 web/src/features/auth/secure-verification/index.ts create mode 100644 web/src/features/auth/secure-verification/types.ts create mode 100644 web/src/features/auth/sign-in/components/user-auth-form.tsx create mode 100644 web/src/features/auth/sign-in/index.tsx create mode 100644 web/src/features/auth/sign-up/components/sign-up-form.tsx create mode 100644 web/src/features/auth/sign-up/index.tsx create mode 100644 web/src/features/auth/types.ts create mode 100644 web/src/features/channels/api.ts create mode 100644 web/src/features/channels/components/channel-card.tsx create mode 100644 web/src/features/channels/components/channel-row-actions-context.ts create mode 100644 web/src/features/channels/components/channel-type-badge.test.tsx create mode 100644 web/src/features/channels/components/channel-type-badge.tsx create mode 100644 web/src/features/channels/components/channels-columns.tsx create mode 100644 web/src/features/channels/components/channels-dialogs.tsx create mode 100644 web/src/features/channels/components/channels-primary-buttons.tsx create mode 100644 web/src/features/channels/components/channels-provider.tsx create mode 100644 web/src/features/channels/components/channels-table.tsx create mode 100644 web/src/features/channels/components/data-table-bulk-actions.tsx create mode 100644 web/src/features/channels/components/data-table-row-actions.tsx create mode 100644 web/src/features/channels/components/data-table-tag-row-actions.tsx create mode 100644 web/src/features/channels/components/dialogs/advanced-custom-editor-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/balance-query-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/channel-test-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/codex-usage-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/copy-channel-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/edit-tag-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/fetch-models-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/missing-models-confirmation-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/multi-key-manage-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/multi-key-statistics-card.tsx create mode 100644 web/src/features/channels/components/dialogs/multi-key-table-row-actions.tsx create mode 100644 web/src/features/channels/components/dialogs/ollama-models-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/param-override-editor-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/status-code-risk-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/tag-batch-edit-dialog.tsx create mode 100644 web/src/features/channels/components/dialogs/upstream-update-dialog.tsx create mode 100644 web/src/features/channels/components/drawers/channel-mutate-drawer.tsx create mode 100644 web/src/features/channels/components/drawers/sections/channel-advanced-section.tsx create mode 100644 web/src/features/channels/components/drawers/sections/channel-api-access-section.tsx create mode 100644 web/src/features/channels/components/drawers/sections/channel-auth-section.tsx create mode 100644 web/src/features/channels/components/drawers/sections/channel-basic-section.tsx create mode 100644 web/src/features/channels/components/drawers/sections/channel-editor-loading-state.tsx create mode 100644 web/src/features/channels/components/drawers/sections/channel-models-section.tsx create mode 100644 web/src/features/channels/components/drawers/sections/index.ts create mode 100644 web/src/features/channels/components/model-mapping-editor.tsx create mode 100644 web/src/features/channels/components/numeric-spinner-input.tsx create mode 100644 web/src/features/channels/constants.ts create mode 100644 web/src/features/channels/hooks/__tests__/channel-key-disclosure.test.tsx create mode 100644 web/src/features/channels/hooks/use-channel-key-disclosure.ts create mode 100644 web/src/features/channels/hooks/use-channel-mutate-form.ts create mode 100644 web/src/features/channels/hooks/use-channel-upstream-updates.ts create mode 100644 web/src/features/channels/index.tsx create mode 100644 web/src/features/channels/lib/__tests__/channel-field-update.test.ts create mode 100644 web/src/features/channels/lib/__tests__/channel-table-row-id.test.ts create mode 100644 web/src/features/channels/lib/__tests__/channel-type-options.test.ts create mode 100644 web/src/features/channels/lib/__tests__/new-api-channel.test.ts create mode 100644 web/src/features/channels/lib/__tests__/task-plugin-base-url.test.ts create mode 100644 web/src/features/channels/lib/advanced-custom.ts create mode 100644 web/src/features/channels/lib/channel-actions.ts create mode 100644 web/src/features/channels/lib/channel-field-update.ts create mode 100644 web/src/features/channels/lib/channel-form-errors.ts create mode 100644 web/src/features/channels/lib/channel-form.ts create mode 100644 web/src/features/channels/lib/channel-type-config.ts create mode 100644 web/src/features/channels/lib/channel-utils.ts create mode 100644 web/src/features/channels/lib/index.ts create mode 100644 web/src/features/channels/lib/model-categories.ts create mode 100644 web/src/features/channels/lib/model-mapping-validation.ts create mode 100644 web/src/features/channels/lib/multi-key-utils.ts create mode 100644 web/src/features/channels/lib/ollama-utils.ts create mode 100644 web/src/features/channels/lib/status-code-risk-guard.ts create mode 100644 web/src/features/channels/lib/task-plugin-base-url.ts create mode 100644 web/src/features/channels/lib/upstream-update-utils.ts create mode 100644 web/src/features/channels/types.ts create mode 100644 web/src/features/chat/hooks/use-active-chat-key.ts create mode 100644 web/src/features/chat/hooks/use-chat-presets.ts create mode 100644 web/src/features/chat/lib/chat-links.ts create mode 100644 web/src/features/chat/lib/send-to-fluent.ts create mode 100644 web/src/features/dashboard/api.ts create mode 100644 web/src/features/dashboard/components/flow/flow-charts.tsx create mode 100644 web/src/features/dashboard/components/flow/flow-node-filter.tsx create mode 100644 web/src/features/dashboard/components/models/consumption-distribution-chart.tsx create mode 100644 web/src/features/dashboard/components/models/log-stat-cards.tsx create mode 100644 web/src/features/dashboard/components/models/model-charts.tsx create mode 100644 web/src/features/dashboard/components/models/models-chart-preferences.tsx create mode 100644 web/src/features/dashboard/components/models/models-filter-dialog.tsx create mode 100644 web/src/features/dashboard/components/models/performance-overview.tsx create mode 100644 web/src/features/dashboard/components/overview/__tests__/setup-guide.test.tsx create mode 100644 web/src/features/dashboard/components/overview/announcement-detail-dialog.tsx create mode 100644 web/src/features/dashboard/components/overview/announcements-panel.tsx create mode 100644 web/src/features/dashboard/components/overview/api-info-item.tsx create mode 100644 web/src/features/dashboard/components/overview/api-info-panel.tsx create mode 100644 web/src/features/dashboard/components/overview/faq-panel.tsx create mode 100644 web/src/features/dashboard/components/overview/overview-dashboard.tsx create mode 100644 web/src/features/dashboard/components/overview/performance-health-panel.tsx create mode 100644 web/src/features/dashboard/components/overview/summary-cards.tsx create mode 100644 web/src/features/dashboard/components/overview/uptime-panel.tsx create mode 100644 web/src/features/dashboard/components/ui/panel-wrapper.tsx create mode 100644 web/src/features/dashboard/components/ui/stat-card.tsx create mode 100644 web/src/features/dashboard/components/users/user-charts.tsx create mode 100644 web/src/features/dashboard/constants.ts create mode 100644 web/src/features/dashboard/hooks/use-dashboard-config.tsx create mode 100644 web/src/features/dashboard/hooks/use-status-data.ts create mode 100644 web/src/features/dashboard/index.tsx create mode 100644 web/src/features/dashboard/lib/api-info.ts create mode 100644 web/src/features/dashboard/lib/charts.ts create mode 100644 web/src/features/dashboard/lib/filters.ts create mode 100644 web/src/features/dashboard/lib/flow-selection.test.ts create mode 100644 web/src/features/dashboard/lib/flow-selection.ts create mode 100644 web/src/features/dashboard/lib/flow.test.ts create mode 100644 web/src/features/dashboard/lib/flow.ts create mode 100644 web/src/features/dashboard/lib/index.ts create mode 100644 web/src/features/dashboard/lib/stats.ts create mode 100644 web/src/features/dashboard/lib/text.ts create mode 100644 web/src/features/dashboard/section-registry.tsx create mode 100644 web/src/features/dashboard/types.ts create mode 100644 web/src/features/errors/forbidden.tsx create mode 100644 web/src/features/errors/general-error.tsx create mode 100644 web/src/features/errors/maintenance-error.tsx create mode 100644 web/src/features/errors/not-found-error.tsx create mode 100644 web/src/features/errors/unauthorized-error.tsx create mode 100644 web/src/features/group-status/__tests__/metrics.test.tsx create mode 100644 web/src/features/group-status/__tests__/status.test.ts create mode 100644 web/src/features/group-status/index.tsx create mode 100644 web/src/features/group-status/lib/status.ts create mode 100644 web/src/features/home/api.ts create mode 100644 web/src/features/home/components/connection-line.tsx create mode 100644 web/src/features/home/components/feature-item.tsx create mode 100644 web/src/features/home/components/gateway-card.tsx create mode 100644 web/src/features/home/components/hero-buttons.tsx create mode 100644 web/src/features/home/components/hero-terminal-demo.tsx create mode 100644 web/src/features/home/components/icon-card.tsx create mode 100644 web/src/features/home/components/index.ts create mode 100644 web/src/features/home/components/scrolling-icons.tsx create mode 100644 web/src/features/home/components/sections/cta.tsx create mode 100644 web/src/features/home/components/sections/features.tsx create mode 100644 web/src/features/home/components/sections/hero.tsx create mode 100644 web/src/features/home/components/sections/how-it-works.tsx create mode 100644 web/src/features/home/components/sections/stats.tsx create mode 100644 web/src/features/home/components/stat-item.tsx create mode 100644 web/src/features/home/constants.ts create mode 100644 web/src/features/home/hooks/index.ts create mode 100644 web/src/features/home/hooks/use-home-page-content.ts create mode 100644 web/src/features/home/index.tsx create mode 100644 web/src/features/home/lib/icon-mapper.tsx create mode 100644 web/src/features/home/types.ts create mode 100644 web/src/features/keys/api.ts create mode 100644 web/src/features/keys/components/__tests__/api-key-group-cell.test.tsx create mode 100644 web/src/features/keys/components/__tests__/api-key-group-combobox.test.tsx create mode 100644 web/src/features/keys/components/__tests__/api-key-listing.test.tsx create mode 100644 web/src/features/keys/components/__tests__/api-keys-mutate-drawer.test.tsx create mode 100644 web/src/features/keys/components/__tests__/auto-group-order-editor.test.tsx create mode 100644 web/src/features/keys/components/api-key-group-cell.tsx create mode 100644 web/src/features/keys/components/api-key-group-combobox.tsx create mode 100644 web/src/features/keys/components/api-key-quota-cell.tsx create mode 100644 web/src/features/keys/components/api-key-timestamp-cell.tsx create mode 100644 web/src/features/keys/components/api-keys-cells.tsx create mode 100644 web/src/features/keys/components/api-keys-columns.tsx create mode 100644 web/src/features/keys/components/api-keys-delete-dialog.tsx create mode 100644 web/src/features/keys/components/api-keys-dialogs.tsx create mode 100644 web/src/features/keys/components/api-keys-multi-delete-dialog.tsx create mode 100644 web/src/features/keys/components/api-keys-mutate-drawer.tsx create mode 100644 web/src/features/keys/components/api-keys-primary-buttons.tsx create mode 100644 web/src/features/keys/components/api-keys-provider.tsx create mode 100644 web/src/features/keys/components/api-keys-table.tsx create mode 100644 web/src/features/keys/components/auto-group-order-editor.tsx create mode 100644 web/src/features/keys/components/auto-group-visuals.tsx create mode 100644 web/src/features/keys/components/data-table-bulk-actions.tsx create mode 100644 web/src/features/keys/components/data-table-row-actions.tsx create mode 100644 web/src/features/keys/components/dialogs/cc-switch-dialog.tsx create mode 100644 web/src/features/keys/constants.ts create mode 100644 web/src/features/keys/index.tsx create mode 100644 web/src/features/keys/lib/__tests__/auto-group-form.test.ts create mode 100644 web/src/features/keys/lib/api-key-form.ts create mode 100644 web/src/features/keys/lib/index.ts create mode 100644 web/src/features/keys/types.ts create mode 100644 web/src/features/legal/api.ts create mode 100644 web/src/features/legal/index.ts create mode 100644 web/src/features/legal/legal-document.tsx create mode 100644 web/src/features/legal/privacy-policy.tsx create mode 100644 web/src/features/legal/types.ts create mode 100644 web/src/features/legal/user-agreement.tsx create mode 100644 web/src/features/model-pricing/__tests__/editor-currency.test.tsx create mode 100644 web/src/features/model-pricing/__tests__/editor-layout.test.tsx create mode 100644 web/src/features/model-pricing/__tests__/pricing.test.ts create mode 100644 web/src/features/model-pricing/api.ts create mode 100644 web/src/features/model-pricing/currency.ts create mode 100644 web/src/features/model-pricing/model-pricing-panel.tsx create mode 100644 web/src/features/model-pricing/pricing-amount-input.tsx create mode 100644 web/src/features/model-pricing/pricing-currency-selector.tsx create mode 100644 web/src/features/model-pricing/pricing.ts create mode 100644 web/src/features/models/__tests__/metadata-editing.test.tsx create mode 100644 web/src/features/models/__tests__/metadata-sync.test.tsx create mode 100644 web/src/features/models/__tests__/model-deletion.test.tsx create mode 100644 web/src/features/models/__tests__/model-listing.test.tsx create mode 100644 web/src/features/models/__tests__/vendor-management.test.tsx create mode 100644 web/src/features/models/api.ts create mode 100644 web/src/features/models/components/data-table-bulk-actions.tsx create mode 100644 web/src/features/models/components/data-table-row-actions.tsx create mode 100644 web/src/features/models/components/deployment-access-guard.tsx create mode 100644 web/src/features/models/components/deployments-columns.tsx create mode 100644 web/src/features/models/components/deployments-table.tsx create mode 100644 web/src/features/models/components/description-cell.tsx create mode 100644 web/src/features/models/components/dialogs/create-deployment-drawer.tsx create mode 100644 web/src/features/models/components/dialogs/description-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/extend-deployment-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/missing-models-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/model-delete-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/prefill-group-management-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/prefill-group-management.tsx create mode 100644 web/src/features/models/components/dialogs/price-sync-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/rename-deployment-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/sync-wizard-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/update-config-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/upstream-conflict-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/vendor-mutate-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/vendor-operation-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/vendors-management-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/view-details-dialog.tsx create mode 100644 web/src/features/models/components/dialogs/view-logs-dialog.tsx create mode 100644 web/src/features/models/components/drawers/model-mutate-drawer.tsx create mode 100644 web/src/features/models/components/drawers/prefill-group-form-drawer.tsx create mode 100644 web/src/features/models/components/model-connections.tsx create mode 100644 web/src/features/models/components/model-square-status.tsx create mode 100644 web/src/features/models/components/models-columns.tsx create mode 100644 web/src/features/models/components/models-dialogs.tsx create mode 100644 web/src/features/models/components/models-primary-buttons.tsx create mode 100644 web/src/features/models/components/models-provider.tsx create mode 100644 web/src/features/models/components/models-table.tsx create mode 100644 web/src/features/models/components/prefill-group-shared.ts create mode 100644 web/src/features/models/components/vendor-linked-models.tsx create mode 100644 web/src/features/models/components/vendors-table.tsx create mode 100644 web/src/features/models/constants.ts create mode 100644 web/src/features/models/hooks/use-model-deployment-settings.ts create mode 100644 web/src/features/models/index.tsx create mode 100644 web/src/features/models/lib/deployments-utils.ts create mode 100644 web/src/features/models/lib/index.ts create mode 100644 web/src/features/models/lib/model-actions.ts create mode 100644 web/src/features/models/lib/model-form.ts create mode 100644 web/src/features/models/lib/model-utils.ts create mode 100644 web/src/features/models/lib/query-keys.ts create mode 100644 web/src/features/models/lib/vendor-actions.ts create mode 100644 web/src/features/models/section-registry.tsx create mode 100644 web/src/features/models/types.ts create mode 100644 web/src/features/models/vendor-api.ts create mode 100644 web/src/features/performance-metrics/api.ts create mode 100644 web/src/features/performance-metrics/lib/format.ts create mode 100644 web/src/features/performance-metrics/types.ts create mode 100644 web/src/features/playground/api.ts create mode 100644 web/src/features/playground/components/chat/playground-chat.tsx create mode 100644 web/src/features/playground/components/chat/playground-empty-state.tsx create mode 100644 web/src/features/playground/components/input/playground-input-controls.tsx create mode 100644 web/src/features/playground/components/input/playground-input-tools.tsx create mode 100644 web/src/features/playground/components/input/playground-input.tsx create mode 100644 web/src/features/playground/components/input/playground-parameter-panel.tsx create mode 100644 web/src/features/playground/components/message/__tests__/playground-message-editor.test.tsx create mode 100644 web/src/features/playground/components/message/message-action-button.tsx create mode 100644 web/src/features/playground/components/message/message-actions.tsx create mode 100644 web/src/features/playground/components/message/message-error-actions.tsx create mode 100644 web/src/features/playground/components/message/message-error.tsx create mode 100644 web/src/features/playground/components/message/message-metadata.tsx create mode 100644 web/src/features/playground/components/message/playground-message-content.tsx create mode 100644 web/src/features/playground/components/message/playground-message-editor.tsx create mode 100644 web/src/features/playground/constants.ts create mode 100644 web/src/features/playground/hooks/index.ts create mode 100644 web/src/features/playground/hooks/use-chat-handler.ts create mode 100644 web/src/features/playground/hooks/use-message-action-guard.ts create mode 100644 web/src/features/playground/hooks/use-playground-conversation.ts create mode 100644 web/src/features/playground/hooks/use-playground-options.ts create mode 100644 web/src/features/playground/hooks/use-playground-state.ts create mode 100644 web/src/features/playground/hooks/use-stream-request.test.ts create mode 100644 web/src/features/playground/hooks/use-stream-request.ts create mode 100644 web/src/features/playground/index.tsx create mode 100644 web/src/features/playground/lib/index.ts create mode 100644 web/src/features/playground/lib/input/input-control-utils.ts create mode 100644 web/src/features/playground/lib/input/input-tool-utils.ts create mode 100644 web/src/features/playground/lib/message/conversation-message-utils.ts create mode 100644 web/src/features/playground/lib/message/message-action-utils.ts create mode 100644 web/src/features/playground/lib/message/message-content-utils.ts create mode 100644 web/src/features/playground/lib/message/message-editor-utils.ts create mode 100644 web/src/features/playground/lib/message/message-error-utils.ts create mode 100644 web/src/features/playground/lib/message/message-layout-utils.ts create mode 100644 web/src/features/playground/lib/message/message-reasoning-utils.ts create mode 100644 web/src/features/playground/lib/message/message-streaming-utils.ts create mode 100644 web/src/features/playground/lib/message/message-styles.ts create mode 100644 web/src/features/playground/lib/message/message-timing-utils.ts create mode 100644 web/src/features/playground/lib/message/message-update-utils.ts create mode 100644 web/src/features/playground/lib/message/message-utils.ts create mode 100644 web/src/features/playground/lib/options/playground-option-utils.ts create mode 100644 web/src/features/playground/lib/parameters/playground-parameters.ts create mode 100644 web/src/features/playground/lib/state/playground-state-utils.ts create mode 100644 web/src/features/playground/lib/storage/storage-schema.ts create mode 100644 web/src/features/playground/lib/storage/storage.ts create mode 100644 web/src/features/playground/lib/streaming/payload-builder.ts create mode 100644 web/src/features/playground/lib/streaming/request-error-utils.ts create mode 100644 web/src/features/playground/lib/streaming/stream-utils.ts create mode 100644 web/src/features/playground/types.ts create mode 100644 web/src/features/pricing/__tests__/breakdown-tier-match.test.ts create mode 100644 web/src/features/pricing/__tests__/dynamic-price.test.ts create mode 100644 web/src/features/pricing/__tests__/group-pricing.test.ts create mode 100644 web/src/features/pricing/__tests__/model-cards.test.tsx create mode 100644 web/src/features/pricing/__tests__/pricing-controls.test.tsx create mode 100644 web/src/features/pricing/__tests__/task-expr.test.ts create mode 100644 web/src/features/pricing/__tests__/task-matrix-display.test.ts create mode 100644 web/src/features/pricing/__tests__/task-matrix.test.ts create mode 100644 web/src/features/pricing/__tests__/task-price-display.test.tsx create mode 100644 web/src/features/pricing/api.ts create mode 100644 web/src/features/pricing/components/dynamic-pricing-breakdown.tsx create mode 100644 web/src/features/pricing/components/empty-state.tsx create mode 100644 web/src/features/pricing/components/index.ts create mode 100644 web/src/features/pricing/components/loading-skeleton.tsx create mode 100644 web/src/features/pricing/components/model-billing-mode-badge.tsx create mode 100644 web/src/features/pricing/components/model-card-grid.tsx create mode 100644 web/src/features/pricing/components/model-card.tsx create mode 100644 web/src/features/pricing/components/model-details-api.tsx create mode 100644 web/src/features/pricing/components/model-details-apps.tsx create mode 100644 web/src/features/pricing/components/model-details-charts.tsx create mode 100644 web/src/features/pricing/components/model-details-performance.tsx create mode 100644 web/src/features/pricing/components/model-details-uptime-sparkline.tsx create mode 100644 web/src/features/pricing/components/model-details.tsx create mode 100644 web/src/features/pricing/components/model-perf-badge.tsx create mode 100644 web/src/features/pricing/components/model-price-cell.tsx create mode 100644 web/src/features/pricing/components/pricing-columns.tsx create mode 100644 web/src/features/pricing/components/pricing-sidebar.tsx create mode 100644 web/src/features/pricing/components/pricing-table.tsx create mode 100644 web/src/features/pricing/components/pricing-toolbar.tsx create mode 100644 web/src/features/pricing/components/search-bar.tsx create mode 100644 web/src/features/pricing/constants.ts create mode 100644 web/src/features/pricing/hooks/index.ts create mode 100644 web/src/features/pricing/hooks/use-filters.ts create mode 100644 web/src/features/pricing/hooks/use-pricing-data.ts create mode 100644 web/src/features/pricing/index.tsx create mode 100644 web/src/features/pricing/lib/__tests__/time-rule-expr.test.ts create mode 100644 web/src/features/pricing/lib/billing-expr.ts create mode 100644 web/src/features/pricing/lib/billing-mode.ts create mode 100644 web/src/features/pricing/lib/breakdown-tier-match.ts create mode 100644 web/src/features/pricing/lib/dynamic-price.ts create mode 100644 web/src/features/pricing/lib/filters.ts create mode 100644 web/src/features/pricing/lib/index.ts create mode 100644 web/src/features/pricing/lib/mock-stats.ts create mode 100644 web/src/features/pricing/lib/model-helpers.ts create mode 100644 web/src/features/pricing/lib/price.ts create mode 100644 web/src/features/pricing/lib/seed.ts create mode 100644 web/src/features/pricing/lib/task-expr.ts create mode 100644 web/src/features/pricing/lib/task-matrix-display.ts create mode 100644 web/src/features/pricing/lib/task-price-display.ts create mode 100644 web/src/features/pricing/lib/tier-expr.ts create mode 100644 web/src/features/pricing/types.ts create mode 100644 web/src/features/profile/__tests__/settings.test.tsx create mode 100644 web/src/features/profile/api.ts create mode 100644 web/src/features/profile/components/checkin-calendar-card.tsx create mode 100644 web/src/features/profile/components/language-preferences-card.tsx create mode 100644 web/src/features/profile/components/profile-header.tsx create mode 100644 web/src/features/profile/components/profile-settings-card.tsx create mode 100644 web/src/features/profile/components/sidebar-modules-card.tsx create mode 100644 web/src/features/profile/components/tabs/notification-tab.tsx create mode 100644 web/src/features/profile/constants.ts create mode 100644 web/src/features/profile/hooks/index.ts create mode 100644 web/src/features/profile/hooks/use-profile.ts create mode 100644 web/src/features/profile/index.tsx create mode 100644 web/src/features/profile/lib/format.ts create mode 100644 web/src/features/profile/lib/index.ts create mode 100644 web/src/features/profile/lib/user-settings.ts create mode 100644 web/src/features/profile/types.ts create mode 100644 web/src/features/rankings/api.ts create mode 100644 web/src/features/rankings/components/entity-links.tsx create mode 100644 web/src/features/rankings/components/growth-text.tsx create mode 100644 web/src/features/rankings/components/index.ts create mode 100644 web/src/features/rankings/components/market-share-section.tsx create mode 100644 web/src/features/rankings/components/model-leaderboard.tsx create mode 100644 web/src/features/rankings/components/models-section.tsx create mode 100644 web/src/features/rankings/components/pulse-section.tsx create mode 100644 web/src/features/rankings/components/rankings-hero.tsx create mode 100644 web/src/features/rankings/hooks/use-rankings.ts create mode 100644 web/src/features/rankings/index.tsx create mode 100644 web/src/features/rankings/lib/format.ts create mode 100644 web/src/features/rankings/lib/index.ts create mode 100644 web/src/features/rankings/types.ts create mode 100644 web/src/features/redemption-codes/api.ts create mode 100644 web/src/features/redemption-codes/components/__tests__/bulk-delete.test.tsx create mode 100644 web/src/features/redemption-codes/components/__tests__/redemptions-export.test.tsx create mode 100644 web/src/features/redemption-codes/components/__tests__/redemptions-mutate-drawer.test.tsx create mode 100644 web/src/features/redemption-codes/components/data-table-bulk-actions.tsx create mode 100644 web/src/features/redemption-codes/components/data-table-row-actions.tsx create mode 100644 web/src/features/redemption-codes/components/redemptions-columns.tsx create mode 100644 web/src/features/redemption-codes/components/redemptions-delete-dialog.tsx create mode 100644 web/src/features/redemption-codes/components/redemptions-dialogs.tsx create mode 100644 web/src/features/redemption-codes/components/redemptions-export-dialog.tsx create mode 100644 web/src/features/redemption-codes/components/redemptions-mobile-list.tsx create mode 100644 web/src/features/redemption-codes/components/redemptions-mutate-drawer.tsx create mode 100644 web/src/features/redemption-codes/components/redemptions-primary-buttons.tsx create mode 100644 web/src/features/redemption-codes/components/redemptions-provider.tsx create mode 100644 web/src/features/redemption-codes/components/redemptions-table.tsx create mode 100644 web/src/features/redemption-codes/constants.ts create mode 100644 web/src/features/redemption-codes/index.tsx create mode 100644 web/src/features/redemption-codes/lib/index.ts create mode 100644 web/src/features/redemption-codes/lib/redemption-form.ts create mode 100644 web/src/features/redemption-codes/lib/utils.ts create mode 100644 web/src/features/redemption-codes/types.ts create mode 100644 web/src/features/security/__tests__/account-security.test.tsx create mode 100644 web/src/features/security/__tests__/enrollment.test.tsx create mode 100644 web/src/features/security/__tests__/page.test.tsx create mode 100644 web/src/features/security/api.ts create mode 100644 web/src/features/security/components/__tests__/access-token-card.test.tsx create mode 100644 web/src/features/security/components/__tests__/login-session-utils.test.ts create mode 100644 web/src/features/security/components/__tests__/privacy-card.test.tsx create mode 100644 web/src/features/security/components/access-token-card.tsx create mode 100644 web/src/features/security/components/account-action-card.tsx create mode 100644 web/src/features/security/components/account-bindings.tsx create mode 100644 web/src/features/security/components/dialogs/access-token-dialog.tsx create mode 100644 web/src/features/security/components/dialogs/change-password-dialog.tsx create mode 100644 web/src/features/security/components/dialogs/delete-account-dialog.tsx create mode 100644 web/src/features/security/components/dialogs/email-bind-dialog.tsx create mode 100644 web/src/features/security/components/dialogs/telegram-bind-dialog.tsx create mode 100644 web/src/features/security/components/dialogs/two-fa-backup-dialog.tsx create mode 100644 web/src/features/security/components/dialogs/two-fa-disable-dialog.tsx create mode 100644 web/src/features/security/components/dialogs/two-fa-setup-dialog.tsx create mode 100644 web/src/features/security/components/dialogs/wechat-bind-dialog.tsx create mode 100644 web/src/features/security/components/login-session-dialogs.tsx create mode 100644 web/src/features/security/components/login-session-item.tsx create mode 100644 web/src/features/security/components/login-session-utils.ts create mode 100644 web/src/features/security/components/login-sessions-card.tsx create mode 100644 web/src/features/security/components/passkey-card.tsx create mode 100644 web/src/features/security/components/privacy-card.tsx create mode 100644 web/src/features/security/components/two-fa-card.tsx create mode 100644 web/src/features/security/hooks/use-access-token.ts create mode 100644 web/src/features/security/hooks/use-account-security.ts create mode 100644 web/src/features/security/hooks/use-two-fa-setup.ts create mode 100644 web/src/features/security/hooks/use-two-fa.ts create mode 100644 web/src/features/security/index.tsx create mode 100644 web/src/features/setup/api.ts create mode 100644 web/src/features/setup/components/admin-step.tsx create mode 100644 web/src/features/setup/components/complete-step.tsx create mode 100644 web/src/features/setup/components/database-step.tsx create mode 100644 web/src/features/setup/components/step-navigation.tsx create mode 100644 web/src/features/setup/components/usage-mode-step.tsx create mode 100644 web/src/features/setup/index.ts create mode 100644 web/src/features/setup/setup-wizard.tsx create mode 100644 web/src/features/setup/types.ts create mode 100644 web/src/features/subscriptions/api.ts create mode 100644 web/src/features/subscriptions/components/data-table-row-actions.tsx create mode 100644 web/src/features/subscriptions/components/dialogs/reset-subscriptions-dialog.tsx create mode 100644 web/src/features/subscriptions/components/dialogs/subscription-purchase-dialog.tsx create mode 100644 web/src/features/subscriptions/components/dialogs/toggle-status-dialog.tsx create mode 100644 web/src/features/subscriptions/components/dialogs/user-subscriptions-dialog.tsx create mode 100644 web/src/features/subscriptions/components/subscriptions-columns.tsx create mode 100644 web/src/features/subscriptions/components/subscriptions-dialogs.tsx create mode 100644 web/src/features/subscriptions/components/subscriptions-mutate-drawer.tsx create mode 100644 web/src/features/subscriptions/components/subscriptions-primary-buttons.tsx create mode 100644 web/src/features/subscriptions/components/subscriptions-provider.tsx create mode 100644 web/src/features/subscriptions/components/subscriptions-table.tsx create mode 100644 web/src/features/subscriptions/constants.ts create mode 100644 web/src/features/subscriptions/index.tsx create mode 100644 web/src/features/subscriptions/lib/format.ts create mode 100644 web/src/features/subscriptions/lib/index.ts create mode 100644 web/src/features/subscriptions/lib/plan-form.ts create mode 100644 web/src/features/subscriptions/types.ts create mode 100644 web/src/features/system-info/api.ts create mode 100644 web/src/features/system-info/components/system-instances-panel.tsx create mode 100644 web/src/features/system-info/components/system-tasks-panel.tsx create mode 100644 web/src/features/system-info/index.tsx create mode 100644 web/src/features/system-info/types.ts create mode 100644 web/src/features/system-settings/__tests__/pricing-sync.test.tsx create mode 100644 web/src/features/system-settings/__tests__/task-public-address.test.ts create mode 100644 web/src/features/system-settings/api.ts create mode 100644 web/src/features/system-settings/auth/basic-auth-section.tsx create mode 100644 web/src/features/system-settings/auth/bot-protection-section.tsx create mode 100644 web/src/features/system-settings/auth/custom-oauth/api.ts create mode 100644 web/src/features/system-settings/auth/custom-oauth/components/access-policy-templates.ts create mode 100644 web/src/features/system-settings/auth/custom-oauth/components/discovery-button.tsx create mode 100644 web/src/features/system-settings/auth/custom-oauth/components/preset-selector.tsx create mode 100644 web/src/features/system-settings/auth/custom-oauth/components/provider-form-dialog.tsx create mode 100644 web/src/features/system-settings/auth/custom-oauth/components/provider-table.tsx create mode 100644 web/src/features/system-settings/auth/custom-oauth/custom-oauth-section.tsx create mode 100644 web/src/features/system-settings/auth/custom-oauth/hooks/use-custom-oauth-mutations.ts create mode 100644 web/src/features/system-settings/auth/custom-oauth/hooks/use-custom-oauth-providers.ts create mode 100644 web/src/features/system-settings/auth/custom-oauth/types.ts create mode 100644 web/src/features/system-settings/auth/index.tsx create mode 100644 web/src/features/system-settings/auth/oauth-callback-url.ts create mode 100644 web/src/features/system-settings/auth/oauth-section.tsx create mode 100644 web/src/features/system-settings/auth/passkey-section.tsx create mode 100644 web/src/features/system-settings/auth/section-registry.tsx create mode 100644 web/src/features/system-settings/billing/index.tsx create mode 100644 web/src/features/system-settings/billing/section-registry.tsx create mode 100644 web/src/features/system-settings/components/form-dirty-indicator.tsx create mode 100644 web/src/features/system-settings/components/form-navigation-guard.tsx create mode 100644 web/src/features/system-settings/components/settings-accordion.tsx create mode 100644 web/src/features/system-settings/components/settings-card.tsx create mode 100644 web/src/features/system-settings/components/settings-form-layout.tsx create mode 100644 web/src/features/system-settings/components/settings-page-context.tsx create mode 100644 web/src/features/system-settings/components/settings-page.tsx create mode 100644 web/src/features/system-settings/components/settings-section.tsx create mode 100644 web/src/features/system-settings/content/announcements-section.tsx create mode 100644 web/src/features/system-settings/content/api-info-section.tsx create mode 100644 web/src/features/system-settings/content/chat-dialog.tsx create mode 100644 web/src/features/system-settings/content/chat-settings-section.tsx create mode 100644 web/src/features/system-settings/content/chat-settings-visual-editor.tsx create mode 100644 web/src/features/system-settings/content/dashboard-section.tsx create mode 100644 web/src/features/system-settings/content/drawing-settings-section.tsx create mode 100644 web/src/features/system-settings/content/faq-section.tsx create mode 100644 web/src/features/system-settings/content/index.tsx create mode 100644 web/src/features/system-settings/content/json-toggle-section.tsx create mode 100644 web/src/features/system-settings/content/section-registry.tsx create mode 100644 web/src/features/system-settings/content/uptime-kuma-section.tsx create mode 100644 web/src/features/system-settings/content/utils.ts create mode 100644 web/src/features/system-settings/general/channel-affinity/api.ts create mode 100644 web/src/features/system-settings/general/channel-affinity/cache-stats-dialog.tsx create mode 100644 web/src/features/system-settings/general/channel-affinity/constants.ts create mode 100644 web/src/features/system-settings/general/channel-affinity/index.tsx create mode 100644 web/src/features/system-settings/general/channel-affinity/rule-editor-dialog.tsx create mode 100644 web/src/features/system-settings/general/channel-affinity/types.ts create mode 100644 web/src/features/system-settings/general/checkin-settings-section.tsx create mode 100644 web/src/features/system-settings/general/pricing-section.tsx create mode 100644 web/src/features/system-settings/general/quota-settings-section.tsx create mode 100644 web/src/features/system-settings/general/system-behavior-section.tsx create mode 100644 web/src/features/system-settings/general/system-info-section.tsx create mode 100644 web/src/features/system-settings/general/task-public-address.ts create mode 100644 web/src/features/system-settings/hooks/use-accordion-state.ts create mode 100644 web/src/features/system-settings/hooks/use-form-dirty-guard.ts create mode 100644 web/src/features/system-settings/hooks/use-reset-form.ts create mode 100644 web/src/features/system-settings/hooks/use-safe-json-state.ts create mode 100644 web/src/features/system-settings/hooks/use-settings-form.ts create mode 100644 web/src/features/system-settings/hooks/use-system-options.ts create mode 100644 web/src/features/system-settings/hooks/use-update-option.ts create mode 100644 web/src/features/system-settings/index.tsx create mode 100644 web/src/features/system-settings/integrations/amount-discount-dialog.tsx create mode 100644 web/src/features/system-settings/integrations/amount-discount-visual-editor.tsx create mode 100644 web/src/features/system-settings/integrations/amount-options-visual-editor.tsx create mode 100644 web/src/features/system-settings/integrations/creem-product-dialog.tsx create mode 100644 web/src/features/system-settings/integrations/creem-products-visual-editor.tsx create mode 100644 web/src/features/system-settings/integrations/email-settings-section.tsx create mode 100644 web/src/features/system-settings/integrations/ionet-deployment-settings-section.tsx create mode 100644 web/src/features/system-settings/integrations/monitoring-settings-section.tsx create mode 100644 web/src/features/system-settings/integrations/payment-method-dialog.tsx create mode 100644 web/src/features/system-settings/integrations/payment-methods-visual-editor.tsx create mode 100644 web/src/features/system-settings/integrations/payment-settings-section.tsx create mode 100644 web/src/features/system-settings/integrations/utils.ts create mode 100644 web/src/features/system-settings/integrations/waffo-pancake-api.ts create mode 100644 web/src/features/system-settings/integrations/waffo-pancake-settings-section.tsx create mode 100644 web/src/features/system-settings/integrations/waffo-settings-section.tsx create mode 100644 web/src/features/system-settings/integrations/worker-settings-section.tsx create mode 100644 web/src/features/system-settings/maintenance/config.ts create mode 100644 web/src/features/system-settings/maintenance/header-navigation-section.tsx create mode 100644 web/src/features/system-settings/maintenance/log-settings-section.tsx create mode 100644 web/src/features/system-settings/maintenance/notice-section.tsx create mode 100644 web/src/features/system-settings/maintenance/performance-section.tsx create mode 100644 web/src/features/system-settings/maintenance/sidebar-modules-section.tsx create mode 100644 web/src/features/system-settings/maintenance/update-checker-section.tsx create mode 100644 web/src/features/system-settings/models/__tests__/group-auto-limit-validation.test.ts create mode 100644 web/src/features/system-settings/models/__tests__/task-pricing-copy.test.tsx create mode 100644 web/src/features/system-settings/models/__tests__/tool-price-validation.test.tsx create mode 100644 web/src/features/system-settings/models/channel-selector-dialog.tsx create mode 100644 web/src/features/system-settings/models/claude-settings-card.tsx create mode 100644 web/src/features/system-settings/models/conflict-confirm-dialog.tsx create mode 100644 web/src/features/system-settings/models/constants.ts create mode 100644 web/src/features/system-settings/models/gemini-settings-card.tsx create mode 100644 web/src/features/system-settings/models/global-settings-card.tsx create mode 100644 web/src/features/system-settings/models/grok-settings-card.tsx create mode 100644 web/src/features/system-settings/models/group-ratio-form.tsx create mode 100644 web/src/features/system-settings/models/group-ratio-visual-editor.tsx create mode 100644 web/src/features/system-settings/models/group-special-usable-editor.tsx create mode 100644 web/src/features/system-settings/models/index.tsx create mode 100644 web/src/features/system-settings/models/model-pricing-core.ts create mode 100644 web/src/features/system-settings/models/model-pricing-inputs.tsx create mode 100644 web/src/features/system-settings/models/model-pricing-sheet.tsx create mode 100644 web/src/features/system-settings/models/model-pricing-snapshots.ts create mode 100644 web/src/features/system-settings/models/model-ratio-form.tsx create mode 100644 web/src/features/system-settings/models/model-ratio-table-columns.tsx create mode 100644 web/src/features/system-settings/models/model-ratio-visual-editor.tsx create mode 100644 web/src/features/system-settings/models/pricing-format.ts create mode 100644 web/src/features/system-settings/models/ratio-settings-card.tsx create mode 100644 web/src/features/system-settings/models/routing-reliability-section.tsx create mode 100644 web/src/features/system-settings/models/section-registry.tsx create mode 100644 web/src/features/system-settings/models/task-pricing-matrix.tsx create mode 100644 web/src/features/system-settings/models/task-usage-pricing-editor.tsx create mode 100644 web/src/features/system-settings/models/tiered-pricing-editor.tsx create mode 100644 web/src/features/system-settings/models/tool-price-settings.tsx create mode 100644 web/src/features/system-settings/models/upstream-price-cells.tsx create mode 100644 web/src/features/system-settings/models/upstream-ratio-sync-columns.tsx create mode 100644 web/src/features/system-settings/models/upstream-ratio-sync-helpers.ts create mode 100644 web/src/features/system-settings/models/upstream-ratio-sync-table.tsx create mode 100644 web/src/features/system-settings/models/upstream-ratio-sync.tsx create mode 100644 web/src/features/system-settings/models/utils.ts create mode 100644 web/src/features/system-settings/operations/index.tsx create mode 100644 web/src/features/system-settings/operations/section-registry.tsx create mode 100644 web/src/features/system-settings/request-limits/rate-limit-dialog.tsx create mode 100644 web/src/features/system-settings/request-limits/rate-limit-section.tsx create mode 100644 web/src/features/system-settings/request-limits/rate-limit-visual-editor.tsx create mode 100644 web/src/features/system-settings/request-limits/sensitive-words-section.tsx create mode 100644 web/src/features/system-settings/request-limits/ssrf-section.tsx create mode 100644 web/src/features/system-settings/request-limits/token-limit-section.tsx create mode 100644 web/src/features/system-settings/security/index.tsx create mode 100644 web/src/features/system-settings/security/section-registry.tsx create mode 100644 web/src/features/system-settings/site/index.tsx create mode 100644 web/src/features/system-settings/site/section-registry.tsx create mode 100644 web/src/features/system-settings/types.ts create mode 100644 web/src/features/system-settings/utils/json-parser.ts create mode 100644 web/src/features/system-settings/utils/json-validators.ts create mode 100644 web/src/features/system-settings/utils/numeric-field.ts create mode 100644 web/src/features/system-settings/utils/route-config.ts create mode 100644 web/src/features/system-settings/utils/section-registry.ts create mode 100644 web/src/features/task-plugins/__tests__/enabled-option.test.ts create mode 100644 web/src/features/task-plugins/__tests__/marketplace-install-dialog.test.tsx create mode 100644 web/src/features/task-plugins/__tests__/marketplace-panel.test.tsx create mode 100644 web/src/features/task-plugins/__tests__/marketplace-plugin-logo.test.tsx create mode 100644 web/src/features/task-plugins/__tests__/marketplace.test.ts create mode 100644 web/src/features/task-plugins/__tests__/plugin-card.test.tsx create mode 100644 web/src/features/task-plugins/__tests__/plugin-detail-sheet.test.tsx create mode 100644 web/src/features/task-plugins/__tests__/plugin-icon-file.test.ts create mode 100644 web/src/features/task-plugins/__tests__/plugin-icon-image.test.tsx create mode 100644 web/src/features/task-plugins/__tests__/plugin-icon.test.ts create mode 100644 web/src/features/task-plugins/__tests__/plugin-meta-preview.test.ts create mode 100644 web/src/features/task-plugins/__tests__/plugin-url.test.ts create mode 100644 web/src/features/task-plugins/__tests__/plugins-table.test.tsx create mode 100644 web/src/features/task-plugins/__tests__/upload-dialog.test.tsx create mode 100644 web/src/features/task-plugins/__tests__/usage-schema-table.test.tsx create mode 100644 web/src/features/task-plugins/__tests__/website.test.tsx create mode 100644 web/src/features/task-plugins/api.ts create mode 100644 web/src/features/task-plugins/components/javascript-viewer.tsx create mode 100644 web/src/features/task-plugins/components/marketplace-capabilities.tsx create mode 100644 web/src/features/task-plugins/components/marketplace-install-dialog.tsx create mode 100644 web/src/features/task-plugins/components/marketplace-panel.tsx create mode 100644 web/src/features/task-plugins/components/marketplace-plugin-card.tsx create mode 100644 web/src/features/task-plugins/components/marketplace-sources-dialog.tsx create mode 100644 web/src/features/task-plugins/components/plugin-card.tsx create mode 100644 web/src/features/task-plugins/components/plugin-detail-sheet.tsx create mode 100644 web/src/features/task-plugins/components/plugin-endpoints.tsx create mode 100644 web/src/features/task-plugins/components/plugin-icon.tsx create mode 100644 web/src/features/task-plugins/components/plugin-integrity-check.tsx create mode 100644 web/src/features/task-plugins/components/plugin-metadata-card.tsx create mode 100644 web/src/features/task-plugins/components/plugin-model-list.tsx create mode 100644 web/src/features/task-plugins/components/plugin-sandbox.tsx create mode 100644 web/src/features/task-plugins/components/plugin-source-picker.tsx create mode 100644 web/src/features/task-plugins/components/plugin-url-import-field.tsx create mode 100644 web/src/features/task-plugins/components/plugin-website-link.tsx create mode 100644 web/src/features/task-plugins/components/plugins-table.tsx create mode 100644 web/src/features/task-plugins/components/source-diff.tsx create mode 100644 web/src/features/task-plugins/components/upload-dialog.tsx create mode 100644 web/src/features/task-plugins/components/usage-schema-table.tsx create mode 100644 web/src/features/task-plugins/index.tsx create mode 100644 web/src/features/task-plugins/lib/host-protocols.ts create mode 100644 web/src/features/task-plugins/lib/marketplace.ts create mode 100644 web/src/features/task-plugins/lib/plugin-icon-file.ts create mode 100644 web/src/features/task-plugins/lib/plugin-icon.ts create mode 100644 web/src/features/task-plugins/lib/plugin-meta-preview.ts create mode 100644 web/src/features/task-plugins/lib/plugin-url.ts create mode 100644 web/src/features/task-plugins/lib/plugin-website.ts create mode 100644 web/src/features/task-plugins/types.ts create mode 100644 web/src/features/usage-logs/__tests__/access.test.ts create mode 100644 web/src/features/usage-logs/__tests__/artifacts.test.ts create mode 100644 web/src/features/usage-logs/__tests__/mobile-layout.test.ts create mode 100644 web/src/features/usage-logs/__tests__/task-details.test.ts create mode 100644 web/src/features/usage-logs/api.ts create mode 100644 web/src/features/usage-logs/audit/__tests__/details.test.tsx create mode 100644 web/src/features/usage-logs/audit/__tests__/viewer.test.tsx create mode 100644 web/src/features/usage-logs/audit/api.ts create mode 100644 web/src/features/usage-logs/audit/components/audit-detail-fields.tsx create mode 100644 web/src/features/usage-logs/audit/components/audit-detail-value.tsx create mode 100644 web/src/features/usage-logs/audit/components/audit-log-columns.tsx create mode 100644 web/src/features/usage-logs/audit/components/audit-log-details-dialog.tsx create mode 100644 web/src/features/usage-logs/audit/components/audit-log-filter-bar.tsx create mode 100644 web/src/features/usage-logs/audit/components/audit-log-viewer.tsx create mode 100644 web/src/features/usage-logs/audit/index.tsx create mode 100644 web/src/features/usage-logs/audit/lib/audit-details.ts create mode 100644 web/src/features/usage-logs/components/__tests__/cost-display.test.tsx create mode 100644 web/src/features/usage-logs/components/__tests__/detail-preview.test.tsx create mode 100644 web/src/features/usage-logs/components/__tests__/group-filter.test.tsx create mode 100644 web/src/features/usage-logs/components/__tests__/log-type-filter.test.tsx create mode 100644 web/src/features/usage-logs/components/__tests__/mobile-card.test.tsx create mode 100644 web/src/features/usage-logs/components/__tests__/mobile-filter.test.tsx create mode 100644 web/src/features/usage-logs/components/__tests__/quota-adjustment.test.tsx create mode 100644 web/src/features/usage-logs/components/__tests__/reject-reason.test.tsx create mode 100644 web/src/features/usage-logs/components/__tests__/usage-facts.test.tsx create mode 100644 web/src/features/usage-logs/components/columns/column-helpers.tsx create mode 100644 web/src/features/usage-logs/components/columns/common-logs-columns.tsx create mode 100644 web/src/features/usage-logs/components/columns/drawing-logs-columns.tsx create mode 100644 web/src/features/usage-logs/components/columns/task-logs-columns.tsx create mode 100644 web/src/features/usage-logs/components/common-log-mobile-card.tsx create mode 100644 web/src/features/usage-logs/components/common-logs-filter-bar.tsx create mode 100644 web/src/features/usage-logs/components/common-logs-header-actions.tsx create mode 100644 web/src/features/usage-logs/components/common-logs-stats.tsx create mode 100644 web/src/features/usage-logs/components/compact-date-time-range-picker.tsx create mode 100644 web/src/features/usage-logs/components/dialogs/audio-preview-dialog.tsx create mode 100644 web/src/features/usage-logs/components/dialogs/details-dialog.tsx create mode 100644 web/src/features/usage-logs/components/dialogs/fail-reason-dialog.tsx create mode 100644 web/src/features/usage-logs/components/dialogs/image-dialog.tsx create mode 100644 web/src/features/usage-logs/components/dialogs/log-detail-layout.tsx create mode 100644 web/src/features/usage-logs/components/dialogs/prompt-dialog.tsx create mode 100644 web/src/features/usage-logs/components/dialogs/task-details-dialog.tsx create mode 100644 web/src/features/usage-logs/components/dialogs/user-info-dialog.tsx create mode 100644 web/src/features/usage-logs/components/log-cost-display.tsx create mode 100644 web/src/features/usage-logs/components/logs-filter-toolbar.tsx create mode 100644 web/src/features/usage-logs/components/model-badge.tsx create mode 100644 web/src/features/usage-logs/components/plugin-author-link.tsx create mode 100644 web/src/features/usage-logs/components/task-artifacts.tsx create mode 100644 web/src/features/usage-logs/components/task-logs-filter-bar.tsx create mode 100644 web/src/features/usage-logs/components/timing-metrics-cell.tsx create mode 100644 web/src/features/usage-logs/components/usage-logs-mobile-card.tsx create mode 100644 web/src/features/usage-logs/components/usage-logs-provider.tsx create mode 100644 web/src/features/usage-logs/components/usage-logs-table.tsx create mode 100644 web/src/features/usage-logs/constants.ts create mode 100644 web/src/features/usage-logs/data/schema.ts create mode 100644 web/src/features/usage-logs/index.tsx create mode 100644 web/src/features/usage-logs/lib/__tests__/tool-surcharge.test.ts create mode 100644 web/src/features/usage-logs/lib/columns.ts create mode 100644 web/src/features/usage-logs/lib/filter.ts create mode 100644 web/src/features/usage-logs/lib/format.ts create mode 100644 web/src/features/usage-logs/lib/index.ts create mode 100644 web/src/features/usage-logs/lib/mappers.ts create mode 100644 web/src/features/usage-logs/lib/query-params.ts create mode 100644 web/src/features/usage-logs/lib/quota-audit-operation.ts create mode 100644 web/src/features/usage-logs/lib/status.ts create mode 100644 web/src/features/usage-logs/lib/task-artifacts.ts create mode 100644 web/src/features/usage-logs/lib/task-details.ts create mode 100644 web/src/features/usage-logs/lib/task-mobile-layout.ts create mode 100644 web/src/features/usage-logs/lib/utils.ts create mode 100644 web/src/features/usage-logs/section-registry.tsx create mode 100644 web/src/features/usage-logs/types.ts create mode 100644 web/src/features/users/api.ts create mode 100644 web/src/features/users/components/__tests__/permissions.test.tsx create mode 100644 web/src/features/users/components/__tests__/quota-display.test.tsx create mode 100644 web/src/features/users/components/data-table-bulk-actions.tsx create mode 100644 web/src/features/users/components/data-table-row-actions.tsx create mode 100644 web/src/features/users/components/dialogs/__tests__/user-binding-dialog.test.tsx create mode 100644 web/src/features/users/components/dialogs/user-binding-dialog.tsx create mode 100644 web/src/features/users/components/user-quota-cell.tsx create mode 100644 web/src/features/users/components/user-quota-dialog.tsx create mode 100644 web/src/features/users/components/users-columns.tsx create mode 100644 web/src/features/users/components/users-delete-dialog.tsx create mode 100644 web/src/features/users/components/users-mutate-drawer.tsx create mode 100644 web/src/features/users/components/users-primary-buttons.tsx create mode 100644 web/src/features/users/components/users-provider.tsx create mode 100644 web/src/features/users/components/users-table.tsx create mode 100644 web/src/features/users/constants.ts create mode 100644 web/src/features/users/index.tsx create mode 100644 web/src/features/users/lib/index.ts create mode 100644 web/src/features/users/lib/user-actions.ts create mode 100644 web/src/features/users/lib/user-form.ts create mode 100644 web/src/features/users/types.ts create mode 100644 web/src/features/wallet/api.ts create mode 100644 web/src/features/wallet/components/affiliate-rewards-card.tsx create mode 100644 web/src/features/wallet/components/creem-products-section.tsx create mode 100644 web/src/features/wallet/components/dialogs/billing-history-dialog.tsx create mode 100644 web/src/features/wallet/components/dialogs/creem-confirm-dialog.tsx create mode 100644 web/src/features/wallet/components/dialogs/payment-confirm-dialog.tsx create mode 100644 web/src/features/wallet/components/dialogs/transfer-dialog.tsx create mode 100644 web/src/features/wallet/components/recharge-form-card.tsx create mode 100644 web/src/features/wallet/components/subscription-plans-card.tsx create mode 100644 web/src/features/wallet/components/wallet-stats-card.tsx create mode 100644 web/src/features/wallet/constants.ts create mode 100644 web/src/features/wallet/hooks/index.ts create mode 100644 web/src/features/wallet/hooks/use-affiliate.ts create mode 100644 web/src/features/wallet/hooks/use-billing-history.ts create mode 100644 web/src/features/wallet/hooks/use-creem-payment.ts create mode 100644 web/src/features/wallet/hooks/use-payment.test.ts create mode 100644 web/src/features/wallet/hooks/use-payment.ts create mode 100644 web/src/features/wallet/hooks/use-redemption.ts create mode 100644 web/src/features/wallet/hooks/use-topup-info.ts create mode 100644 web/src/features/wallet/hooks/use-waffo-pancake-payment.ts create mode 100644 web/src/features/wallet/hooks/use-waffo-payment.ts create mode 100644 web/src/features/wallet/index.tsx create mode 100644 web/src/features/wallet/lib/affiliate.ts create mode 100644 web/src/features/wallet/lib/billing.ts create mode 100644 web/src/features/wallet/lib/format.ts create mode 100644 web/src/features/wallet/lib/index.ts create mode 100644 web/src/features/wallet/lib/payment.test.ts create mode 100644 web/src/features/wallet/lib/payment.ts create mode 100644 web/src/features/wallet/lib/ui.tsx create mode 100644 web/src/features/wallet/types.ts create mode 100644 web/src/hooks/__tests__/sidebar-config.test.tsx create mode 100644 web/src/hooks/index.ts create mode 100644 web/src/hooks/use-admin.ts create mode 100644 web/src/hooks/use-copy-to-clipboard.ts create mode 100644 web/src/hooks/use-countdown.ts create mode 100644 web/src/hooks/use-debounce.ts create mode 100644 web/src/hooks/use-dialog.ts create mode 100644 web/src/hooks/use-hidden-click-unlock.ts create mode 100644 web/src/hooks/use-media-query.ts create mode 100644 web/src/hooks/use-minimum-loading-time.ts create mode 100644 web/src/hooks/use-mobile.ts create mode 100644 web/src/hooks/use-mobile.tsx create mode 100644 web/src/hooks/use-notifications.ts create mode 100644 web/src/hooks/use-sidebar-config.ts create mode 100644 web/src/hooks/use-sidebar-data.ts create mode 100644 web/src/hooks/use-sidebar-view.ts create mode 100644 web/src/hooks/use-status.ts create mode 100644 web/src/hooks/use-system-config.ts create mode 100644 web/src/hooks/use-table-compact-mode.ts create mode 100644 web/src/hooks/use-table-url-state.ts create mode 100644 web/src/hooks/use-top-nav-links.ts create mode 100644 web/src/hooks/use-user-display.ts create mode 100644 web/src/i18n/config.ts create mode 100644 web/src/i18n/languages.ts create mode 100644 web/src/i18n/locales/en.json create mode 100644 web/src/i18n/locales/fr.json create mode 100644 web/src/i18n/locales/ja.json create mode 100644 web/src/i18n/locales/ru.json create mode 100644 web/src/i18n/locales/vi.json create mode 100644 web/src/i18n/locales/zh-TW.json create mode 100644 web/src/i18n/locales/zh.json create mode 100644 web/src/i18n/static-keys.ts create mode 100644 web/src/lib/__tests__/http-cache.test.ts create mode 100644 web/src/lib/__tests__/localized-text.test.ts create mode 100644 web/src/lib/admin-permissions.ts create mode 100644 web/src/lib/api.ts create mode 100644 web/src/lib/auth-session-sync.ts create mode 100644 web/src/lib/auth-session.test.ts create mode 100644 web/src/lib/auth-session.ts create mode 100644 web/src/lib/avatar.ts create mode 100644 web/src/lib/build-metadata.ts create mode 100644 web/src/lib/channel-connection-info.ts create mode 100644 web/src/lib/colors.ts create mode 100644 web/src/lib/constants.ts create mode 100644 web/src/lib/content-format.ts create mode 100644 web/src/lib/cookies.ts create mode 100644 web/src/lib/copy-to-clipboard.ts create mode 100644 web/src/lib/currency.ts create mode 100644 web/src/lib/dayjs.ts create mode 100644 web/src/lib/dom-utils.ts create mode 100644 web/src/lib/format.ts create mode 100644 web/src/lib/frontend-cache.ts create mode 100644 web/src/lib/handle-server-error.ts create mode 100644 web/src/lib/http-client.ts create mode 100644 web/src/lib/http-status-code-rules.ts create mode 100644 web/src/lib/legacy-route.test.ts create mode 100644 web/src/lib/legacy-route.ts create mode 100644 web/src/lib/lobe-icon.tsx create mode 100644 web/src/lib/localized-text.ts create mode 100644 web/src/lib/motion.ts create mode 100644 web/src/lib/nav-modules.ts create mode 100644 web/src/lib/oauth.ts create mode 100644 web/src/lib/passkey.ts create mode 100644 web/src/lib/password-policy.ts create mode 100644 web/src/lib/roles.ts create mode 100644 web/src/lib/secure-verification.ts create mode 100644 web/src/lib/server-error-message.test.ts create mode 100644 web/src/lib/server-error-message.ts create mode 100644 web/src/lib/session-hint.ts create mode 100644 web/src/lib/show-submitted-data.tsx create mode 100644 web/src/lib/theme-customization.ts create mode 100644 web/src/lib/theme-radius.ts create mode 100644 web/src/lib/time.ts create mode 100644 web/src/lib/use-chart-theme.ts create mode 100644 web/src/lib/use-controllable-state.ts create mode 100644 web/src/lib/utils.ts create mode 100644 web/src/lib/vchart.ts create mode 100644 web/src/main.tsx create mode 100644 web/src/routeTree.gen.ts create mode 100644 web/src/routes/(auth)/forgot-password.tsx create mode 100644 web/src/routes/(auth)/oauth.tsx create mode 100644 web/src/routes/(auth)/otp.tsx create mode 100644 web/src/routes/(auth)/register.tsx create mode 100644 web/src/routes/(auth)/reset.tsx create mode 100644 web/src/routes/(auth)/route.tsx create mode 100644 web/src/routes/(auth)/sign-in.tsx create mode 100644 web/src/routes/(auth)/sign-up.tsx create mode 100644 web/src/routes/(auth)/user/reset.tsx create mode 100644 web/src/routes/(errors)/401.tsx create mode 100644 web/src/routes/(errors)/403.tsx create mode 100644 web/src/routes/(errors)/404.tsx create mode 100644 web/src/routes/(errors)/500.tsx create mode 100644 web/src/routes/(errors)/503.tsx create mode 100644 web/src/routes/__root.tsx create mode 100644 web/src/routes/_authenticated/channels/index.tsx create mode 100644 web/src/routes/_authenticated/chat/$chatId.tsx create mode 100644 web/src/routes/_authenticated/chat2link.tsx create mode 100644 web/src/routes/_authenticated/dashboard/$section.tsx create mode 100644 web/src/routes/_authenticated/dashboard/index.tsx create mode 100644 web/src/routes/_authenticated/errors/$error.tsx create mode 100644 web/src/routes/_authenticated/keys/index.tsx create mode 100644 web/src/routes/_authenticated/models/$section.tsx create mode 100644 web/src/routes/_authenticated/models/index.tsx create mode 100644 web/src/routes/_authenticated/playground/index.tsx create mode 100644 web/src/routes/_authenticated/profile/index.tsx create mode 100644 web/src/routes/_authenticated/redemption-codes/index.tsx create mode 100644 web/src/routes/_authenticated/route.tsx create mode 100644 web/src/routes/_authenticated/security/index.tsx create mode 100644 web/src/routes/_authenticated/subscriptions/index.tsx create mode 100644 web/src/routes/_authenticated/system-info/index.tsx create mode 100644 web/src/routes/_authenticated/system-settings/auth/$section.tsx create mode 100644 web/src/routes/_authenticated/system-settings/auth/index.tsx create mode 100644 web/src/routes/_authenticated/system-settings/billing/$section.tsx create mode 100644 web/src/routes/_authenticated/system-settings/billing/index.tsx create mode 100644 web/src/routes/_authenticated/system-settings/content/$section.tsx create mode 100644 web/src/routes/_authenticated/system-settings/content/index.tsx create mode 100644 web/src/routes/_authenticated/system-settings/index.tsx create mode 100644 web/src/routes/_authenticated/system-settings/models/$section.tsx create mode 100644 web/src/routes/_authenticated/system-settings/models/index.tsx create mode 100644 web/src/routes/_authenticated/system-settings/operations/$section.tsx create mode 100644 web/src/routes/_authenticated/system-settings/operations/index.tsx create mode 100644 web/src/routes/_authenticated/system-settings/route.tsx create mode 100644 web/src/routes/_authenticated/system-settings/security/$section.tsx create mode 100644 web/src/routes/_authenticated/system-settings/security/index.tsx create mode 100644 web/src/routes/_authenticated/system-settings/site/$section.tsx create mode 100644 web/src/routes/_authenticated/system-settings/site/index.tsx create mode 100644 web/src/routes/_authenticated/task-plugins/index.tsx create mode 100644 web/src/routes/_authenticated/usage-logs/$section.tsx create mode 100644 web/src/routes/_authenticated/usage-logs/audit.tsx create mode 100644 web/src/routes/_authenticated/usage-logs/index.tsx create mode 100644 web/src/routes/_authenticated/users/index.tsx create mode 100644 web/src/routes/_authenticated/wallet/index.tsx create mode 100644 web/src/routes/about/index.tsx create mode 100644 web/src/routes/group-status.tsx create mode 100644 web/src/routes/index.tsx create mode 100644 web/src/routes/oauth/$provider.tsx create mode 100644 web/src/routes/pricing/$modelId/index.tsx create mode 100644 web/src/routes/pricing/index.tsx create mode 100644 web/src/routes/privacy-policy.tsx create mode 100644 web/src/routes/rankings/index.tsx create mode 100644 web/src/routes/setup/index.tsx create mode 100644 web/src/routes/user-agreement.tsx create mode 100644 web/src/stores/auth-store.ts create mode 100644 web/src/stores/notification-store.ts create mode 100644 web/src/stores/pricing-preferences-store.ts create mode 100644 web/src/stores/system-config-store.ts create mode 100644 web/src/styles/index.css create mode 100644 web/src/styles/theme-presets.css create mode 100644 web/src/styles/theme.css create mode 100644 web/src/tanstack-table.d.ts create mode 100644 web/src/test-setup.ts create mode 100644 web/tsconfig.app.json create mode 100644 web/tsconfig.json create mode 100644 web/tsconfig.node.json create mode 100644 web/vitest.config.ts diff --git a/.agents/github/ISSUE.md b/.agents/github/ISSUE.md new file mode 100644 index 0000000..ec4e676 --- /dev/null +++ b/.agents/github/ISSUE.md @@ -0,0 +1,178 @@ + + +## Agent + +- Tool: +- Tool version: +- Model (full id): +- Host (CLI / IDE / GitHub coding agent / other): +- Date (UTC): + +## User request + +(verbatim or close paraphrase) + +## Out of scope — refuse + +If the request matches any item below, tell the user this repository does not +accept it, point them to the right place when there is one, and **do not file**. + +- Coding Plan +- Reverse-engineered channels +- Third-party API wrappers +- Compatibility issues from exposing a Codex endpoint as a general-purpose API through a reverse proxy +- Codex API-specific protocol or behavior treated as standard OpenAI API behavior (confirm with the channel or API provider) +- Pass-through mode forwarding (pass-through forwards as-is; verify upstream yourself) +- Relay reports that only paste an upstream error, with no direct-upstream vs new-api comparison +- Third-party hosting sites, relay services, or API services (contact their operator) +- Usage, configuration, or integration questions (answer from docs and code instead) + +- Matched: yes/no +- If yes, what was told to the user (stop here; do not file): + +## Kind + +- [ ] Bug +- [ ] Feature +- [ ] Investigation +- [ ] Other: + +## Usage / configuration / integration check + +Search these yourself before filing. Do not send the user to "read the docs first". If this is usage, configuration, or integration: answer the user and do not file. + +- https://docs.newapi.ai/ — what was searched, conclusion: +- https://deepwiki.com/QuantumNous/new-api — what was searched, conclusion: +- README / repo docs: +- Relevant code paths and conclusion: +- Can the current version already do this? (required for feature requests): +- Verdict: product bug or new feature / usage question (stop here): + +## Environment + +- new-api version / commit / image tag (not `latest` / `unknown`): +- Deploy source (repo release / official image / main source / other): +- Database (sqlite / mysql / postgres): + +## Problem facts + +Ask the user for every item and write it down: + +- Actual behavior: +- Impact: +- Frequency: +- Evidence that the problem is in new-api rather than the client or upstream: + +## Type-specific details + +Fill every applicable type. Write "not applicable" for the rest. Ask the user for missing items; do not invent them. + +### Relay / API + +- Request endpoint and method: +- Channel type: +- Model: +- Conversion format: +- Pass-through enabled: +- Evidence of upstream native support: +- Equivalent redacted request sent directly upstream: status, body, server logs: +- Same request through new-api: status, body, server logs: + +### Billing + +- Request endpoint and model: +- Response `usage`: +- Relevant ratio or pricing configuration: +- Consumption log: +- Expected charge and calculation basis: + +### Frontend + +- Page path: +- Browser and version: +- Active theme: +- Relevant browser Console / Network errors: + +### Deployment / upgrade + +- Deployment method: +- OS and architecture: +- Database type: +- Versions before and after the upgrade: +- Startup or migration logs: + +## Reproduction and expected result + +- Steps to reproduce: +- Expected result: +- Related screenshots (optional): + +## Feature (feature requests only) + +- Feature description: +- Use case: + +## Duplicate check + +- Search queries (issues, PRs, discussions): +- Closest existing threads: +- Why this is not a duplicate: + +## Research + +Open the docs and code. Do not write "already checked" without sources. + +### Docs + +- https://docs.newapi.ai/ : +- https://deepwiki.com/QuantumNous/new-api : +- README / other repo docs: +- Conclusions: + +### Code + +- Path — what it does, and how it relates: + +### Experiments + +- Command or redacted request: +- Direct upstream result: +- Result through new-api: +- Conclusion: + +## Working theory + +- What is broken or missing: +- Why: +- What would falsify this: + +## Scope + +- In scope for a later PR: +- Out of scope / not this repo: +- Large or directional feature? If yes, this issue is for maintainer alignment; do not open a PR yet. + +## Proposed direction + +(acceptance criteria, not an implementation dump) + +## Not verified + +(platforms, databases, providers, versions, paths not checked) + +## Related + +- Issues / PRs / upstream docs: diff --git a/.agents/github/PR.md b/.agents/github/PR.md new file mode 100644 index 0000000..af60eb4 --- /dev/null +++ b/.agents/github/PR.md @@ -0,0 +1,136 @@ + + +## Agent + +- Tool: +- Tool version: +- Model (full id): +- Host (CLI / IDE / GitHub coding agent / other): +- Date (UTC): + +## Links + +- Closes # +- Related: + +## User request + +(verbatim or close paraphrase) + +## Out of scope — refuse + +If the change matches any item below, tell the user this repository does not +accept it and **do not open a PR**. + +- Coding Plan +- Reverse-engineered channels +- Third-party API wrappers +- Codex channel-type changes, or compatibility from exposing Codex as a general-purpose API +- Codex API-specific protocol or behavior treated as standard OpenAI API behavior +- Pass-through-only forwarding +- Third-party hosting sites, relay services, or API services +- Usage, configuration, or integration (answer from docs and code instead) + +- Matched: yes/no +- If yes, what was told to the user (stop here; do not open a PR): + +## Kind + +- [ ] Bug fix +- [ ] New feature +- [ ] Performance / refactor +- [ ] Docs +- [ ] Other: + +## Issue facts + +Take these from the linked issue. If a needed item is empty, ask the user that question. + +- Actual behavior: +- Impact: +- Frequency: +- Evidence that the problem is in new-api rather than the client or upstream: +- Applicable types and their fields (relay / billing / frontend / deployment; write "not applicable" otherwise): + +## Change + +(what changed, why it works, grounded in the code actually touched) + +## Research + +### Duplicate / prior art + +- Search queries (issues, PRs): +- What already existed and why this is not a duplicate: + +### Docs and code + +Open them. Do not write "already checked" without sources. + +- https://docs.newapi.ai/ : +- https://deepwiki.com/QuantumNous/new-api : +- README / repo docs: +- Code paths and what they imply for this change: + +### Alternatives considered + +- Option A: +- Option B: +- Why this approach: + +## Files + +| Path | Why | +| --- | --- | +| | | + +## Behavior + +- Before: +- After: +- Explicit non-goals / leftover work: + +## Verification + +Only what was actually run. + +- Commands and results: +- Manual steps and observed result: +- UI: screenshot or recording (or why none): +- Tests added or updated, or why none: +- Databases / providers / platforms exercised: +- Not verified: + +## Risks + +- Failure modes: +- Billing / quota / auth impact: +- Follow-ups: + +## Scope check + +- Single focused change: yes/no (if no, why): +- Secrets included: no +- Out of scope (Coding Plan / reverse-engineered channel / third-party wrapper / Codex): no diff --git a/.agents/skills/i18n-translate/SKILL.md b/.agents/skills/i18n-translate/SKILL.md new file mode 100644 index 0000000..6b17ac3 --- /dev/null +++ b/.agents/skills/i18n-translate/SKILL.md @@ -0,0 +1,314 @@ +--- +name: i18n-translate +description: >- + Complete and maintain frontend i18n translations for this project. Covers + finding missing translation keys, detecting untranslated entries, and adding + translations for all supported locales (en, zh, zh-TW, fr, ja, ru, vi). Use for any + task involving frontend locale files, missing translation keys, untranslated + UI text, `t(...)` keys, `useTranslation()`, static i18n keys, button/label/ + toast/dialog/placeholder/validation copy, or adding/fixing even a single + i18n key. Use when review findings mention missing i18n, when new UI text + needs translation, or when the user asks to add translations, fix i18n, or + complete missing translations. Always load and follow this skill before + translating, adding locale keys, or editing frontend i18n files. +--- + +# Frontend i18n Translation Workflow + +## Mandatory Preflight + +- Read this entire `SKILL.md` before any frontend i18n work, including one-key fixes. +- Before editing locale files, confirm the source text comes from a `t(...)` key, `en.json`, existing UI copy, or an explicitly requested new UI string. +- Use the user conversation only to understand the task target. Do not copy conversation text, review wording, or task descriptions directly into locale values. +- Before translating each key, re-think the intended UI copy from the code and locale context instead of treating the surrounding chat as the translation source. + +### Hard Constraint: Locale Writes Go Through the Script + +- You MUST NOT edit `web/src/i18n/locales/*.json` directly with text-editing tools (StrReplace, Write, search-and-replace, manual JSON edits, etc.). This applies even to a single key. +- ALL locale writes MUST go through the `add-missing-keys.mjs` script, followed by `bun run i18n:sync`. The script is the only sanctioned way to add or change locale values. +- Why this is mandatory, not optional: + - Hand-editing reliably drops one or more of the seven locales (`en`, `zh`, `zh-TW`, `fr`, `ja`, `ru`, `vi`), leaving keys missing in some languages. + - Hand-editing breaks the required alphabetical key order and introduces JSON syntax errors (trailing commas, mismatched quotes). + - The script writes all seven files atomically with consistent sorting, so the locale set stays in sync by construction. +- The script does not do the translation for you. You still must reason out each locale's copy and populate the script's `newKeys` object; the script only handles insertion, sorting, and writing. Do not skip the script just because the thinking happens regardless. + +## Scope Checklist + +Before editing files, treat the task as covered by this skill if it involves: + +- `i18n`, translation, locale files, language packs, missing keys, or untranslated text +- `t('...')`, `useTranslation()`, `static-keys.ts`, or `locales/*.json` +- UI copy in buttons, labels, toasts, dialogs, placeholders, validation messages, descriptions, or table/empty states +- A review finding about missing i18n keys + +Do not skip this workflow because the fix is "just one key". + +## Overview + +- Locale files: `web/src/i18n/locales/{en,zh,zh-TW,fr,ja,ru,vi}.json` +- Format: flat JSON under `"translation"` key, keys are English source strings +- Base locale: `en.json` (most keys), fallback: `zh` (Chinese) +- Sync script: `bun run i18n:sync` (from `web/`) +- All `t()` calls must have corresponding keys in every locale file + +## Small Fix Path + +For a single known missing key (still script-only, no direct JSON edits): + +1. Confirm the exact key at the call site and verify it is absent from all locale files. +2. Add the key via `add-missing-keys.mjs`, populating its `newKeys` object for every supported locale: `en`, `zh`, `zh-TW`, `fr`, `ja`, `ru`, `vi`. Even one key goes through the script; do not hand-edit the JSON. +3. The script preserves the flat `"translation"` object and keeps keys alphabetically sorted automatically. +4. Run a targeted search for the key in code and locale files. +5. Run `bun run i18n:sync` to normalize file order. This step is mandatory, not optional. + +## Workflow + +### Step 1: Run sync and read report + +```bash +cd web && bun run i18n:sync +``` + +Read `web/src/i18n/locales/_reports/_sync-report.json` to see per-locale status (missingCount, extrasCount, untranslatedCount). + +### Step 2: Find missing keys (used in code but not in locale files) + +Create and run `web/scripts/find-missing-keys.mjs`: + +```javascript +import fs from 'node:fs/promises' +import path from 'node:path' + +const LOCALES_DIR = path.resolve('src/i18n/locales') +const SRC_DIR = path.resolve('src') + +const en = JSON.parse(await fs.readFile(path.join(LOCALES_DIR, 'en.json'), 'utf8')) +const enKeys = new Set(Object.keys(en.translation)) + +const tCallRegex = /\bt\(\s*['"`]([^'"`\n]+?)['"`]\s*[,)]/g +const tCallMultilineRegex = /\bt\(\s*['"`]([^'"`]+?)['"`]\s*\)/g + +async function walkDir(dir) { + const files = [] + const entries = await fs.readdir(dir, { withFileTypes: true }) + for (const entry of entries) { + const fullPath = path.join(dir, entry.name) + if (entry.isDirectory()) { + if (['node_modules', '.git', 'locales', '_reports', '_extras'].includes(entry.name)) continue + files.push(...(await walkDir(fullPath))) + } else if (/\.(tsx?|jsx?)$/.test(entry.name)) { + files.push(fullPath) + } + } + return files +} + +const files = await walkDir(SRC_DIR) +const missingKeys = new Map() + +for (const file of files) { + const content = await fs.readFile(file, 'utf8') + const relPath = path.relative(SRC_DIR, file) + for (const regex of [tCallRegex, tCallMultilineRegex]) { + regex.lastIndex = 0 + let match + while ((match = regex.exec(content)) !== null) { + const key = match[1] + if (key.startsWith('{{') || key.includes('${')) continue + if (!enKeys.has(key)) { + if (!missingKeys.has(key)) missingKeys.set(key, []) + missingKeys.get(key).push(relPath) + } + } + } +} + +if (missingKeys.size === 0) { + console.log('All t() keys found in en.json!') +} else { + console.log(`Found ${missingKeys.size} missing keys:\n`) + for (const [key, files] of [...missingKeys.entries()].sort(([a], [b]) => a.localeCompare(b))) { + console.log(` "${key}"`) + for (const f of [...new Set(files)]) console.log(` -> ${f}`) + } +} +``` + +### Step 3: Find untranslated entries (value equals English) + +Create and run `web/scripts/find-untranslated.mjs`: + +```javascript +import fs from 'node:fs/promises' +import path from 'node:path' + +const LOCALES_DIR = path.resolve('src/i18n/locales') +const en = JSON.parse(await fs.readFile(path.join(LOCALES_DIR, 'en.json'), 'utf8')) +const enTrans = en.translation + +// Brand names, URLs, technical terms — skip these +const skipPatterns = [ + /^https?:\/\//, /^smtp\./, /^socks5:/, /^name@/, /^noreply@/, + /^org-/, /^price_/, /^whsec_/, /^edit_this$/, /^my-status$/, + /^_copy$/, /^gpt-/, /^checkout\./, /^footer\./, /^\[?\{/, + /^"default/, /^\/status\//, /^\/your\//, /^example\.com/, + /^AZURE_/, /^AccessKey/, /^OAuth/, /^Client /, /^Webhook URL/, + /^API URL$/, /^Well-Known/, /^Worker URL$/, /^Uptime Kuma/, + /^New API/, /^Baidu V2$/, /^Zhipu V4$/, /^Quota:$/, +] + +const brandNames = new Set([ + 'AIGC2D','Anthropic','API2GPT','Claude','Cloudflare','Cohere','DeepSeek', + 'Discord','DoubaoVideo','FastGPT','Gemini','GitHub','Jimeng','JustSong', + 'LingYiWanWu','LinuxDO','Midjourney','MidjourneyPlus','MiniMax','Mistral', + 'MokaAI','Moonshot','NewAPI','OhMyGPT','Ollama','OpenAI','OpenAIMax', + 'OpenRouter','Passkey','Perplexity','QuantumNous','Replicate','SiliconFlow', + 'Stripe','Submodel','SunoAPI','Telegram','Tencent','Vertex AI','VolcEngine', + 'WeChat','Xinference','Xunfei','AI Proxy','One API', +]) + +const locales = ['fr', 'ja', 'ru', 'zh', 'zh-TW', 'vi'] + +for (const locale of locales) { + const locFile = JSON.parse(await fs.readFile(path.join(LOCALES_DIR, `${locale}.json`), 'utf8')) + const locTrans = locFile.translation + const untranslated = {} + + for (const [key, enVal] of Object.entries(enTrans)) { + const locVal = locTrans[key] + if (locVal === undefined || locVal !== enVal) continue + if (brandNames.has(key)) continue + if (skipPatterns.some(p => p.test(key))) continue + if (typeof enVal === 'string' && enVal.length < 4) continue + if (/[a-zA-Z]{3,}/.test(String(enVal))) untranslated[key] = enVal + } + + const count = Object.keys(untranslated).length + if (count > 0) { + console.log(`\n=== ${locale} (${count} untranslated) ===`) + for (const [k, v] of Object.entries(untranslated)) + console.log(` ${JSON.stringify(k)}: ${JSON.stringify(v)}`) + } else { + console.log(`\n=== ${locale}: all translated ===`) + } +} +``` + +### Step 4: Add translations + +This script is the ONLY sanctioned way to write locale values. You MUST NOT bypass it by hand-filling the JSON files. Create `web/scripts/add-missing-keys.mjs` with this exact structure: + +```javascript +import fs from 'node:fs/promises' +import path from 'node:path' + +const LOCALES_DIR = path.resolve('src/i18n/locales') + +function stableStringify(obj) { + return JSON.stringify(obj, null, 2) + '\n' +} + +const newKeys = { + en: { /* "key": "English value" */ }, + zh: { /* "key": "中文翻译" */ }, + 'zh-TW': { /* "key": "繁體中文翻譯" */ }, + fr: { /* "key": "Traduction française" */ }, + ja: { /* "key": "日本語翻訳" */ }, + ru: { /* "key": "Русский перевод" */ }, + vi: { /* "key": "Bản dịch tiếng Việt" */ }, +} + +async function main() { + let totalAdded = 0 + + for (const [locale, trans] of Object.entries(newKeys)) { + const filePath = path.join(LOCALES_DIR, `${locale}.json`) + const json = JSON.parse(await fs.readFile(filePath, 'utf8')) + + let count = 0 + for (const [key, value] of Object.entries(trans)) { + if (!Object.prototype.hasOwnProperty.call(json.translation, key)) { + json.translation[key] = value + count++ + } else if (json.translation[key] !== value) { + json.translation[key] = value + count++ + } + } + + if (count > 0) { + json.translation = Object.fromEntries( + Object.entries(json.translation).sort(([a], [b]) => a.localeCompare(b)) + ) + await fs.writeFile(filePath, stableStringify(json), 'utf8') + } + + console.log(`${locale}: ${count} translations applied`) + totalAdded += count + } + + console.log(`\nTotal: ${totalAdded} translations applied`) +} + +main().catch((err) => { console.error(err); process.exitCode = 1 }) +``` + +Populate the `newKeys` object with actual translations for each locale. + +### Step 5: Verify and clean up + +```bash +cd web +node scripts/add-missing-keys.mjs # apply translations +node scripts/find-missing-keys.mjs # verify: should say "All t() keys found" +bun run i18n:sync # normalize file order +``` + +Delete temporary scripts after completion. + +## Translation Guidelines + +### Source Text Rules + +- Reconsider every key's UI meaning before translating: component location, user action, placeholder variables, button/label/toast/dialog/validation context, and whether the copy is a noun, command, status, or full sentence. +- Prefer the English key or `en` value as the source text. Use the call site only to clarify meaning, tone, and constraints. +- Do not copy chat messages, review comments, issue descriptions, or task wording as translation text. +- If the source text is unclear, inspect the code and locale files first. Ask the user for exact source copy only when the intended UI text remains ambiguous. + +### Length and Layout Awareness + +- Consider whether translated text may overflow the UI before choosing final wording, especially for buttons, table headers, menu items, labels, toasts, dialog titles, tabs, badges, and empty states. +- For languages that often expand relative to English, especially French, Russian, and Vietnamese, prefer natural but compact wording. +- Do not sacrifice meaning just to shorten text. When the call site has limited space, choose the shortest clear translation that preserves the UI intent. +- For interpolated variables, counts, model names, provider names, quotas, and dates, consider the longest realistic rendered text, not only the translation string itself. + +| Language | Code | Notes | +|----------|------|-------| +| English | en | Base locale, key = value | +| Chinese | zh | Fallback locale, must be complete | +| Traditional Chinese | zh-TW | Use natural Traditional Chinese wording | +| French | fr | Many English cognates are valid (e.g., "Configuration") | +| Japanese | ja | Use katakana for technical loanwords | +| Russian | ru | Use formal register | +| Vietnamese | vi | Use standard Vietnamese | + +**Keep as English (do not translate):** +- Brand/product names (OpenAI, Claude, Gemini, etc.) +- URLs and email placeholders +- Technical identifiers (JSON keys, API paths, model names) +- Code-like strings (gpt-3.5-turbo, price_xxx, etc.) + +**Always translate:** +- UI labels, button text, error messages, descriptions +- Time units (hours, minutes, months, years) +- Action words (Move, Show, Delete, etc.) + +## Key Rules + +1. All scripts run from `web/` directory +2. Use `node scripts/xxx.mjs` (ESM format with top-level await) +3. Sort keys alphabetically when writing locale files +4. Always run `bun run i18n:sync` as the final step +5. Delete temporary scripts after completion +6. The `{{variable}}` placeholders in keys must be preserved in all translations +7. NEVER edit `locales/*.json` directly. Any non-script write to a locale file (StrReplace, Write, manual JSON edit) is non-compliant, including single-key fixes. diff --git a/.agents/skills/shadcn-ui/SKILL.md b/.agents/skills/shadcn-ui/SKILL.md new file mode 100644 index 0000000..7622820 --- /dev/null +++ b/.agents/skills/shadcn-ui/SKILL.md @@ -0,0 +1,105 @@ +--- +name: shadcn-ui +description: >- + Give the assistant project-aware shadcn/ui context: components.json, + composition patterns, CLI, registries, theming, and MCP. Use when working on + web UI, shadcn components, or presets. Overview aligns with + https://ui.shadcn.com/docs/skills.md; full upstream skill text is vendored + under vendor/shadcn/. +--- + + + +# Skills (shadcn/ui) + +Skills give AI assistants project-aware context about shadcn/ui. When used, the assistant knows how to find, install, compose, and customize components using the correct APIs and patterns for your project. + +For example, you can ask: + +- _"Add a login form with email and password fields."_ +- _"Create a settings page with a form for updating profile information."_ +- _"Build a dashboard with a sidebar, stats cards, and a data table."_ +- _"Switch to --preset [CODE]"_ +- _"Can you add a hero from @tailark?"_ + +The skill reads your project's `components.json` and provides your framework, aliases, installed components, icon library, and base library so it can generate correct code on the first try. + +--- + +## Install (ecosystem vs this repo) + +Official install from [Skills — shadcn/ui](https://ui.shadcn.com/docs/skills.md): + +```bash +npx skills add shadcn/ui +``` + +That installs the skill where the `skills` CLI is available. **This repository** keeps the same intent under `.agents/skills/shadcn-ui/` (overview here + **vendored** upstream docs in [`vendor/shadcn/`](./vendor/shadcn/)) and runs the shadcn CLI from the frontend app root: + +```bash +cd web && bunx shadcn@latest info --json +``` + +Learn more about skills at [skills.sh](https://skills.sh). + +--- + +## What's included (and where) + +### Project context + +Run **`shadcn info --json`** (here: `cd web && bunx shadcn@latest info --json`) for framework, Tailwind version, aliases, base (`radix` | `base`), icon library, installed components, and resolved paths. + +### CLI commands + +Full command reference (vendored): [`vendor/shadcn/cli.md`](./vendor/shadcn/cli.md). + +### Theming and customization + +Vendored: [`vendor/shadcn/customization.md`](./vendor/shadcn/customization.md). Live docs: [Theming](https://ui.shadcn.com/docs/theming). + +### Registry authoring + +Not duplicated as a single file in the vendor tree; see [Registry](https://ui.shadcn.com/docs/registry) and `build` in [`vendor/shadcn/cli.md`](./vendor/shadcn/cli.md). + +### MCP server + +Vendored: [`vendor/shadcn/mcp.md`](./vendor/shadcn/mcp.md). Live docs: [MCP Server](https://ui.shadcn.com/docs/mcp). + +--- + +## How it works + +1. **Project detection** — Applies when `components.json` exists (here: `web/components.json`). +2. **Context injection** — Use `shadcn info --json` as ground truth for imports and APIs. +3. **Pattern enforcement** — Use [`vendor/shadcn/rules/`](./vendor/shadcn/rules/) for concrete markup checks; the complete official workflow reference is listed below for deeper CLI, registry, and preset questions. +4. **Component discovery** — `shadcn docs`, `shadcn search`, MCP, or registries — see the official workflow reference and MCP doc when deeper context is needed. + +--- + +## Learn more (web) + +- [CLI](https://ui.shadcn.com/docs/cli) — complements [`vendor/shadcn/cli.md`](./vendor/shadcn/cli.md) +- [Theming](https://ui.shadcn.com/docs/theming) +- [Registry](https://ui.shadcn.com/docs/registry) +- [skills.sh](https://skills.sh) + +--- + +## Vendored upstream bundle (deep rules) + +Snapshot from [shadcn-ui/ui `skills/shadcn`](https://github.com/shadcn-ui/ui/tree/main/skills/shadcn); revision note in [`vendor/shadcn/UPSTREAM.txt`](./vendor/shadcn/UPSTREAM.txt). The upstream workflow is stored as a reference file, with its original skill frontmatter removed, so the vendored copy is not discovered as a second local skill. + +| Doc | Path | +| --- | --- | +| Official shadcn/ui workflow reference | [`vendor/shadcn/official-shadcn-ui-workflow.md`](./vendor/shadcn/official-shadcn-ui-workflow.md) | +| CLI reference | [`vendor/shadcn/cli.md`](./vendor/shadcn/cli.md) | +| Theming / customization | [`vendor/shadcn/customization.md`](./vendor/shadcn/customization.md) | +| MCP | [`vendor/shadcn/mcp.md`](./vendor/shadcn/mcp.md) | +| Forms | [`vendor/shadcn/rules/forms.md`](./vendor/shadcn/rules/forms.md) | +| Composition | [`vendor/shadcn/rules/composition.md`](./vendor/shadcn/rules/composition.md) | +| Icons | [`vendor/shadcn/rules/icons.md`](./vendor/shadcn/rules/icons.md) | +| Styling | [`vendor/shadcn/rules/styling.md`](./vendor/shadcn/rules/styling.md) | +| Base vs Radix | [`vendor/shadcn/rules/base-vs-radix.md`](./vendor/shadcn/rules/base-vs-radix.md) | + +**Workflow:** Prefer this **root** `SKILL.md` for repo paths (`web`, Bun). Read **`vendor/shadcn/official-shadcn-ui-workflow.md`** only when you need the complete official component, registry, or preset workflow. Use **`vendor/shadcn/rules/*.md`** when validating concrete markup. diff --git a/.agents/skills/shadcn-ui/vendor/shadcn/UPSTREAM.txt b/.agents/skills/shadcn-ui/vendor/shadcn/UPSTREAM.txt new file mode 100644 index 0000000..aab92e2 --- /dev/null +++ b/.agents/skills/shadcn-ui/vendor/shadcn/UPSTREAM.txt @@ -0,0 +1,4 @@ +Source: https://github.com/shadcn-ui/ui/tree/56161142f1b83f612462772d18883807b5f0d601/skills/shadcn +Branch: main +Fetched: 2026-04-29 +Local file note: upstream SKILL.md is stored as official-shadcn-ui-workflow.md with its original frontmatter removed to avoid exposing the vendored copy as a separate local skill. diff --git a/.agents/skills/shadcn-ui/vendor/shadcn/cli.md b/.agents/skills/shadcn-ui/vendor/shadcn/cli.md new file mode 100644 index 0000000..7e389a1 --- /dev/null +++ b/.agents/skills/shadcn-ui/vendor/shadcn/cli.md @@ -0,0 +1,276 @@ +# shadcn CLI Reference + +Configuration is read from `components.json`. + +> **IMPORTANT:** Always run commands using the project's package runner: `npx shadcn@latest`, `pnpm dlx shadcn@latest`, or `bunx --bun shadcn@latest`. Check `packageManager` from project context to choose the right one. Examples below use `npx shadcn@latest` but substitute the correct runner for the project. + +> **IMPORTANT:** Only use the flags documented below. Do not invent or guess flags — if a flag isn't listed here, it doesn't exist. The CLI auto-detects the package manager from the project's lockfile; there is no `--package-manager` flag. + +## Contents + +- Commands: init, apply, add (dry-run, smart merge), search, view, docs, info, build +- Templates: next, vite, start, react-router, astro +- Presets: named, code, URL formats and fields +- Switching presets + +--- + +## Commands + +### `init` — Initialize or create a project + +```bash +npx shadcn@latest init [components...] [options] +``` + +Initializes shadcn/ui in an existing project or creates a new project (when `--name` is provided). Optionally installs components in the same step. + +| Flag | Short | Description | Default | +| ----------------------- | ----- | --------------------------------------------------------- | ------- | +| `--template