Skip to content

Feat/redis mysql account store - #5955

Merged
qin-ctx merged 17 commits into
volcengine:mainfrom
runyunzhou:feat/redis-mysql-account-store
Oct 14, 2026
Merged

qin-ctx merged 17 commits into
volcengine:mainfrom
runyunzhou:feat/redis-mysql-account-store

Conversation

@runyunzhou

@runyunzhou runyunzhou commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Description

为 Account Store 新增 mysql 与 redis_mysql 两个分布式 Provider,使 Account / User / Group / API Key 的持久化可以从单机 File(AGFS JSON)后端平滑切换到以 MySQL 为权威存储、Redis 为共享认证缓存的多副本部署形态。本 PR 基于已合入 main 的可插拔 AccountStore 抽象(#5933),只新增 Provider 实现与装配,不改动既有 File 后端的行为语义。

Human Involvement

  • A human participated in the implementation or review loop
  • This PR was generated entirely by AI agents without human participation in the loop

Related Issue

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Refactoring (no functional changes)
  • Performance improvement
  • Test update

Changes Made

  • MySQL Provider(权威存储):以关系表落地 Account / User / Group / Credential,使用内部 account_pk / user_pk 主键,业务 ID 作唯一键;外键约束保证 Group/User 不跨 Account,生成列唯一键保证每个 User 最多一个活动 Key。Account 行用 FOR UPDATE 串行化角色变更、成员增删、删除 fence 与 Key 轮换,过滤/分页/计数全部下推 SQL;所有表与查询均带必填的 resource_id 分区键。API Key 默认存版本化 SHA-256 摘要并建独立摘要索引做常量代价查找。
  • Redis-MySQL Provider(认证缓存):MySQL 保持权威,Redis 缓存 API binding、Account revision、User principal;缓存 miss 走 Account 范围 Redis 租约 + 二次检查 + Lua owner/revision 写入,命中时校验 account_pk/user_pk/credential_id/revision,避免旧 Key 与同名重建 User 串联;MySQL 增加独立 auth_revision 字段覆盖认证语义变化;首次创建凭据后主动失效 Redis 负缓存。
  • Keyless 建号兼容:实现 main Refactor/account store provider #5933 新增的抽象方法 create_account(无 Key 建号,服务于 trusted keyless 身份),在 MySQL/Redis Provider 中补齐,保证两者可实例化并与 File Provider 的 keyless-admin 创建语义一致。
  • 装配与配置:store_assembly 硬编码 file / mysql / redis_mysql 分支装配;新增 config.py Provider 参数透传;新增 SQL 初始化脚本与变更模板(sql/init.sql、sql/changes/0000_template.sql);pyproject.toml / uv.lock 增加 SQLAlchemy / Redis 等依赖(并约束兼容的 SQLAlchemy 版本)。
  • 文档:更新中英文 01-configuration.md,说明 account_store.provider 新增 mysql / redis_mysql 取值及 Redis 缓存语义。

Redis 缓存一致性语义

  • 架构定位:MySQL 是唯一权威存储,Redis 只作认证/身份读缓存,绝不进入写链路前置依赖。写操作先提交 MySQL,提交成功后再 best-effort 失效相关缓存 key。
  • 正常业务流程 = 失效即一致(读己之写):任意成功返回的写操作(建号 / 建用户 / 改角色 / 轮换或撤销 Key / 组成员变更 / 删除 Account/User)在 MySQL 提交后会同步失效对应缓存;因此调用方拿到成功响应后,后续请求读到的即是最新数据,不依赖 TTL。缓存回填走「读 miss 加 Account 范围 Redis 租约 → Lua 二次检查 → 携带 MySQL revision 条件写」,并校验 account_pk/user_pk/credential_id/revision,避免旧 Key 与同名重建 User 串联、以及旧 reader 把过期值写回。
  • 最终一致(TTL 收敛)只在异常兜底时触发:仅当 MySQL 已提交但缓存失效这一步没能落地时,旧值才交由固定 TTL(默认 60s,可配 redis.ttl_seconds)收敛。典型场景:
    • Redis 不可用 / 网络分区:失效命令发不出去或超时(此时 MySQL 写入照常成功,不被 Redis 故障阻塞);
    • 节点崩溃 / 非优雅退出:进程在「MySQL 已提交」与「缓存已失效」之间中断(优雅重启会等读写请求完成,正常不产生该窗口);
    • 并发读写竞态下的锁租约到期等极低概率边界:条件写用 lock token + revision 比较拦截陈旧回填,极端下最多短暂穿透到 MySQL,不会固化脏缓存。
  • 可用性取舍:明确接受「Redis 故障时旧鉴权最多残留一个 TTL 周期」,换取 Redis 故障时系统仍可正常读写;Redis 恢复后缓存自然重建。

Testing

uv run ruff check openviking/server/account_stores/ tests/server/test_redis_mysql_account_store.py tests/server/test_account_services.py tests/server/test_store_assembly.py
uv run python -m pytest tests/server/test_redis_mysql_account_store.py tests/server/test_account_services.py tests/server/test_store_assembly.py tests/server/test_api_key_manager.py tests/server/test_auth.py tests/server/test_identity_auth.py tests/server/test_admin_api.py tests/server/test_bot_studio.py -q
  • 结果:427 passed, 1 skipped(跳过项为需要真实 OV_TEST_MYSQL 实例的 MySQL 集成测试)

  • Ruff:All checks passed

  • git diff --check:通过

  • I have added tests that prove my fix is effective or that my feature works

  • New and existing unit tests pass locally with my changes

  • I have tested this on the following platforms:

    • Linux
    • macOS
    • Windows

Checklist

  • My code follows the project's coding style
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • Any dependent changes have been merged and published

Screenshots (if applicable)

Additional Notes

  • mysql / redis_mysql 为生产部署形态,默认 Provider 仍为 file,不影响既有单机部署。
  • MySQL 不在应用启动时自动建表,表结构变更需显式执行 sql/init.sql 及后续迁移脚本(生产环境避免隐式 DDL)。

@ZaynJarvis ZaynJarvis added the kernel Core server, runtime, storage, retrieval, SDK, and CLI. label Oct 13, 2026
@runyunzhou
runyunzhou force-pushed the feat/redis-mysql-account-store branch from 3d4ae20 to 6407d96 Compare October 13, 2026 12:57
Comment thread openviking/server/account_stores/redis_mysql.py Outdated

@qin-ctx qin-ctx left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个方向有合入价值:MySQL 统一持久化账号和凭据,Redis 为多副本共享认证缓存。当前需要先解决 trusted 自动注册的入口校验与落库限制不一致的问题;一个长用户 ID 会让同批正常身份持续无法注册。

本次提交 1 条阻塞问题和 1 条非阻塞存储设计意见,具体见行级评论。

Comment thread openviking/server/account_stores/mysql.py
Comment thread openviking/server/account_stores/mysql.py
@runyunzhou
runyunzhou requested a review from qin-ctx October 14, 2026 07:27

@qin-ctx qin-ctx left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

上轮指出的 trusted 注册阻塞和旧凭据持续增长已经修复。MySQL 持久化账号、Redis 提供共享认证缓存的方向有合入价值。

本轮两条阻塞问题均来自上轮评审后新增的 Redis 拓扑支持提交(d31f49d):standalone TLS 连接在初始化时失败,以及新增测试使标准测试环境在收集阶段失败。具体见行内评论,需要在合并前解决。

Comment thread openviking/server/account_stores/redis_client.py
Comment thread tests/server/test_redis_client.py Outdated
@runyunzhou
runyunzhou requested a review from qin-ctx October 14, 2026 12:02
@qin-ctx
qin-ctx merged commit 6cf6767 into volcengine:main Oct 14, 2026
5 checks passed
@github-project-automation github-project-automation Bot moved this from Backlog to Done in OpenViking project Oct 14, 2026
yenchang265-afk added a commit to yenchang265-afk/OpenViking that referenced this pull request Oct 15, 2026
* feat(docs): send copy and search events to Google Analytics (volcengine#5990)

The docs site has GA4 but no key events, so traffic can be measured
but intent cannot. Send the actions that signal someone is about to
install or integrate OpenViking:

- copy_code: code block copy button, with the block language
- copy_agent_prompt: AgentPrompt copy button
- copy_markdown: "copy page as Markdown"
- docs_search: the existing search event, now also sent to GA

trackEvent still reports to Viewer-Counter and additionally calls gtag
when it is loaded; GA event names use underscores.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(integrations): add Microsoft Agent Framework context provider (volcengine#5578)

* feat(integrations): add Microsoft Agent Framework context provider

Signed-off-by: Hao Zhe <haozhe4547@gmail.com>

* fix(agent-framework): preserve streamed loop capture

Signed-off-by: Hao Zhe <haozhe4547@gmail.com>

* feat(agent-framework): add capture and commit policies

Signed-off-by: Hao Zhe <haozhe4547@gmail.com>

---------

Signed-off-by: Hao Zhe <haozhe4547@gmail.com>

* feat(gateway): embed runtime and separate management access (volcengine#5960)

* feat(gateway): embed runtime with independent management permissions

Co-authored-by: TRAE CLI <traecli@bytedance.com>

* feat(studio): support gateway hosts and management-key access

Co-authored-by: TRAE CLI <traecli@bytedance.com>

* feat(gateway): add init setup and single-port deployment guides

Co-authored-by: TRAE CLI <traecli@bytedance.com>

* fix(gateway): keep data plane up when OpenViking is unavailable

- Delete a gateway key only on an explicit OpenViking 401; unreachable,
  5xx and identity-less /health responses let the request through with a
  revocation_check_unavailable degradation.
- v6 migration keeps v5 request URLs for path-prefixed bases
  (https://openrouter.ai/api -> .../api/v1); bases already ending in a
  version segment such as /api/paas/v4 are left as entered.
- Replace record_request bookkeeping with log(user_id) + save(ttl); capture
  paused rows are now written. Delete management rows before kernel scopes.
- /test reports upstream_key_missing without sending a request; re-importing
  VLM settings refreshes source fields only; degraded probes back off.
- Host-agnostic create_app plus a small host API (seed_defaults,
  import_vlm_objects, delete_data); standalone startup moves to
  standalone.py. Management routes are registered per object.
- Server injects the gateway app into DeletionService, forwards WebSockets
  to the gateway, shares ScopedRoute with /mcp and skips the version gate.
- VLM import defaults provider to openai, strips OpenAI-compatible LiteLLM
  route prefixes and skips non-OpenAI routes; Kimi/GLM normalization is
  shared with the VLM backends.

* refactor(studio): derive gateway permissions from /access

- Keep one management-key event; drop the access-changed/expired events,
  local import-forbidden state and redundant invalidations.
- Derive readOnly and canIssueForOthers once in useGateway; choose the
  navigation list by host type; remove unreachable probe branches.
- Changing an upstream address requires re-entering the API key and
  header values; issuing for yourself never asks to paste a key.
- Map upstream_key_missing, litellm_unsupported_route and
  revocation_check_unavailable; unify key terminology and plural forms.

* docs(gateway): restructure guides and harden upgrade path

- Give each fact one home: concepts and quick start in 15, operations in
  22, the API contract (permissions, reasons, /test results) in 25.
- Split the quick start into local and remote paths and restore the
  memory check; redraw the architecture diagram for both deployments.
- Helm keeps gateway.existingSecret for the encryption key and adds
  gateway.managementKeySecret; Compose no longer passes an empty
  management key.
- The setup wizard drops removed gateway fields and stale 1935 public URLs
  and revisits gateway access when switching between local and remote.

* docs(gateway): rewrite gateway guides for readability

Rewrite the zh and en gateway guides, API reference and Helm notes from the
reader's side: one home per fact, plain wording, behaviour checked against
the code (503 statuses, management key without account_id, key removal
timing, read tool requirement for catalogs, schema errors on downgrade).

* fix(studio): polish gateway copy and states found in a browser walkthrough

- Rewrite zh-CN and en gateway strings around the next step.
- Sign-in separates a rejected OpenViking API key from an unreachable
  OpenViking or gateway.
- Upstream editor: fix buttons sit in the notice action, no duplicate
  default-address link, saved-secret badge drops once the address changes.
- Read-only editors hide placeholders and add/remove controls.
- The issue dialog only asks to paste a key when the server says it cannot
  read it; older servers omit api_key_available.
- Import notice omits empty counts; overview wording fits imported-only
  upstreams.

* fix(gateway): ignore removed v0.5.0 gateway fields with a warning

v0.5.0 configs and the old Helm chart write host, port, workers, url,
openviking_url and admin_token_env into ov.conf. Rejecting them stopped the
whole OpenViking server, not just the gateway, after an upgrade. Drop them
and log a migration hint instead; unknown fields still fail validation.
The old sidecar command keeps failing on its own because the standalone
CLI no longer accepts ov.conf, so the server cannot end up beside a second
gateway on the same store.

* fix(gateway): retry the WAL switch when workers open a store together

Switching a new or v5 SQLite store to WAL needs an exclusive lock, and
SQLite reports a concurrent switch as "database is locked" immediately
instead of waiting for the busy timeout. With several workers starting at
once, one of them could fail on first start or on the v5 upgrade.

* refactor(gateway): one config schema and reuse OpenViking encryption

- Embedded (ov.conf "gateway") and standalone (gateway.conf) share one
  schema; a non-empty OPENVIKING_GATEWAY_<FIELD> overrides the file on both
  hosts. encryption_key_env joins the removed fields that are ignored with
  a warning.
- openviking-gateway takes only --config, looks up gateway.conf like the
  server looks up ov.conf, and gains an "init" subcommand that probes
  OpenViking and writes ~/.openviking/gateway.conf (0600).
- Stored values are encrypted with openviking.crypto when OpenViking
  encryption is enabled (the server's settings when embedded, an
  "encryption" block in gateway.conf when standalone) and kept as plain
  JSON otherwise. The gateway's own Fernet key file is gone.
- The v6 migration re-encodes v0.5 Fernet data in every table using the old
  key from OPENVIKING_GATEWAY_ENCRYPTION_KEY or encryption.key, waiting up
  to ten minutes for the migration lock, and refuses to start without it.

* chore(deploy): pass gateway secrets through one optional Secret

gateway.existingSecret becomes optional and feeds
OPENVIKING_GATEWAY_MANAGEMENT_KEY plus, for the upgrade release only,
OPENVIKING_GATEWAY_ENCRYPTION_KEY. managementKeySecret and the configmap
$VAR injection are removed; Compose passes both variables.

* docs(gateway): document gateway.conf, init and encryption reuse

Describe the shared field table, the environment override rule, both init
paths, encryption following OpenViking, and the one-time v0.5 data
migration. Studio hints point at gateway.conf and the new variables.

* fix(gateway): keep init non-interactive-safe and load the root key at startup

- openviking-gateway init keeps a "$VAR" OpenViking URL as written instead
  of forcing a literal one, and exits on an invalid URL when there is no
  terminal instead of prompting forever.
- The standalone CLI loads the encryption root key once before uvicorn
  starts workers, so bad Vault/KMS/local settings stop startup and workers
  never race to create the local key file.

* refactor(gateway): serve every gateway URL under /gateway

The server mounts the gateway app once at /gateway instead of forwarding
/v1, /api/v3, /api/compatible/v1, /gateway and /api/v1/admin/gateway, so it
no longer claims OpenAI-style root paths. Model APIs move to /gateway/v1,
/gateway/api/v3 and /gateway/api/compatible/v1, the management API to
/gateway/admin, and the upload relay stays at /gateway/uploads. The
standalone host mounts the gateway the same way and keeps Studio, the
OpenViking allowlist and /health at the root. public_url is the external
origin; the gateway appends its mount path. Route labels in metrics and
request logs keep the mount prefix.

* docs(gateway): point clients and Studio at the /gateway prefix

Studio calls /gateway/admin and renders client snippets from the /gateway
base. Guides, API reference, Helm notes and the migration section use
/gateway/v1, /gateway (Claude Code) and /gateway/api/v3.

* docs(gateway): link the animated walkthrough on the website

* docs(gateway): drop the language path from the walkthrough link

* docs(gateway): use the docs-site domain for the walkthrough link

* fix(gateway): address review findings on availability, issuing and config

- Skip the per-request identity check while OpenViking is already marked
  unavailable, and clear that mark on any successful identify; probe every
  second until OpenViking first answers so embedded startup does not leave
  recall off for up to a minute.
- Keep a configured x-api-key header on chat and responses upstreams.
- Require root to name the user it issues a key for (user_required) and
  look up only that user's credential.
- Read the tool catalog for root with a key issued in the account, since
  OpenViking refuses root on /mcp.
- Ignore kubelet service-link values (tcp://, udp://) in environment
  overrides.

* docs(gateway): fix Studio reasons, address hints and operator notes

Studio shows the unreachable-OpenViking text, gives host-specific
public_url hints, and keeps the dedicated unreachable card for standalone
gateways. Docs drop the unreleased managementKeySecret note and the
unconditional workers advice, state the config lookup precisely, and
document user_required and how root reads the tool list.

* feat(gateway): enable the embedded gateway from the container environment

Compose passes OPENVIKING_GATEWAY_ENABLED, so one line in .env (or -e on
docker run) turns the gateway on without editing ov.conf. An embedded
gateway without its own public_url now uses the server's public address
(OPENVIKING_PUBLIC_BASE_URL, then server.public_base_url), the same one
MCP upload links use, so containers configure a single external address.

* feat(studio): enable the embedded gateway from the Gateway page

The Gateway entry now shows for every signed-in user. When the gateway is
off, root on a server with writable ov.conf gets an Enable button: Studio
writes gateway.enabled (and optionally a generated ovgm_ management key,
shown once) through the existing configuration API, restarts the server
and opens the gateway. Multi-worker servers get a manual-restart notice,
read-only ov.conf shows the environment and Helm alternatives, rollbacks
and revision conflicts are reported, and other users are told to ask the
deployer. No backend changes.

* fix(retrieval): bound session search intent analysis (volcengine#6007)

* fix(retrieval): bound session search intent analysis

* fix(retrieval): expose intent analysis fallback status

* fix(retrieval): keep intent timeout change focused

* test(retrieval): focus intent fallback coverage

* feat(cache): 增加顶层 service_name 配置, 删除 namespace/cache_key_prefix  ,使用service_name 统一管理 (volcengine#6011)

* docs: update readme (volcengine#6021)

* refactor(cache): 统一 cache key format (volcengine#6014)

* refactor(model): 统一 VLM 与 Embedding 重试策略 (volcengine#5950)

* refactor(vlm): centralize retry handling

* test(vlm): 补充统一重试边界回归

* refactor(vlm): 收紧统一重试层改动范围

撤回全局错误分类和无关 API 扩张,使本次改造仅聚焦 VLM 重试职责收拢。

* refactor(embedding): 统一模型重试职责

将重试决策集中到 RetryEmbedder,避免 Provider 与 SDK 重试叠乘,同时保持组合模型和账号资源语义。

* fix(embedding): 恢复 Gemini 429 重试

---------

Co-authored-by: zhanghe.1216 <@bytedance.com>

* fix(storage): 保持写入锁直到异步索引完成 (volcengine#6016)

* fix: 延长 content write 文件锁至异步索引完成

* fix: 延长 batch write 批量锁至异步索引完成

---------

Co-authored-by: zhanghe.1216 <@bytedance.com>

* fix(langchain): recognize SDK system health flag (volcengine#5878)

Co-authored-by: r266-tech <r266-tech@users.noreply.github.com>

* fix(storage): sanitize persisted search tags on index writes (volcengine#5862)

* fix(storage): sanitize persisted search tags on index writes

* test(api): settle ancestor refreshes before directory copy

* fix(memory-plugin): carry OPENVIKING_EXTRA_HEADERS on the runtime path and fail on a non-JSON 2xx (volcengine#5988)

* fix(memory-plugin): send the operator's gateway headers on the runtime path

OPENVIKING_EXTRA_HEADERS only reached the stdio MCP proxies (volcengine#5065). The turn-hook
path goes through createOvHttp, which never consulted the environment, so a harness
behind an authenticating gateway sent its captures and recalls without the headers
the gateway requires.

createOvHttp now falls back to parseExtraHeaders(process.env.OPENVIKING_EXTRA_HEADERS)
when the caller passes no map, which keeps the MCP proxies' explicit map authoritative
and gives every other harness the documented escape hatch.

The same scenario exposed a second problem: a gateway answers a header-less request
with its login page at 200/text-html, and the client read only the status, so the
harness reported a connected server while every request went to that page. A 2xx whose
body is not JSON and whose content-type is not JSON is now a failure.

Verified against a self-hosted deployment behind Cloudflare Access through dsh's own
client: /health, session create, message and commit all 200 with the gateway headers;
without them the same client now reports ok=false instead of ok=true.

tests: three cases in ov-http.test.mjs (env headers on the wire, an explicit map still
wins, a 200/text-html is a failure). node --test examples/memory-plugin-shared/*.test.mjs
-> 545 passed, 0 failed.

* chore(memory-plugin): move every distributed plugin version for the shared-lib change

The shared runtime in examples/memory-plugin-shared/lib reaches all six distributed
plugins, and hosts install by the version string in each manifest, so
check-plugin-version-bumps.sh requires each of them to move. Bump the manifests, the
agent-hook host manifests that pair with plugin.json, the dsh wire version reported by
config.mjs, and the two lockfiles that `npm ci` validates.

* chore(memory-plugin): take the version numbers past what main already carries

Merged main into the branch: volcengine#5994 bumped agent-hook, opencode and pi while this PR was
open, so the first bump landed on the same strings main now has and the version check
still saw "changed but not moved". Move those three one patch further (and pi's lockfile
with it); the three others already differ from main.

* perf(retrieval): align default intent planner with compact v4 prompt (volcengine#6039)

* perf(retrieval): compact default intent planner output

* test(retrieval): keep default planner aligned with v4

* fix(api): 修正输入错误与模型失败的 HTTP 状态码 (volcengine#6045)

将非法正则、Skill YAML、ZIP 和搜索字符归为参数错误;保留模型原始异常类型,同类失败返回对应状态,混合失败保留 500。

* fix(svg): 补齐 SVG 转 PNG 所需的运行依赖 (volcengine#6049)

* fix(svg): 补齐 SVG 转 PNG 所需的运行依赖

补充 CairoSVG、Docker Cairo 系统库和安装说明,避免正常 SVG 因依赖缺失导入失败。

Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>

* chore(svg): 移除部署文档改动

Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>

---------

Co-authored-by: qin-ptr <222410531+qin-ptr@users.noreply.github.com>
Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>

* refactor(api)!: 移除等待专用 timeout 参数 (volcengine#6048)

* refactor(api)!: 移除等待专用 timeout 参数

保留 wait 和客户端 HTTP 超时配置,同步服务端、SDK、CLI、MCP、插件与文档。

BREAKING CHANGE: 等待相关接口和命令不再支持单独的 timeout / --timeout 参数。

* refactor: 清理等待适配与过时测试

* feat(cli): support list and context search modes (volcengine#5951)

* feat(cli): support list and context search modes

* fix(cli): surface context retrieval failures

* test(cli): consolidate search mode contract coverage

---------

Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>

* fix(snapshot): 复用外层目录锁完成加密快照恢复 (volcengine#6052)

Co-authored-by: qin-ptr <222410531+qin-ptr@users.noreply.github.com>
Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>

* test(queuefs): support script-aware cache mocks (volcengine#6055)

Co-authored-by: TRAE CLI <traecli@bytedance.com>

* fix(openwebui): validate session IDs before forwarding requests (volcengine#6059)

Reject URL syntax and empty or dot-only path segments at the session
status tool boundary so callers cannot alter the upstream endpoint.

* fix(ci): 修正 API 契约断言和工作流配置 (volcengine#6062)

对齐现有 API 契约与 SVG 支持,避免旧断言阻塞后续集成检查。
修复 pnpm 安装策略冲突、测试数据版本检查误报和 Pages 并发部署冲突。

* fix(memory): preserve Markdown structure in resource links (volcengine#6054)

* fix: 兼容索引 ACL 列表中的空字符串 (volcengine#6067)

* Feat/redis mysql account store (volcengine#5955)

* feat(account-store): add MySQL and Redis providers

* fix(account-store): harden distributed providers

* fix(mysql): require compatible SQLAlchemy version

* fix(mysql): lock trusted identity provisioning

* fix(redis): harden account cache consistency

* refactor(account-store): simplify provider contract coverage

* fix(account-store): preserve fresh user lookup

* fix(mysql): validate account identifier lengths

* test(account-store): keep shared auth coverage in base

* test(account-store): validate configured provider

* fix(account-store): implement keyless create_account for distributed providers

Main's volcengine#5933 added the abstract AccountStore.create_account to support
trusted keyless identity provisioning. Implement it in the MySQL and
Redis/MySQL providers so they remain instantiable and preserve the
file provider's keyless-admin creation semantics.

* fix(account-store): isolate providers by service name

* fix(account-store): bound identity and credential history

* feat(account-store): support Redis deployment topologies

* fix(account-store): handle Redis TLS and test dependencies

* test(account-store): consolidate provider contract coverage

---------

Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>

* docs: 新增数据组织指引,并支持 MCP add_resource parent 自动建目录 (volcengine#6060)

* test(queuefs): support script-aware cache mocks

Co-authored-by: TRAE CLI <traecli@bytedance.com>

* docs: add 23-data-organize.md guide

Co-authored-by: TRAE CLI <traecli@bytedance.com>

* fix(mcp): 内联资源目录约定,移除运行时不可读的文档引用

Co-authored-by: TRAE CLI <traecli@bytedance.com>

* docs(data-organize): 补充日历路径变量提示,projects 行移至表末并强调可选

Co-authored-by: TRAE CLI <traecli@bytedance.com>

---------

Co-authored-by: TRAE CLI <traecli@bytedance.com>

* fix(web-studio): stop sending the wait timeout the server removed

Upstream volcengine#6048 removed the wait-only timeout parameter, but Studio
still sent it: with "Wait for processing" and a timeout filled in, the
add-resource form posted `timeout`, which AddResourceRequest now
rejects with 422, and the terminal's /wait passed a body the
regenerated client types as never.

Drop the Wait Timeout field and its strings, and make /wait take no
arguments (anything after it shows the usage). HTTP request timeouts
stay the client's setting, as upstream documents.

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

* chore(docker): drop the PathLock namespace removed upstream

Upstream volcengine#6011 replaced storage.agfs.pathlock.namespace with the
top-level service_name, and the RAGFS config loader now rejects the old
field. Remove it from the compose ov.conf example and the Redis profile
snippet, and note that service_name namespaces the Redis keys.

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

* fix(ragfs): build the cached write_from_path test with a service name

Upstream volcengine#6014 replaced CacheNamespace with a plain service name in
MountableFS::with_cache_runtime, so the fork's streaming-I/O cache test
no longer compiled. Pass the name directly, as upstream's tests do.

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

* fix(web-studio): drop the WaitRequest re-export the client no longer has

Upstream volcengine#6048 removed WaitRequest from the generated types but left it
in index.ts, which fails type-checking.

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

* fix(config): restore the S3 multipart settings lost in the upstream merge

Stage 3 resolved agfs_config.py by taking upstream's file whole, which
also dropped the fork's multipart_threshold_bytes and
multipart_part_size_bytes S3 fields. Pydantic ignores unknown fields,
so configured multipart settings would silently stop reaching s3fs.
Restore both fields; test_config_validation covers them again.

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

---------

Signed-off-by: Hao Zhe <haozhe4547@gmail.com>
Co-authored-by: Zayn Jarvis <zaynjarvis@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: z1gon <130889443+ehz0ah@users.noreply.github.com>
Co-authored-by: t0saki <15712521+t0saki@users.noreply.github.com>
Co-authored-by: Lusen Dong <cicomaple@gmail.com>
Co-authored-by: baojun-zhang <zhangbaojun.1@bytedance.com>
Co-authored-by: MaojiaSheng <shengmaojia@bytedance.com>
Co-authored-by: hezhang-1216 <zhanghe.1216@bytedance.com>
Co-authored-by: Evo <r2668940489@gmail.com>
Co-authored-by: r266-tech <r266-tech@users.noreply.github.com>
Co-authored-by: Xinmin Zeng <135568692+fancyboi999@users.noreply.github.com>
Co-authored-by: xiebaiyuan <xiebaiyuan@139.com>
Co-authored-by: Qin Haojie <qinhaojie.exe@bytedance.com>
Co-authored-by: bot-of-qin-ctx <qin_haojie@qq.com>
Co-authored-by: qin-ptr <222410531+qin-ptr@users.noreply.github.com>
Co-authored-by: dingben <1162833047@qq.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: zhanggaoyuan <1670519171@qq.com>
Co-authored-by: chuanbao666 <sunchuanbao@bytedance.com>
Co-authored-by: runyunzhou <164479727+runyunzhou@users.noreply.github.com>
Co-authored-by: root <root@DESKTOP-97A9VQ8.localdomain>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

kernel Core server, runtime, storage, retrieval, SDK, and CLI.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants