Skip to content

merge(main): merge v2.6.0 release from develop - #3946

Merged
jeffwu-1999 merged 90 commits into
mainfrom
develop
Sep 16, 2026
Merged

jeffwu-1999 merged 90 commits into
mainfrom
develop

Conversation

@jeffwu-1999

@jeffwu-1999 jeffwu-1999 commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Merge latest develop into main for the v2.6.0 release. No conflicts
(develop synchronized with main via #3945).

Changes

Notes

  • v2.6.0 tag: d5d345a (will be updated to latest)
  • Docker image build triggered

JasonW404 and others added 30 commits August 31, 2026 15:41
* fix: update dreaming schema tests for merged migration

* fix: update knowledge scope migration test
* ✨ Feature: Add NL2Agent optimization suggestions

* 🐛 Bugfix: Align NL2Agent suggestion card spacing
* Refactor: 重构chat页面分页加载功能,默认加载30条

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Bugfix: 支持在北向接口的run接口中返回conversation_created的chunk

* add ut

* Bugfix: Remove redundant field validation

* Bugfix: Fix model name display in model selector dropdown

* Bugfix: Prevent loading stale agent info when agent_id does not exist

* Bugfix: update agent version when published

* Bugfix: Resolve agent stop failure in debug mode(by adding run id)

* fix ut

* Bugfix: default set nl2agent suggestion visible

* Bugfix: 更新单点优化策略

* Bugfix: 当用户配置了模型后模型被删除,有对应的提示

* add unavaliable reason

* fix ut

* fix ut

* fix ut

* agent不可用原因支持修改后刷新

(cherry picked from commit 0359088)

* 更新trigger的样式

* 修改agentName为空时前端报错

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit b089f87)
Co-authored-by: hhhhsc <name>
* feat: add nexent-infrastructure Helm chart with Elasticsearch, PostgreSQL, Redis, and MinIO deployments

* Add process health endpoints and probes

* Configure Helm services as ClusterIP

* Respect persistence mode when removing Kubernetes data

* Respect persistence mode when removing Kubernetes data

* Move health endpoints to apps layer and use local Kubernetes storage

* Synchronize official skills to the Kubernetes workspace PVC

---------

Co-authored-by: root <root@DESKTOP-UARO3HF.localdomain>
Co-authored-by: hhhhsc <name>
* ✨ Feature: Sandbox adaptation for Anthropic's skills.

* ✨ Feature: Sandbox adaptation for Anthropic's skills.

* ✨ Feature: Sandbox adaptation for Anthropic's skills.
* fix: restore unlimited tenant storage quota

* fix: allow clearing tenant hard quota

* fix: preserve quota input styling
* fix(agent-repository): resolve copied agent name conflicts

* fix(agent): prevent stale agent config flash

* test(agent): cover repository copy name conflicts
* ♻️ Remove deprecated app config stuff

* 🧪 Add test files

* 🧪 Add test files

