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 @@
本地桌面端 + 服务进程的 Codex 账号管理器+网关转发
+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 @@
-