From acf3a4fdb243d5e44473efd431311a92f6604843 Mon Sep 17 00:00:00 2001 From: 992751305-stack <260033796+992751305-stack@users.noreply.github.com> Date: Tue, 11 Aug 2026 19:40:37 +0800 Subject: [PATCH] feat: establish OpenRuntime unified AI gateway --- .gitignore | 4 + AGENTS.md | 18 + Cargo.lock | 500 +- Cargo.toml | 3 +- README.md | 8 +- apps/package.json | 101 +- apps/public/startup.html | 8 +- apps/src-tauri/Cargo.lock | 494 +- apps/src-tauri/Cargo.toml | 4 +- apps/src-tauri/src/app_storage/env.rs | 17 +- apps/src-tauri/src/app_storage/migration.rs | 95 +- apps/src-tauri/src/commands/account/remote.rs | 800 +-- .../src/commands/account/transfer.rs | 5 +- apps/src-tauri/src/commands/adapter_probe.rs | 59 + apps/src-tauri/src/commands/apikey.rs | 18 + apps/src-tauri/src/commands/grok.rs | 74 + apps/src-tauri/src/commands/kiro.rs | 130 + apps/src-tauri/src/commands/mod.rs | 4 + apps/src-tauri/src/commands/proxy_profiles.rs | 49 + apps/src-tauri/src/commands/registry.rs | 364 +- apps/src-tauri/src/commands/settings/ui.rs | 5 +- apps/src-tauri/tauri.conf.json | 6 +- .../app/accounts/accounts-page-helpers.tsx | 1889 ++++--- apps/src/app/accounts/accounts-page-view.tsx | 60 + apps/src/app/accounts/page.tsx | 68 +- apps/src/app/adapters/page.tsx | 51 + apps/src/app/globals.css | 295 + apps/src/app/grok/page.tsx | 221 + apps/src/app/import/page.tsx | 665 +++ apps/src/app/kiro/page.tsx | 571 ++ apps/src/app/layout.tsx | 5 +- apps/src/app/logs/page-sections.tsx | 8 +- apps/src/app/models/page.tsx | 186 +- apps/src/app/page.tsx | 63 +- apps/src/app/platform-mode/page-sections.tsx | 8 +- apps/src/app/proxies/page.tsx | 181 + apps/src/app/routing/page.tsx | 150 + .../components/account-stability-card.tsx | 127 + apps/src/app/settings/page.tsx | 6 + apps/src/app/tray-preview/page.tsx | 2 +- .../dashboard/adapter-pool-console.tsx | 1092 ++++ .../dashboard/runtime-command-center.tsx | 251 + apps/src/components/layout/header.tsx | 33 +- .../layout/page-keep-alive-viewport.tsx | 10 +- apps/src/components/layout/shell-link.tsx | 55 + apps/src/components/layout/sidebar.tsx | 77 +- apps/src/components/modals/api-key-modal.tsx | 168 +- apps/src/components/modals/usage-modal.tsx | 63 + apps/src/hooks/useDashboardStats.ts | 7 +- apps/src/lib/account-callability.ts | 137 + apps/src/lib/adapter-probe.ts | 260 + apps/src/lib/aggregate-key-import.ts | 135 + apps/src/lib/api/account-client.ts | 1958 +++---- apps/src/lib/api/adapter-probe-client.ts | 67 + apps/src/lib/api/dashboard-client.ts | 6 + apps/src/lib/api/grok-client.ts | 90 + apps/src/lib/api/kiro-client.ts | 156 + apps/src/lib/api/normalize.ts | 3991 +++++++------- apps/src/lib/api/proxy-profile-client.ts | 78 + apps/src/lib/api/transport-errors.ts | 15 + apps/src/lib/api/transport-web-commands.ts | 10 +- .../lib/api/transport-web-commands/account.ts | 206 +- .../transport-web-commands/adapter-probe.ts | 10 + .../lib/api/transport-web-commands/grok.ts | 12 + .../lib/api/transport-web-commands/kiro.ts | 15 + .../transport-web-commands/proxy-profiles.ts | 11 + apps/src/lib/app-shell/top-level-routes.ts | 90 +- apps/src/lib/i18n/messages/en.ts | 3541 ++++++------ apps/src/lib/i18n/messages/ko.ts | 3061 ++++++----- apps/src/lib/i18n/messages/ru.ts | 4502 ++++++++-------- .../messages/sections/en-agent-identity.ts | 31 + .../lib/i18n/messages/sections/en-api-keys.ts | 13 + .../src/lib/i18n/messages/sections/en-grok.ts | 26 + .../src/lib/i18n/messages/sections/en-kiro.ts | 68 + .../lib/i18n/messages/sections/en-proxies.ts | 58 + .../i18n/messages/sections/en-runtime-ui.ts | 258 +- .../messages/sections/ko-agent-identity.ts | 31 + .../lib/i18n/messages/sections/ko-api-keys.ts | 13 + .../src/lib/i18n/messages/sections/ko-grok.ts | 26 + .../src/lib/i18n/messages/sections/ko-kiro.ts | 69 + .../lib/i18n/messages/sections/ko-proxies.ts | 59 + .../i18n/messages/sections/ko-runtime-ui.ts | 248 +- .../messages/sections/ru-agent-identity.ts | 31 + .../lib/i18n/messages/sections/ru-api-keys.ts | 13 + .../src/lib/i18n/messages/sections/ru-grok.ts | 26 + .../src/lib/i18n/messages/sections/ru-kiro.ts | 69 + .../lib/i18n/messages/sections/ru-proxies.ts | 59 + .../i18n/messages/sections/ru-runtime-ui.ts | 248 +- apps/src/lib/routes/root-page-paths.ts | 8 + apps/src/lib/store/useAppStore.ts | 21 +- apps/src/lib/utils/usage.ts | 110 + apps/src/types/account.ts | 169 +- apps/src/types/api-key.ts | 6 + apps/src/types/dashboard.ts | 2 + apps/src/types/settings.ts | 19 + apps/tests/account-callability.test.mjs | 109 + apps/tests/accounts-status-reason.spec.ts | 55 +- apps/tests/codex-profile-cache.test.mjs | 2 +- apps/tests/dashboard-direct-mode.test.mjs | 10 +- apps/tests/top-level-routes.test.mjs | 37 +- apps/tests/transport-errors.test.mjs | 15 + apps/tests/transport-web-commands.test.mjs | 68 + crates/core/Cargo.toml | 5 + .../core/migrations/112_kiro_credentials.sql | 40 + .../migrations/113_kiro_credential_health.sql | 3 + .../migrations/114_kiro_proxy_username.sql | 1 + .../core/migrations/115_api_key_policies.sql | 15 + .../migrations/118_kiro_credential_models.sql | 13 + .../core/migrations/119_grok_credentials.sql | 25 + .../core/migrations/120_grok_quota_models.sql | 27 + .../121_api_key_model_visibility.sql | 3 + .../migrations/122_codex_agent_identities.sql | 18 + .../123_adapter_credential_probe_states.sql | 55 + crates/core/migrations/124_proxy_profiles.sql | 35 + crates/core/src/rpc/tests/types_tests.rs | 885 +-- crates/core/src/rpc/types.rs | 3286 ++++++------ crates/core/src/storage/accounts.rs | 4741 +++++++++-------- crates/core/src/storage/accounts_sql.rs | 280 +- .../core/src/storage/adapter_probe_states.rs | 125 + crates/core/src/storage/api_key_policies.rs | 138 + crates/core/src/storage/api_keys.rs | 69 +- .../src/storage/codex_agent_identities.rs | 276 + crates/core/src/storage/grok_credentials.rs | 468 ++ crates/core/src/storage/kiro_credentials.rs | 1216 +++++ crates/core/src/storage/mod.rs | 122 +- crates/core/src/storage/proxy_profiles.rs | 233 + .../core/src/storage/request_token_stats.rs | 20 + .../core/src/storage/tests/api_keys_tests.rs | 54 + .../tests/request_token_stats_tests.rs | 15 + crates/core/src/storage/tokens.rs | 168 +- crates/core/src/storage/tokens_tests.rs | 103 + crates/core/src/usage/mod.rs | 203 +- crates/core/tests/storage/migration_tests.rs | 26 + crates/core/tests/usage.rs | 22 +- crates/grok-provider/Cargo.toml | 11 + crates/grok-provider/GROK2API_LICENSE | 22 + crates/grok-provider/PROTOCOL_SOURCE.md | 15 + crates/grok-provider/src/catalog.rs | 132 + crates/grok-provider/src/headers.rs | 272 + crates/grok-provider/src/lib.rs | 25 + crates/grok-provider/src/quota.rs | 111 + crates/grok-provider/src/request.rs | 168 + crates/grok-provider/src/statsig.rs | 99 + crates/grok-provider/src/stream.rs | 277 + crates/kiro-provider/Cargo.toml | 28 + crates/kiro-provider/KIRO_RS_LICENSE | 21 + crates/kiro-provider/VENDORED_SOURCE.md | 13 + .../kiro-provider/src/anthropic/converter.rs | 1836 +++++++ crates/kiro-provider/src/anthropic/mod.rs | 4 + crates/kiro-provider/src/anthropic/stream.rs | 2009 +++++++ crates/kiro-provider/src/anthropic/types.rs | 283 + .../kiro-provider/src/anthropic/websearch.rs | 763 +++ crates/kiro-provider/src/http_client.rs | 121 + crates/kiro-provider/src/kiro/endpoint/ide.rs | 182 + crates/kiro-provider/src/kiro/endpoint/mod.rs | 133 + crates/kiro-provider/src/kiro/machine_id.rs | 282 + crates/kiro-provider/src/kiro/mod.rs | 8 + .../src/kiro/model/common/mod.rs | 4 + .../src/kiro/model/credentials.rs | 895 ++++ .../src/kiro/model/events/assistant.rs | 115 + .../src/kiro/model/events/base.rs | 186 + .../src/kiro/model/events/context_usage.rs | 40 + .../src/kiro/model/events/mod.rs | 13 + .../src/kiro/model/events/tool_use.rs | 52 + crates/kiro-provider/src/kiro/model/mod.rs | 16 + .../src/kiro/model/requests/conversation.rs | 374 ++ .../src/kiro/model/requests/kiro.rs | 73 + .../src/kiro/model/requests/mod.rs | 7 + .../src/kiro/model/requests/tool.rs | 192 + .../src/kiro/model/token_refresh.rs | 46 + .../src/kiro/model/usage_limits.rs | 239 + crates/kiro-provider/src/kiro/parser/crc.rs | 37 + .../kiro-provider/src/kiro/parser/decoder.rs | 336 ++ crates/kiro-provider/src/kiro/parser/error.rs | 94 + crates/kiro-provider/src/kiro/parser/frame.rs | 178 + .../kiro-provider/src/kiro/parser/header.rs | 317 ++ crates/kiro-provider/src/kiro/parser/mod.rs | 10 + crates/kiro-provider/src/kiro/provider.rs | 686 +++ .../kiro-provider/src/kiro/token_manager.rs | 2647 +++++++++ crates/kiro-provider/src/lib.rs | 7 + crates/kiro-provider/src/model/config.rs | 243 + crates/kiro-provider/src/model/mod.rs | 1 + crates/rusqlite/src/lib.rs | 41 + crates/service/Cargo.toml | 6 +- .../src/account/account_agent_identity.rs | 767 +++ .../src/account/account_credential_repair.rs | 108 + crates/service/src/account/account_import.rs | 58 +- crates/service/src/account/account_list.rs | 146 +- crates/service/src/account/account_status.rs | 1010 ++-- .../src/account/account_status_tests.rs | 477 +- .../src/account/account_update_tests.rs | 6 +- crates/service/src/account/account_warmup.rs | 138 +- .../src/account/account_warmup_tests.rs | 39 +- crates/service/src/account/mod.rs | 4 + crates/service/src/adapter_probe_jobs.rs | 504 ++ crates/service/src/aggregate_api.rs | 259 +- crates/service/src/aggregate_api_tests.rs | 30 +- crates/service/src/apikey/apikey_create.rs | 40 + crates/service/src/apikey/apikey_list.rs | 6 + crates/service/src/apikey/apikey_models.rs | 65 +- crates/service/src/apikey/apikey_policy.rs | 97 + .../service/src/apikey/apikey_update_model.rs | 23 + crates/service/src/apikey/mod.rs | 2 + .../service/src/app_settings/api/current.rs | 21 +- crates/service/src/app_settings/api/mod.rs | 28 +- crates/service/src/app_settings/api/patch.rs | 32 +- .../env_overrides/catalog/items.rs | 4 +- crates/service/src/app_settings/gateway.rs | 18 +- crates/service/src/app_settings/mod.rs | 17 +- .../service/src/app_settings/runtime_sync.rs | 30 +- crates/service/src/app_settings/shared.rs | 1 + crates/service/src/codex_profile_tests.rs | 7 + crates/service/src/dashboard.rs | 187 +- crates/service/src/dashboard_tests.rs | 5 +- .../src/gateway/auth/token_exchange.rs | 5 +- crates/service/src/gateway/canonical.rs | 152 + .../src/gateway/core/runtime_config.rs | 350 +- .../core/tests/runtime_config_tests.rs | 88 +- crates/service/src/gateway/key_concurrency.rs | 55 + .../src/gateway/local_validation/auth.rs | 65 + .../src/gateway/local_validation/mod.rs | 2 + .../src/gateway/local_validation/request.rs | 94 +- .../local_validation/tests/request_tests.rs | 58 +- crates/service/src/gateway/mod.rs | 48 +- .../service/src/gateway/model_picker/mod.rs | 33 +- .../src/gateway/model_picker/request.rs | 38 +- .../aggregate/openai_responses_event.rs | 5 + .../http_bridge/body_conversion.rs | 41 + .../http_bridge/delivery_tests.rs | 92 + .../gateway/observability/http_bridge/mod.rs | 94 +- .../http_bridge/stream_readers.rs | 2 +- .../stream_readers/openai_responses.rs | 8 +- .../src/gateway/observability/metrics.rs | 389 +- .../observability/tests/http_bridge_tests.rs | 47 +- .../src/gateway/protocol_adapter/mod.rs | 2 +- .../protocol_adapter/request_router.rs | 76 +- .../protocol_adapter/request_router_tests.rs | 49 + .../service/src/gateway/provider_runtime.rs | 291 + .../src/gateway/request/incoming_headers.rs | 18 + .../src/gateway/request/local_models.rs | 189 +- .../request/official_responses_http.rs | 52 + .../request/official_responses_http_tests.rs | 83 + .../src/gateway/request/request_entry.rs | 50 +- .../src/gateway/request/request_rewrite.rs | 8 + .../request/tests/incoming_headers_tests.rs | 12 + .../request/tests/local_models_tests.rs | 154 + .../request/tests/request_rewrite_tests.rs | 27 + .../gateway/routing/account_batch_rotation.rs | 1030 ++++ .../gateway/routing/conversation_binding.rs | 17 +- .../routing/conversation_binding_tests.rs | 52 + .../service/src/gateway/routing/cooldown.rs | 224 +- .../gateway/routing/proxy_stream_circuit.rs | 148 + .../src/gateway/routing/request_gate.rs | 10 +- .../service/src/gateway/routing/selection.rs | 2 +- .../gateway/routing/tests/cooldown_tests.rs | 58 + .../routing/tests/request_gate_tests.rs | 35 +- .../gateway/routing/tests/selection_tests.rs | 30 +- .../upstream/attempt_flow/fallback_branch.rs | 4 +- .../upstream/attempt_flow/openai_base.rs | 9 +- .../upstream/attempt_flow/postprocess.rs | 83 +- .../attempt_flow/postprocess_tests.rs | 28 +- .../upstream/attempt_flow/primary_flow.rs | 30 +- .../upstream/attempt_flow/transport.rs | 115 +- .../upstream/attempt_flow/transport_tests.rs | 57 +- .../gateway/upstream/headers/codex_headers.rs | 139 +- .../upstream/headers/codex_headers_tests.rs | 103 +- crates/service/src/gateway/upstream/mod.rs | 3 +- .../upstream/protocol/aggregate_api.rs | 13 + .../upstream/protocol/aggregate_api_tests.rs | 28 + crates/service/src/gateway/upstream/proxy.rs | 308 +- .../proxy_pipeline/candidate_executor.rs | 227 +- .../upstream/proxy_pipeline/request_gate.rs | 4 +- .../proxy_pipeline/request_gate_tests.rs | 2 + .../service/src/gateway/upstream/response.rs | 627 +++ .../gateway/upstream/support/candidates.rs | 12 + .../upstream/support/failover_policy.rs | 2 +- .../src/gateway/upstream/support/outcome.rs | 156 +- .../gateway/upstream/support/retry_tests.rs | 2 + .../attempt_flow/fallback_branch_tests.rs | 6 +- .../tests/support/failover_policy_tests.rs | 2 +- .../upstream/tests/support/outcome_tests.rs | 154 +- crates/service/src/grok/catalog.rs | 35 + crates/service/src/grok/import.rs | 273 + crates/service/src/grok/mod.rs | 3 + crates/service/src/grok/runtime.rs | 1160 ++++ .../service/src/http/responses_websocket.rs | 169 +- .../src/http/responses_websocket_tests.rs | 58 + crates/service/src/kiro/catalog.rs | 131 + crates/service/src/kiro/import.rs | 717 +++ crates/service/src/kiro/mod.rs | 4 + crates/service/src/kiro/routing.rs | 371 ++ crates/service/src/kiro/runtime.rs | 1097 ++++ crates/service/src/lib.rs | 6 + crates/service/src/proxy_profiles.rs | 309 ++ crates/service/src/quota/model_pricing.rs | 46 +- .../service/src/quota/model_pricing_tests.rs | 459 +- crates/service/src/rpc_dispatch/account.rs | 46 +- .../src/rpc_dispatch/adapter_probe_jobs.rs | 46 + crates/service/src/rpc_dispatch/apikey.rs | 47 + crates/service/src/rpc_dispatch/grok.rs | 115 + crates/service/src/rpc_dispatch/kiro.rs | 207 + crates/service/src/rpc_dispatch/mod.rs | 16 + .../src/rpc_dispatch/proxy_profiles.rs | 37 + .../service/src/runtime/reasoning_effort.rs | 29 + crates/service/src/tests/lib_tests.rs | 28 +- crates/service/src/usage/refresh/batch.rs | 14 +- crates/service/src/usage/refresh/errors.rs | 605 ++- crates/service/src/usage/refresh/mod.rs | 309 +- .../service/src/usage/refresh/probe_retry.rs | 421 ++ .../usage/tests/usage_refresh_errors_tests.rs | 402 +- .../src/usage/tests/usage_refresh_tests.rs | 251 +- crates/service/src/usage/usage_http.rs | 2760 +++++----- crates/service/src/usage/usage_refresh.rs | 7 +- .../service/src/usage/usage_token_refresh.rs | 7 +- .../gateway/availability/upstream_headers.rs | 40 +- crates/service/tests/gateway_logs/support.rs | 12 +- .../gateway_logs/usage_limit_failover.rs | 65 +- crates/service/tests/rpc.rs | 60 + crates/start/Cargo.toml | 2 +- crates/start/build.rs | 34 +- crates/web/Cargo.toml | 2 +- docker-compose.yml | 6 +- docker/docker-compose.all-in-one.yml | 7 +- docker/docker-compose.release.yml | 6 +- docker/nginx/nginx.conf | 5 + docs/zh-CN/kiro-unified-openai-gateway.md | 139 + ...15\347\275\256\350\257\264\346\230\216.md" | 7 + scripts/activate-openruntime-service-hot.ps1 | 79 + scripts/cutover-openruntime-hot.ps1 | 88 + scripts/cutover-openruntime-service-fast.ps1 | 101 + scripts/cutover-openruntime-service-only.ps1 | 104 + scripts/light-web-shell.mjs | 188 + scripts/recover-openruntime-service.ps1 | 18 + scripts/smoke-openruntime-candidate.ps1 | 36 + scripts/toggle-openruntime.ps1 | 159 + 335 files changed, 59329 insertions(+), 18306 deletions(-) create mode 100644 apps/src-tauri/src/commands/adapter_probe.rs create mode 100644 apps/src-tauri/src/commands/grok.rs create mode 100644 apps/src-tauri/src/commands/kiro.rs create mode 100644 apps/src-tauri/src/commands/proxy_profiles.rs create mode 100644 apps/src/app/adapters/page.tsx create mode 100644 apps/src/app/grok/page.tsx create mode 100644 apps/src/app/import/page.tsx create mode 100644 apps/src/app/kiro/page.tsx create mode 100644 apps/src/app/proxies/page.tsx create mode 100644 apps/src/app/routing/page.tsx create mode 100644 apps/src/app/settings/components/account-stability-card.tsx create mode 100644 apps/src/components/dashboard/adapter-pool-console.tsx create mode 100644 apps/src/components/dashboard/runtime-command-center.tsx create mode 100644 apps/src/components/layout/shell-link.tsx create mode 100644 apps/src/lib/account-callability.ts create mode 100644 apps/src/lib/adapter-probe.ts create mode 100644 apps/src/lib/aggregate-key-import.ts create mode 100644 apps/src/lib/api/adapter-probe-client.ts create mode 100644 apps/src/lib/api/grok-client.ts create mode 100644 apps/src/lib/api/kiro-client.ts create mode 100644 apps/src/lib/api/proxy-profile-client.ts create mode 100644 apps/src/lib/api/transport-web-commands/adapter-probe.ts create mode 100644 apps/src/lib/api/transport-web-commands/grok.ts create mode 100644 apps/src/lib/api/transport-web-commands/kiro.ts create mode 100644 apps/src/lib/api/transport-web-commands/proxy-profiles.ts create mode 100644 apps/src/lib/i18n/messages/sections/en-agent-identity.ts create mode 100644 apps/src/lib/i18n/messages/sections/en-grok.ts create mode 100644 apps/src/lib/i18n/messages/sections/en-kiro.ts create mode 100644 apps/src/lib/i18n/messages/sections/en-proxies.ts create mode 100644 apps/src/lib/i18n/messages/sections/ko-agent-identity.ts create mode 100644 apps/src/lib/i18n/messages/sections/ko-grok.ts create mode 100644 apps/src/lib/i18n/messages/sections/ko-kiro.ts create mode 100644 apps/src/lib/i18n/messages/sections/ko-proxies.ts create mode 100644 apps/src/lib/i18n/messages/sections/ru-agent-identity.ts create mode 100644 apps/src/lib/i18n/messages/sections/ru-grok.ts create mode 100644 apps/src/lib/i18n/messages/sections/ru-kiro.ts create mode 100644 apps/src/lib/i18n/messages/sections/ru-proxies.ts create mode 100644 apps/tests/account-callability.test.mjs create mode 100644 crates/core/migrations/112_kiro_credentials.sql create mode 100644 crates/core/migrations/113_kiro_credential_health.sql create mode 100644 crates/core/migrations/114_kiro_proxy_username.sql create mode 100644 crates/core/migrations/115_api_key_policies.sql create mode 100644 crates/core/migrations/118_kiro_credential_models.sql create mode 100644 crates/core/migrations/119_grok_credentials.sql create mode 100644 crates/core/migrations/120_grok_quota_models.sql create mode 100644 crates/core/migrations/121_api_key_model_visibility.sql create mode 100644 crates/core/migrations/122_codex_agent_identities.sql create mode 100644 crates/core/migrations/123_adapter_credential_probe_states.sql create mode 100644 crates/core/migrations/124_proxy_profiles.sql create mode 100644 crates/core/src/storage/adapter_probe_states.rs create mode 100644 crates/core/src/storage/api_key_policies.rs create mode 100644 crates/core/src/storage/codex_agent_identities.rs create mode 100644 crates/core/src/storage/grok_credentials.rs create mode 100644 crates/core/src/storage/kiro_credentials.rs create mode 100644 crates/core/src/storage/proxy_profiles.rs create mode 100644 crates/grok-provider/Cargo.toml create mode 100644 crates/grok-provider/GROK2API_LICENSE create mode 100644 crates/grok-provider/PROTOCOL_SOURCE.md create mode 100644 crates/grok-provider/src/catalog.rs create mode 100644 crates/grok-provider/src/headers.rs create mode 100644 crates/grok-provider/src/lib.rs create mode 100644 crates/grok-provider/src/quota.rs create mode 100644 crates/grok-provider/src/request.rs create mode 100644 crates/grok-provider/src/statsig.rs create mode 100644 crates/grok-provider/src/stream.rs create mode 100644 crates/kiro-provider/Cargo.toml create mode 100644 crates/kiro-provider/KIRO_RS_LICENSE create mode 100644 crates/kiro-provider/VENDORED_SOURCE.md create mode 100644 crates/kiro-provider/src/anthropic/converter.rs create mode 100644 crates/kiro-provider/src/anthropic/mod.rs create mode 100644 crates/kiro-provider/src/anthropic/stream.rs create mode 100644 crates/kiro-provider/src/anthropic/types.rs create mode 100644 crates/kiro-provider/src/anthropic/websearch.rs create mode 100644 crates/kiro-provider/src/http_client.rs create mode 100644 crates/kiro-provider/src/kiro/endpoint/ide.rs create mode 100644 crates/kiro-provider/src/kiro/endpoint/mod.rs create mode 100644 crates/kiro-provider/src/kiro/machine_id.rs create mode 100644 crates/kiro-provider/src/kiro/mod.rs create mode 100644 crates/kiro-provider/src/kiro/model/common/mod.rs create mode 100644 crates/kiro-provider/src/kiro/model/credentials.rs create mode 100644 crates/kiro-provider/src/kiro/model/events/assistant.rs create mode 100644 crates/kiro-provider/src/kiro/model/events/base.rs create mode 100644 crates/kiro-provider/src/kiro/model/events/context_usage.rs create mode 100644 crates/kiro-provider/src/kiro/model/events/mod.rs create mode 100644 crates/kiro-provider/src/kiro/model/events/tool_use.rs create mode 100644 crates/kiro-provider/src/kiro/model/mod.rs create mode 100644 crates/kiro-provider/src/kiro/model/requests/conversation.rs create mode 100644 crates/kiro-provider/src/kiro/model/requests/kiro.rs create mode 100644 crates/kiro-provider/src/kiro/model/requests/mod.rs create mode 100644 crates/kiro-provider/src/kiro/model/requests/tool.rs create mode 100644 crates/kiro-provider/src/kiro/model/token_refresh.rs create mode 100644 crates/kiro-provider/src/kiro/model/usage_limits.rs create mode 100644 crates/kiro-provider/src/kiro/parser/crc.rs create mode 100644 crates/kiro-provider/src/kiro/parser/decoder.rs create mode 100644 crates/kiro-provider/src/kiro/parser/error.rs create mode 100644 crates/kiro-provider/src/kiro/parser/frame.rs create mode 100644 crates/kiro-provider/src/kiro/parser/header.rs create mode 100644 crates/kiro-provider/src/kiro/parser/mod.rs create mode 100644 crates/kiro-provider/src/kiro/provider.rs create mode 100644 crates/kiro-provider/src/kiro/token_manager.rs create mode 100644 crates/kiro-provider/src/lib.rs create mode 100644 crates/kiro-provider/src/model/config.rs create mode 100644 crates/kiro-provider/src/model/mod.rs create mode 100644 crates/service/src/account/account_agent_identity.rs create mode 100644 crates/service/src/account/account_credential_repair.rs create mode 100644 crates/service/src/adapter_probe_jobs.rs create mode 100644 crates/service/src/apikey/apikey_policy.rs create mode 100644 crates/service/src/gateway/canonical.rs create mode 100644 crates/service/src/gateway/key_concurrency.rs create mode 100644 crates/service/src/gateway/provider_runtime.rs create mode 100644 crates/service/src/gateway/routing/account_batch_rotation.rs create mode 100644 crates/service/src/gateway/routing/proxy_stream_circuit.rs create mode 100644 crates/service/src/grok/catalog.rs create mode 100644 crates/service/src/grok/import.rs create mode 100644 crates/service/src/grok/mod.rs create mode 100644 crates/service/src/grok/runtime.rs create mode 100644 crates/service/src/kiro/catalog.rs create mode 100644 crates/service/src/kiro/import.rs create mode 100644 crates/service/src/kiro/mod.rs create mode 100644 crates/service/src/kiro/routing.rs create mode 100644 crates/service/src/kiro/runtime.rs create mode 100644 crates/service/src/proxy_profiles.rs create mode 100644 crates/service/src/rpc_dispatch/adapter_probe_jobs.rs create mode 100644 crates/service/src/rpc_dispatch/grok.rs create mode 100644 crates/service/src/rpc_dispatch/kiro.rs create mode 100644 crates/service/src/rpc_dispatch/proxy_profiles.rs create mode 100644 crates/service/src/usage/refresh/probe_retry.rs create mode 100644 docs/zh-CN/kiro-unified-openai-gateway.md create mode 100644 scripts/activate-openruntime-service-hot.ps1 create mode 100644 scripts/cutover-openruntime-hot.ps1 create mode 100644 scripts/cutover-openruntime-service-fast.ps1 create mode 100644 scripts/cutover-openruntime-service-only.ps1 create mode 100644 scripts/light-web-shell.mjs create mode 100644 scripts/recover-openruntime-service.ps1 create mode 100644 scripts/smoke-openruntime-candidate.ps1 create mode 100644 scripts/toggle-openruntime.ps1 diff --git a/.gitignore b/.gitignore index 3ce165188..cf6048115 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,10 @@ # Logs & local data /data/ +/exports/ +/cases/ +.env +.env.* *.log *.db *.sqlite diff --git a/AGENTS.md b/AGENTS.md index 4eefda6df..013eb1f23 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -96,3 +96,21 @@ Tauri rules. release/build commands. - Root governance docs describe repository-level boundaries. App-specific frontend rules belong in `apps/AGENTS.md`. + +## 9. Live Runtime Protection +- Treat the running OpenRuntime service and Web UI as user-critical. Development, + tests, frontend export, Rust compilation, and packaging must not stop, replace, + or lock the live processes on ports `48764` and `48763`. +- Build candidate service/Web executables into a separate hot-update target + directory while the current version remains online. Never compile directly + over a running Windows executable. +- Do not restart for intermediate changes. Only perform one short cutover after + all requested changes, migrations, tests, frontend assets, and candidate + binaries are complete. +- Before cutover, preserve the currently running binaries and database, prepare + an automatic rollback path, and verify that ports `48760` and other legacy CPA + services are outside the operation scope. +- During cutover, start and health-check the new service and Web UI immediately. + If either health check fails, restore the previous binaries and restart the + previous version automatically. The goal is to keep the user's active Codex + sessions and this task reachable throughout development. diff --git a/Cargo.lock b/Cargo.lock index ca361747a..5fcf170be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,41 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "ahash" version = "0.8.12" @@ -90,6 +125,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "anyhow" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" + [[package]] name = "ascii" version = "1.1.0" @@ -200,12 +241,27 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bitflags" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -266,6 +322,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + [[package]] name = "chrono" version = "0.4.44" @@ -275,6 +342,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-link", ] @@ -285,6 +353,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + [[package]] name = "cmake" version = "0.1.57" @@ -298,13 +377,50 @@ dependencies = [ name = "codexmanager-core" version = "0.4.0" dependencies = [ + "aes-gcm", "base64", + "hmac", "rand 0.8.5", "rusqlite", "serde", "serde_json", "sha2", "urlencoding", + "windows-sys 0.61.2", +] + +[[package]] +name = "codexmanager-grok-provider" +version = "0.4.0" +dependencies = [ + "base64", + "http", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "codexmanager-kiro-provider" +version = "0.4.0" +dependencies = [ + "anyhow", + "axum", + "bytes", + "chrono", + "crc", + "fastrand", + "futures", + "hex", + "parking_lot", + "reqwest", + "serde", + "serde_json", + "sha2", + "tokio", + "tracing", + "urlencoding", + "uuid", ] [[package]] @@ -316,8 +432,12 @@ dependencies = [ "bytes", "chrono", "codexmanager-core", + "codexmanager-grok-provider", + "codexmanager-kiro-provider", "croner", "crossbeam-channel", + "crypto_box", + "ed25519-dalek", "env_logger", "eventsource-stream", "futures-util", @@ -397,6 +517,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "const-random" version = "0.1.18" @@ -427,6 +553,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -442,6 +578,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc" version = "3.4.0" @@ -524,9 +669,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "crypto_box" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16182b4f39a82ec8a6851155cc4c0cda3065bb1db33651726a29e1951de0f009" +dependencies = [ + "aead", + "blake2", + "crypto_secretbox", + "curve25519-dalek", + "salsa20", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto_secretbox" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1" +dependencies = [ + "aead", + "cipher", + "generic-array", + "poly1305", + "salsa20", + "subtle", + "zeroize", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "ctrlc" version = "3.5.2" @@ -538,6 +723,33 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "darling" version = "0.20.11" @@ -579,6 +791,16 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "derive_builder" version = "0.20.2" @@ -618,6 +840,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -655,6 +878,30 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2", + "subtle", + "zeroize", +] + [[package]] name = "either" version = "1.15.0" @@ -740,6 +987,12 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "find-msvc-tools" version = "0.1.8" @@ -799,6 +1052,21 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -872,6 +1140,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -891,6 +1160,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -915,11 +1185,33 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "h2" version = "0.4.13" @@ -977,6 +1269,15 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "home" version = "0.5.12" @@ -1070,6 +1371,7 @@ dependencies = [ "hyper", "hyper-util", "rustls", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls", @@ -1280,6 +1582,15 @@ dependencies = [ "hashbrown 0.16.1", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -1487,10 +1798,10 @@ dependencies = [ "libc", "log", "openssl", - "openssl-probe", + "openssl-probe 0.1.6", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -1736,6 +2047,12 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "openssl" version = "0.10.75" @@ -1768,6 +2085,21 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-src" +version = "300.6.1+3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46eb8fb9fb3b61ce1c0f8a026c4c1a0714d3a9e138e7fbde78753ce2babc3846" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" version = "0.9.111" @@ -1776,6 +2108,7 @@ checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -1843,12 +2176,45 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.13.1" @@ -1961,6 +2327,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" version = "0.8.5" @@ -1982,6 +2354,17 @@ dependencies = [ "rand_core 0.9.5", ] +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -2020,6 +2403,12 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "raw-window-handle" version = "0.5.2" @@ -2112,6 +2501,7 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", + "rustls-native-certs", "rustls-pki-types", "serde", "serde_json", @@ -2189,6 +2579,15 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "1.1.3" @@ -2218,6 +2617,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe 0.2.1", + "rustls-pki-types", + "schannel", + "security-framework 3.6.0", +] + [[package]] name = "rustls-pki-types" version = "1.14.0" @@ -2252,6 +2663,15 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + [[package]] name = "same-file" version = "1.0.6" @@ -2283,7 +2703,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" +dependencies = [ + "bitflags", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -2291,14 +2724,20 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + [[package]] name = "serde" version = "1.0.228" @@ -2372,7 +2811,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -2383,7 +2822,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -2393,6 +2832,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "slab" version = "0.4.11" @@ -2435,6 +2883,16 @@ dependencies = [ "lock_api", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "sqlx" version = "0.8.6" @@ -2639,7 +3097,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -3008,6 +3466,16 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "untrusted" version = "0.9.0" @@ -3050,6 +3518,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.23.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5fab0d6c3c01ae70085a09cb03d4c7a1d6314e2b3e075392783396d724ca0a" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "rand 0.10.2", + "wasm-bindgen", +] + [[package]] name = "vcpkg" version = "0.2.15" @@ -3194,7 +3674,7 @@ version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db67ae75a9405634f5882791678772c94ff5f16a66535aae186e26aa0841fc8b" dependencies = [ - "core-foundation", + "core-foundation 0.9.4", "home", "jni", "log", diff --git a/Cargo.toml b/Cargo.toml index 078233cb5..a672e201f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,8 @@ [workspace] members = [ "crates/core", + "crates/grok-provider", + "crates/kiro-provider", "crates/rusqlite", "crates/service", "crates/start", @@ -13,4 +15,3 @@ resolver = "2" [workspace.package] version = "0.4.0" - diff --git a/README.md b/README.md index 858eac6a7..c2159e818 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,13 @@ CodexManager Logo

-

CodexManager

+

CodexManager Unified

-

本地桌面端 + 服务进程的 Codex 账号管理器+网关转发

+

Codex + Kiro 统一 OpenAI 网关

+ +

Codex + Kiro 统一 OpenAI 网关开发说明

+ +

独立应用身份、独立 AppData 数据库、独立 48764 端口,可与原版 CodexManager 并行安装。

English diff --git a/apps/package.json b/apps/package.json index 3413aed13..9e49bf948 100644 --- a/apps/package.json +++ b/apps/package.json @@ -1,50 +1,51 @@ -{ - "name": "codexmanager-frontend", - "version": "0.4.0", - "packageManager": "pnpm@10.30.3", - "private": true, - "scripts": { - "dev": "next dev --webpack", - "dev:desktop": "next dev --webpack -H 127.0.0.1 -p 3005", - "build": "next build", - "build:desktop": "next build", - "check": "pnpm run lint && pnpm run test:runtime && pnpm run build:desktop", - "test": "pnpm run test:runtime", - "test:e2e": "playwright test", - "test:navigation": "playwright test tests/navigation-cache.spec.ts", - "test:runtime": "node --test", - "test:ui": "pnpm run test:e2e", - "start": "next start", - "lint": "eslint" - }, - "dependencies": { - "@base-ui/react": "^1.3.0", - "@tanstack/react-query": "^5.90.21", - "@tauri-apps/api": "^2.10.1", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "lucide-react": "^0.577.0", - "next": "16.1.6", - "next-themes": "^0.4.6", - "react": "19.2.3", - "react-dom": "19.2.3", - "recharts": "3.8.0", - "shadcn": "^4.0.6", - "sonner": "^2.0.7", - "tailwind-merge": "^3.5.0", - "tailwindcss-animate": "^1.0.7", - "zustand": "^5.0.11" - }, - "devDependencies": { - "@playwright/test": "1.58.0", - "@tailwindcss/postcss": "^4", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "babel-plugin-react-compiler": "1.0.0", - "eslint": "^9", - "eslint-config-next": "16.1.6", - "tailwindcss": "^4", - "typescript": "^5" - } -} +{ + "name": "codexmanager-frontend", + "version": "0.4.0", + "packageManager": "pnpm@10.30.3", + "private": true, + "scripts": { + "dev": "next dev --webpack", + "dev:desktop": "next dev --webpack -H 127.0.0.1 -p 3005", + "build": "next build", + "build:desktop": "next build", + "check": "pnpm run lint && pnpm run test:runtime && pnpm run build:desktop", + "test": "pnpm run test:runtime", + "test:e2e": "playwright test", + "test:navigation": "playwright test tests/navigation-cache.spec.ts", + "test:runtime": "node --test", + "test:ui": "pnpm run test:e2e", + "start": "next start", + "lint": "eslint", + "dev:shell": "node ../scripts/light-web-shell.mjs" + }, + "dependencies": { + "@base-ui/react": "^1.3.0", + "@tanstack/react-query": "^5.90.21", + "@tauri-apps/api": "^2.10.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.577.0", + "next": "16.1.6", + "next-themes": "^0.4.6", + "react": "19.2.3", + "react-dom": "19.2.3", + "recharts": "3.8.0", + "shadcn": "^4.0.6", + "sonner": "^2.0.7", + "tailwind-merge": "^3.5.0", + "tailwindcss-animate": "^1.0.7", + "zustand": "^5.0.11" + }, + "devDependencies": { + "@playwright/test": "1.58.0", + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "babel-plugin-react-compiler": "1.0.0", + "eslint": "^9", + "eslint-config-next": "16.1.6", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/apps/public/startup.html b/apps/public/startup.html index 681251fe9..2d410669d 100644 --- a/apps/public/startup.html +++ b/apps/public/startup.html @@ -3,7 +3,7 @@ - CodexManager + OpenRuntime