* 🧪 Add test files
…ut) (#3838)

* Add docs to illustrate how to integrate resources (in/out)

* docs(integration): 完善集成文档结构(中英文拆分 + 智能体导出/发布)

- 拆分 integration-out 文档:agents.md -> agents-export.md + agents-publish.md
- 整合并精简 integration-in(agents / mcp / skills / overview)
- 更新 northbound-api.md 与 zh/integration/index.md
- 新增英文版 en/integration 镜像(含 integration-in、integration-out 全部页面)
- 调整 .vitepress/config.mts 侧边栏与导航,支持新增英文入口
- 更新 zh/mcp-ecosystem/overview.md 引用

* Add reference link to user guide
…ervice (#3843)

* refactor(core): slim agent skill and knowledge services

Extract reusable service boundaries, preserve deleted-model availability, and consolidate knowledge-base permission, list, and deletion flows.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5.6-sol

* ♻️ Refactor phase 1: agent_service / vectordatabase_service / skill_service

* ♻️ Refactor phase 1: agent_service / vectordatabase_service / skill_service

* 🧪 Add test files

* fix(agent): preserve repository naming after develop rebase

* ♻️ Refactor phase 1: agent_service / vectordatabase_service / skill_service

* 🧪 Add test files
…ontent (#3853)

* docs: disable cache for local main image build

* docs: update v2.5.0 Chinese documentation

* docs: update user-guide Chinese documentation

* docs: update pictures in agent-configuration and memory-configuration of user-guide Chinese documentation

* 根据重构后的文档结构调整了中英文内容和对应截图

* 根据中文文档的概览以及部署与升级的内容同步了对应的英文文档内容

---------

Co-authored-by: DoYX <du.yuxiao@gmail.com>
* Recover interrupted tasks on service startup

* Fix evaluation pure logic test stub

* Increase startup recovery test coverage

* Scope upload recovery by service and enforce single-replica restarts

---------

Co-authored-by: root <root@DESKTOP-UARO3HF.localdomain>
* fix(tag-mgmt): register legacy exception handlers + fix filter endpoint sync + add value usage index

- backend/apps/app_factory.py: register handlers for legacy domain
  exceptions (UnauthorizedError->401, ForbiddenError->403,
  LimitExceededError->429, ValidationError->400, NotFoundException->404,
  DuplicateError->409, TagManagementConflictError->409,
  SignatureValidationError->401) so they no longer fall through to the
  generic 500 handler. Verified live: unauthenticated tag endpoints now
  return 401 instead of 500.
- backend/apps/tag_management_app.py: convert filter_resource_tag_assignments
  from async/await to sync/_run to match the synchronous
  TagManagementDB.filter_authorized_resource_ids (which returns a dict, not a
  coroutine). Fixes TypeError -> HTTP 500 on the filter endpoint.
- deploy/sql: add partial index idx_resource_tag_assignment_value
  (tenant_id, value_id, delete_flag) WHERE delete_flag='N' via new migration
  v2.5.4_0820_tag_value_usage_index.sql and init.sql. Benchmark at capacity
  limits (100 defs / 100k values / 50k assignments) showed value-usage-count
  was a 102ms Seq Scan; with the index it becomes a 1.28ms Index Only Scan.
  Idempotent (IF NOT EXISTS).

* feat(tag-mgmt): unified tag management for KB/agent/MCP/skill resources

- Add tenant-scoped tag libraries, definitions, values and assignments
- Wire tag chips and filters into knowledge base, agent and MCP pages
- Add document tag projection ledger with provider sync
- Clean up assignments when KB/agent/MCP/skill resources are deleted
- Add preflight and migration scripts v2.5.0-v2.5.3
- Cache assignment reads on list pages to avoid per-row HTTP requests

* fix(tag-mgmt): migrate tag assignment entries and enable tag search for mine agents

* feat(tag-mgmt): complete unified tag assignment flows

* feat(tag-management): unify repository tag filters

* feat(tag-management): localize and search agent tags

* feat(tag-management): unify repository tag filtering

* fix(tag-management): migrate legacy agent categories

* fix(tag-management): restore rebased tag UI

* feat(tag-management): support no-value tags

* fix(tag-management): unblock CI checks

* chore(sonar): exclude mirrored tag SQL from CPD

* test(tag-management): raise patch coverage

* fix(tag-management): address review feedback

* fix: migrate tag services after management split
…rectly in Docker version 18.09 and earlier versions. (#3856)

* 🐛 Bugfix: Fixed an issue where sandbox containers failed to start correctly in Docker version 18.09 and earlier versions.

* 🐛 Bugfix: Fixed an issue where sandbox containers failed to start correctly in Docker version 18.09 and earlier versions.

* 🐛 Bugfix: Fixed an issue where sandbox containers failed to start correctly in Docker version 18.09 and earlier versions.
Co-authored-by: root <root@DESKTOP-UARO3HF.localdomain>
…ge separately (#3845)

* fix: separate source and Elasticsearch quota usage

* test: cover platform ES usage aggregation

* fix: restore knowledge storage label

* fix: simplify quota usage response fields
* docs: add agent evaluation user guide

* docs: refine agent evaluation navigation and guides

* docs: simplify evaluation task guidance

* docs: add agent evaluation overview screenshot

* docs: add with-set evaluation task screenshot

* docs: add no-set evaluation task screenshot

* docs: add AI evaluation set screenshot

* docs: add Chinese agent evaluation screenshots

* docs: fix evaluation guide whitespace
* Refactor: 重构chat页面分页加载功能,默认加载30条

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Bugfix: 支持在北向接口的run接口中返回conversation_created的chunk

* add ut

* Bugfix: Remove redundant field validation

* Bugfix: Fix model name display in model selector dropdown

* Bugfix: Prevent loading stale agent info when agent_id does not exist

* Bugfix: update agent version when published

* Bugfix: Resolve agent stop failure in debug mode(by adding run id)

* fix ut

* Bugfix: default set nl2agent suggestion visible

* Bugfix: 更新单点优化策略

* Bugfix: 当用户配置了模型后模型被删除,有对应的提示

* add unavaliable reason

* fix ut

* fix ut

* fix ut

* agent不可用原因支持修改后刷新

(cherry picked from commit 0359088)

* 更新trigger的样式

* 修改agentName为空时前端报错

* refactor(frontend): reorganize agent config tabs and fix NL2Agent focus routing

- Move knowledge_base and conversation_guide from advanced to basic tab
- Move tools_skills, run_strategy, publish_attributes to advanced tab
- Add section-to-tab mapping (BASIC_CONFIG_SECTIONS) for consistent routing
- Complete all section DOM refs for focus requests (run_strategy, publish_attributes, collaborative_agents, guardrail)
- Add activeConfigTab to focus effect dependencies to re-trigger scroll after tab switch
- Replace nested ternary with centralized sectionRefs map for maintainability

Co-authored-by: Claude Code <noreply@anthropic.com>
Generated-by: claude-opus-4-7
Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(agent-config): add security settings tab and reorganize sections

- Add new security tab to separate security-related configurations
- Move guardrail section from advanced tab to security tab
- Reorder advanced tab sections: tools and skills, collaborative agents, run strategy, publish attributes
- Update section-to-tab mapping to support security tab auto-navigation
- Preserve NL2Agent focus behavior for all sections including guardrail

Co-authored-by: Claude Code &lt;noreply@anthropic.com&gt;
Generated-by: claude-opus-4-7
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(frontend): 修复 nl2agent 完成后 Tab 切换失效问题

修复在 nl2agent 生成智能体后,外层配置 Tab(基本设置/高级设置/安全设置)
偶现无法切换的问题。

根本原因:
- configFocusRequest 被设置后未及时清除
- useEffect 依赖 activeConfigTab,导致每次 Tab 切换时重复触发
- 重复触发强制切回 basic tab,覆盖用户的点击操作

解决方案:
1. 新增 clearConfigFocusRequest 方法,在处理完聚焦请求后立即清除
2. 移除 useEffect 对 activeConfigTab 的依赖,避免循环触发
3. 通过 lastScrolledRequestRef 防止重复处理同一请求

影响范围:
- frontend/contexts/nl2AgentFlow.tsx: 新增清除方法
- frontend/app/[locale]/agents/agent-config.tsx: 修复 useEffect 逻辑
- frontend/app/[locale]/agents/components/agent-prompt.tsx: 代码清理

Co-authored-by: Claude Code <noreply@anthropic.com>
Generated-by: claude-opus-4-20250514
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(frontend): add i18n

* fix(frontend): update Select search configuration

Move the custom model filtering callback into the supported showSearch configuration to remove the Ant Design deprecation warning while preserving case-insensitive search behavior.

Co-authored-by: Cursor <noreply@cursor.com>
Generated-by: gpt-5.6-sol

* fix(markdown): disable raw HTML rendering

Treat raw HTML, including unclosed <code> tags, as non-renderable Markdown content.

Co-authored-by: Cursor <noreply@cursor.com>
Generated-by: gpt-5-codex

* fix(frontend): preserve config focus scrolling

Defer clearing the focus request until its scroll frame executes so effect cleanup cannot cancel the pending scroll.

Co-authored-by: Cursor <noreply@cursor.com>
Generated-by: gpt-5-codex

* feat(nl2agent): enable inline skill creation

Add inline Skill creation to the NL2Agent recommendation flow and persist the new Skill binding automatically.

Co-authored-by: Cursor <noreply@cursor.com>
Generated-by: gpt-5-codex

* fix(reasoning): require closing </code> tag in code parsing

Frontend was treating unclosed <code> tags as code blocks because
the regex accepted end-of-string as a valid terminator. This caused
model descriptions like "use <code>" to render as code blocks.

Backend parse_code_blobs() only extracts when a closing </code> is
present; this aligns the frontend with that behavior.

Co-authored-by: Cursor <noreply@cursor.com>
Generated-by: gpt-5-codex

* Revert "fix(reasoning): require closing </code> tag in code parsing"

This reverts commit 854bee8.

* Revert "feat(nl2agent): enable inline skill creation"

This reverts commit c5280d9.

* Revert "fix(markdown): disable raw HTML rendering"

This reverts commit 7c2ec98.

* update prompt

* test(nl2agent): align prompt contract assertions

Update bilingual assertions to match the current atomic-action prompt contract.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* docs(agent-config): document tab layout change

Record the approved layout and implementation plan before changing the agent configuration UI.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* refactor(agent-config): reorganize configuration tabs

Add a dedicated tools and skills tab, and move guardrails into advanced settings.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* docs(agent-config): plan capability collapsibles

Document the approved direct tools and skills collapsible layout.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* refactor(agent-config): split tools and skills sections

Render tools and skills as direct collapsible sections and preserve their existing actions.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* fix(agent-config): expand capability sections by default

Open both tools and skills sections when the configuration is initialized.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* fix(agent-config): map focus sections to config tabs

Map every NL2Agent focus section explicitly so tool and skill bindings open the tools-and-skills tab.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* Revert "feat: refactor label system (#3809)"

This reverts commit cdefcf4.

* fix(nl2agent): keep focus request ids monotonic

Preserve the focus request sequence when requests are cleared so later resource bindings are not discarded as duplicates.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* Reapply "feat: refactor label system (#3809)"

This reverts commit 8c77082.

* delete doc

* delete doc

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <noreply@cursor.com>
* ✨Feature: Logs are written to disk as files

* ✨Feature: Logs are written to disk as files

* ✨Feature: Logs are written to disk as files

* ✨Feature: Logs are written to disk as files: ut

* ✨Feature: Logs are written to disk as files: ut

* ✨Feature: Logs are written to disk as files: ut

* ✨Feature: Logs are written to disk as files: ut

* ✨Feature: Logs are written to disk as files: ut
* feat(memory): post-final-answer memory extraction via standalone LLM call

Squash merge of feat/final-answer-based-memory (2 commits):
- feat(memory): post-final-answer memory extraction via standalone LLM call
- fix(test): update memory_tool_prompt assertions for new action-steps-only policy

Adds automatic memory extraction after final_answer in _stream_agent_chunks(),
with a standalone LLM-based extractor service and updated memory tool prompt policy.

* feat(memory): add external_provider_top_k and external_provider_timeout to memory config system

- Add external_provider_top_k (default: 20) and external_provider_timeout (default: 30s) fields to MemoryUserConfig
- Add getter/setter functions in memory_config_service.py with validation (top_k: 1-100, timeout: 1-120s)
- Add API endpoints in memory_config_app.py for setting these configurations
- Add UI controls in MemoryManager.tsx with input fields and validation
- Update frontend memoryService.ts to load/save these configurations
- All changes respect memory_switch setting (disabled when memory is off)

* feat(memory): wire external provider search into create_agent_config()

- Query external providers at session start using configured top_k and timeout
- Convert MemorySearchResult to ExternalMemoryItem format
- Pass external_results to memory_context_service.build_context()
- Add graceful error handling (failures don't break session start)
- Respects memory_switch and external provider enabled settings
- Logs external provider search results and failures

* test(memory): add integration tests for session-start external retrieval

- Test full flow with multiple external providers
- Test provider timeout with partial results
- Test all providers fail gracefully (session continues)
- Test MMR dedup of duplicate content
- Test token budget enforcement
- All tests use mocks and follow existing integration test patterns

* feat(memory): implement Phase 3 external memory provider system

Backend:
- Add memory_provider_config_t and memory_provider_config_param_t tables for EAV configuration
- Add memory_external_ingest_event_log_t for audit logging
- Implement MemoryProviderConfigService for CRUD operations with validation
- Implement MemoryExternalProviderService for provider lifecycle management
- Implement MemoryIngestionEventService for ingest event handling
- Implement MemoryProviderPluginLoader for dynamic plugin loading
- Add memory_provider_app.py with REST API endpoints
- Add transparent proxy integration in memory_backend_adapter.py
- Add per-turn supplement hook in agent_service.py
- Add content hash dedup in normalizer.py
- Add elastic MMR candidate pool in mmr.py
- Add ExternalMemoryItem and related models to SDK

Frontend:
- Add ProviderConfigCard component for provider list display
- Add ProviderConfigDialog for provider configuration
- Add providerService for API integration

Deployment:
- Add SQL migration v2.5.0_0814_external_memory_provider.sql
- Update docker-compose.yml with plugin volume mapping
- Update k8s manifests with plugin directory configuration
- Update .env.example with new environment variables

Tests:
- Add comprehensive unit tests for all backend services
- Add integration tests for transparent proxy
- Add integration tests for per-turn supplement hook

* fix(memory): complete external provider integration

* docs(memory): clarify external plugin data directory

* test(memory): remove obsolete root mem0 script

* fix(deploy): correct external memory plugin mounts

* feat(memory): refine external provider management UI

* fix(ci): resolve external memory quality gate failures

* refactor(memory): reduce duplicated test setup

* test(memory): share database test stubs

* fix(memory): enable provider-controlled external ingest

* test: align suite with merged migrations

* test(memory): cover provider error and fanout paths

* test(memory): cover ingestion service construction

* fix(memory): support hosted Mem0 v3 writes

* refactor(memory): use latest Mem0 API exclusively

* fix(db): keep external memory schema in migration

* refactor(memory): move runtime imports to module scope

* docs(memory): add Mem0 Cloud E2E evidence

* style(memory): compact external provider cards

* style(memory): hide provider timeout summary

* chore(db): update external memory migration date

* docs(memory): remove PR documentation and evidence

* chore: remove local backend launcher

* refactor(memory): narrow external provider scope

* fix(deploy): mount memory plugins in production compose

* style(memory): use absolute backend imports
* docs: update and refine all Chinese documentation

This commit updates multiple Chinese documentation files:
1. Fix knowledge base tool usage example and notes
2. Correct MCP service file path reference
3. Add new office tool entries
4. Update MCP server name validation rules
5. Fix Kubernetes storage access mode configuration
6. Add northbound API documentation
7. Update SDK feature list and project structure
8. Correct frontend tech stack versions and directory structure
9. Update monitoring default configuration and add version notes
10. Refine multimodal module documentation
11. Update model module documentation with new features
12. Update frontend project structure and build options
13. Refine agent framework documentation and add sequence diagrams
14. Update devcontainer documentation and port mapping
15. Fix environment setup script paths and commands
16. Refine prompt development documentation structure
17. Update version management documentation and add database migration guide
18. Add new tool categories and update tool development specifications
19. Refine docker build documentation with new build flow and images
20. Update testing framework documentation structure and examples
21. Refine backend architecture documentation and add sequence diagrams
22. Update data process module documentation with new parameters and flow diagrams
23. Refine backend test documentation with pytest examples

* docs: (SDK)更新多份文档内容,修复细节并补充新模块

1.  修复向量数据库文档中的防火墙端口说明和混合搜索权重注释
2.  新增多模态模块文档并添加到侧边栏导航
3.  更新监控文档中的Collector版本和LLM调用函数签名
4.  补充数据处理模块的异常类型说明和libmagic依赖提示
5.  优化OpenTelemetry设计文档中的网络名称和配置说明
6.  重构模型和工具模块文档,补充多语言描述、接口细节和使用规范
7.  修正多模态示例文档中的方法调用注释

* docs: 更新文档与配置,完善项目文档体系

1. 调整pnpm workspace配置允许esbuild构建
2. 更新开发启动命令与devcontainer路径
3. 补充技能系统文档模板与导航菜单
4. 修正docker镜像构建标签与说明
5. 升级前后端文档目录与技术栈描述
6. 扩充后端测试文档示例与最佳实践
7. 修复文档换行与格式问题

* docs: update all English documentation

更新了全量英文文档内容,包含:
1. 修复开发服务器启动命令、知识库工具参数说明
2. 更新路径引用、服务器名称规则和多模态文档说明
3. 新增北向开放API文档、项目目录结构和技术栈更新
4. 补充网关适配器架构、记忆系统、评测能力等SDK特性
5. 更新技能模板结构、文档提示词开发指南和前端目录结构
6. 完善版本管理、Docker构建和测试文档
7. 重构后端目录结构和架构说明

* docs: add mermaid diagram support and update doc navigation

1.  新增mermaid依赖并实现可拖拽缩放、全屏的流程图渲染组件
2.  完善中英文文档的侧边导航菜单结构
3.  新增Kibana本地开发跨域白名单

* feat(docs): add sidebar-local search and polish search style

新增侧边栏搜索入口,配置多语言本地搜索,并优化全局搜索弹窗的UI样式,提升文档站搜索体验

* docs: 更新中英文贡献者文档的团队分工与人员列表

重构了文档内的团队职位分类,替换为行业通用的Maintainers、Committers等角色分类,补充了完整的github链接,移除了过时的成员条目并更新了运营经理信息。

* docs: 统一修改文档中的架构/流程类标题

将多处"数据流架构"相关标题统一调整为更贴合内容的命名,包括中文和英文文档中的对应标题,让文档标题和实际内容描述更匹配。
…tions into v2.5.2 (#3861)

* fix: move one-time tag SQL out of init.sql and consolidate #3809 migrations into v2.5.2

- Remove the TAG_LIBRARY permission seed DML from init.sql; it is a
  one-time migration step and re-running init.sql on upgraded clusters
  crashed the config pod with a duplicate role_permission_t primary key.
- Consolidate the eight PR #3809 incremental migrations into a single
  versioned v2.5.2_unified_tag_management.sql wrapped in one transaction,
  with a role_permission_t sequence repair before the permission seed so
  upgraded clusters never collide on generated ids.
- Keep init.sql limited to idempotent final tag schema DDL; per-tenant
  seeding stays inside provision_unified_tag_management().
- Update and extend the SQL migration test suite: consolidation contract,
  built-in Agent Category preset accounting in trigger/concurrency
  boundary tests, and a repaired document tag projection test that now
  exercises init.sql plus the full migration chain on a fresh database.

* fix: move unified tag schema out of init.sql

* fix: assign reserved role permission IDs to TAG_LIBRARY grants

The v2.5.2 unified tag migration now writes TAG_LIBRARY/MANAGE role permission rows with the reserved IDs agreed with the admin (SU=41, ADMIN=92, SPEED=229, ASSET_OWNER=230), normalizes legacy auto-generated IDs, fails closed when a reserved ID is occupied by a different grant, and repairs the role_permission sequence after seeding. Tests cover legacy ID normalization, idempotency, and occupied-ID conflict rollback.
* test:add auto test github workflow

* test:updata workflow
Keep the official skill archives required by Kubernetes deployment while pruning unrelated Docker deployment files.

Fixes #3870


Generated-by: gpt-5

Co-authored-by: Codex <noreply@openai.com>
Jasonxia007 and others added 25 commits September 14, 2026 21:32
* 📃 Merge cursor rules into universal AGENTS.md and skills

* ✨ Support full thread management

* ✨ Support full thread management phase2

* 🧪 Add test files

* 🧪 Add test files

* 🧪 Add test files

* ✨ Thread management fulfilling platform constraint

* 🧪 Add test files

* 🧪 Add thread interface

* 🧪 Add test files
…3913)

* 🐛Bugfix: move health check out of dropdown into inline icon button

* Restrict the new button to isOwned items to preserve the previous ownership gate
* docs(agents): define collaborative version label

Document the approved version-name label behavior and implementation plan.\n\nCo-authored-by: Codex <noreply@openai.com>\nGenerated-by: gpt-5-codex

* fix(agents): show related agent version labels

Display each internal collaborative agent's saved version name beside its name.\n\nCo-authored-by: Codex <noreply@openai.com>\nGenerated-by: gpt-5-codex

* fix(agents): distinguish related agent versions

Show version number and name when selecting an internal agent, while keeping related agent labels compact with the saved version number.\n\nCo-authored-by: Codex <noreply@openai.com>\nGenerated-by: gpt-5-codex

* fix(agents): guard version detail during agent switch

Skip version-detail requests while an agent switch is pending or no published version exists. This prevents stale agent state from requesting a nonexistent version.\n\nCo-authored-by: Codex <noreply@openai.com>\nGenerated-by: gpt-5-codex

* delete frontend

* delete plan

* fix(agents): initialize agent before route switch

Keep the active agent and URL synchronized by updating the route only after the selected agent data has been loaded into the store.\n\nCo-authored-by: Codex <noreply@openai.com>\nGenerated-by: gpt-5-codex

* fix(agents): preserve target route during selector load

Set the selected agent URL before asynchronous loading so URL synchronization cannot reload the previous agent after initialization.\n\nCo-authored-by: Codex <noreply@openai.com>\nGenerated-by: gpt-5-codex

* fix(agents): centralize selector synchronization

Use the URL as the sole selection source and load the selected agent only from its synchronization effect, preventing competing route and store updates.\n\nCo-authored-by: Codex <noreply@openai.com>\nGenerated-by: gpt-5-codex

* feat(agents): support model priority sorting

Allow selected agent models to be reordered with drag and drop, keeping the first model and display names synchronized.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* fix(newchat): show agent name in conversation header

Replace the fixed conversation subtitle with the selected agent's display name and cover the header behavior with a regression test.

Co-authored-by: Codex <noreply@openai.com>
Generated-by: gpt-5-codex

* feat(agents): collapse model priority editor

Keep selected model tags compact and expose priority sorting through an on-demand popover.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* fix(agents): sync reordered models with form

Write reordered model IDs to the form store so Select tags render the updated priority.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* fix(newchat): disable Markdown strikethrough rendering

Render GFM delete nodes as plain text in newchat while retaining other GFM features. Add a focused regression test and implementation plan.

Co-authored-by: Codex <noreply@openai.com>
Generated-by: gpt-5

* fix(agents): remove duplicate model selection state

Use the filtered selection state for model priority controls after merging develop.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5-codex

* delete plan

---------

Co-authored-by: Codex <noreply@openai.com>
* fix(newchat): restore conversation after returning

Switch to a fresh thread before returning to the agent landing page so the previous conversation can be selected and rendered again.

Co-authored-by: Codex <noreply@openai.com>
Generated-by: gpt-5

* fix(hotfix): sync remaining v2.5.1 fixes

Port deployment-aware knowledge tool filtering, historical conversation timing, and parallel tool-call completion from #3895. Exclude the already handled empty agent input fix.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5

---------

Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: panyehong <2655992392@qq.com>
* feat:model page

* feat: 接入方式优化-需要回退

* ♻️ Refactor: unify model edit dialog onto ModelAddDialogV2

- ModelAddDialogV2: add model prop for edit mode (prefill custom form from existing model, default to 自定义接入 tab, call updateSingleModel/updateManageTenantModel on submit instead of add)
- modelConfig.tsx: handleCardEdit now renders ModelAddDialogV2 with model prop instead of ModelEditDialogV2

* Feature: model capacity auto-lookup, custom param validation, and type inference fixes

Capacity suggestion (catalog -> bundled LiteLLM JSON -> default):
- model_capacity_suggestion_service: remove LLM self-report fallback (dead code,
  providers without web search always return null); add _litellm_lookup reading
  the bundled LiteLLM model_prices_and_context_window.json (3818 models) as the
  second source; match by provider/name and bare-name final segment, preferring
  entries with both max_input and max_output
- main Dockerfile: bundle LiteLLM JSON at build time (works offline / no VPN)
- suggest_capacity: try LiteLLM bare-name match even when provider is
  uninferable (base_url still empty while typing)

Model add/edit dialog (V2):
- custom tab: debounced auto-lookup on model name (500ms) fills empty capacity
  fields only; configured tag reflects lookup result, not display_name presence
- connectivity probe no longer mutates capacity fields; probe carries
  temperature/top_p/extra_params so invalid __custom__ params surface at verify
  time as a 400 instead of failing at runtime
- __custom__ numeric strings coerce to numbers (top_k=50, not 50); fix
  .trim crash on numeric values in edit mode
- batch tab: add client-side model name search filter; per-row connectivity
  fills capacity from suggestion
- edit mode: onConnectivityChange reports probe result back to the model list
  so connect_status refreshes in place

Model config list:
- verifyModels now probes ALL models in the list (was: default-model selection
  only), updating rows in parallel
- remove misleading provider model-count badge; fix ModelConnectStatus
  duplicate declaration; drop unused DEFAULT_* imports

Type inference (_infer_model_type_from_name):
- match full name AND final path segment so repo-prefixed ids from aggregators
  (BAAI/bge-m3, Pro/..., deepseek-ai/...) classify correctly
- add contains-based rules aligned with develop TokenPony classifier:
  embedding/rerank/stt/tts mid-name, vlm3 (omni/video), vlm2 (image-gen
  keywords), vlm (vision/visual/ocr/vl-segment)

Connectivity service:
- port develop _embedding_url_candidates multi-candidate probe (normalized
  /embeddings URL first, then as-given) for embedding/multi_embedding
- _config_to_context: __custom__ KV pairs flow into extra_body at runtime
- openai_llm check_connectivity probe carries inference params

Type fixes: AgentDraft includes model_params_override; ModelEditDialogV2
keyMap adds vlm4; agent-prompt model override config dialog typing

* Fix: rename llmModels to availableLlmModels after develop merge (useModelList API rename)

* Fix: normalize rerank probe URL to the rerank endpoint

The batch-import connectivity probe passed the bare provider root
(e.g. https://api.siliconflow.cn/v1/) straight to the rerank adapter,
which POSTs the URL as-is -> 404 -> unavailable even though the model
is fine. prepare_model_dict already appends /rerank when SAVING the
model, so probe-time and save-time URLs disagreed.

Mirror that munging in _perform_connectivity_check: dashscope roots get
the api/v1 .../services/rerank/text-rerank/text-rerank path, others get
{root}/rerank. Already-normalized URLs pass through untouched. This
matches the embedding probe /embeddings normalization.

* Fix: carry verified connect_status into batch-created model records

Batch submit requires every enabled row to pass the connectivity probe
(hasUnchecked gate), but the verified available result lived only in
dialog state — the create endpoints never received it, so the backend
reset connect_status to not_detected on insert and the freshly imported
models showed as unverified in the list.

The backend already honors this (create_model_for_tenant:
connect_status = payload or NOT_DETECTED; ModelRequest has the field) —
only the frontend was not sending it. Thread connectStatus through
addCustomModel / createManageTenantModel request bodies and set it from
the row state at batch submit time.

* Remove legacy modify-or-delete models button and ModelDeleteDialog

The button opened a 2000-line legacy panel whose single-row edit/delete
duplicated the per-row actions (and used the old V1 edit dialog), and
whose only unique capability was a narrow bulk-edit (same-provider key,
timeout, capacity override). Bulk delete did not exist - deletion inside
the panel was still one-by-one.

- drop the top-bar button (Can model:update wrapper)
- drop the capacity-coverage alert action that opened the same panel
- remove isDeleteModalOpen state, ModelDeleteDialog import and instance
- delete the orphaned ModelDeleteDialog.tsx (ModelEditDialog stays - it
  is still referenced by resource-manage ModelList)

* Fix: show Chinese type labels for vlm2/vlm3/vlm4 in model list

The type column rendered t(`model.type.${type}`) directly, but the locale
files have no model.type.vlm2/vlm3/vlm4 keys (they are keyed by semantic
name: imageGeneration / videoUnderstanding / audioUnderstanding), so those
rows displayed the raw id string. Add the same id-to-semantic-key mapping
the add dialog uses, covering all ten types.

Also aligns vlm to the dialog label (image understanding) instead of the
legacy model.type.vlm wording.

* Fix: address CodeQL security alerts in provider fetch and catalog endpoints

SSRF (critical) in openai_provider.get_models: the operator-supplied
base_url was fetched as-is. Add _validate_provider_base_url guard before
the request: scheme must be http/https, host required, private / link-local
/ multicast / reserved IP literals rejected (cloud metadata endpoints,
internal routers). Plain DNS names and the documented localhost/127.0.0.1
local-LLM exemption are allowed. Validation errors flow through the
existing _classify_provider_error path as provider fetch failures.

Information exposure (medium x5) in model_managment_app catalog endpoints:
the exception text was interpolated into the JSON response body, which can
leak stack traces / internal details to the caller. Replace with fixed
messages; the exception detail is already logged server-side via
logger.warning. Affected: /catalog/all, /catalog/providers,
/catalog/inference_field_specs, /catalog/providers/{provider}/models,
/catalog/providers/{provider}/models/{model_name}.

* Fix: address Copilot review findings in tests and catalog wiring

Real bugs (blocked the unit-test CI job):
- test_model_consts.py: corrupted multi-byte string literal (truncated
  mid-character) made the module unparseable; restore the intended
  default title assertion.
- test_model_catalog_loader.py: read p.provider_key /
  get_model_profile(p.provider_key, ...) but the Pydantic
  ModelCatalogProviderInfo model exposes id; align to the actual field.

Latent issues flagged by review:
- model_managment_app.py: the catalog-import fallback handler logged via
  the module logger before it was initialized, raising NameError on the
  graceful-degradation path; log via logging.getLogger directly.
- useModelCatalog.ts + types: provider summary declared
  provider_key/supported_model_types while /catalog/providers serializes
  id/supported_types (Pydantic dump). Align the frontend type and hook
  maps to the wire names. ModelCatalogModelEntry.provider_key stays as
  is - the /catalog/all model entries do carry provider_key.

* Fix: catalog loader test must accept normalized model entries

The loader normalizes each catalog model entry into a ModelCatalogProfile
instance (not a raw dict), so asserting model_type in model_cfg fails
with TypeError on the Pydantic model. Accept both the raw dict form and
the normalized instance via getattr. Verified in-container: 8 passed.

* Fix: sync model health tests with inference params and rerank URL normalization

* Fix: sync model tests with unified provider dispatch and consts.model imports

* Fix: register consts.model and nexent.core.agents stubs in tests blocked by model_management_db import chain

* Fix: harden provider SSRF guard with post-DNS IP validation and restore TLS verification

* Fix: resolve SonarCloud quality gate findings (complexity, log injection, warnings, duplication)

* Fix: reduce cognitive complexity and eliminate duplicated blocks flagged by SonarCloud

* Fix: remove legacy dialogs duplicated by V2, sanitize catalog logging, resolve remaining SonarCloud issues

* Fix: sanitize catalog version with json.dumps and clear remaining SonarCloud issues

* Fix: stop logging file-derived catalog version and flatten handleSave max-tokens logic

* Fix: resolve SDK httpx Timeout class for httpx2-based OpenAI builds

* Fix: route capacity suggestion through managed thread pool and make stopwords loading race-tolerant

---------

Co-authored-by: hzw <hzw@qq.com>
Co-authored-by: ljy <ljy@DESKTOP-65OBISN.(none)>
* 🐛 Bugfix: httpx2 timeout
* ✨ feat: Implement human-in-the-loop (HITL) functionality with durable interaction support

* ✨ feat: Enhance human-in-the-loop (HITL) functionality with new components and configuration

* ✨ feat: Add human-in-the-loop (HITL) support with new endpoints and configuration options

* ✨ feat: Add human-in-the-loop (HITL) support with new endpoints and configuration options

* ✨ feat: Add human-in-the-loop (HITL) support with new endpoints and configuration options
* fix: stabilize unified tag migration for large datasets

* fix: align skill tag action labels
* Document backup, upgrade, and rollback procedures

* Add English backup, upgrade, and rollback guide

* Simplify Docker and Kubernetes upgrade guides

* Separate online and offline upgrade instructions

* feat(docker): add pre-upgrade backup script

Add a logged space-check and direct-copy workflow for ROOT_DIR and Compose volumes, with explicit business-write confirmation and offline-package coverage.

Co-authored-by: Codex <noreply@openai.com>
Generated-by: gpt-5

* docs(deploy): add pre-upgrade backup scripts

Add non-interactive Docker and Kubernetes backup flows with capacity checks, complete persistent-volume coverage, bilingual upgrade guidance, and regression tests.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5

* fix(k8s): back up volumes without tar

Fall back to safe per-file kubectl exec streaming when minimal images such as MinIO cannot support kubectl cp or tar streaming.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5

* docs(k8s): only check pod status after upgrade

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5

---------

Co-authored-by: hhhhsc <name>
Co-authored-by: Codex <noreply@openai.com>
* Fix: drop sampling params from connectivity probe for reasoning-only models

* Feat: forced-temperature catalog field and runtime sampling-param fallback for reasoning models

* Feat: auto-configure default model slots after create/import with user-facing toast

* Fix: treat dangling default-model config rows (model deleted) as empty and repair in place

* Fix: treat empty-dict config lookup result as never-configured (DB helper returns {} not None)

* Fix: invalidate config cache after model create so auto-configured defaults show without reload

* Style: unify model params override button size and enlarge centered default-model dialog

* Feat: make Base URL editable for preset providers in batch import

* Feat: probe batch connectivity in parallel in the add-model dialog

* Style: widen default-model dialog to 1180px

* Fix: loadModelLists reads freshest cached config so auto-configured defaults appear immediately

---------

Co-authored-by: ljy <ljy@DESKTOP-65OBISN.(none)>
… management (#3933)

* ✨ feat: Implement human-in-the-loop (HITL) functionality with durable interaction support

* ✨ feat: Enhance human-in-the-loop (HITL) functionality with new components and configuration

* ✨ feat: Add human-in-the-loop (HITL) support with new endpoints and configuration options

* ✨ feat: Add human-in-the-loop (HITL) support with new endpoints and configuration options

* ✨ feat: Add human-in-the-loop (HITL) support with new endpoints and configuration options

* ✨ feat: Enhance HITL schema with conditional table creation and trigger management

* ✨ feat: Enhance HITL schema with conditional table creation and trigger management
* 🐛 Bugfix: sandbox-tool-bridge thread leak

* 🧪 Add test files
…rations.sql (#3936)

- Merge all 8 migration files applied after the v2.5.1 release into
  v2.6.0_merged_migrations.sql, embedding source bodies byte-for-byte
  in deployment (sort -V) order with per-source SHA-256 annotations
- Remove the 8 superseded source migration files
- Point deploy/tests scripts and backend pytest fixtures at the merged
  file (locate source sections via "-- Source migration:" markers)
- Update migrations README history note and doc references to the
  removed file paths

Note: do NOT modify v2.6.0_merged_migrations.sql after deployment —
even a comment-only edit trips the checksum cascade and re-executes
every subsequent migration.

Co-authored-by: jeffwu <meetjeff.wu@gmail.com>
* Fix: split repo prefix from model_name on update to prevent progressive name pollution

* Fix: filter nameless provider entries and stop bare random suffixes as display names

* Fix: default thinking switch to on-with-hint and translate enable_thinking for Qwen wire format

* Fix: fall back advanced-settings title to model type when name is empty

* Fix: include model_params_override in the agent save payload so override edits persist

* Fix: carry model_params_override through toDraft so overrides load after reopening an agent

* Fix: remove duplicated inherit hint above the override form

---------

Co-authored-by: ljy <ljy@DESKTOP-65OBISN.(none)>
* bugfix: 模型配置问题修改

* test: 修复模型健康检查单元测试

---------

Co-authored-by: hzw <hzw@qq.com>
* fix(mcp): unbind deleted tools from agent drafts

Soft-delete draft tool instances when removing an MCP service while preserving published snapshots. Stop MCP record deletion when cleanup fails.

Refs #3935

Co-authored-by: Codex <noreply@openai.com>
Generated-by: gpt-5

* fix(agent): refresh draft after MCP deletion

Reload the current Agent draft after successful MCP server or container deletion so removed tool bindings disappear immediately from the configuration page.

Refs #3935

Co-authored-by: Codex <noreply@openai.com>
Generated-by: gpt-5

* fix(mcp): prevent stale agent bindings after deletion

Drain pending Agent draft saves before deleting an MCP service, then refresh the draft after deletion. Ignore unavailable tool IDs in stale Agent updates so deleted bindings cannot be recreated.\n\nRefs #3935\n\nCo-authored-by: Codex <noreply@openai.com>\nGenerated-by: gpt-5

* fix(agent-version): refresh current version after mutations

Share the page-level agent version state with the management panel so publish and rollback render the latest current version.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5

* fix(agent): label collaborative agent version names

Distinguish custom version names from numeric version identifiers in the collaborative agent selector with localized labels.

Co-authored-by: Codex <noreply@openai.com>

Generated-by: gpt-5

* delete i18n

---------

Co-authored-by: Codex <noreply@openai.com>
Rename the bundled AIDP provider entry file to match plugin.yaml exactly and add a case-sensitive manifest regression test.


Generated-by: gpt-5

Co-authored-by: Codex <noreply@openai.com>
…3942)

* Bugfix: 优化nl2agent单点优化能力 (#3835)

* ✨ Feature: Add NL2Agent optimization suggestions

(cherry picked from commit 4c1bace)

* 🐛 Bugfix: Align NL2Agent suggestion card spacing

(cherry picked from commit db14812)

* Bugfix: default set nl2agent suggestion visible

(cherry picked from commit 0828331)

* Bugfix: 更新单点优化策略

(cherry picked from commit f1e0163)

* Bugfix: 当用户配置了模型后模型被删除,有对应的提示

(cherry picked from commit feb8d8a)

* add unavaliable reason

(cherry picked from commit 793d49d)

* fix ut

(cherry picked from commit 3931295)

* fix ut

(cherry picked from commit d681192)

* fix ut

(cherry picked from commit a7b437c)

* agent不可用原因支持修改后刷新

* 更新trigger的样式

(cherry picked from commit f24ef28)

---------

Co-authored-by: RedShakespeare <silencess_m@qq.com>

* fix(evaluation): avoid duplicate stream keyword (#3836)

* Bump version from 2.5.0 to 2.5.1

* 🐛 Bugfix: Fixed an issue where sandbox containers failed to start correctly in Docker version 18.09 and earlier versions. (#3857)

---------

Co-authored-by: Dallas98 <40557804+Dallas98@users.noreply.github.com>
Co-authored-by: xuyaqi <xuyaqist@gmail.com>
Co-authored-by: RedShakespeare <silencess_m@qq.com>
Co-authored-by: cj2026-bit <647646783@qq.com>
Co-authored-by: Dallas98 <990259227@qq.com>
Co-authored-by: panyehong <91180085+YehongPan@users.noreply.github.com>
Co-authored-by: chase <byzhangxin11@126.com>
* Fix: hide tokenizer_family from the override form to match the model-config advanced settings

* Style: align capacity field labels with the model-config advanced settings

* Style: hide the clear-override button per product feedback

* Style: remove the clear-override button and dead handler code

---------

Co-authored-by: ljy <ljy@DESKTOP-65OBISN.(none)>
merge(develop): sync conflict resolutions from release/v2.6.0-merge
@jeffwu-1999 jeffwu-1999 changed the title merge(main): merge v2.6.0 release from develop Release v2.6.0 (#3946) Sep 16, 2026
@jeffwu-1999 jeffwu-1999 changed the title Release v2.6.0 (#3946) merge(main): merge v2.6.0 release from develop Sep 16, 2026
@jeffwu-1999
jeffwu-1999 merged commit 23a4859 into main Sep 16, 2026
12 of 13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.