Commit Graph
698 Commits
Author SHA1 Message Date
cita-777 39ce22247f feature redesign modern dark friendly landing page 2026-09-06 12:31:43 +08:00
cita-777 1e820035da fix dark login surface colors 2026-09-06 12:12:55 +08:00
cita-777 7e93a2ad5e fix schema runtime test timeout 2026-09-05 16:41:39 +08:00
cita-777 8af97fd845 fix dark mode first-paint flash 2026-09-05 16:32:29 +08:00
cita-777 b196baa350 docs: remove sponsor contact link from READMEs 2026-09-03 14:16:21 +08:00
Cita 4fb7689f9a docs: add IPWO sponsor and update contributors in README (#617) 2026-09-03 14:13:36 +08:00
Cita f4114ada6d fix: tolerate corrupted site announcement cache rows
Verified on cita1 with a single temporary Metapi instance: health 200, /api/site-announcements 200, Playwright page reload rendered announcements without Failed query, and browser console had no errors. Production container was restored and remains healthy.
2026-08-30 22:47:45 +08:00
crazzzzzysnail 83e33ffc18 feat: 优化自定义群组在通道重建后自动更新
CI 全绿;本地全套测试与 cita1 单实例 Playwright Routes E2E 已验证。
2026-08-30 19:51:29 +08:00
lengxiaouserandcita-777 a539f04645 feat: add proxy fixes and per-site concurrency
* feat: add proxy fixes and per-site concurrency

* docs: record branch push permission result

* docs: record fork preparation

* docs: record pull request link

* fix: address CodeRabbit proxy review findings

* test: update shared surface endpoint mocks

* docs: correct review validation count

* fix: preserve explicit route channel priorities

* fix: honor explicit channel priorities

* fix: honor priorities regardless of channel mode

* docs: record CodeRabbit follow-up validation

* docs: record route rebuild validation

* test: cover Gemini site endpoint concurrency

* fix: preserve versioned endpoint path handling

* chore: include merged site columns in schema snapshot

---------

Co-authored-by: cita-777 <juricek.chen@gmail.com>
2026-08-30 17:33:38 +08:00
a0c10fdc60 fix: align newapi cookie checkin and downstream key defaults
* fix: align newapi cookie checkin and downstream key defaults

Closes #548

* fix: address follow-up review feedback in issue 548 PR

* fix: address additional PR 550 review feedback

* fix: clear stale account model context metadata

* fix: propagate context metadata through model discovery

* fix: tighten manual model and context cache flows

---------

Co-authored-by: Codex <codex@openai.com>
Co-authored-by: cita-777 <juricek.chen@gmail.com>
2026-08-30 17:13:28 +08:00
aoguai b1821a06cc feat: Add site custom header override priority
* Add site custom header override priority

* Preserve site probe settings in migration statements

* Regenerate cross-dialect upgrade artifacts
2026-08-30 16:50:31 +08:00
2d0ecc0710 Add model context length and manual model deletion
* feat: add context_length to /v1/models response

- New modelContextLengthCache service for in-memory model→context_length mapping
- Platform adapters (newApi, standardApiProvider) extract context_length from upstream /v1/models
- modelsSurface injects context_length into both OpenAI and Claude response formats
- Default 1,000,000 when upstream does not provide context_length
- Supports field names: context_length, contextLength, max_context_length, contextWindow, etc.

* feat: add delete button for manually added models

- Backend: DELETE /api/accounts/:id/models/manual endpoint
- Only deletes models where isManual=true (safe against auto-discovered models)
- Frontend: AccountModelsModal shows '✕ 删除' button next to each manual model
- Frontend: api.removeAccountManualModels() function
- Accounts.tsx: wires up delete handler with toast feedback

* fix: address PR review feedback for model metadata

* fix: preserve model context metadata across credential scans

* fix: canonicalize endpoint model context scope

Closes #507

* fix: isolate concurrent model context scan scopes

* fix: use conservative model context lengths in models surface

* fix: clear stale context metadata after failed refresh

* fix: keep model context metadata conservative

---------

Co-authored-by: Hermes Agent <hermes-agent@metapi>
Co-authored-by: Codex <codex@local>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: cita-777 <juricek.chen@gmail.com>
2026-08-30 16:50:24 +08:00
8bd2bfec48 feat: add OrcaRouter as a named platform and provider preset
* feat: add OrcaRouter as a named platform and provider preset

Add a dedicated OrcaRouter adapter (OpenAI-compatible, API-key-first),
auto-detected for api.orcarouter.ai, and registered across the platform
registry, URL detection, site initialization presets, brand matching,
and the web UI (site options, payload rules, connection segments).

Verified: 2581 tests passing, full typecheck green, and a live model
discovery call against https://api.orcarouter.ai returns 200 models.

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: JinhaoSong322 <jinhao.song@myflashcloud.com>

* fix: bound OrcaRouter host detection

---------

Signed-off-by: JinhaoSong322 <jinhao.song@myflashcloud.com>
Co-authored-by: JinhaoSong322 <jinhao.song@myflashcloud.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: cita-777 <juricek.chen@gmail.com>
2026-08-30 16:50:17 +08:00
8a7dfc5336 fix: use the user id returned by login instead of guessing it
* fix: use the user id returned by login instead of guessing it

New API's /api/user/login returns the account's own id in `data.id`, but
`login()` extracted only the access token and threw the rest away. Callers
therefore fell back to `guessPlatformUserIdFromUsername()`, whose trailing
digits regex only matches usernames that happen to end with the id (e.g.
`linuxdo_80305`). For an email login such as `alice@example.com` it yields
nothing, so requests go out without the `New-Api-User` header, the site
answers 401, the balance stays 0 and the session is misjudged as expired —
which sends every scheduled round back through a full password login.

Surface `platformUserId` on LoginResult, populate it from the login payload,
prefer it over the guess when creating an account, and persist it on
auto-relogin too (merging extraConfig so the stored autoRelogin credentials
survive). This also avoids the extra `discoverUserId()` round trip that
checkin and balance refresh currently pay on every single call.

* fix: carry the re-login identity back to the caller

Addresses the review feedback on #610.

`tryAutoRelogin()` persisted the authoritative `platformUserId` but returned
only the access token, so callers kept using pre-login state:

- the immediate retry still sent the stale `New-Api-User`, so it could fail
  even though the re-login succeeded
- the later `mergeAccountExtraConfig(account.extraConfig, ...)` writes started
  from the pre-login snapshot and wrote the old id back over the one that had
  just been persisted

Both helpers now return `{ accessToken, platformUserId, extraConfig }`.
`checkinService` adopts the id and refreshes `account.extraConfig` before
retrying; `balanceService` does the same via its existing `activeExtraConfig`
(`readBalance` closes over `platformUserId`, so the retry picks it up).

Also from the review:

- `extractLoginUserId()` no longer uses `Number.parseInt`, which accepted
  "80305abc" and "80305.9" as 80305 and would have produced a wrong
  `New-Api-User`. It now requires an all-digit string and a safe integer.
- `login()` returns the exported `LoginResult` instead of redeclaring the shape
  inline, so the base contract and the adapter cannot drift apart.

* fix: never let the guessed id overwrite the one login reported

Follow-up to the review on #610.

`storedPlatformUserId` and `guessedPlatformUserId` are computed once, before any
re-login. When an account had no stored id, the guess was non-empty, and a
re-login then reported the authoritative id, the success path still tested the
pre-login snapshot and merged the guess back in — replacing a known-good id with
digits scraped off the end of the username, which is the exact failure this PR
exists to remove.

The condition now checks the *current* `account.extraConfig` instead of the
pre-login snapshot. `guessedPlatformUserId` is only ever set when
`storedPlatformUserId` was empty, so behaviour is unchanged when no re-login
happened.

* test: cover the relogin identity path

Per the review, the existing auto-relogin test only asserted the refreshed access
token, so nothing pinned down the behaviour this PR is about.

The new case uses `alice_1999` — a username whose trailing digits are not the
account id, which is exactly what `guessPlatformUserIdFromUsername()` gets wrong
— and asserts three things:

- the first attempt falls back to the guess (1999), since nothing better exists yet
- the retry after re-login uses the id the site reported (500123)
- no subsequent write puts the guess back over it

Verified the test actually bites: reverting either the identity propagation or the
guarded guess-persist makes it fail.

* test: also pin that relogin keeps the autoRelogin credentials

Per the review, asserting only `platformUserId` left a hole: a write that
*replaced* `extraConfig` with just `{ platformUserId }` would still satisfy the
test, while dropping the `autoRelogin` credentials and leaving nothing to
re-login with on the next round.

The assertion now parses the whole persisted config and requires both the
reported id and the intact credentials. Verified it bites: swapping
`mergeAccountExtraConfig` for a plain overwrite makes it fail.

* fix: resolve the login user id for every adapter, not just New API

`VeloeraAdapter` inherits `BasePlatformAdapter.login()` untouched, and that base
implementation discarded `res.data.id` exactly like the New API one did. Its
`authHeaders()` only sends `Veloera-User` / `New-API-User` / `User-id` when an id
was resolved, so the same e-mail-login failure this PR fixes for New API was
still present on the adjacent adapter — and on anything else inheriting the base
login path.

Moved `extractLoginUserId()` from `NewApiAdapter` onto `BasePlatformAdapter` as a
protected helper and used it in the base `login()`. `NewApiAdapter` now inherits
it instead of carrying a private copy, so the diff gets smaller while covering
more adapters.

Also tightened the test assertion: credentials are now required to survive
*every* persisted config, not just one of them. `toContainEqual` would have
passed while a later write dropped them.

* refactor: keep login identity resolution out of route

* fix: preserve concurrent config during relogin

* fix: avoid replaying relogin config snapshots

---------

Co-authored-by: Jacky Li <xiaoranli@buct.edu.cn>
Co-authored-by: cita-777 <juricek.chen@gmail.com>
2026-08-30 16:48:30 +08:00
JASimandcita-777 58866f82bd Fix Gemini official tool history thought signatures
* fix: bridge Gemini tool history through native API

* fix: preserve Gemini native API key auth

* fix: stream Gemini native tool history responses

---------

Co-authored-by: cita-777 <juricek.chen@gmail.com>
2026-08-30 16:48:26 +08:00
Bluice ZhenandClaude a2e5a215f8 feat(chart): 支持通过 existingSecret 引用已有 Secret
* feat(chart): support referencing a pre-existing Secret via existingSecret

Add an existingSecret value to the k3s chart so operators can supply a
cluster-managed Secret instead of letting the chart generate one.

- existingSecret non-empty: skip rendering secret.yaml; Deployment envFrom
  references the named Secret; checksum/env-secret annotation omitted (the
  chart does not promise to roll on external Secret content changes).
- existingSecret empty: behavior unchanged (chart creates <release>-env and
  references it; full backward compatibility).
- When existingSecret is set, .Values.env.* required validations are skipped
  via the conditional render (no conflict detection with env.*).
- No per-key mapping (still envFrom), no lookup/verification of the external
  Secret, no new NOTES.txt/README — the chart's documentation surface is left
  as-is.

Verified with helm template in both modes.

Closes #595

Co-Authored-By: Claude <noreply@anthropic.com>

* test(chart): assert envFrom resolves to envSecretRefName for existingSecret

The k3sAssets guard asserted envFrom referenced metapi.envSecretName, but the
existingSecret feature renamed the envFrom binding to metapi.envSecretRefName
(secretRef.name falls back to the helper when existingSecret is unset). Update
the assertion to match and pin the new existingSecret branch with guards on the
envSecretRefName define and the .Values.existingSecret branch in _helpers.tpl.

Co-Authored-By: Claude <noreply@anthropic.com>

* docs(k3s): document existingSecret mode, required keys, and roll caveat

Add a dedicated section to the k3s update-center doc covering the chart's
existingSecret value: the chart-managed Secret vs an operator-supplied one, the
fixed 11 keys the external Secret must provide, and the behavioral change that
the checksum/env-secret auto-roll on Secret change is omitted under
existingSecret (operators must drive rollouts via Reloader or manual restart).

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-30 14:03:04 +08:00
Fierushio e6278e2208 fix(docker): forward every variable declared in docker/.env.example
* fix(docker): forward every documented env var to the container

docker/docker-compose.yml only forwarded a subset of the variables that
docker/.env.example tells users to set, so the rest were silently inert.
CHECKIN_CRON and BALANCE_REFRESH_CRON were additionally hardcoded, which
overrode any user value.

* docs(docker): declare the remaining supported env vars in the compose example
2026-08-30 14:00:09 +08:00
Fierushio 9c2e8d6a76 feat: make Telegram Bot API base URL configurable
* docs: add missing Telegram env vars to .env.example

TELEGRAM_API_BASE_URL, TELEGRAM_MESSAGE_THREAD_ID, and
TELEGRAM_USE_SYSTEM_PROXY were supported in config.ts but absent from
the example file.

* fix(config): read TELEGRAM_API_BASE_URL from environment

telegramApiBaseUrl was hardcoded to 'https://api.telegram.org' with no
env var override, preventing users in restricted networks (mainland
China, self-hosted bot-api servers) from pointing metapi at a proxy.

Now reads TELEGRAM_API_BASE_URL with fallback to the official endpoint,
trims whitespace, and strips trailing slashes — matching the pattern
already applied in notifyService.ts line ~80.

* fix: make telegramApiBaseUrl configurable via TELEGRAM_API_BASE_URL env var

Hardcoding https://api.telegram.org prevents users behind the Great Firewall
or running a self-hosted Bot API server from configuring a proxy base URL.

Read the base URL from TELEGRAM_API_BASE_URL (fallback to official endpoint)
and strip trailing slashes.

* test: cover TELEGRAM_API_BASE_URL resolution in buildConfig

* style: drop stray trailing newline

* fix(config): normalize TELEGRAM_API_BASE_URL before applying the default

* test: cover whitespace-only TELEGRAM_API_BASE_URL fallback
2026-08-30 14:00:04 +08:00
ag163and周俊翔 00c1d3a1e6 fix: support mysql upsert in admin snapshot store
Co-authored-by: 周俊翔 <16970053+zhou-junxiang987@user.noreply.gitee.com>
2026-08-30 13:58:25 +08:00
dependabot[bot] 7d2d5eb36c chore(deps): bump the github-actions group across 1 directory with 3 updates
Bumps the github-actions group with 3 updates in the / directory: [actions/setup-node](https://github.com/actions/setup-node), [actions/labeler](https://github.com/actions/labeler) and [actions/cache](https://github.com/actions/cache).


Updates `actions/setup-node` from 6 to 7
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v6...v7)

Updates `actions/labeler` from 6 to 7
- [Release notes](https://github.com/actions/labeler/releases)
- [Commits](https://github.com/actions/labeler/compare/v6...v7)

Updates `actions/cache` from 5 to 6
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/labeler
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/cache
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-30 13:58:21 +08:00
OctoBoredandOctoBored a2c641568d fix: migrate star-history chart links to self-hosted star-history.dera.page
The old star history chart depends on the GitHub stargazer API which broke recently. Switch image and anchor URLs in README.md and README_EN.md to the self-hosted star-history.dera.page endpoint (same-domain, no api subdomain, /svg path kept, hash-based links).

Co-authored-by: OctoBored <212877535+OctoBored@users.noreply.github.com>
2026-08-30 13:58:16 +08:00
dependabot[bot] 41767a65ec Keep CI actions current with checkout v7
The workflow stack should use the current checkout action now that the full CI matrix is green, keeping automation dependencies maintained without changing runtime behavior.

Constraint: This is a GitHub Actions dependency update generated by Dependabot.
Rejected: Holding the checkout major update without a failing signal | PR CI and CodeQL passed across the project gate.
Confidence: high
Scope-risk: narrow
Directive: Re-check pull_request_target behavior before future checkout major upgrades because v7 changes fork checkout protections.
Tested: GitHub CI for PR #587 passed Test Core, Build Web, Build Server, Build Desktop, Typecheck, schema checks for SQLite/MySQL/Postgres, Build Docs, CodeQL, and audit.
Not-tested: Docker publish jobs were skipped because this was a pull_request workflow, not a push/tag publish event.
2026-06-24 10:06:18 +08:00
Brisbanehuang f396014728 Restore New API session compatibility across user-id headers
New API-compatible deployments disagree on which user-id header session-cookie calls must send, so Metapi should emit the compatible header set wherever it has a resolved platform user id.

Constraint: Some New API deployments require X-User-Id while existing integrations already depend on New-Api-User variants.
Rejected: Replacing the existing header variants | it would regress deployments that already accept the current names.
Confidence: high
Scope-risk: narrow
Directive: Keep New API session-cookie auth header changes centralized in the shared helper.
Tested: GitHub CI for PR #567 passed Test Core, Build Web, Build Server, Build Desktop, Typecheck, schema checks for SQLite/MySQL/Postgres, CodeQL, and audit.
Not-tested: No fresh post-merge local runtime smoke test was run.
2026-06-24 10:05:28 +08:00
Cita e72d19e235 Remove Docker Image badge from README
Removed Docker Image badge from README.
2026-05-22 11:02:57 +08:00
Cita fe158c6bf0 Update README.md 2026-05-21 15:31:56 +08:00
Bluice ZhenandClaude Opus 4.7 c308a3ed7c fix: support Claude anthropic model discovery fallback (#554)
Allow Claude sites configured under an /anthropic path to fall back to the parent OpenAI-compatible models endpoint so model refresh works without changing chat routing.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 14:11:06 +08:00
dependabot[bot] 34eb5c8eb9 chore(deps): bump the minor-and-patch group across 1 directory with 14 updates
Constraint: Dependabot replacement PR after earlier grouped dependency PR was superseded; all required GitHub checks passed before merge.
Confidence: high
Scope-risk: moderate
Directive: Treat this as the canonical replacement for superseded #544.
Tested: GitHub CI status check rollup passed for PR before merge.
Not-tested: Manual runtime smoke beyond repository CI.
2026-05-17 14:00:04 +08:00
dependabot[bot] e1461619ca chore(deps): bump marked from 17.0.5 to 18.0.3
Constraint: Dependabot PR with required GitHub checks passing before merge.
Confidence: high
Scope-risk: narrow
Tested: GitHub CI status check rollup passed for PR before merge.
Not-tested: No additional manual runtime smoke beyond repository CI.
2026-05-17 13:59:03 +08:00
dependabot[bot] a6389ce398 chore(deps-dev): bump electron from 41.1.1 to 42.0.1
Constraint: Dependabot PR with required GitHub checks passing before merge.
Confidence: high
Scope-risk: narrow
Tested: GitHub CI status check rollup passed for PR before merge.
Not-tested: No additional manual runtime smoke beyond repository CI.
2026-05-17 13:58:58 +08:00
dependabot[bot] b809f5d12c chore(deps-dev): bump react-router-dom from 7.14.0 to 7.15.0 in the routing group
Constraint: Dependabot PR with required GitHub checks passing before merge.
Confidence: high
Scope-risk: narrow
Tested: GitHub CI status check rollup passed for PR before merge.
Not-tested: No additional manual runtime smoke beyond repository CI.
2026-05-17 13:50:35 +08:00
dependabot[bot] befb19cadd chore(deps): bump undici from 6.24.1 to 6.25.0 in the runtime-http group
Constraint: Dependabot PR with all required GitHub checks passing before merge.
Confidence: high
Scope-risk: narrow
Tested: GitHub CI status check rollup passed for PR before merge.
Not-tested: Combined post-merge dependency matrix beyond repository CI.
2026-05-17 13:48:59 +08:00
dependabot[bot] 94dad13b49 chore(deps-dev): bump the build-tooling group with 2 updates
Constraint: Dependabot PR with all required GitHub checks passing before merge.
Confidence: high
Scope-risk: narrow
Tested: GitHub CI status check rollup passed for PR before merge.
Not-tested: Combined post-merge dependency matrix beyond repository CI.
2026-05-17 13:48:54 +08:00
dependabot[bot] 44114cb8f8 chore(deps): bump the github-actions group with 3 updates
Constraint: Dependabot PR with all required GitHub checks passing before merge.
Confidence: high
Scope-risk: narrow
Tested: GitHub CI status check rollup passed for PR before merge.
Not-tested: Combined post-merge dependency matrix beyond repository CI.
2026-05-17 13:48:49 +08:00
Tursom K. Ulefits cdb12a9819 [codex] fix quota refresh probe model (#490) 2026-05-08 22:55:17 +08:00
Ju Ziandjuzi f19ddac865 feat: 支持从站点页快捷添加 API Key (#505)
Co-authored-by: juzi <956428403@qq.com>
2026-05-08 22:54:40 +08:00
Cita 90e2f0c405 Merge PR #535: clear production dependency audit
Merge the narrow package-lock refresh that restores the main production audit gate.
2026-05-08 17:39:42 +08:00
cita-777 0f51dec36e Clear the main-branch production audit gate
Constraint: main push CI fails on npm audit --omit=dev --audit-level=high after recent merges.
Rejected: Broad npm audit fix output | it updated unrelated dev-only lockfile entries.
Confidence: high
Scope-risk: narrow
Directive: Keep PR audit informational until production dependencies are audited on dev/main consistently.
Tested: ELECTRON_SKIP_BINARY_DOWNLOAD=1 npm ci --prefer-offline --no-audit --no-fund; npm audit --omit=dev --audit-level=high; npm run typecheck:server; npm test -- --run src/server/config.test.ts src/server/settingsRoutePayloads.test.ts
Not-tested: Full GitHub Actions matrix before opening PR.
2026-05-08 17:35:24 +08:00
Cita f4148675e1 Merge PR #510: per-site model probe
Merged after updating the PR onto current main and fixing the remaining probe-setting review gaps.\n\nValidation:\n- GitHub checks all passing: Test Core, Typecheck, Build Web/Server/Desktop, Repo Drift Check, Schema SQLite/MySQL/Postgres, CodeQL, CodeRabbit.\n- Local: npm run typecheck\n- Local: npm run repo:drift-check\n- Local: npx vitest run --root . src/server/db/schemaContract.test.ts src/server/db/schemaArtifactGenerator.test.ts src/server/db/schemaIntrospection.test.ts src/server/db/schemaParity.test.ts src/web/api.test.ts src/web/pages/helpers/sitesEditor.test.ts src/web/pages/sites.disabled-models-save.test.tsx src/web/pages/sites.edit-scroll.test.tsx
2026-05-08 16:58:27 +08:00
cita-777 e5a8a0b3d7 Keep per-site probe settings reliable before merge
Refresh the PR onto current main and close the remaining probe-setting review gaps: the primary site save now persists the latency threshold, the site row type carries that field without an any-cast, active probe streams are aborted on unmount, and all-model one-shot probes get the longer timeout they need.

Constraint: PR #510 must preserve the per-site model probe feature while merging cleanly into current main.
Rejected: Leave threshold persistence behind the separate probe-settings button | the primary save path would still silently drop user changes.
Rejected: Keep the SiteRow any-cast | it hides API/schema drift for the new persisted field.
Confidence: high
Scope-risk: narrow
Directive: Keep probe setting fields represented in the typed site save payload and covered by focused web API/editor tests.
Tested: npm run typecheck; npm run repo:drift-check; npx vitest run --root . src/server/db/schemaContract.test.ts src/server/db/schemaArtifactGenerator.test.ts src/server/db/schemaIntrospection.test.ts src/server/db/schemaParity.test.ts src/web/api.test.ts src/web/pages/helpers/sitesEditor.test.ts src/web/pages/sites.disabled-models-save.test.tsx src/web/pages/sites.edit-scroll.test.tsx
Not-tested: Full npm test.
2026-05-08 16:51:05 +08:00
Cita 1d61a7ac84 Merge PR #495: auto-discover recent Docker Hub dev tags
Merged after resolving conflicts with current main.\n\nValidation:\n- GitHub checks all passing: Test Core, Typecheck, Build Web/Server/Desktop, Repo Drift Check, Schema checks, CodeQL, CodeRabbit.\n- Local: npx vitest run --root . src/web/pages/settings/UpdateCenterSection.test.tsx src/server/services/updateCenterVersionService.test.ts src/server/routes/api/updateCenter.test.ts src/server/services/updateCenterStatusService.test.ts\n- Local: npm run typecheck\n- Local: npm run repo:drift-check
2026-05-08 16:27:26 +08:00
cita-777 93bc42a69d Refresh the recent Docker tag PR onto current main
The release branch had fallen behind current main and only conflicted in the
Update Center recent-tag test. Keep the latest main-side deploy-state coverage
while preserving the PR's raw-tag filtering and digest visibility assertions.

Constraint: PR #495 must merge into the current main without widening the PR diff beyond the update-center candidate behavior.
Rejected: Drop the PR-specific digest/raw-tag assertions | would regress the review fixes that prompted the branch update.
Confidence: high
Scope-risk: narrow
Directive: Keep recent Docker tag cards deployable only from real tagName values and keep digest metadata visible before deployment.
Tested: npx vitest run --root . src/web/pages/settings/UpdateCenterSection.test.tsx src/server/services/updateCenterVersionService.test.ts src/server/routes/api/updateCenter.test.ts src/server/services/updateCenterStatusService.test.ts; npm run typecheck; npm run repo:drift-check; git diff --cached --check origin/main
Not-tested: Full npm test.
2026-05-08 16:23:05 +08:00
Cita 508fa71ec7 Merge pull request #518 from kevinye13/fix/settings-allowlist-json-array
fix(settings): persist model allowlist as JSON array
2026-05-08 16:05:15 +08:00
Cita 3ce705ab9d Update contributors section in README.md 2026-05-08 15:37:37 +08:00
Cita 4481cf7493 Clean up contributor section in README
Removed unnecessary contributor images from the README.
2026-05-08 15:29:19 +08:00
Cita 3720b3d0ed Merge pull request #533 from cita-777/release/fix-protocol-compatibility-20260508
[fix] Harden protocol compatibility from dev
2026-05-08 11:05:31 +08:00
cita-777andOmX 10dc1ba7bd Carry update center review test follow-up
This merge keeps PR #533 aligned with dev after addressing CodeRabbit follow-up test comments. The changes are limited to UpdateCenterSection test assertions.

Constraint: Release branch remains the publication branch for the open main-targeting PR.

Confidence: high

Scope-risk: narrow

Tested: npx vitest run --root . src/web/pages/settings/UpdateCenterSection.test.tsx

Tested: npm run typecheck:web

Co-authored-by: OmX <omx@oh-my-codex.dev>
2026-05-08 10:50:25 +08:00
cita-777andOmX fee6a6388f Tighten update center review test coverage
CodeRabbit follow-up review pointed out that one renderer assertion could not fail usefully and that the new recent-candidate deploy test did not prove log streaming after dispatch. The test now asserts the visible candidate text directly and covers streamUpdateCenterTaskLogs for the new deploy path.

Constraint: Keep review follow-up scoped to test coverage only.

Confidence: high

Scope-risk: narrow

Tested: npx vitest run --root . src/web/pages/settings/UpdateCenterSection.test.tsx

Tested: npm run typecheck:web

Co-authored-by: OmX <omx@oh-my-codex.dev>
2026-05-08 10:50:10 +08:00
cita-777andOmX 00348e0528 Carry protocol review fixes into release
The release branch is main-based and tracks the reviewed dev slice for PR publication. This merge carries the post-review compatibility fixes without rewriting the already-open PR history.

Constraint: PR #533 publishes dev changes through a clean release branch targeting main.

Rejected: Recreate the PR branch from scratch | unnecessary churn after green checks and review context already exist.

Confidence: high

Scope-risk: narrow

Tested: npx vitest run --root . src/server/proxy-core/responsesPreflight.test.ts src/server/proxy-core/serviceTierPolicy.test.ts src/server/routes/proxy/chat.stream.test.ts src/web/pages/settings/UpdateCenterSection.test.tsx

Tested: npm run typecheck:server

Tested: npm run typecheck:web

Tested: npm run repo:drift-check

Co-authored-by: OmX <omx@oh-my-codex.dev>
2026-05-08 10:43:12 +08:00
cita-777andOmX 8309ac073a Close protocol compatibility review gaps
Review feedback found narrow compatibility regressions in the web-search shim, Responses tool detection, service tier accounting, and update-center Docker candidate actions. The fix keeps synthetic search routed through the dedicated search model, preserves Responses text compatibility, distinguishes absent service_tier from filtered service_tier, and evaluates recent Docker tags per candidate.

Constraint: Review fixes must stay on dev first, then flow into the main-based release PR branch.

Rejected: Leave Responses web_search simulation on the request model | it has the same search-route selection risk as Anthropic simulation.

Confidence: high

Scope-risk: narrow

Tested: npx vitest run --root . src/server/proxy-core/responsesPreflight.test.ts src/server/proxy-core/serviceTierPolicy.test.ts src/server/routes/proxy/chat.stream.test.ts src/web/pages/settings/UpdateCenterSection.test.tsx

Tested: npm run typecheck:server

Tested: npm run typecheck:web

Tested: npm run repo:drift-check

Co-authored-by: OmX <omx@oh-my-codex.dev>
2026-05-08 10:42:49 +08:00
cita-777 207ab5cedf Prepare protocol compatibility release 2026-05-08 00:32:50 +08:00