Repository navigation
ci: add copyright header check for changed source files - #4087
Merged
Merged
Conversation
- Add scripts/check_copyright.py to check and auto-fix missing copyright headers on .py/.sh/.sql/.ts/.tsx/.js/.jsx/.mjs files, with a --files-from mode for incremental checks - Add .github/workflows/copyright-check.yml to incrementally check PRs targeting develop/release/hotfix branches, with an optional full scan via workflow_dispatch - Require the header in AGENTS.md shared constraints and add a .cursor/rules thin entry for compatibility - Document the requirement and local verify/fix commands in CONTRIBUTING.md
TiTi-iTiT
requested review from
Dallas98,
WMC001,
YehongPan,
hhhhsc701 and
jeffwu-1999
as code owners
October 13, 2026 11:35
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
added 2 commits
October 13, 2026 20:13
Derive the end year of the copyright header from the current year instead of hardcoding 2025-2026, so headers inserted by --fix and the suggestion in error output stay correct in future years. The check pattern already accepts any year variant. Also document the dynamic end year in AGENTS.md and CONTRIBUTING.md.
Add an explicit top-level permissions block restricting GITHUB_TOKEN to contents: read, matching the convention of other workflows and resolving the CodeQL workflow permissions alert.
jeffwu-1999
reviewed
Oct 14, 2026
Remove the push trigger: on merge commits to protected branches the two-dot diff (event.before..HEAD) includes every file from the merged feature branch, which could turn previously green PRs into unexpected red builds on develop. Incremental checking is already closed-loop on pull_request events via the three-dot diff against the base branch. Simplify the fallback diff to HEAD~1..HEAD: github.event.before is only populated for push events, so the BEFORE_SHA branch is dead code now. workflow_dispatch changed mode keeps its documented latest-commit semantics. Add a pull_request paths filter matching the checker's supported source extensions so docs-only PRs no longer trigger a fetch-depth: 0 checkout. Keep the workflow file itself in the trigger set so changes to the check are still validated end-to-end.
jeffwu-1999
approved these changes
Oct 14, 2026
cj2026-bit
added a commit
that referenced
this pull request
Oct 14, 2026
…e files Satisfies develop's new copyright-check workflow (#4087), generated with its official fixer (scripts/check_copyright.py --fix): one header comment line plus a separator per file, after any shebang/coding line. Comments only — no behavior change; fidelity suite (63), attach/worker tests (31) and mock-services tests (26) re-run green after the insertion.
jeffwu-1999
pushed a commit
that referenced
this pull request
Oct 15, 2026
… and repair the daily knowledge cases (#4090) * 🧪 Test(e2e): migrate the ext-knowledge mock into the formal framework and repair the daily knowledge cases - Move the ext-knowledge mock contract into test-e2e/infra/mock-services/ext-knowledge-mock (single-source build context, runner/product dual compose overlays, per-case attach tooling with identity check, endpoint lock, full reset and evidence export, suite-worker integration, validate_execution mock-service enum + profile selection, publisher evidence whitelist). - Migrate the eight formal mock consumers (AGT-001/002, CTR-016/017/046/047, PERF-09, REL-02) onto the framework-managed instance; API-AUTO-FC03F18034CB0D51 is repaired separately below. - Repair the four daily knowledge cases: the D2 delete signature and audit isolation, PW-KB-LOCAL-01 (agent-card configure action + AddKnowledgeDrawer autosave), PW-FILE-01 (composer/attachment and refreshed-chat drift), and the new PW-KB-AIDP-01 journey with explicit mock/real_smoke profile selection. - Add the fidelity suite test/ext_components/ext_knowledge (57 original + 6 regressions = 63 tests) driving the real adapters against the mock; CI collects it through test/ext_components. - Repair shared D4 helper drift found under live execution (collapsible agent editor sections, tool-config autosave evidence, high-fidelity conversation guide, collaborator drawer, guardrail modal, agent publish before a new conversation). - No product code changed. * 🧪 Test(e2e): keep prerequisite-failure receipts and align the mock deployment with D-001 Review-fix pass on the framework migration: - Bind RESULT_DIR in the worker process itself and adopt any prerequisite receipt (not only preparation-step failures), so attach and dependency failures report BLOCKED_BY_DEPENDENCY with their concrete reason instead of a bare AUTOMATION_ERROR. Regression tests cover the classification and the worker wiring (the previous tests set RESULT_DIR themselves and thus masked the gap). - Publish the mock port on loopback only per design D-001; product-side callers keep using the compose-network DNS name. The registration test now pins the loopback binding. - Decide the instance's released/unknown state before releasing the attach lock (removes the unlock-vs-rewrite race); the schema description now matches the allowed host-mode equality of runner_url/product_url. - Fidelity conftest clears the wire log per test and restores the identity environment variables at teardown. - Control plane validates the whole /_reset service list before executing and checks the AIDP sub-app response codes on fail-next/fail-reset. - PW-KB-AIDP-01 syncs the contract text with the implemented evidence model and gains acceptance obligations and bindings; drop an unused variable and a stray blank line. * 🧪 Test(e2e): record the review re-verification results Minimum-regression re-run against a fresh one-off deployment on the review-fix code: PW-TASK-01 and AGT-001 passed, PW-KB-AIDP-01 passed its full mock-profile journey, and the repaired helpers were exercised successfully wherever reached (PW-CHAT-01 step 1, PW-CHAT-05 steps 1-3, PW-PROMPT-02 preconditions, PW-AGENT-01 precondition 3). The remaining cases fail on their own pre-existing post-#4058 drift (AgentPage.create() flow, retired 请输入智能体描述 placeholder, 智能体角色 tab, 执行 mode button, 知识库: scope button), recorded per case and left untouched. The negative attach path was verified live: a foreign identity yields BLOCKED_BY_DEPENDENCY with the concrete reason written to the case runtime receipt. * 📝 Docs(e2e): add the product-UI driving guide and seed catalog to the mock README Documents what a human enters when binding the mocked services as agent tools (fields, product-side base URLs, credential shapes, runtime input names incl. iData's question + required rerank_model_id) and the full seed catalog the pickers list per service, including the AIDP startup rename and the permission-table registration note. Markdown only; no behavior or test change. * 🔧 Chore(e2e): add the required copyright headers to the changed source files Satisfies develop's new copyright-check workflow (#4087), generated with its official fixer (scripts/check_copyright.py --fix): one header comment line plus a separator per file, after any shebang/coding line. Comments only — no behavior change; fidelity suite (63), attach/worker tests (31) and mock-services tests (26) re-run green after the insertion. * 🐛 Fix(e2e): port the lock-order rule to the attach failure path and block on an unusable profile contract Review fixes (jeffwu-1999): - _attach_locked: the exception path released the lock before rewriting the released state, the reverse of the release() rule fixed earlier — a concurrent attacher could read the pre-failure released=False in that window and false-block with 'previous attach state was not released cleanly'. The state is now decided while the lock is still held; a failed reset still keeps the unknown state. - resolve_profile_selection: an unreadable case.yaml or a missing execution.profiles entry for the selected profile silently produced an empty dependency set, letting attach() skip the mock identity check, lock and reset while the batch report looked clean. Both paths now raise a typed dependency failure with the concrete reason; a legitimately empty required_services entry (real_smoke) is unchanged. - Four regression tests: state-at-unlock snapshots for both failure orderings, plus both blocking paths of the profile contract. Offline: attach/worker 35 passed, fidelity 63 passed, mock-services 26 passed, asset validator green.
MoeexT
added a commit
that referenced
this pull request
Oct 15, 2026
develop now rejects changed .py/.ts/.tsx files without the standard header (Copyright Header Check, #4087). The rebase brought the rule in with the framework code, so the remaining 28 files this branch touches now carry it. Verified with scripts/check_copyright.py --files-from.
MoeexT
added a commit
that referenced
this pull request
Oct 16, 2026
develop now rejects changed .py/.ts/.tsx files without the standard header (Copyright Header Check, #4087). The rebase brought the rule in with the framework code, so the remaining 28 files this branch touches now carry it. Verified with scripts/check_copyright.py --files-from.
WMC001
pushed a commit
that referenced
this pull request
Oct 17, 2026
* feat(agent): sort agent repository by publish time and mark main agents Agent repository: add publish-time-descending ordering (sort_by_update_time) over the merged tenant+official listing set, and expose the root agent's is_main_agent flag on listing and detail responses. Agent list page: support searching agents by tag through tag predicates, and harden tag normalization so array-form tags are no longer rendered as raw strings. Add an amber badge that distinguishes main agents from ordinary ones, plus unit and component tests for the sorting, main-agent flag, and tag normalization behavior. * test(e2e): add formal D4 case for agent repo sort and main-agent tag Add feature catalog, case-local contracts, and the change record for AGENT-REPO-SORT-MAIN-TAG, covering repository publish-time sorting, the main-agent badge, and tag-based agent search with array-form tag normalization. Verified locally: 1/1 AGENT-REPO-SORT-MAIN-TAG-D4-001 PASS (acceptance_status MAPPED_EXECUTION_PASSED); asset validation passes with --require-acceptance-case and --require-ut-change. * feat(agent): add latest-published sort and main-agent badge to my-agents tab Add a latest-published (newest first) sort option and a main-agent badge to the agent-space my-agents tab, mirroring the repository tab. /agent/list/page now accepts sort_by_update_time and list_agent_page_impl orders the filtered set by publish time descending with the agent id as tie-break before pagination; list summaries emit is_main_agent defaulting to true when unknown. The my-agents card renders a localized main-agent badge and the list request carries the sort flag only when selected. * test(e2e): cover my-agents tab sort and main-agent badge in AGENT-REPO-SORT-MAIN-TAG Extend the D4 case with a fourth step and assertion for the my-agents tab and widen RULE-001/RULE-002 to both agent-space tabs, keeping the formal assets aligned with the fixed Playwright journey. * test(e2e): cover the agent tag filter and sort page reset in AGENT-REPO-SORT-MAIN-TAG Extend the D4 case AGENT-REPO-SORT-MAIN-TAG-D4-001 with three steps and matching assertions for the behaviors this change introduced on the agent management page and the my-agents tab: - STEP-05/ASSERT-05: the tag filter narrows the list to the tag-matched agent and forwards its predicates without the raw stringified tag. - STEP-06/ASSERT-06: the active tag filter and the text query combine as an intersection, and clearing the filter restores the query-only result. - STEP-07/ASSERT-07: changing the sort option while the my-agents list sits on a later page requests page one under the latest-published order. The my-agents fixture grows to fifteen agents so the list spans two pages at the frozen 1920x1080 viewport, while the two tracked agents stay on page one in both orders. Add RULE-004 and RULE-005 to the feature, extend the acceptance contract to steps 1-7, and regenerate the derived views. Verification: validate_test_assets.py --phase implementation passed and run_cases.py AGENT-REPO-SORT-MAIN-TAG-D4-001 passed with PRE-01, STEP-01..07 and ASSERT-01..07 green, no console errors and no unexpected 5xx. * test(e2e): align the AGENT-REPO-SORT-MAIN-TAG change record with actual UT evidence The requirement record claimed the agent management page's tag search predicate production, multi-tag filtering and combined query-and-tag matching were proved by traditional UT, but the two selectors it lists (agentTagsNormalization.test.tsx and agentListCard.test.tsx) only assert tag normalization and card rendering. The validator checks that selector files exist, not what they assert, so the overstatement was invisible to it. Narrow the traditional_ut behaviors to the two assertions the selectors actually prove, and record the remaining proof gap in the notes: the tag filter's predicate production, its intersection with the text query, the clear action and the first-page reset on a sort change are proved at the browser boundary by steps 5-7 of AGENT-REPO-SORT-MAIN-TAG-D4-001, while multi-tag OR filtering and the English locale strings are deferred coverage rather than claimed as proved. Verification: validate_test_assets.py --phase implementation with --require-acceptance-case and --require-ut-change passed, and the derived registry view was regenerated. * test(backend): align agent list candidate fixtures with the new current_version_no column The feat commit that added the latest-published sort made query_agent_list_candidates_by_tenant_id select AgentInfo.current_version_no, but test_agent_db.py still built its agent_info fixtures without that column, so three candidate-query cases failed on both the mock session and the system-agent exclusion test. Add the column to the shared column fixture and the standalone table, and extend the expected column list. * fix(frontend): keep the agent resource card header unclipped A fixed h-11 header column clipped the title, subtitle and main-agent badge whenever the content exceeded one line. Use min-h-11 so the column keeps its minimum height and grows with its content, and add a regression test that pins the unclipped title column and the rendered subtitle and badge. * fix(frontend): include tags in the agent list search placeholder The agent list search already matches tags through its tag predicates, so the placeholder now names them alongside the name and description. The browser suite that locates the search box by its placeholder text follows the new copy. * test(e2e): follow the new agent search placeholder in the D4 agent page The D4 agent page object hardcodes the agent list search placeholder, so the copy change broke its select, export and copy locators. Update the literal to the copy that now renders. * fix(frontend): select the deep-linked agent before switching threads PR #4058 moved the selection update after `await startAgentConversation`, so a deep link into /newchat?agentId=... kept showing the previous agent until the runtime thread list settled. Reflect the selection first and keep the thread switch awaited and error-guarded. * test(frontend): give the component and workbench harnesses the project JSX transform PR #4058 replaced the vitest `esbuild.jsx` option with `oxc.jsx` in vitest.config.ts but only removed the stale `esbuild` block from vitest.workbench.config.ts, so the workbench suite could not transpile JSX at all. Add the matching `oxc` block and allow the component suite the same 30s per-test budget as the D1 harness it mirrors. * test(frontend): realign the deep-link and config layout specs with the current contracts The deep-link spec asserted the pre-#4058 call counts and bound the raw agent id, and the layout spec compared the scroll region direct children against four cards although the info/model pair is wrapped by the creation-guide container. Assert the current contracts: one dedicated thread per deep link with a normalized agent id plus a second thread for a manual selection. * chore(repo): add the required copyright header to changed source files develop now rejects changed .py/.ts/.tsx files without the standard header (Copyright Header Check, #4087). The rebase brought the rule in with the framework code, so the remaining 28 files this branch touches now carry it. Verified with scripts/check_copyright.py --files-from. * test(backend): cover the publish-time sort and main-agent flag fallbacks Exercise the defensive paths of the new agent sorting helpers: unparsable publish times, scope tenants without published versions, a failing version lookup, and the repository-side repository-id and publish-time sort keys. * test(e2e): record the publish-time sort UT in the AGENT-REPO-SORT-MAIN-TAG change record List the agent app and agent service UT selectors that prove the sort flag forwarding and the publish-time sort fallbacks, and state the fallback behaviour in the recorded UT obligations. * test(e2e): narrow the agent-page API stub so the tag library call returns an array The agent management page resolves the default resource tag library before it renders the list, so the previous catch-all **/api/** stub answered /api/tag-libraries with an empty object. The page then called .find() on that object and the whole route fell into the error boundary, which left both assets with zero cards. Narrowing the stub to an empty array brings the cards back. The two measured search-box widths follow the tag filter button, which now shares the 360px grid toolbar slot and the 296px list toolbar slot with the search box.
jeffwu-1999
added a commit
that referenced
this pull request
Oct 23, 2026
* docs: update third-party notices (#4048)
* feat: add optional nginx HTTPS termination (#4026)
* feat(deploy): add optional nginx HTTPS termination for docker and k8s installs
- Add HTTPS mode option (disabled/self-signed/custom) to install TUI,
persisted in deploy.options and reusable on non-interactive reruns
- Support auto-generated self-signed certs (99-year validity, SAN from
env or NIC auto-detection) and user-provided certs with validation
(PEM format, key/cert match, expiry, encrypted key decryption)
- Decrypt passphrase-protected keys to a 0600 plaintext copy mounted by
nginx; passphrase stored via existing .env credential pattern
- Add nexent-nginx helm chart (deployment/service/configmap/secret)
terminating TLS on NodePort 30000 via error_page 497 same-port redirect;
web service steps down to ClusterIP when HTTPS is enabled
- Render cert/key as YAML literal blocks; store TLS as Opaque secret
with server.pem/server.key keys
- Update offline packaging, env example, install docs and common tests
* fix(deploy): address HTTPS review findings
- Seed HTTPS config from NEXENT_HTTPS_* env vars before defaults
- Detect SAN via ip -o -4 addr (Linux) with ifconfig fallback
- Start docker nginx before core services; clean up on disabled; bind web to loopback 3001 when HTTPS is enabled
- chmod 600 generated Helm values containing private keys
- Support EC keys via openssl pkey with LibreSSL fallback
- Route nginx image through NGINX_IMAGE and registry prefix
- Validate cert/key pair and expiry when reusing self-signed certs
- Persist custom key passphrase to .env
* refactor(deploy): split HTTP and HTTPS entry ports for nginx HTTPS
- Give HTTPS a dedicated entry: Docker port 3100, K8s NodePort 31000
- Keep the plain HTTP entry unchanged (Docker 3000 / K8s NodePort 30000); web no longer steps down to ClusterIP or a loopback-only binding
- Drop the same-port error_page 497 redirect now that entries are split
- Update TUI/summary wording, tests and install docs for the new ports
* docs(deploy): list the HTTPS entry port in the port mapping table
* fix(deploy): always bundle nginx image in offline package
Offline hosts cannot pull the nginx image after delivery when the user enables HTTPS during installation. Bundle nginx:alpine with the infrastructure images instead of gating it on build-time HTTPS options, and drop the HTTPS flags from the offline build passthrough list.
* feat(deploy): make HTTP and HTTPS entry ports configurable
Introduce NEXENT_WEB_PORT and NEXENT_HTTPS_PORT so users can change the entry ports for both Docker (host port mapping) and Kubernetes (NodePort) deployments. Defaults keep the current behavior (Docker 3000/3100, K8s 30000/31000). Also fix the deploy script overwriting a user-set web port mapping when HTTPS is disabled, and document the new variables in .env.example and the installation guides.
* feat(deploy): validate k8s nodePort range for entry ports
Reject NEXENT_WEB_PORT and NEXENT_HTTPS_PORT values outside the Kubernetes nodePort range (30000-32767) before rendering Helm values, so users get a clear error instead of a cryptic API server message. Ports are only validated when HTTPS mode needs them, and empty values keep using defaults.
* fix(deploy): render nginx nodePort in generated Helm values
The live Helm values renderer (deployment_render_helm_chart_values) only
rendered the nginx image block, so the nginx Service fell back to the
chart default NodePort and a user-set NEXENT_HTTPS_PORT never took
effect. Render the nginx services block the same way the port-policy
renderer does, and cover it with a Helm values assertion.
* test(deploy): include nginx image in offline push test fixtures
* Bugfix: Resolve indicator status display failure (#4050)
1. 修复在对话过程中无法正常显示指示灯的问题,“绿色”代表正在回答,“蓝色”代表回答完成 (#4050)
2. 修复在对话过程中,用户发送的消息无法正常显示换行的问题
3. 修复无法正常重命名“当前会话”的标题
* docs(api): update Apifox API docs website URL (#4052)
Replace the retired project link (8icfxll43r.apifox.cn) with the new
shared docs URL in both zh and en API reference pages.
Generated-by: glm-5.3-flash
Co-authored-by: ZCode <noreply@zcode.ai>
* fix: keep independent AIDP search selectable and recommendable (#4046)
* 🐛 Bugfix: 支持 Windows 本机 runtime 使用 Docker Linux 沙箱 (#3985)
* 修改Windows 本机 runtime 与 Docker Linux 路径不兼容的问题
* 实现 HTTPS/WSS 保留业务功能,消除明文连接问题
* 修改了安全存储密钥,校验了证书身份,客户端和测试服务端明确要求 TLS 1.2+
* 恢复了Agent 初始化失败后重新分配 kernel的特性
* test: align workspace initialization tests with lease-owned recovery
* fix: keep sandbox WSS connections off environment proxies
* test: support websocket-client redirect rejection across versions
---------
Co-authored-by: DoYX <du.yuxiao@gmail.com>
* ♻️ Refactor(data-process): replace Ray with Celery prefork (#3888)
* refactor(data-process): replace Ray with Celery prefork
Run parsing in process-local Celery prefork children, keep orchestration and forwarding on thread workers, and remove the Ray runtime, dependency, and deployment surface.
Co-authored-by: Codex <noreply@openai.com>
Generated-by: gpt-5-codex
* fix(data-process): preserve sync parser result metadata
* fix(data-process): wait for parser readiness in result backend
* fix(data-process): tolerate lightweight worker app doubles
* test(model): mock authentication for temporary healthcheck
* Revert "test(model): mock authentication for temporary healthcheck"
This reverts commit 9aa8d45b8eb9b8248b731957d23d851936e03608.
* test(data-process): configure Celery URLs in isolated tests
* test(data-process): cover prefork task boundaries
* test(data-process): isolate prefork coverage from redis backend
* test(data-process): cover lazy prefork branches
* fix(data-process): complete celery prefork migration review fixes
* test(data-process): align prefork tests with current APIs
* fix(data-process): avoid logging user-controlled image paths
* test(data-process): isolate router tests from celery bootstrap
* test(model): provide auth for temporary healthcheck
* test(data-process): stub redis chunk loader in router test
* test(data-process): cover parser cancellation and lifecycle helpers
* test(data-process): re-export process_sync from tasks module
Keep the synchronous parse entry point reachable through the tasks
module so coverage and isolation tests can patch one import site.
Use a redundant-alias re-export to satisfy F401.
* 🧪 Test: restore stubbed sys.modules after app router fixture
Problem: the stub_modules fixture in test_data_process_app.py assigned
stub modules directly to sys.modules without restoring them, so the
stubs leaked into every later test file sharing the same pytest
process. Running test_data_process_app.py before
test_data_process_service.py failed all 52 service tests in setUp with
AttributeError: '_CeleryAppStub' object has no attribute 'reset_mock'.
The leak was invisible to CI because run_all_test.py runs each test
file in its own subprocess.
Fix: replace the six direct sys.modules assignments with
monkeypatch.setitem so the real modules are restored when the fixture
tears down. Behavior during each test is unchanged.
Verification:
- pytest test/backend/app/test_data_process_app.py
test/backend/services/test_data_process_service.py
-> 76 passed (was 24 passed / 52 failed)
- each file alone: 24 passed / 52 passed (no regression)
- wider combo (app + services + tasks + worker + coverage):
app+services now pass together; the remaining failures are a
pre-existing module-level mock leak in test_data_process_service.py
that exists on develop and is out of scope here.
* 🐛 Bugfix: Move AIDP-related synchronous calls to a managed thread to avoid blocking other interfaces. (#4054)
* ♻️ Refactor agent prompt (#4051)
* [WIP]♻️ Agent prompt refactor
* [WIP]♻️ Agent prompt refactor
* 🧪 Add test files
* 🧪 Add test files
* 🧪 Add test files
* 🧪 Add test files
* 🧪 Add test files
* ♻️ Merge system prompts into one chunk
* 🧪 Add test files
* 🧪 Add test files
* feat(audit): add security audit logging to backend management APIs (#4055)
* feat: 为模型管理接口添加安全审计日志记录
实现了模型创建、更新、删除、批量操作等接口的安全审计日志功能,过滤了敏感凭证信息,确保审计日志安全合规。新增了审计安全字段过滤工具函数,补充了对应的测试用例验证审计日志的正确性和安全性。
* feat: 为多个接口添加安全审计日志记录
为agent和agent_repository相关的API接口添加安全审计事件记录,包括代理更新、图标上传、删除、导出、导入、版本发布/回滚/更新/删除等操作,同时补充对应的测试用例验证审计日志的正确性,确保敏感数据不被记录。
* feat: 为MCP和技能相关接口添加上下文安全审计日志
为tool、mcp、remote_mcp、skill模块的所有关键增删改接口添加安全审计日志,记录操作人、资源信息等关键字段,同时避免记录敏感信息如凭证、密钥等。新增对应的测试用例验证审计日志的正确性,确保敏感数据不会被泄露。
* feat: 添加安全审计日志并限制审计详情列表长度
在多个服务端点添加安全审计日志,记录关键操作信息
同时统一审计详情列表的长度限制为20,防止日志被恶意payload撑爆
* feat: 为配置相关接口添加安全审计日志记录
为 config_sync_app 和 memory_config_app 的配置操作接口添加安全审计事件记录,记录操作人、租户、操作类型和相关字段信息,同时更新测试用例验证审计日志的正确性,确保敏感配置值不被记录。
* test: 为上传测试用例添加 http_request 参数默认值
为测试用例中的 upload_files 调用添加 http_request=None 参数,避免测试时可能出现的未定义错误
* 🧪test:add e2e test baseline&fix some bugs (#4065)
* test:baseline cases
* test:add local test process
* doc:add test deploy guide
* bugfiix:优化测试流程
* bugfix:修复测试用例
* doc:轻量化bugfix的spec设计和测试用例设计
* test:修复测试用例
* test:修复D1测试用例
* test: 修复 D3 用例脚本并记录失败归因
* test: 移除 D3 变更记录,仅保留测试修复
* fix(test-e2e): make D5 tests portable and isolate evaluation workloads
* fix(test-e2e): repair Windows case contracts and D4 journeys
* feat(test-e2e): launch repository daily from a pinned branch
* test:修复D4读取config问题
* test:修复测试用例,删掉过期用例
* test:修复测试用例
* test:修复测试用例
* doc:测试规范修改
* test:增加外部记忆mock服务
* test:测试用例修复
* fix(prompt): reject blank task descriptions before SSE generation
* fix(agent): return 404 for missing discovery resources
* fix(agent): validate relationships before update writes
* fix(model): preserve provider error status on provider create
A provider failure (e.g. an upstream connection_failed) was raised as
HTTPException(502) by create_provider_models_for_tenant, but the generic
except Exception handlers in the service and the app layer swallowed it and
re-wrapped it, so /model/provider/create answered 500 with the real status
only surviving as text in the message body (API-049).
- service: re-raise HTTPException instead of wrapping it
- app: pass HTTPException through on /provider/create and
/manage/provider/create
- schema: reject a blank provider with 422 at the boundary
- tests: regression coverage for both behaviours
* fix: correct conversation access and stopped-turn regressions
* fix: enforce tenant isolation and edit permissions for agent relations
* fix: enforce tenant isolation and edit permissions for agent relations1
* 🐛 Fix tag projection crash on first-attempt ES write failure
Problem:
project_document_assignments() dereferenced the prior ledger state
without a None guard in its generic exception handler. On a document's
first-ever projection attempt there is no ledger row yet, so an ES write
failure crashed with AttributeError before the failed state was
persisted. The failure then became invisible: no retry_count, no
next_attempt_at, retry_pending_document_projections() never picked the
document up, and tag-filtered retrieval silently ignored the document
until its tags were re-saved.
Fix:
Treat a missing prior state as retry_count 0 in the failure handler
((current or {}).get("retry_count")), so first-attempt failures record a
retryable failed state with correct exponential backoff. Added a
regression unit test for the no-prior-state failure path (previously
only the existing-state path was covered). Also added one blank line
after the import block to satisfy the repo ruff pre-commit hook on this
file (pre-existing I001).
Verification:
- test/backend/services/test_tag_document_projection.py 28/28 passed,
incl. new test_first_attempt_failure_records_retryable_state
- Neighboring regression: test_tag_management_service.py and
test_tag_document_batch_status.py, 53/53 passed
- ruff (E,F,I,W hook rule set) clean on the touched backend file
- Matches the state-machine expectations of e2e case
API-AUTO-357B84F01BA6D321 (daily run 2026-10-09)
* Fix A2A publication smoke scope and remove Mock dependency
* fix(a2a): execute the version recorded by A2A publication
* [WIP] Fix accepted semantic repair stream commits (#4057)
* feat(audit): add security audit logging to backend management APIs (#4055)
* feat: 为模型管理接口添加安全审计日志记录
实现了模型创建、更新、删除、批量操作等接口的安全审计日志功能,过滤了敏感凭证信息,确保审计日志安全合规。新增了审计安全字段过滤工具函数,补充了对应的测试用例验证审计日志的正确性和安全性。
* feat: 为多个接口添加安全审计日志记录
为agent和agent_repository相关的API接口添加安全审计事件记录,包括代理更新、图标上传、删除、导出、导入、版本发布/回滚/更新/删除等操作,同时补充对应的测试用例验证审计日志的正确性,确保敏感数据不被记录。
* feat: 为MCP和技能相关接口添加上下文安全审计日志
为tool、mcp、remote_mcp、skill模块的所有关键增删改接口添加安全审计日志,记录操作人、资源信息等关键字段,同时避免记录敏感信息如凭证、密钥等。新增对应的测试用例验证审计日志的正确性,确保敏感数据不会被泄露。
* feat: 添加安全审计日志并限制审计详情列表长度
在多个服务端点添加安全审计日志,记录关键操作信息
同时统一审计详情列表的长度限制为20,防止日志被恶意payload撑爆
* feat: 为配置相关接口添加安全审计日志记录
为 config_sync_app 和 memory_config_app 的配置操作接口添加安全审计事件记录,记录操作人、租户、操作类型和相关字段信息,同时更新测试用例验证审计日志的正确性,确保敏感配置值不被记录。
* test: 为上传测试用例添加 http_request 参数默认值
为测试用例中的 upload_files 调用添加 http_request=None 参数,避免测试时可能出现的未定义错误
* chore: bootstrap semantic repair stream fix draft
* fix(agent): commit accepted streamed code action repairs
* test(agent): verify repaired streams in deployed runtime and browser
* test(agent): clarify deployed repair assertion failures
---------
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
* fix: repair agent repository e2e cases and API-type MCP health check (#4061)
* fix: repair four failing e2e cases (API-086, API-063, PW-MCP-CONTAINER-01, PW-MCP-MARKET-01)
* fix: skip MCP protocol handshake for API-type MCP health check
* fix(test-e2e): align runtime contracts and strengthen local test diagnostics
* fix(test-e2e): reconcile standalone semantic repair tests with formal cases
* test:修改workflow
* test:修复测试用例
* fix: preserve manual titles and metadata-free A2A calls
* test: repair D1-D5 runtime contracts and execution evidence
* test: repair daily assertions and remove excluded cases
* fix: guard MCP tag refresh and repair daily test isolation
* test:修复测试用例
* test:修复测试用例
* test:修复测试用例
---------
Co-authored-by: panyehong <2655992392@qq.com>
Co-authored-by: xuyaqist <xuyaqist@gmail.com>
Co-authored-by: chase <byzhangxin11@126.com>
Co-authored-by: cj2026-bit <647646783@qq.com>
Co-authored-by: Jason Wang <56037774+JasonW404@users.noreply.github.com>
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
Co-authored-by: MoeexT <yuwancumian666@outlook.com>
* fix(deploy): default frontend and backend timezone to Asia/Shanghai (#4067)
* Fix thinking prefix compatibility in Agent output parsing (#4060)
* test:baseline cases
* test:add local test process
* doc:add test deploy guide
* bugfiix:优化测试流程
* bugfix:修复测试用例
* doc:轻量化bugfix的spec设计和测试用例设计
* test:修复测试用例
* test:修复D1测试用例
* test: 修复 D3 用例脚本并记录失败归因
* test: 移除 D3 变更记录,仅保留测试修复
* fix(test-e2e): make D5 tests portable and isolate evaluation workloads
* fix(test-e2e): repair Windows case contracts and D4 journeys
* feat(test-e2e): launch repository daily from a pinned branch
* test:修复D4读取config问题
* test:修复测试用例,删掉过期用例
* test:修复测试用例
* test:修复测试用例
* doc:测试规范修改
* test:增加外部记忆mock服务
* test:测试用例修复
* fix(prompt): reject blank task descriptions before SSE generation
* fix(agent): return 404 for missing discovery resources
* fix(agent): validate relationships before update writes
* fix(model): preserve provider error status on provider create
A provider failure (e.g. an upstream connection_failed) was raised as
HTTPException(502) by create_provider_models_for_tenant, but the generic
except Exception handlers in the service and the app layer swallowed it and
re-wrapped it, so /model/provider/create answered 500 with the real status
only surviving as text in the message body (API-049).
- service: re-raise HTTPException instead of wrapping it
- app: pass HTTPException through on /provider/create and
/manage/provider/create
- schema: reject a blank provider with 422 at the boundary
- tests: regression coverage for both behaviours
* fix: correct conversation access and stopped-turn regressions
* fix: enforce tenant isolation and edit permissions for agent relations
* fix: enforce tenant isolation and edit permissions for agent relations1
* 🐛 Fix tag projection crash on first-attempt ES write failure
Problem:
project_document_assignments() dereferenced the prior ledger state
without a None guard in its generic exception handler. On a document's
first-ever projection attempt there is no ledger row yet, so an ES write
failure crashed with AttributeError before the failed state was
persisted. The failure then became invisible: no retry_count, no
next_attempt_at, retry_pending_document_projections() never picked the
document up, and tag-filtered retrieval silently ignored the document
until its tags were re-saved.
Fix:
Treat a missing prior state as retry_count 0 in the failure handler
((current or {}).get("retry_count")), so first-attempt failures record a
retryable failed state with correct exponential backoff. Added a
regression unit test for the no-prior-state failure path (previously
only the existing-state path was covered). Also added one blank line
after the import block to satisfy the repo ruff pre-commit hook on this
file (pre-existing I001).
Verification:
- test/backend/services/test_tag_document_projection.py 28/28 passed,
incl. new test_first_attempt_failure_records_retryable_state
- Neighboring regression: test_tag_management_service.py and
test_tag_document_batch_status.py, 53/53 passed
- ruff (E,F,I,W hook rule set) clean on the touched backend file
- Matches the state-machine expectations of e2e case
API-AUTO-357B84F01BA6D321 (daily run 2026-10-09)
* Fix A2A publication smoke scope and remove Mock dependency
* fix(a2a): execute the version recorded by A2A publication
* [WIP] Fix accepted semantic repair stream commits (#4057)
* feat(audit): add security audit logging to backend management APIs (#4055)
* feat: 为模型管理接口添加安全审计日志记录
实现了模型创建、更新、删除、批量操作等接口的安全审计日志功能,过滤了敏感凭证信息,确保审计日志安全合规。新增了审计安全字段过滤工具函数,补充了对应的测试用例验证审计日志的正确性和安全性。
* feat: 为多个接口添加安全审计日志记录
为agent和agent_repository相关的API接口添加安全审计事件记录,包括代理更新、图标上传、删除、导出、导入、版本发布/回滚/更新/删除等操作,同时补充对应的测试用例验证审计日志的正确性,确保敏感数据不被记录。
* feat: 为MCP和技能相关接口添加上下文安全审计日志
为tool、mcp、remote_mcp、skill模块的所有关键增删改接口添加安全审计日志,记录操作人、资源信息等关键字段,同时避免记录敏感信息如凭证、密钥等。新增对应的测试用例验证审计日志的正确性,确保敏感数据不会被泄露。
* feat: 添加安全审计日志并限制审计详情列表长度
在多个服务端点添加安全审计日志,记录关键操作信息
同时统一审计详情列表的长度限制为20,防止日志被恶意payload撑爆
* feat: 为配置相关接口添加安全审计日志记录
为 config_sync_app 和 memory_config_app 的配置操作接口添加安全审计事件记录,记录操作人、租户、操作类型和相关字段信息,同时更新测试用例验证审计日志的正确性,确保敏感配置值不被记录。
* test: 为上传测试用例添加 http_request 参数默认值
为测试用例中的 upload_files 调用添加 http_request=None 参数,避免测试时可能出现的未定义错误
* chore: bootstrap semantic repair stream fix draft
* fix(agent): commit accepted streamed code action repairs
* test(agent): verify repaired streams in deployed runtime and browser
* test(agent): clarify deployed repair assertion failures
---------
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
* chore: bootstrap think prefix compatibility fix
* fix: repair agent repository e2e cases and API-type MCP health check (#4061)
* fix: repair four failing e2e cases (API-086, API-063, PW-MCP-CONTAINER-01, PW-MCP-MARKET-01)
* fix: skip MCP protocol handshake for API-type MCP health check
* fix(test-e2e): align runtime contracts and strengthen local test diagnostics
* fix(test-e2e): reconcile standalone semantic repair tests with formal cases
* fix(agent): tolerate incomplete thinking prefixes without raw protocol finals
* test:修改workflow
* test:修复测试用例
* fix: preserve manual titles and metadata-free A2A calls
* test: repair D1-D5 runtime contracts and execution evidence
* test: repair daily assertions and remove excluded cases
* fix: guard MCP tag refresh and repair daily test isolation
* test:修复测试用例
* test:修复测试用例
* test:修复测试用例
* docs(test): update controlled provider invocation after migration
* test: verify migrated browser authentication and persisted skill results
* test: complete think-prefix acceptance obligations
* test: document and validate deployed TPC fixture
* doc:优化测试用例生成skill
* test: regenerate TPC proof at required UT and runtime boundaries
---------
Co-authored-by: dongjibao2001 <332722455@qq.com>
Co-authored-by: panyehong <2655992392@qq.com>
Co-authored-by: xuyaqist <xuyaqist@gmail.com>
Co-authored-by: chase <byzhangxin11@126.com>
Co-authored-by: cj2026-bit <647646783@qq.com>
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
Co-authored-by: MoeexT <yuwancumian666@outlook.com>
* fix(model): restore type-aware advanced settings in add/edit dialogs (#4066)
* fix(model): restore type-aware advanced settings in add/edit dialogs
PR #4007's v0 dialogs rendered the LLM capacity grid (context window,
input/output/reserve tokens, temperature, top_p) for every model type,
losing the type-specific parameters the old dialog exposed:
- embedding / multi_embedding: multimodal switch, chunk-size slider and
chunk batch were gone; chunk params were no longer sent on create and
multi_embedding models could not be added at all
- rerank: max-tokens field was gone
- stt / tts: provider select + App ID + Access Token were gone, which
also broke the volcengine connectivity probe
Restore the old per-type field set:
- ModelAdvancedConfig now renders the capacity grid only for the
llm/vlm/vlm2/vlm3 family (supportsCapacityGrid mirrors the old
supportsCapacityFields set, shared via modelTypeUi); embedding rows
get the multimodal switch (live type flip via onModelTypeChange) plus
the chunk-size slider and batch input; rerank gets max tokens;
stt/tts get the provider select and Volcano credentials (tts adds
max tokens)
- create, verify and update paths map the snake_case spec keys to the
camelCase request contract (expectedChunkSize / maximumChunkSize /
chunkingBatchSize / maxTokens / modelFactory / modelAppid /
accessToken); embedding rows always carry chunk params with the
old-dialog defaults (1024 / 1536 / 10), and both embedding types use
max_tokens 1024 as the dimension placeholder
- the edit dialog pre-fills the type-specific fields from the record,
sends them on save and rides them along the probe; the multimodal
switch stays hidden there because the edit path locks the embedding
pair's type
* fix(model): gate type-specific overrides and prefill voice provider
Address review findings on #4066:
- gate the rerank/voice payload mappings and the probe credential
pass-through by the row's model type: gear settings survive a row
type change, and a stale rerank max_tokens must not overwrite an
embedding row's 1024 dimension placeholder, nor stale voice
credentials a non-voice model's factory / probe
- prefill the stt/tts provider select from model.source: getAllModels
maps the API's model_factory into source only (model.modelFactory is
never populated), so editing an existing volcengine voice model
showed the dashscope fallback and saving would overwrite the factory
- add the missing rowSettingsDescEmbedding / voiceProviderHint entries
to both locale files so English users no longer see Chinese copy
Not addressed (intentional): clearing App ID / Access Token keeps the
stored credential (empty becomes undefined and is dropped from the
update payload). This matches the old dialog's behavior — switching the
provider to dashscope stops the backend from consuming the stored
credentials.
* fix(model): drop the static voice-provider hint line
The hint was static (shown for dashscope too, describing volcengine
credentials) and redundant with the App ID / Access Token placeholders,
so remove it along with its locale entries.
* fix(model): gate edit-dialog type-specific fields by current type
The type select is editable in the edit dialog (only the embedding pair
is locked), and the advanced values prefilled for the original type
survive a type change — the save/probe mappings must therefore be gated
by the CURRENT type, mirroring the add-dialog fix:
- chunk params only for embedding-family records
- factory / App ID / Access Token only for stt/tts records
- max tokens only for rerank/tts records
Also skip the max-tokens prefill when the record's value is 0 (the list
mapper falls back to 0 for an unset column); a literal 0 reads worse
than the empty default.
* refactor(model): dedupe type-specific mapping into shared helpers
Address review findings on #4066:
- extract buildVoiceCredentialParams into ModelAdvancedSettings: the
four call sites (add verify x2, edit verify, add/edit save) each
re-implemented the same camelCase mapping with a 4-6 line comment
explaining it; the full rationale now lives in the helper's doc block
and call sites are one-liners
- add supportsMaxTokensField to modelTypeUi so the (rerank || tts) &&
max_tokens gate is not duplicated between the add and edit save paths
- add DEFAULT_CHUNKING_BATCH_SIZE next to the other chunk defaults and
use it for the fallback and the input placeholder instead of the
magic 10
- rename ModelChunkSizeSilder.tsx -> ModelChunkSizeSlider.tsx (typo,
pre-existing) and update the four importers
---------
Co-authored-by: ljy <ljy@DESKTOP-65OBISN.(none)>
* feat(frontend): redesign agent and chat workflows (#4058)
* feat(frontend): align agent UI and shared components with design
* feat(frontend): add agent list table view
* feat(frontend): add resource-picker drawers and param-config modals
- 新增 components/resource-picker/ 共享组件库:
- AddAgentDrawer / AddKnowledgeDrawer / AddModelDrawer / AddSkillDrawer / AddToolDrawer
五个右侧滑出 760px 抽屉,点击按钮后滑出,高保真对齐设计稿。
- ParamDialog 系列:ModelConfigModal / SkillConfigModal / ToolConfigModal
居中 480px 弹窗(antd Modal centered),覆盖模型/技能/工具配置参数,
ToolConfigModal 支持 mode=config(参数配置态) 与 mode=debug(调试态,含点击测试与结果区)。
- 均为独立可调用组件,统一经 index.ts barrel 导出;数据先 mock,不修改后端。
- 补充 zh/en common.json 的 resourcePicker.* 本地化文案。
* feat(frontend): refine workbench UI per design specs
* feat(frontend): wire resource-picker drawers to real APIs and fix pagination
Replace the mock data in the five add-resource drawers (agent, knowledge,
model, skill, tool) with real data from existing hooks, and make the
resource drawers fetch and render 10 items per page with working pagination.
Changes:
- AddAgentDrawer: load local agents from usePublishedAgentList and external
agents from useExternalAgents; derive the label dropdown from agent tags.
- AddKnowledgeDrawer: load knowledge bases from useKnowledgeList; use the
source field for the label filter (no tags field on KnowledgeBase).
- AddSkillDrawer: load skills from useSkillList; derive labels from skill.tags.
- AddToolDrawer: load tools from useToolList; derive labels from tool.labels.
- AddModelDrawer: switch the data source from the preset catalog
(useModelCatalog) to the account's own models (useModelList), grouping LLM
models by source, since this drawer adds models already connected by the
account on the model config page.
- AddResourceDrawer: make ResourcePagination a controlled component and add
search/tab/filter -> page-1 reset so page navigation works.
- types: add optional tags to AgentCardItem.
Root cause of the pagination bug: ResourcePagination kept its own state and
the parent never sliced the list, so every page rendered the full result set
and the page controls were inert.
* feat(frontend): rename landing examples heading to recommended prompts
* feat(frontend): polish resource-picker drawers per design specs
Align the five "add resource" drawers with the design mockups.
- AddAgentDrawer: add a divider between local/external tabs, show the
agent update time with a status dot, and add a refresh button next to
select-all (reuse usePublishedAgentList/useExternalAgents refetch).
- AddKnowledgeDrawer: change the item meta label from "更新" to "使用过"
to match the design.
- AddModelDrawer: source data from useModelList (the account's already
connected models) instead of the preset useModelCatalog, group models
by their source, add a refresh button, and render a checkbox on the
right of each model row.
- AddSkillDrawer: always render both official and custom tabs instead of
deriving tabs from data so the "官方" tab no longer disappears.
- useSkillList: treat both "official" and "官方" as official sources.
- AddResourceDrawer: restyle the pagination jump box as a single
96x32px rounded white field with the "跳转" suffix inside.
- types: rename AgentCardItem.publishedAt to updatedAt.
* fix(frontend): refine pagination jump box input/button
Make the jump box match the design: keep the vertical divider full
height instead of inset, and turn the "跳转" suffix into a real button
whose click jumps to the entered page (via a ref), with Enter still
working in the input.
* feat(frontend): match composer toolbar icons to design
* feat(frontend): redesign new chat experience
* feat(frontend): agent config high-fidelity layout, resource drawers and debug page
- High-fidelity agent config layout with selected resource rows and add button
- Resource picker drawers for models, skills, tools and child agents
- Agent creation guide and first-creation welcome experience
- High-fidelity debug layout with welcome and question suggestions
- configurationLayout/debugLayout support in Thread and Composer
- Tags mapping in published agent list service
- D1/D4 test assets, automation cases and handoff docs
* feat(frontend): merge new chat redesign and restore workbench composer toolbar
* fix(frontend): remove duplicate planning menu in workbench composer
* feat(frontend): unify sidebar frame across pages and redraw knowledge icon
* fix(frontend): align workbench sidebar frame with new chat page
* fix(frontend): align new chat layout and agent conversation interactions
* fix(frontend): connect chat resource actions and localized sidebar navigation
* feat(frontend): migrate agent resource dialogs to resource-picker drawers
Replace the legacy add-tool / add-agent / add-skill / add-knowledge dialogs with the shared AddResourceDrawer skeleton while preserving data flows and API calls.
AddToolDrawer / AddAgentDrawer use the skeleton layout (search, single-select tag, selected chips, list header, tabs, pagination); AddAgentDrawer uses a 2-column card grid with instant selection and no confirm footer.
AddSkillDrawer selected chips resolve names by merging persisted skill instances (skill_name) with the catalog, matching SelectedSkillManagement hydration.
Extract the per-model parameter override popup into ModelParamsModal, wired into agent-prompt.
Delete orphaned legacy components (SelectToolsDialog, SelectSkillsDialog, SkillRowContent, capability/skill/utils, collaborative-agent-selector-modal).
Update the version-name label test to assert against collaborative-agent.tsx.
* feat(frontend): refine workbench composer alignment per design
* fix(frontend): hide empty attachment row above workbench composer input
* feat(frontend): refine agent development list layout
* fix(frontend): hide inactive sidebar controls
* fix(frontend): rename and reorder workbench menu
* fix(frontend): preserve conversation completion feedback after merge
* fix(frontend): repair quality gate interaction and duplication findings
* refactor(test): share duplicated editor browser fixtures
* test: add case-local PR4058 regressions and remove temporary docs
* fix(frontend): align new chat resource controls
* test: expand agent editor E2E and restore readonly mode navigation
* fix(frontend): load creation templates from Agent API
* fix(frontend): complete PR4058 localization and verified review fixes
---------
Co-authored-by: hzw <hzw@qq.com>
Co-authored-by: qianshengjia <840646206@qq.com>
Co-authored-by: ljy <ljy@DESKTOP-65OBISN.(none)>
Co-authored-by: 高天 <高天@DESKTOP-NKC6LHG.(none)>
* 🐛 Bugfix: Fixed the issue where concurrent calls to the same agent caused the sandbox kernel to become unhealthy. (#4068)
* 🐛 Bugfix: Fixed the issue where concurrent calls to the same agent caused the sandbox kernel to become unhealthy.
* 🐛 Bugfix: Fixed the issue where concurrent calls to the same agent caused the sandbox kernel to become unhealthy.
* test(sandbox): consolidate invocation regression coverage
* fix(sdk): limit SQL result rows without appending LIMIT (#4070)
* docs: add bilingual acknowledgments for former core contributors (#4075)
* test:新增测试报告责任人指派 (#4073)
* test:baseline cases
* test:add local test process
* doc:add test deploy guide
* bugfiix:优化测试流程
* bugfix:修复测试用例
* doc:轻量化bugfix的spec设计和测试用例设计
* test:修复测试用例
* test:修复D1测试用例
* test: 修复 D3 用例脚本并记录失败归因
* test: 移除 D3 变更记录,仅保留测试修复
* fix(test-e2e): make D5 tests portable and isolate evaluation workloads
* fix(test-e2e): repair Windows case contracts and D4 journeys
* feat(test-e2e): launch repository daily from a pinned branch
* test:修复D4读取config问题
* test:修复测试用例,删掉过期用例
* test:修复测试用例
* test:修复测试用例
* doc:测试规范修改
* test:增加外部记忆mock服务
* test:测试用例修复
* fix(prompt): reject blank task descriptions before SSE generation
* fix(agent): return 404 for missing discovery resources
* fix(agent): validate relationships before update writes
* fix(model): preserve provider error status on provider create
A provider failure (e.g. an upstream connection_failed) was raised as
HTTPException(502) by create_provider_models_for_tenant, but the generic
except Exception handlers in the service and the app layer swallowed it and
re-wrapped it, so /model/provider/create answered 500 with the real status
only surviving as text in the message body (API-049).
- service: re-raise HTTPException instead of wrapping it
- app: pass HTTPException through on /provider/create and
/manage/provider/create
- schema: reject a blank provider with 422 at the boundary
- tests: regression coverage for both behaviours
* fix: correct conversation access and stopped-turn regressions
* fix: enforce tenant isolation and edit permissions for agent relations
* fix: enforce tenant isolation and edit permissions for agent relations1
* 🐛 Fix tag projection crash on first-attempt ES write failure
Problem:
project_document_assignments() dereferenced the prior ledger state
without a None guard in its generic exception handler. On a document's
first-ever projection attempt there is no ledger row yet, so an ES write
failure crashed with AttributeError before the failed state was
persisted. The failure then became invisible: no retry_count, no
next_attempt_at, retry_pending_document_projections() never picked the
document up, and tag-filtered retrieval silently ignored the document
until its tags were re-saved.
Fix:
Treat a missing prior state as retry_count 0 in the failure handler
((current or {}).get("retry_count")), so first-attempt failures record a
retryable failed state with correct exponential backoff. Added a
regression unit test for the no-prior-state failure path (previously
only the existing-state path was covered). Also added one blank line
after the import block to satisfy the repo ruff pre-commit hook on this
file (pre-existing I001).
Verification:
- test/backend/services/test_tag_document_projection.py 28/28 passed,
incl. new test_first_attempt_failure_records_retryable_state
- Neighboring regression: test_tag_management_service.py and
test_tag_document_batch_status.py, 53/53 passed
- ruff (E,F,I,W hook rule set) clean on the touched backend file
- Matches the state-machine expectations of e2e case
API-AUTO-357B84F01BA6D321 (daily run 2026-10-09)
* Fix A2A publication smoke scope and remove Mock dependency
* fix(a2a): execute the version recorded by A2A publication
* [WIP] Fix accepted semantic repair stream commits (#4057)
* feat(audit): add security audit logging to backend management APIs (#4055)
* feat: 为模型管理接口添加安全审计日志记录
实现了模型创建、更新、删除、批量操作等接口的安全审计日志功能,过滤了敏感凭证信息,确保审计日志安全合规。新增了审计安全字段过滤工具函数,补充了对应的测试用例验证审计日志的正确性和安全性。
* feat: 为多个接口添加安全审计日志记录
为agent和agent_repository相关的API接口添加安全审计事件记录,包括代理更新、图标上传、删除、导出、导入、版本发布/回滚/更新/删除等操作,同时补充对应的测试用例验证审计日志的正确性,确保敏感数据不被记录。
* feat: 为MCP和技能相关接口添加上下文安全审计日志
为tool、mcp、remote_mcp、skill模块的所有关键增删改接口添加安全审计日志,记录操作人、资源信息等关键字段,同时避免记录敏感信息如凭证、密钥等。新增对应的测试用例验证审计日志的正确性,确保敏感数据不会被泄露。
* feat: 添加安全审计日志并限制审计详情列表长度
在多个服务端点添加安全审计日志,记录关键操作信息
同时统一审计详情列表的长度限制为20,防止日志被恶意payload撑爆
* feat: 为配置相关接口添加安全审计日志记录
为 config_sync_app 和 memory_config_app 的配置操作接口添加安全审计事件记录,记录操作人、租户、操作类型和相关字段信息,同时更新测试用例验证审计日志的正确性,确保敏感配置值不被记录。
* test: 为上传测试用例添加 http_request 参数默认值
为测试用例中的 upload_files 调用添加 http_request=None 参数,避免测试时可能出现的未定义错误
* chore: bootstrap semantic repair stream fix draft
* fix(agent): commit accepted streamed code action repairs
* test(agent): verify repaired streams in deployed runtime and browser
* test(agent): clarify deployed repair assertion failures
---------
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
* fix: repair agent repository e2e cases and API-type MCP health check (#4061)
* fix: repair four failing e2e cases (API-086, API-063, PW-MCP-CONTAINER-01, PW-MCP-MARKET-01)
* fix: skip MCP protocol handshake for API-type MCP health check
* fix(test-e2e): align runtime contracts and strengthen local test diagnostics
* fix(test-e2e): reconcile standalone semantic repair tests with formal cases
* test:修改workflow
* test:修复测试用例
* fix: preserve manual titles and metadata-free A2A calls
* test: repair D1-D5 runtime contracts and execution evidence
* test: repair daily assertions and remove excluded cases
* fix: guard MCP tag refresh and repair daily test isolation
* test:修复测试用例
* test:修复测试用例
* test:修复测试用例
* doc:优化测试用例生成skill
* test:新增测试报告责任人
* test: publish latest complete Daily reports for Syncthing
---------
Co-authored-by: panyehong <2655992392@qq.com>
Co-authored-by: xuyaqist <xuyaqist@gmail.com>
Co-authored-by: chase <byzhangxin11@126.com>
Co-authored-by: cj2026-bit <647646783@qq.com>
Co-authored-by: Jason Wang <56037774+JasonW404@users.noreply.github.com>
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
Co-authored-by: MoeexT <yuwancumian666@outlook.com>
* fix(agent): export filename uses display name + unique copy name suffix (#4064)
* fix(agent): export agent with display name as zip filename
Use the agent display name (falling back to name) for export zip
filenames, and encode Content-Disposition with RFC 5987 so non-ASCII
names survive browser downloads. Extract the filename on the frontend
from the encoded header.
Verified: unit tests for header encoding/parsing and API-level export
checks in the local cluster.
* fix(agent): generate unique copy name suffix on agent copy
* fix(agent): deduplicate agent name on create via update API
* test(e2e): cover agent copy unique-name and availability contract
Add bugfix record AGENT-COPY-DUP-20261012, update API-058 to the
fixed auto-suffix dedup contract, and add D4 journey PW-AGENT-COPY-01
that copies an agent twice through the repository UI and asserts
unique identifiers and availability.
* test(e2e): assert agent export uses display-name filename
Add bugfix record AGENT-EXPORT-NAME-20261012, update API-066 to
require the display-name ZIP export path, and extend the D3 scenario
to bind a skill before export and assert the RFC 5987 encoded
Content-Disposition filename.
* test(e2e): parse bare agent list array in copy journey
/api/agent/list returns a bare JSON array; the copy journey and the shared page object unwrapped payload.data, so every poll resolved to an empty list and the case failed before its assertions ran. Parse the array first and keep the wrapped shape as a fallback. Also align case.yaml expected_results with the three spec assertions and remap acceptance bindings accordingly.
* ✨ Feature(aidp): complete knowledge base management pages (#4062)
* feat(aidp): isolate knowledge list, creation, files and import pages
* fix(aidp): preserve list preferences and restrict row navigation
* fix(aidp): refresh knowledge list once after import
* fix(aidp): refresh knowledge list when import drawer closes
* docs(aidp): define import creation and files acceptance cases
* fix: align AIDP file operations and knowledge list refresh with acceptance
* fix: use persisted AIDP knowledge creator consistently
* fix: align AIDP knowledge pages with deployed contract
* fix: restore four-column knowledge cards
* fix(aidp): align knowledge guide with agent workflows
* fix(aidp): sanitize externally sourced log values
* test(aidp): cover graph contracts and file query branches
* refactor(aidp): confine knowledge management changes to module
* refactor(aidp): organize frontend by pages and reusable features
* fix: simplify AIDP knowledge management after backend review
* fix(aidp): address knowledge page frontend review
* fix(aidp): avoid overlapping permission tooltips
* fix(aidp): unify knowledge page typography
* fix(aidp): keep knowledge list reachable below expanded guide
* test(aidp): align frontend D1 with knowledge management pages
* fix(aidp): handle failed file deletion confirmations without unhandled rejections
* chore(aidp): remove unused upload documentation and stale text
* fix(aidp): review fixes for KB management pages
- Defer graph domain validation to AIDP: the frontend sources domain
options from the live graph template, so a hardcoded backend whitelist
would reject newly added AIDP domains at submit time. The serializer
now only requires a non-empty string.
- Treat AIDP 404 on KB delete as success so orphan KBs (already removed
upstream) can be cleaned up locally, and expose the delete action for
unavailable rows in the KB list (card menu and table actions).
- Reject same-name duplicates within one upload batch: only the first
file is accepted and the rest fail immediately as duplicates, because
upload responses match rows by file name only and would otherwise pair
success/failure with the wrong rows.
* 支持本地工具不走沙箱调用 (#4069)
* feat: defer Docker startup for official tool actions
* feat: allow JSON imports in local tool fast path
* fix(sdk): align tool policy registration and cover deferred execution
* test: add deployed and browser tool fastpath acceptance coverage
---------
Co-authored-by: hhhhsc <name>
* ✨ Feature: Add a pipeline to synchronize the MinIO image to Docker Hub. (#4081)
* ✨ Feature: Add a pipeline to synchronize the MinIO image to Docker Hub.
* fix(test): align offline package fixtures with MinIO image source
* 🐛 Bugfix: final answer duplication in subagent situation (#4077)
* 🐛 Bugfix: final answer duplicate in subagent situation
* Update final-answer browser checks for develop history groups
* Fix final-answer unit test expectations and stream type mock
* Cover final-answer ownership cleanup and stream rollback boundaries
* Cover final-answer stream transitions and completion branches
* refactor(chat): remove legacy chat page and migrate version comparison and share views (#4085)
* refactor(chat): remove legacy chat page and migrate conversation consumers
* test(workbench): fix composer fixtures and retrieval configuration coverage
* switch bettwen /workbench and /newchat
* test(chat): migrate legacy D1 cases to newchat contracts
* ♻️ refactor model service (#4088)
* refactor: consolidate model management services
* test: update Management architecture checks for model modules
* 修复思考强度切换及下拉样式 (#4091)
* fix: correct reasoning effort selection
* fix: default workbench reasoning effort to low
* ci: add copyright header check for changed source files (#4087)
* ci: add copyright header check for changed source files
- Add scripts/check_copyright.py to check and auto-fix missing copyright
headers on .py/.sh/.sql/.ts/.tsx/.js/.jsx/.mjs files, with a
--files-from mode for incremental checks
- Add .github/workflows/copyright-check.yml to incrementally check PRs
targeting develop/release/hotfix branches, with an optional full scan
via workflow_dispatch
- Require the header in AGENTS.md shared constraints and add a
.cursor/rules thin entry for compatibility
- Document the requirement and local verify/fix commands in CONTRIBUTING.md
* fix(ci): generate copyright year range dynamically
Derive the end year of the copyright header from the current year instead of hardcoding 2025-2026, so headers inserted by --fix and the suggestion in error output stay correct in future years. The check pattern already accepts any year variant. Also document the dynamic end year in AGENTS.md and CONTRIBUTING.md.
* fix(ci): limit copyright check workflow token permissions
Add an explicit top-level permissions block restricting GITHUB_TOKEN to contents: read, matching the convention of other workflows and resolving the CodeQL workflow permissions alert.
* fix(ci): drop push trigger and add paths filter to copyright check
Remove the push trigger: on merge commits to protected branches the two-dot diff (event.before..HEAD) includes every file from the merged feature branch, which could turn previously green PRs into unexpected red builds on develop. Incremental checking is already closed-loop on pull_request events via the three-dot diff against the base branch.
Simplify the fallback diff to HEAD~1..HEAD: github.event.before is only populated for push events, so the BEFORE_SHA branch is dead code now. workflow_dispatch changed mode keeps its documented latest-commit semantics.
Add a pull_request paths filter matching the checker's supported source extensions so docs-only PRs no longer trigger a fetch-depth: 0 checkout. Keep the workflow file itself in the trigger set so changes to the check are still validated end-to-end.
---------
Co-authored-by: zz287613978 <zz287613978@noreply.gitcode.com>
* fix(i18n): Chinese characters in English UI (#4084)
* fix(i18n): 修复问题英文界面有中文
修改 i18n 配置和 Memory 组件,使英文界面正确显示英文,中文界面保持中文。
- i18n.tsx: 设置 keySeparator=false, nsSeparator=false,强制 i18next 用 flat key 查找 locale 文件,避免带点 key 被当作嵌套结构查找失败
- MemoryManager.tsx: JSX 中文字面量(tooltip、aria-label、placeholder、按钮文案、列标题、状态映射等)改为 t() 调用形式,新增 56 个 memory.manager.* i18n key
- en/common.json: 新增对应 56 个英文翻译
- zh/common.json: 新增对应 56 个中文翻译,确保两个 locale 完全对齐
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: glm-5.2
* docs(i18n): add verification screenshot for PR #4084
上传英文/中文界面国际化对比截图作为验证证据。
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: glm-5.2
* docs(i18n): remove screenshot from PR #4084 modified files
移除截图文件,改为通过 PR 评论方式提供验证截图。
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: glm-5.2
* fix(i18n): add model provider connection error messages
为模型提供商连接失败场景补充 en/zh 文案(title/noModels/connectionFailed/authenticationFailed/accessDenied/endpointNotFound/serverError/timeout/sslError)。
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: deepseek-v4.1-flash
* fix(i18n): align en/zh locale keys for model config and agent pages
补齐两边 locale 缺失 key,使 en/zh 完全对齐:
- zh 补 77 个:model.connectivity/status/filter、modelConfig.addDialog/button/
defaultConfig/delete/editDialog/library/list/pagination/search/spec/table/
update/verify、model.dialog.v2.searchModels、nl2agent.toolRecommendations 复数形式
- en 补 17 个:agent.a2a、agent.deployment、agent.mainAgent、agent.permission、
agent.runPolicy
- 同时移除未生效的嵌套 model.dialog.error.provider 块(keySeparator=false 下
不会被解析,扁平 key 已存在)
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: kimi-k3
* fix(i18n): remove keySeparator/nsSeparator overrides in i18next init
恢复 i18next 默认分隔符行为:
- i18next 的 deepFind 会先把整串 key 当作扁平属性查找,与 keySeparator 无关;
默认 "." 是 keySeparator: false 的超集,显式关闭反而让嵌套数据与数组索引
路径(如 page.features.0.title)静默失效并返回裸 key。
- 全仓无含 ":" 的 key、也无 t("common:...") 形式的调用,nsSeparator 无实际作用。
- 已对 en/zh 全部语言包条目做等价性验证(5940 x 2 key,新旧配置解析差异 0),
并确认移除后 page.features.0.title 恢复为正常文案。
Refs #4084
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: deepseek-v4.1-flash
---------
Co-authored-by: Trae <noreply@trae.ai>
* test:优化测试结果同步sycthing文件夹机制 (#4100)
* test:baseline cases
* test:add local test process
* doc:add test deploy guide
* bugfiix:优化测试流程
* bugfix:修复测试用例
* doc:轻量化bugfix的spec设计和测试用例设计
* test:修复测试用例
* test:修复D1测试用例
* test: 修复 D3 用例脚本并记录失败归因
* test: 移除 D3 变更记录,仅保留测试修复
* fix(test-e2e): make D5 tests portable and isolate evaluation workloads
* fix(test-e2e): repair Windows case contracts and D4 journeys
* feat(test-e2e): launch repository daily from a pinned branch
* test:修复D4读取config问题
* test:修复测试用例,删掉过期用例
* test:修复测试用例
* test:修复测试用例
* doc:测试规范修改
* test:增加外部记忆mock服务
* test:测试用例修复
* fix(prompt): reject blank task descriptions before SSE generation
* fix(agent): return 404 for missing discovery resources
* fix(agent): validate relationships before update writes
* fix(model): preserve provider error status on provider create
A provider failure (e.g. an upstream connection_failed) was raised as
HTTPException(502) by create_provider_models_for_tenant, but the generic
except Exception handlers in the service and the app layer swallowed it and
re-wrapped it, so /model/provider/create answered 500 with the real status
only surviving as text in the message body (API-049).
- service: re-raise HTTPException instead of wrapping it
- app: pass HTTPException through on /provider/create and
/manage/provider/create
- schema: reject a blank provider with 422 at the boundary
- tests: regression coverage for both behaviours
* fix: correct conversation access and stopped-turn regressions
* fix: enforce tenant isolation and edit permissions for agent relations
* fix: enforce tenant isolation and edit permissions for agent relations1
* 🐛 Fix tag projection crash on first-attempt ES write failure
Problem:
project_document_assignments() dereferenced the prior ledger state
without a None guard in its generic exception handler. On a document's
first-ever projection attempt there is no ledger row yet, so an ES write
failure crashed with AttributeError before the failed state was
persisted. The failure then became invisible: no retry_count, no
next_attempt_at, retry_pending_document_projections() never picked the
document up, and tag-filtered retrieval silently ignored the document
until its tags were re-saved.
Fix:
Treat a missing prior state as retry_count 0 in the failure handler
((current or {}).get("retry_count")), so first-attempt failures record a
retryable failed state with correct exponential backoff. Added a
regression unit test for the no-prior-state failure path (previously
only the existing-state path was covered). Also added one blank line
after the import block to satisfy the repo ruff pre-commit hook on this
file (pre-existing I001).
Verification:
- test/backend/services/test_tag_document_projection.py 28/28 passed,
incl. new test_first_attempt_failure_records_retryable_state
- Neighboring regression: test_tag_management_service.py and
test_tag_document_batch_status.py, 53/53 passed
- ruff (E,F,I,W hook rule set) clean on the touched backend file
- Matches the state-machine expectations of e2e case
API-AUTO-357B84F01BA6D321 (daily run 2026-10-09)
* Fix A2A publication smoke scope and remove Mock dependency
* fix(a2a): execute the version recorded by A2A publication
* [WIP] Fix accepted semantic repair stream commits (#4057)
* feat(audit): add security audit logging to backend management APIs (#4055)
* feat: 为模型管理接口添加安全审计日志记录
实现了模型创建、更新、删除、批量操作等接口的安全审计日志功能,过滤了敏感凭证信息,确保审计日志安全合规。新增了审计安全字段过滤工具函数,补充了对应的测试用例验证审计日志的正确性和安全性。
* feat: 为多个接口添加安全审计日志记录
为agent和agent_repository相关的API接口添加安全审计事件记录,包括代理更新、图标上传、删除、导出、导入、版本发布/回滚/更新/删除等操作,同时补充对应的测试用例验证审计日志的正确性,确保敏感数据不被记录。
* feat: 为MCP和技能相关接口添加上下文安全审计日志
为tool、mcp、remote_mcp、skill模块的所有关键增删改接口添加安全审计日志,记录操作人、资源信息等关键字段,同时避免记录敏感信息如凭证、密钥等。新增对应的测试用例验证审计日志的正确性,确保敏感数据不会被泄露。
* feat: 添加安全审计日志并限制审计详情列表长度
在多个服务端点添加安全审计日志,记录关键操作信息
同时统一审计详情列表的长度限制为20,防止日志被恶意payload撑爆
* feat: 为配置相关接口添加安全审计日志记录
为 config_sync_app 和 memory_config_app 的配置操作接口添加安全审计事件记录,记录操作人、租户、操作类型和相关字段信息,同时更新测试用例验证审计日志的正确性,确保敏感配置值不被记录。
* test: 为上传测试用例添加 http_request 参数默认值
为测试用例中的 upload_files 调用添加 http_request=None 参数,避免测试时可能出现的未定义错误
* chore: bootstrap semantic repair stream fix draft
* fix(agent): commit accepted streamed code action repairs
* test(agent): verify repaired streams in deployed runtime and browser
* test(agent): clarify deployed repair assertion failures
---------
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
* fix: repair agent repository e2e cases and API-type MCP health check (#4061)
* fix: repair four failing e2e cases (API-086, API-063, PW-MCP-CONTAINER-01, PW-MCP-MARKET-01)
* fix: skip MCP protocol handshake for API-type MCP health check
* fix(test-e2e): align runtime contracts and strengthen local test diagnostics
* fix(test-e2e): reconcile standalone semantic repair tests with formal cases
* test:修改workflow
* test:修复测试用例
* fix: preserve manual titles and metadata-free A2A calls
* test: repair D1-D5 runtime contracts and execution evidence
* test: repair daily assertions and remove excluded cases
* fix: guard MCP tag refresh and repair daily test isolation
* test:修复测试用例
* test:修复测试用例
* test:修复测试用例
* doc:优化测试用例生成skill
* test:新增测试报告责任人
* test: publish latest complete Daily reports for Syncthing
* fix(test): preserve unrelated files during Daily report publication
---------
Co-authored-by: panyehong <2655992392@qq.com>
Co-authored-by: xuyaqist <xuyaqist@gmail.com>
Co-authored-by: chase <byzhangxin11@126.com>
Co-authored-by: cj2026-bit <647646783@qq.com>
Co-authored-by: Jason Wang <56037774+JasonW404@users.noreply.github.com>
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
Co-authored-by: MoeexT <yuwancumian666@outlook.com>
* 🧪 Test(e2e): migrate the ext-knowledge mock into the formal framework and repair the daily knowledge cases (#4090)
* 🧪 Test(e2e): migrate the ext-knowledge mock into the formal framework and repair the daily knowledge cases
- Move the ext-knowledge mock contract into test-e2e/infra/mock-services/ext-knowledge-mock
(single-source build context, runner/product dual compose overlays, per-case attach tooling
with identity check, endpoint lock, full reset and evidence export, suite-worker integration,
validate_execution mock-service enum + profile selection, publisher evidence whitelist).
- Migrate the eight formal mock consumers (AGT-001/002, CTR-016/017/046/047, PERF-09, REL-02)
onto the framework-managed instance; API-AUTO-FC03F18034CB0D51 is repaired separately below.
- Repair the four daily knowledge cases: the D2 delete signature and audit isolation,
PW-KB-LOCAL-01 (agent-card configure action + AddKnowledgeDrawer autosave),
PW-FILE-01 (composer/attachment and refreshed-chat drift), and the new PW-KB-AIDP-01 journey
with explicit mock/real_smoke profile selection.
- Add the fidelity suite test/ext_components/ext_knowledge (57 original + 6 regressions = 63 tests)
driving the real adapters against the mock; CI collects it through test/ext_components.
- Repair shared D4 helper drift found under live execution (collapsible agent editor sections,
tool-config autosave evidence, high-fidelity conversation guide, collaborator drawer,
guardrail modal, agent publish before a new conversation).
- No product code changed.
* 🧪 Test(e2e): keep prerequisite-failure receipts and align the mock deployment with D-001
Review-fix pass on the framework migration:
- Bind RESULT_DIR in the worker process itself and adopt any prerequisite
receipt (not only preparation-step failures), so attach and dependency
failures report BLOCKED_BY_DEPENDENCY with their concrete reason instead
of a bare AUTOMATION_ERROR. Regression tests cover the classification and
the worker wiring (the previous tests set RESULT_DIR themselves and thus
masked the gap).
- Publish the mock port on loopback only per design D-001; product-side
callers keep using the compose-network DNS name. The registration test
now pins the loopback binding.
- Decide the instance's released/unknown state before releasing the attach
lock (removes the unlock-vs-rewrite race); the schema description now
matches the allowed host-mode equality of runner_url/product_url.
- Fidelity conftest clears the wire log per test and restores the identity
environment variables at teardown.
- Control plane validates the whole /_reset service list before executing
and checks the AIDP sub-app response codes on fail-next/fail-reset.
- PW-KB-AIDP-01 syncs the contract text with the implemented evidence
model and gains acceptance obligations and bindings; drop an unused
variable and a stray blank line.
* 🧪 Test(e2e): record the review re-verification results
Minimum-regression re-run against a fresh one-off deployment on the
review-fix code: PW-TASK-01 and AGT-001 passed, PW-KB-AIDP-01 passed its
full mock-profile journey, and the repaired helpers were exercised
successfully wherever reached (PW-CHAT-01 step 1, PW-CHAT-05 steps 1-3,
PW-PROMPT-02 preconditions, PW-AGENT-01 precondition 3). The remaining
cases fail on their own pre-existing post-#4058 drift (AgentPage.create()
flow, retired 请输入智能体描述 placeholder, 智能体角色 tab, 执行 mode button,
知识库: scope button), recorded per case and left untouched. The negative
attach path was verified live: a foreign identity yields
BLOCKED_BY_DEPENDENCY with the concrete reason written to the case
runtime receipt.
* 📝 Docs(e2e): add the product-UI driving guide and seed catalog to the mock README
Documents what a human enters when binding the mocked services as agent
to…
jeffwu-1999
added a commit
that referenced
this pull request
Oct 23, 2026
* docs: update third-party notices (#4048)
* feat: add optional nginx HTTPS termination (#4026)
* feat(deploy): add optional nginx HTTPS termination for docker and k8s installs
- Add HTTPS mode option (disabled/self-signed/custom) to install TUI,
persisted in deploy.options and reusable on non-interactive reruns
- Support auto-generated self-signed certs (99-year validity, SAN from
env or NIC auto-detection) and user-provided certs with validation
(PEM format, key/cert match, expiry, encrypted key decryption)
- Decrypt passphrase-protected keys to a 0600 plaintext copy mounted by
nginx; passphrase stored via existing .env credential pattern
- Add nexent-nginx helm chart (deployment/service/configmap/secret)
terminating TLS on NodePort 30000 via error_page 497 same-port redirect;
web service steps down to ClusterIP when HTTPS is enabled
- Render cert/key as YAML literal blocks; store TLS as Opaque secret
with server.pem/server.key keys
- Update offline packaging, env example, install docs and common tests
* fix(deploy): address HTTPS review findings
- Seed HTTPS config from NEXENT_HTTPS_* env vars before defaults
- Detect SAN via ip -o -4 addr (Linux) with ifconfig fallback
- Start docker nginx before core services; clean up on disabled; bind web to loopback 3001 when HTTPS is enabled
- chmod 600 generated Helm values containing private keys
- Support EC keys via openssl pkey with LibreSSL fallback
- Route nginx image through NGINX_IMAGE and registry prefix
- Validate cert/key pair and expiry when reusing self-signed certs
- Persist custom key passphrase to .env
* refactor(deploy): split HTTP and HTTPS entry ports for nginx HTTPS
- Give HTTPS a dedicated entry: Docker port 3100, K8s NodePort 31000
- Keep the plain HTTP entry unchanged (Docker 3000 / K8s NodePort 30000); web no longer steps down to ClusterIP or a loopback-only binding
- Drop the same-port error_page 497 redirect now that entries are split
- Update TUI/summary wording, tests and install docs for the new ports
* docs(deploy): list the HTTPS entry port in the port mapping table
* fix(deploy): always bundle nginx image in offline package
Offline hosts cannot pull the nginx image after delivery when the user enables HTTPS during installation. Bundle nginx:alpine with the infrastructure images instead of gating it on build-time HTTPS options, and drop the HTTPS flags from the offline build passthrough list.
* feat(deploy): make HTTP and HTTPS entry ports configurable
Introduce NEXENT_WEB_PORT and NEXENT_HTTPS_PORT so users can change the entry ports for both Docker (host port mapping) and Kubernetes (NodePort) deployments. Defaults keep the current behavior (Docker 3000/3100, K8s 30000/31000). Also fix the deploy script overwriting a user-set web port mapping when HTTPS is disabled, and document the new variables in .env.example and the installation guides.
* feat(deploy): validate k8s nodePort range for entry ports
Reject NEXENT_WEB_PORT and NEXENT_HTTPS_PORT values outside the Kubernetes nodePort range (30000-32767) before rendering Helm values, so users get a clear error instead of a cryptic API server message. Ports are only validated when HTTPS mode needs them, and empty values keep using defaults.
* fix(deploy): render nginx nodePort in generated Helm values
The live Helm values renderer (deployment_render_helm_chart_values) only
rendered the nginx image block, so the nginx Service fell back to the
chart default NodePort and a user-set NEXENT_HTTPS_PORT never took
effect. Render the nginx services block the same way the port-policy
renderer does, and cover it with a Helm values assertion.
* test(deploy): include nginx image in offline push test fixtures
* Bugfix: Resolve indicator status display failure (#4050)
1. 修复在对话过程中无法正常显示指示灯的问题,“绿色”代表正在回答,“蓝色”代表回答完成 (#4050)
2. 修复在对话过程中,用户发送的消息无法正常显示换行的问题
3. 修复无法正常重命名“当前会话”的标题
* docs(api): update Apifox API docs website URL (#4052)
Replace the retired project link (8icfxll43r.apifox.cn) with the new
shared docs URL in both zh and en API reference pages.
Generated-by: glm-5.3-flash
Co-authored-by: ZCode <noreply@zcode.ai>
* fix: keep independent AIDP search selectable and recommendable (#4046)
* 🐛 Bugfix: 支持 Windows 本机 runtime 使用 Docker Linux 沙箱 (#3985)
* 修改Windows 本机 runtime 与 Docker Linux 路径不兼容的问题
* 实现 HTTPS/WSS 保留业务功能,消除明文连接问题
* 修改了安全存储密钥,校验了证书身份,客户端和测试服务端明确要求 TLS 1.2+
* 恢复了Agent 初始化失败后重新分配 kernel的特性
* test: align workspace initialization tests with lease-owned recovery
* fix: keep sandbox WSS connections off environment proxies
* test: support websocket-client redirect rejection across versions
---------
Co-authored-by: DoYX <du.yuxiao@gmail.com>
* ♻️ Refactor(data-process): replace Ray with Celery prefork (#3888)
* refactor(data-process): replace Ray with Celery prefork
Run parsing in process-local Celery prefork children, keep orchestration and forwarding on thread workers, and remove the Ray runtime, dependency, and deployment surface.
Co-authored-by: Codex <noreply@openai.com>
Generated-by: gpt-5-codex
* fix(data-process): preserve sync parser result metadata
* fix(data-process): wait for parser readiness in result backend
* fix(data-process): tolerate lightweight worker app doubles
* test(model): mock authentication for temporary healthcheck
* Revert "test(model): mock authentication for temporary healthcheck"
This reverts commit 9aa8d45b8eb9b8248b731957d23d851936e03608.
* test(data-process): configure Celery URLs in isolated tests
* test(data-process): cover prefork task boundaries
* test(data-process): isolate prefork coverage from redis backend
* test(data-process): cover lazy prefork branches
* fix(data-process): complete celery prefork migration review fixes
* test(data-process): align prefork tests with current APIs
* fix(data-process): avoid logging user-controlled image paths
* test(data-process): isolate router tests from celery bootstrap
* test(model): provide auth for temporary healthcheck
* test(data-process): stub redis chunk loader in router test
* test(data-process): cover parser cancellation and lifecycle helpers
* test(data-process): re-export process_sync from tasks module
Keep the synchronous parse entry point reachable through the tasks
module so coverage and isolation tests can patch one import site.
Use a redundant-alias re-export to satisfy F401.
* 🧪 Test: restore stubbed sys.modules after app router fixture
Problem: the stub_modules fixture in test_data_process_app.py assigned
stub modules directly to sys.modules without restoring them, so the
stubs leaked into every later test file sharing the same pytest
process. Running test_data_process_app.py before
test_data_process_service.py failed all 52 service tests in setUp with
AttributeError: '_CeleryAppStub' object has no attribute 'reset_mock'.
The leak was invisible to CI because run_all_test.py runs each test
file in its own subprocess.
Fix: replace the six direct sys.modules assignments with
monkeypatch.setitem so the real modules are restored when the fixture
tears down. Behavior during each test is unchanged.
Verification:
- pytest test/backend/app/test_data_process_app.py
test/backend/services/test_data_process_service.py
-> 76 passed (was 24 passed / 52 failed)
- each file alone: 24 passed / 52 passed (no regression)
- wider combo (app + services + tasks + worker + coverage):
app+services now pass together; the remaining failures are a
pre-existing module-level mock leak in test_data_process_service.py
that exists on develop and is out of scope here.
* 🐛 Bugfix: Move AIDP-related synchronous calls to a managed thread to avoid blocking other interfaces. (#4054)
* ♻️ Refactor agent prompt (#4051)
* [WIP]♻️ Agent prompt refactor
* [WIP]♻️ Agent prompt refactor
* 🧪 Add test files
* 🧪 Add test files
* 🧪 Add test files
* 🧪 Add test files
* 🧪 Add test files
* ♻️ Merge system prompts into one chunk
* 🧪 Add test files
* 🧪 Add test files
* feat(audit): add security audit logging to backend management APIs (#4055)
* feat: 为模型管理接口添加安全审计日志记录
实现了模型创建、更新、删除、批量操作等接口的安全审计日志功能,过滤了敏感凭证信息,确保审计日志安全合规。新增了审计安全字段过滤工具函数,补充了对应的测试用例验证审计日志的正确性和安全性。
* feat: 为多个接口添加安全审计日志记录
为agent和agent_repository相关的API接口添加安全审计事件记录,包括代理更新、图标上传、删除、导出、导入、版本发布/回滚/更新/删除等操作,同时补充对应的测试用例验证审计日志的正确性,确保敏感数据不被记录。
* feat: 为MCP和技能相关接口添加上下文安全审计日志
为tool、mcp、remote_mcp、skill模块的所有关键增删改接口添加安全审计日志,记录操作人、资源信息等关键字段,同时避免记录敏感信息如凭证、密钥等。新增对应的测试用例验证审计日志的正确性,确保敏感数据不会被泄露。
* feat: 添加安全审计日志并限制审计详情列表长度
在多个服务端点添加安全审计日志,记录关键操作信息
同时统一审计详情列表的长度限制为20,防止日志被恶意payload撑爆
* feat: 为配置相关接口添加安全审计日志记录
为 config_sync_app 和 memory_config_app 的配置操作接口添加安全审计事件记录,记录操作人、租户、操作类型和相关字段信息,同时更新测试用例验证审计日志的正确性,确保敏感配置值不被记录。
* test: 为上传测试用例添加 http_request 参数默认值
为测试用例中的 upload_files 调用添加 http_request=None 参数,避免测试时可能出现的未定义错误
* 🧪test:add e2e test baseline&fix some bugs (#4065)
* test:baseline cases
* test:add local test process
* doc:add test deploy guide
* bugfiix:优化测试流程
* bugfix:修复测试用例
* doc:轻量化bugfix的spec设计和测试用例设计
* test:修复测试用例
* test:修复D1测试用例
* test: 修复 D3 用例脚本并记录失败归因
* test: 移除 D3 变更记录,仅保留测试修复
* fix(test-e2e): make D5 tests portable and isolate evaluation workloads
* fix(test-e2e): repair Windows case contracts and D4 journeys
* feat(test-e2e): launch repository daily from a pinned branch
* test:修复D4读取config问题
* test:修复测试用例,删掉过期用例
* test:修复测试用例
* test:修复测试用例
* doc:测试规范修改
* test:增加外部记忆mock服务
* test:测试用例修复
* fix(prompt): reject blank task descriptions before SSE generation
* fix(agent): return 404 for missing discovery resources
* fix(agent): validate relationships before update writes
* fix(model): preserve provider error status on provider create
A provider failure (e.g. an upstream connection_failed) was raised as
HTTPException(502) by create_provider_models_for_tenant, but the generic
except Exception handlers in the service and the app layer swallowed it and
re-wrapped it, so /model/provider/create answered 500 with the real status
only surviving as text in the message body (API-049).
- service: re-raise HTTPException instead of wrapping it
- app: pass HTTPException through on /provider/create and
/manage/provider/create
- schema: reject a blank provider with 422 at the boundary
- tests: regression coverage for both behaviours
* fix: correct conversation access and stopped-turn regressions
* fix: enforce tenant isolation and edit permissions for agent relations
* fix: enforce tenant isolation and edit permissions for agent relations1
* 🐛 Fix tag projection crash on first-attempt ES write failure
Problem:
project_document_assignments() dereferenced the prior ledger state
without a None guard in its generic exception handler. On a document's
first-ever projection attempt there is no ledger row yet, so an ES write
failure crashed with AttributeError before the failed state was
persisted. The failure then became invisible: no retry_count, no
next_attempt_at, retry_pending_document_projections() never picked the
document up, and tag-filtered retrieval silently ignored the document
until its tags were re-saved.
Fix:
Treat a missing prior state as retry_count 0 in the failure handler
((current or {}).get("retry_count")), so first-attempt failures record a
retryable failed state with correct exponential backoff. Added a
regression unit test for the no-prior-state failure path (previously
only the existing-state path was covered). Also added one blank line
after the import block to satisfy the repo ruff pre-commit hook on this
file (pre-existing I001).
Verification:
- test/backend/services/test_tag_document_projection.py 28/28 passed,
incl. new test_first_attempt_failure_records_retryable_state
- Neighboring regression: test_tag_management_service.py and
test_tag_document_batch_status.py, 53/53 passed
- ruff (E,F,I,W hook rule set) clean on the touched backend file
- Matches the state-machine expectations of e2e case
API-AUTO-357B84F01BA6D321 (daily run 2026-10-09)
* Fix A2A publication smoke scope and remove Mock dependency
* fix(a2a): execute the version recorded by A2A publication
* [WIP] Fix accepted semantic repair stream commits (#4057)
* feat(audit): add security audit logging to backend management APIs (#4055)
* feat: 为模型管理接口添加安全审计日志记录
实现了模型创建、更新、删除、批量操作等接口的安全审计日志功能,过滤了敏感凭证信息,确保审计日志安全合规。新增了审计安全字段过滤工具函数,补充了对应的测试用例验证审计日志的正确性和安全性。
* feat: 为多个接口添加安全审计日志记录
为agent和agent_repository相关的API接口添加安全审计事件记录,包括代理更新、图标上传、删除、导出、导入、版本发布/回滚/更新/删除等操作,同时补充对应的测试用例验证审计日志的正确性,确保敏感数据不被记录。
* feat: 为MCP和技能相关接口添加上下文安全审计日志
为tool、mcp、remote_mcp、skill模块的所有关键增删改接口添加安全审计日志,记录操作人、资源信息等关键字段,同时避免记录敏感信息如凭证、密钥等。新增对应的测试用例验证审计日志的正确性,确保敏感数据不会被泄露。
* feat: 添加安全审计日志并限制审计详情列表长度
在多个服务端点添加安全审计日志,记录关键操作信息
同时统一审计详情列表的长度限制为20,防止日志被恶意payload撑爆
* feat: 为配置相关接口添加安全审计日志记录
为 config_sync_app 和 memory_config_app 的配置操作接口添加安全审计事件记录,记录操作人、租户、操作类型和相关字段信息,同时更新测试用例验证审计日志的正确性,确保敏感配置值不被记录。
* test: 为上传测试用例添加 http_request 参数默认值
为测试用例中的 upload_files 调用添加 http_request=None 参数,避免测试时可能出现的未定义错误
* chore: bootstrap semantic repair stream fix draft
* fix(agent): commit accepted streamed code action repairs
* test(agent): verify repaired streams in deployed runtime and browser
* test(agent): clarify deployed repair assertion failures
---------
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
* fix: repair agent repository e2e cases and API-type MCP health check (#4061)
* fix: repair four failing e2e cases (API-086, API-063, PW-MCP-CONTAINER-01, PW-MCP-MARKET-01)
* fix: skip MCP protocol handshake for API-type MCP health check
* fix(test-e2e): align runtime contracts and strengthen local test diagnostics
* fix(test-e2e): reconcile standalone semantic repair tests with formal cases
* test:修改workflow
* test:修复测试用例
* fix: preserve manual titles and metadata-free A2A calls
* test: repair D1-D5 runtime contracts and execution evidence
* test: repair daily assertions and remove excluded cases
* fix: guard MCP tag refresh and repair daily test isolation
* test:修复测试用例
* test:修复测试用例
* test:修复测试用例
---------
Co-authored-by: panyehong <2655992392@qq.com>
Co-authored-by: xuyaqist <xuyaqist@gmail.com>
Co-authored-by: chase <byzhangxin11@126.com>
Co-authored-by: cj2026-bit <647646783@qq.com>
Co-authored-by: Jason Wang <56037774+JasonW404@users.noreply.github.com>
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
Co-authored-by: MoeexT <yuwancumian666@outlook.com>
* fix(deploy): default frontend and backend timezone to Asia/Shanghai (#4067)
* Fix thinking prefix compatibility in Agent output parsing (#4060)
* test:baseline cases
* test:add local test process
* doc:add test deploy guide
* bugfiix:优化测试流程
* bugfix:修复测试用例
* doc:轻量化bugfix的spec设计和测试用例设计
* test:修复测试用例
* test:修复D1测试用例
* test: 修复 D3 用例脚本并记录失败归因
* test: 移除 D3 变更记录,仅保留测试修复
* fix(test-e2e): make D5 tests portable and isolate evaluation workloads
* fix(test-e2e): repair Windows case contracts and D4 journeys
* feat(test-e2e): launch repository daily from a pinned branch
* test:修复D4读取config问题
* test:修复测试用例,删掉过期用例
* test:修复测试用例
* test:修复测试用例
* doc:测试规范修改
* test:增加外部记忆mock服务
* test:测试用例修复
* fix(prompt): reject blank task descriptions before SSE generation
* fix(agent): return 404 for missing discovery resources
* fix(agent): validate relationships before update writes
* fix(model): preserve provider error status on provider create
A provider failure (e.g. an upstream connection_failed) was raised as
HTTPException(502) by create_provider_models_for_tenant, but the generic
except Exception handlers in the service and the app layer swallowed it and
re-wrapped it, so /model/provider/create answered 500 with the real status
only surviving as text in the message body (API-049).
- service: re-raise HTTPException instead of wrapping it
- app: pass HTTPException through on /provider/create and
/manage/provider/create
- schema: reject a blank provider with 422 at the boundary
- tests: regression coverage for both behaviours
* fix: correct conversation access and stopped-turn regressions
* fix: enforce tenant isolation and edit permissions for agent relations
* fix: enforce tenant isolation and edit permissions for agent relations1
* 🐛 Fix tag projection crash on first-attempt ES write failure
Problem:
project_document_assignments() dereferenced the prior ledger state
without a None guard in its generic exception handler. On a document's
first-ever projection attempt there is no ledger row yet, so an ES write
failure crashed with AttributeError before the failed state was
persisted. The failure then became invisible: no retry_count, no
next_attempt_at, retry_pending_document_projections() never picked the
document up, and tag-filtered retrieval silently ignored the document
until its tags were re-saved.
Fix:
Treat a missing prior state as retry_count 0 in the failure handler
((current or {}).get("retry_count")), so first-attempt failures record a
retryable failed state with correct exponential backoff. Added a
regression unit test for the no-prior-state failure path (previously
only the existing-state path was covered). Also added one blank line
after the import block to satisfy the repo ruff pre-commit hook on this
file (pre-existing I001).
Verification:
- test/backend/services/test_tag_document_projection.py 28/28 passed,
incl. new test_first_attempt_failure_records_retryable_state
- Neighboring regression: test_tag_management_service.py and
test_tag_document_batch_status.py, 53/53 passed
- ruff (E,F,I,W hook rule set) clean on the touched backend file
- Matches the state-machine expectations of e2e case
API-AUTO-357B84F01BA6D321 (daily run 2026-10-09)
* Fix A2A publication smoke scope and remove Mock dependency
* fix(a2a): execute the version recorded by A2A publication
* [WIP] Fix accepted semantic repair stream commits (#4057)
* feat(audit): add security audit logging to backend management APIs (#4055)
* feat: 为模型管理接口添加安全审计日志记录
实现了模型创建、更新、删除、批量操作等接口的安全审计日志功能,过滤了敏感凭证信息,确保审计日志安全合规。新增了审计安全字段过滤工具函数,补充了对应的测试用例验证审计日志的正确性和安全性。
* feat: 为多个接口添加安全审计日志记录
为agent和agent_repository相关的API接口添加安全审计事件记录,包括代理更新、图标上传、删除、导出、导入、版本发布/回滚/更新/删除等操作,同时补充对应的测试用例验证审计日志的正确性,确保敏感数据不被记录。
* feat: 为MCP和技能相关接口添加上下文安全审计日志
为tool、mcp、remote_mcp、skill模块的所有关键增删改接口添加安全审计日志,记录操作人、资源信息等关键字段,同时避免记录敏感信息如凭证、密钥等。新增对应的测试用例验证审计日志的正确性,确保敏感数据不会被泄露。
* feat: 添加安全审计日志并限制审计详情列表长度
在多个服务端点添加安全审计日志,记录关键操作信息
同时统一审计详情列表的长度限制为20,防止日志被恶意payload撑爆
* feat: 为配置相关接口添加安全审计日志记录
为 config_sync_app 和 memory_config_app 的配置操作接口添加安全审计事件记录,记录操作人、租户、操作类型和相关字段信息,同时更新测试用例验证审计日志的正确性,确保敏感配置值不被记录。
* test: 为上传测试用例添加 http_request 参数默认值
为测试用例中的 upload_files 调用添加 http_request=None 参数,避免测试时可能出现的未定义错误
* chore: bootstrap semantic repair stream fix draft
* fix(agent): commit accepted streamed code action repairs
* test(agent): verify repaired streams in deployed runtime and browser
* test(agent): clarify deployed repair assertion failures
---------
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
* chore: bootstrap think prefix compatibility fix
* fix: repair agent repository e2e cases and API-type MCP health check (#4061)
* fix: repair four failing e2e cases (API-086, API-063, PW-MCP-CONTAINER-01, PW-MCP-MARKET-01)
* fix: skip MCP protocol handshake for API-type MCP health check
* fix(test-e2e): align runtime contracts and strengthen local test diagnostics
* fix(test-e2e): reconcile standalone semantic repair tests with formal cases
* fix(agent): tolerate incomplete thinking prefixes without raw protocol finals
* test:修改workflow
* test:修复测试用例
* fix: preserve manual titles and metadata-free A2A calls
* test: repair D1-D5 runtime contracts and execution evidence
* test: repair daily assertions and remove excluded cases
* fix: guard MCP tag refresh and repair daily test isolation
* test:修复测试用例
* test:修复测试用例
* test:修复测试用例
* docs(test): update controlled provider invocation after migration
* test: verify migrated browser authentication and persisted skill results
* test: complete think-prefix acceptance obligations
* test: document and validate deployed TPC fixture
* doc:优化测试用例生成skill
* test: regenerate TPC proof at required UT and runtime boundaries
---------
Co-authored-by: dongjibao2001 <332722455@qq.com>
Co-authored-by: panyehong <2655992392@qq.com>
Co-authored-by: xuyaqist <xuyaqist@gmail.com>
Co-authored-by: chase <byzhangxin11@126.com>
Co-authored-by: cj2026-bit <647646783@qq.com>
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
Co-authored-by: MoeexT <yuwancumian666@outlook.com>
* fix(model): restore type-aware advanced settings in add/edit dialogs (#4066)
* fix(model): restore type-aware advanced settings in add/edit dialogs
PR #4007's v0 dialogs rendered the LLM capacity grid (context window,
input/output/reserve tokens, temperature, top_p) for every model type,
losing the type-specific parameters the old dialog exposed:
- embedding / multi_embedding: multimodal switch, chunk-size slider and
chunk batch were gone; chunk params were no longer sent on create and
multi_embedding models could not be added at all
- rerank: max-tokens field was gone
- stt / tts: provider select + App ID + Access Token were gone, which
also broke the volcengine connectivity probe
Restore the old per-type field set:
- ModelAdvancedConfig now renders the capacity grid only for the
llm/vlm/vlm2/vlm3 family (supportsCapacityGrid mirrors the old
supportsCapacityFields set, shared via modelTypeUi); embedding rows
get the multimodal switch (live type flip via onModelTypeChange) plus
the chunk-size slider and batch input; rerank gets max tokens;
stt/tts get the provider select and Volcano credentials (tts adds
max tokens)
- create, verify and update paths map the snake_case spec keys to the
camelCase request contract (expectedChunkSize / maximumChunkSize /
chunkingBatchSize / maxTokens / modelFactory / modelAppid /
accessToken); embedding rows always carry chunk params with the
old-dialog defaults (1024 / 1536 / 10), and both embedding types use
max_tokens 1024 as the dimension placeholder
- the edit dialog pre-fills the type-specific fields from the record,
sends them on save and rides them along the probe; the multimodal
switch stays hidden there because the edit path locks the embedding
pair's type
* fix(model): gate type-specific overrides and prefill voice provider
Address review findings on #4066:
- gate the rerank/voice payload mappings and the probe credential
pass-through by the row's model type: gear settings survive a row
type change, and a stale rerank max_tokens must not overwrite an
embedding row's 1024 dimension placeholder, nor stale voice
credentials a non-voice model's factory / probe
- prefill the stt/tts provider select from model.source: getAllModels
maps the API's model_factory into source only (model.modelFactory is
never populated), so editing an existing volcengine voice model
showed the dashscope fallback and saving would overwrite the factory
- add the missing rowSettingsDescEmbedding / voiceProviderHint entries
to both locale files so English users no longer see Chinese copy
Not addressed (intentional): clearing App ID / Access Token keeps the
stored credential (empty becomes undefined and is dropped from the
update payload). This matches the old dialog's behavior — switching the
provider to dashscope stops the backend from consuming the stored
credentials.
* fix(model): drop the static voice-provider hint line
The hint was static (shown for dashscope too, describing volcengine
credentials) and redundant with the App ID / Access Token placeholders,
so remove it along with its locale entries.
* fix(model): gate edit-dialog type-specific fields by current type
The type select is editable in the edit dialog (only the embedding pair
is locked), and the advanced values prefilled for the original type
survive a type change — the save/probe mappings must therefore be gated
by the CURRENT type, mirroring the add-dialog fix:
- chunk params only for embedding-family records
- factory / App ID / Access Token only for stt/tts records
- max tokens only for rerank/tts records
Also skip the max-tokens prefill when the record's value is 0 (the list
mapper falls back to 0 for an unset column); a literal 0 reads worse
than the empty default.
* refactor(model): dedupe type-specific mapping into shared helpers
Address review findings on #4066:
- extract buildVoiceCredentialParams into ModelAdvancedSettings: the
four call sites (add verify x2, edit verify, add/edit save) each
re-implemented the same camelCase mapping with a 4-6 line comment
explaining it; the full rationale now lives in the helper's doc block
and call sites are one-liners
- add supportsMaxTokensField to modelTypeUi so the (rerank || tts) &&
max_tokens gate is not duplicated between the add and edit save paths
- add DEFAULT_CHUNKING_BATCH_SIZE next to the other chunk defaults and
use it for the fallback and the input placeholder instead of the
magic 10
- rename ModelChunkSizeSilder.tsx -> ModelChunkSizeSlider.tsx (typo,
pre-existing) and update the four importers
---------
Co-authored-by: ljy <ljy@DESKTOP-65OBISN.(none)>
* feat(frontend): redesign agent and chat workflows (#4058)
* feat(frontend): align agent UI and shared components with design
* feat(frontend): add agent list table view
* feat(frontend): add resource-picker drawers and param-config modals
- 新增 components/resource-picker/ 共享组件库:
- AddAgentDrawer / AddKnowledgeDrawer / AddModelDrawer / AddSkillDrawer / AddToolDrawer
五个右侧滑出 760px 抽屉,点击按钮后滑出,高保真对齐设计稿。
- ParamDialog 系列:ModelConfigModal / SkillConfigModal / ToolConfigModal
居中 480px 弹窗(antd Modal centered),覆盖模型/技能/工具配置参数,
ToolConfigModal 支持 mode=config(参数配置态) 与 mode=debug(调试态,含点击测试与结果区)。
- 均为独立可调用组件,统一经 index.ts barrel 导出;数据先 mock,不修改后端。
- 补充 zh/en common.json 的 resourcePicker.* 本地化文案。
* feat(frontend): refine workbench UI per design specs
* feat(frontend): wire resource-picker drawers to real APIs and fix pagination
Replace the mock data in the five add-resource drawers (agent, knowledge,
model, skill, tool) with real data from existing hooks, and make the
resource drawers fetch and render 10 items per page with working pagination.
Changes:
- AddAgentDrawer: load local agents from usePublishedAgentList and external
agents from useExternalAgents; derive the label dropdown from agent tags.
- AddKnowledgeDrawer: load knowledge bases from useKnowledgeList; use the
source field for the label filter (no tags field on KnowledgeBase).
- AddSkillDrawer: load skills from useSkillList; derive labels from skill.tags.
- AddToolDrawer: load tools from useToolList; derive labels from tool.labels.
- AddModelDrawer: switch the data source from the preset catalog
(useModelCatalog) to the account's own models (useModelList), grouping LLM
models by source, since this drawer adds models already connected by the
account on the model config page.
- AddResourceDrawer: make ResourcePagination a controlled component and add
search/tab/filter -> page-1 reset so page navigation works.
- types: add optional tags to AgentCardItem.
Root cause of the pagination bug: ResourcePagination kept its own state and
the parent never sliced the list, so every page rendered the full result set
and the page controls were inert.
* feat(frontend): rename landing examples heading to recommended prompts
* feat(frontend): polish resource-picker drawers per design specs
Align the five "add resource" drawers with the design mockups.
- AddAgentDrawer: add a divider between local/external tabs, show the
agent update time with a status dot, and add a refresh button next to
select-all (reuse usePublishedAgentList/useExternalAgents refetch).
- AddKnowledgeDrawer: change the item meta label from "更新" to "使用过"
to match the design.
- AddModelDrawer: source data from useModelList (the account's already
connected models) instead of the preset useModelCatalog, group models
by their source, add a refresh button, and render a checkbox on the
right of each model row.
- AddSkillDrawer: always render both official and custom tabs instead of
deriving tabs from data so the "官方" tab no longer disappears.
- useSkillList: treat both "official" and "官方" as official sources.
- AddResourceDrawer: restyle the pagination jump box as a single
96x32px rounded white field with the "跳转" suffix inside.
- types: rename AgentCardItem.publishedAt to updatedAt.
* fix(frontend): refine pagination jump box input/button
Make the jump box match the design: keep the vertical divider full
height instead of inset, and turn the "跳转" suffix into a real button
whose click jumps to the entered page (via a ref), with Enter still
working in the input.
* feat(frontend): match composer toolbar icons to design
* feat(frontend): redesign new chat experience
* feat(frontend): agent config high-fidelity layout, resource drawers and debug page
- High-fidelity agent config layout with selected resource rows and add button
- Resource picker drawers for models, skills, tools and child agents
- Agent creation guide and first-creation welcome experience
- High-fidelity debug layout with welcome and question suggestions
- configurationLayout/debugLayout support in Thread and Composer
- Tags mapping in published agent list service
- D1/D4 test assets, automation cases and handoff docs
* feat(frontend): merge new chat redesign and restore workbench composer toolbar
* fix(frontend): remove duplicate planning menu in workbench composer
* feat(frontend): unify sidebar frame across pages and redraw knowledge icon
* fix(frontend): align workbench sidebar frame with new chat page
* fix(frontend): align new chat layout and agent conversation interactions
* fix(frontend): connect chat resource actions and localized sidebar navigation
* feat(frontend): migrate agent resource dialogs to resource-picker drawers
Replace the legacy add-tool / add-agent / add-skill / add-knowledge dialogs with the shared AddResourceDrawer skeleton while preserving data flows and API calls.
AddToolDrawer / AddAgentDrawer use the skeleton layout (search, single-select tag, selected chips, list header, tabs, pagination); AddAgentDrawer uses a 2-column card grid with instant selection and no confirm footer.
AddSkillDrawer selected chips resolve names by merging persisted skill instances (skill_name) with the catalog, matching SelectedSkillManagement hydration.
Extract the per-model parameter override popup into ModelParamsModal, wired into agent-prompt.
Delete orphaned legacy components (SelectToolsDialog, SelectSkillsDialog, SkillRowContent, capability/skill/utils, collaborative-agent-selector-modal).
Update the version-name label test to assert against collaborative-agent.tsx.
* feat(frontend): refine workbench composer alignment per design
* fix(frontend): hide empty attachment row above workbench composer input
* feat(frontend): refine agent development list layout
* fix(frontend): hide inactive sidebar controls
* fix(frontend): rename and reorder workbench menu
* fix(frontend): preserve conversation completion feedback after merge
* fix(frontend): repair quality gate interaction and duplication findings
* refactor(test): share duplicated editor browser fixtures
* test: add case-local PR4058 regressions and remove temporary docs
* fix(frontend): align new chat resource controls
* test: expand agent editor E2E and restore readonly mode navigation
* fix(frontend): load creation templates from Agent API
* fix(frontend): complete PR4058 localization and verified review fixes
---------
Co-authored-by: hzw <hzw@qq.com>
Co-authored-by: qianshengjia <840646206@qq.com>
Co-authored-by: ljy <ljy@DESKTOP-65OBISN.(none)>
Co-authored-by: 高天 <高天@DESKTOP-NKC6LHG.(none)>
* 🐛 Bugfix: Fixed the issue where concurrent calls to the same agent caused the sandbox kernel to become unhealthy. (#4068)
* 🐛 Bugfix: Fixed the issue where concurrent calls to the same agent caused the sandbox kernel to become unhealthy.
* 🐛 Bugfix: Fixed the issue where concurrent calls to the same agent caused the sandbox kernel to become unhealthy.
* test(sandbox): consolidate invocation regression coverage
* fix(sdk): limit SQL result rows without appending LIMIT (#4070)
* docs: add bilingual acknowledgments for former core contributors (#4075)
* test:新增测试报告责任人指派 (#4073)
* test:baseline cases
* test:add local test process
* doc:add test deploy guide
* bugfiix:优化测试流程
* bugfix:修复测试用例
* doc:轻量化bugfix的spec设计和测试用例设计
* test:修复测试用例
* test:修复D1测试用例
* test: 修复 D3 用例脚本并记录失败归因
* test: 移除 D3 变更记录,仅保留测试修复
* fix(test-e2e): make D5 tests portable and isolate evaluation workloads
* fix(test-e2e): repair Windows case contracts and D4 journeys
* feat(test-e2e): launch repository daily from a pinned branch
* test:修复D4读取config问题
* test:修复测试用例,删掉过期用例
* test:修复测试用例
* test:修复测试用例
* doc:测试规范修改
* test:增加外部记忆mock服务
* test:测试用例修复
* fix(prompt): reject blank task descriptions before SSE generation
* fix(agent): return 404 for missing discovery resources
* fix(agent): validate relationships before update writes
* fix(model): preserve provider error status on provider create
A provider failure (e.g. an upstream connection_failed) was raised as
HTTPException(502) by create_provider_models_for_tenant, but the generic
except Exception handlers in the service and the app layer swallowed it and
re-wrapped it, so /model/provider/create answered 500 with the real status
only surviving as text in the message body (API-049).
- service: re-raise HTTPException instead of wrapping it
- app: pass HTTPException through on /provider/create and
/manage/provider/create
- schema: reject a blank provider with 422 at the boundary
- tests: regression coverage for both behaviours
* fix: correct conversation access and stopped-turn regressions
* fix: enforce tenant isolation and edit permissions for agent relations
* fix: enforce tenant isolation and edit permissions for agent relations1
* 🐛 Fix tag projection crash on first-attempt ES write failure
Problem:
project_document_assignments() dereferenced the prior ledger state
without a None guard in its generic exception handler. On a document's
first-ever projection attempt there is no ledger row yet, so an ES write
failure crashed with AttributeError before the failed state was
persisted. The failure then became invisible: no retry_count, no
next_attempt_at, retry_pending_document_projections() never picked the
document up, and tag-filtered retrieval silently ignored the document
until its tags were re-saved.
Fix:
Treat a missing prior state as retry_count 0 in the failure handler
((current or {}).get("retry_count")), so first-attempt failures record a
retryable failed state with correct exponential backoff. Added a
regression unit test for the no-prior-state failure path (previously
only the existing-state path was covered). Also added one blank line
after the import block to satisfy the repo ruff pre-commit hook on this
file (pre-existing I001).
Verification:
- test/backend/services/test_tag_document_projection.py 28/28 passed,
incl. new test_first_attempt_failure_records_retryable_state
- Neighboring regression: test_tag_management_service.py and
test_tag_document_batch_status.py, 53/53 passed
- ruff (E,F,I,W hook rule set) clean on the touched backend file
- Matches the state-machine expectations of e2e case
API-AUTO-357B84F01BA6D321 (daily run 2026-10-09)
* Fix A2A publication smoke scope and remove Mock dependency
* fix(a2a): execute the version recorded by A2A publication
* [WIP] Fix accepted semantic repair stream commits (#4057)
* feat(audit): add security audit logging to backend management APIs (#4055)
* feat: 为模型管理接口添加安全审计日志记录
实现了模型创建、更新、删除、批量操作等接口的安全审计日志功能,过滤了敏感凭证信息,确保审计日志安全合规。新增了审计安全字段过滤工具函数,补充了对应的测试用例验证审计日志的正确性和安全性。
* feat: 为多个接口添加安全审计日志记录
为agent和agent_repository相关的API接口添加安全审计事件记录,包括代理更新、图标上传、删除、导出、导入、版本发布/回滚/更新/删除等操作,同时补充对应的测试用例验证审计日志的正确性,确保敏感数据不被记录。
* feat: 为MCP和技能相关接口添加上下文安全审计日志
为tool、mcp、remote_mcp、skill模块的所有关键增删改接口添加安全审计日志,记录操作人、资源信息等关键字段,同时避免记录敏感信息如凭证、密钥等。新增对应的测试用例验证审计日志的正确性,确保敏感数据不会被泄露。
* feat: 添加安全审计日志并限制审计详情列表长度
在多个服务端点添加安全审计日志,记录关键操作信息
同时统一审计详情列表的长度限制为20,防止日志被恶意payload撑爆
* feat: 为配置相关接口添加安全审计日志记录
为 config_sync_app 和 memory_config_app 的配置操作接口添加安全审计事件记录,记录操作人、租户、操作类型和相关字段信息,同时更新测试用例验证审计日志的正确性,确保敏感配置值不被记录。
* test: 为上传测试用例添加 http_request 参数默认值
为测试用例中的 upload_files 调用添加 http_request=None 参数,避免测试时可能出现的未定义错误
* chore: bootstrap semantic repair stream fix draft
* fix(agent): commit accepted streamed code action repairs
* test(agent): verify repaired streams in deployed runtime and browser
* test(agent): clarify deployed repair assertion failures
---------
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
* fix: repair agent repository e2e cases and API-type MCP health check (#4061)
* fix: repair four failing e2e cases (API-086, API-063, PW-MCP-CONTAINER-01, PW-MCP-MARKET-01)
* fix: skip MCP protocol handshake for API-type MCP health check
* fix(test-e2e): align runtime contracts and strengthen local test diagnostics
* fix(test-e2e): reconcile standalone semantic repair tests with formal cases
* test:修改workflow
* test:修复测试用例
* fix: preserve manual titles and metadata-free A2A calls
* test: repair D1-D5 runtime contracts and execution evidence
* test: repair daily assertions and remove excluded cases
* fix: guard MCP tag refresh and repair daily test isolation
* test:修复测试用例
* test:修复测试用例
* test:修复测试用例
* doc:优化测试用例生成skill
* test:新增测试报告责任人
* test: publish latest complete Daily reports for Syncthing
---------
Co-authored-by: panyehong <2655992392@qq.com>
Co-authored-by: xuyaqist <xuyaqist@gmail.com>
Co-authored-by: chase <byzhangxin11@126.com>
Co-authored-by: cj2026-bit <647646783@qq.com>
Co-authored-by: Jason Wang <56037774+JasonW404@users.noreply.github.com>
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
Co-authored-by: MoeexT <yuwancumian666@outlook.com>
* fix(agent): export filename uses display name + unique copy name suffix (#4064)
* fix(agent): export agent with display name as zip filename
Use the agent display name (falling back to name) for export zip
filenames, and encode Content-Disposition with RFC 5987 so non-ASCII
names survive browser downloads. Extract the filename on the frontend
from the encoded header.
Verified: unit tests for header encoding/parsing and API-level export
checks in the local cluster.
* fix(agent): generate unique copy name suffix on agent copy
* fix(agent): deduplicate agent name on create via update API
* test(e2e): cover agent copy unique-name and availability contract
Add bugfix record AGENT-COPY-DUP-20261012, update API-058 to the
fixed auto-suffix dedup contract, and add D4 journey PW-AGENT-COPY-01
that copies an agent twice through the repository UI and asserts
unique identifiers and availability.
* test(e2e): assert agent export uses display-name filename
Add bugfix record AGENT-EXPORT-NAME-20261012, update API-066 to
require the display-name ZIP export path, and extend the D3 scenario
to bind a skill before export and assert the RFC 5987 encoded
Content-Disposition filename.
* test(e2e): parse bare agent list array in copy journey
/api/agent/list returns a bare JSON array; the copy journey and the shared page object unwrapped payload.data, so every poll resolved to an empty list and the case failed before its assertions ran. Parse the array first and keep the wrapped shape as a fallback. Also align case.yaml expected_results with the three spec assertions and remap acceptance bindings accordingly.
* ✨ Feature(aidp): complete knowledge base management pages (#4062)
* feat(aidp): isolate knowledge list, creation, files and import pages
* fix(aidp): preserve list preferences and restrict row navigation
* fix(aidp): refresh knowledge list once after import
* fix(aidp): refresh knowledge list when import drawer closes
* docs(aidp): define import creation and files acceptance cases
* fix: align AIDP file operations and knowledge list refresh with acceptance
* fix: use persisted AIDP knowledge creator consistently
* fix: align AIDP knowledge pages with deployed contract
* fix: restore four-column knowledge cards
* fix(aidp): align knowledge guide with agent workflows
* fix(aidp): sanitize externally sourced log values
* test(aidp): cover graph contracts and file query branches
* refactor(aidp): confine knowledge management changes to module
* refactor(aidp): organize frontend by pages and reusable features
* fix: simplify AIDP knowledge management after backend review
* fix(aidp): address knowledge page frontend review
* fix(aidp): avoid overlapping permission tooltips
* fix(aidp): unify knowledge page typography
* fix(aidp): keep knowledge list reachable below expanded guide
* test(aidp): align frontend D1 with knowledge management pages
* fix(aidp): handle failed file deletion confirmations without unhandled rejections
* chore(aidp): remove unused upload documentation and stale text
* fix(aidp): review fixes for KB management pages
- Defer graph domain validation to AIDP: the frontend sources domain
options from the live graph template, so a hardcoded backend whitelist
would reject newly added AIDP domains at submit time. The serializer
now only requires a non-empty string.
- Treat AIDP 404 on KB delete as success so orphan KBs (already removed
upstream) can be cleaned up locally, and expose the delete action for
unavailable rows in the KB list (card menu and table actions).
- Reject same-name duplicates within one upload batch: only the first
file is accepted and the rest fail immediately as duplicates, because
upload responses match rows by file name only and would otherwise pair
success/failure with the wrong rows.
* 支持本地工具不走沙箱调用 (#4069)
* feat: defer Docker startup for official tool actions
* feat: allow JSON imports in local tool fast path
* fix(sdk): align tool policy registration and cover deferred execution
* test: add deployed and browser tool fastpath acceptance coverage
---------
Co-authored-by: hhhhsc <name>
* ✨ Feature: Add a pipeline to synchronize the MinIO image to Docker Hub. (#4081)
* ✨ Feature: Add a pipeline to synchronize the MinIO image to Docker Hub.
* fix(test): align offline package fixtures with MinIO image source
* 🐛 Bugfix: final answer duplication in subagent situation (#4077)
* 🐛 Bugfix: final answer duplicate in subagent situation
* Update final-answer browser checks for develop history groups
* Fix final-answer unit test expectations and stream type mock
* Cover final-answer ownership cleanup and stream rollback boundaries
* Cover final-answer stream transitions and completion branches
* refactor(chat): remove legacy chat page and migrate version comparison and share views (#4085)
* refactor(chat): remove legacy chat page and migrate conversation consumers
* test(workbench): fix composer fixtures and retrieval configuration coverage
* switch bettwen /workbench and /newchat
* test(chat): migrate legacy D1 cases to newchat contracts
* ♻️ refactor model service (#4088)
* refactor: consolidate model management services
* test: update Management architecture checks for model modules
* 修复思考强度切换及下拉样式 (#4091)
* fix: correct reasoning effort selection
* fix: default workbench reasoning effort to low
* ci: add copyright header check for changed source files (#4087)
* ci: add copyright header check for changed source files
- Add scripts/check_copyright.py to check and auto-fix missing copyright
headers on .py/.sh/.sql/.ts/.tsx/.js/.jsx/.mjs files, with a
--files-from mode for incremental checks
- Add .github/workflows/copyright-check.yml to incrementally check PRs
targeting develop/release/hotfix branches, with an optional full scan
via workflow_dispatch
- Require the header in AGENTS.md shared constraints and add a
.cursor/rules thin entry for compatibility
- Document the requirement and local verify/fix commands in CONTRIBUTING.md
* fix(ci): generate copyright year range dynamically
Derive the end year of the copyright header from the current year instead of hardcoding 2025-2026, so headers inserted by --fix and the suggestion in error output stay correct in future years. The check pattern already accepts any year variant. Also document the dynamic end year in AGENTS.md and CONTRIBUTING.md.
* fix(ci): limit copyright check workflow token permissions
Add an explicit top-level permissions block restricting GITHUB_TOKEN to contents: read, matching the convention of other workflows and resolving the CodeQL workflow permissions alert.
* fix(ci): drop push trigger and add paths filter to copyright check
Remove the push trigger: on merge commits to protected branches the two-dot diff (event.before..HEAD) includes every file from the merged feature branch, which could turn previously green PRs into unexpected red builds on develop. Incremental checking is already closed-loop on pull_request events via the three-dot diff against the base branch.
Simplify the fallback diff to HEAD~1..HEAD: github.event.before is only populated for push events, so the BEFORE_SHA branch is dead code now. workflow_dispatch changed mode keeps its documented latest-commit semantics.
Add a pull_request paths filter matching the checker's supported source extensions so docs-only PRs no longer trigger a fetch-depth: 0 checkout. Keep the workflow file itself in the trigger set so changes to the check are still validated end-to-end.
---------
Co-authored-by: zz287613978 <zz287613978@noreply.gitcode.com>
* fix(i18n): Chinese characters in English UI (#4084)
* fix(i18n): 修复问题英文界面有中文
修改 i18n 配置和 Memory 组件,使英文界面正确显示英文,中文界面保持中文。
- i18n.tsx: 设置 keySeparator=false, nsSeparator=false,强制 i18next 用 flat key 查找 locale 文件,避免带点 key 被当作嵌套结构查找失败
- MemoryManager.tsx: JSX 中文字面量(tooltip、aria-label、placeholder、按钮文案、列标题、状态映射等)改为 t() 调用形式,新增 56 个 memory.manager.* i18n key
- en/common.json: 新增对应 56 个英文翻译
- zh/common.json: 新增对应 56 个中文翻译,确保两个 locale 完全对齐
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: glm-5.2
* docs(i18n): add verification screenshot for PR #4084
上传英文/中文界面国际化对比截图作为验证证据。
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: glm-5.2
* docs(i18n): remove screenshot from PR #4084 modified files
移除截图文件,改为通过 PR 评论方式提供验证截图。
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: glm-5.2
* fix(i18n): add model provider connection error messages
为模型提供商连接失败场景补充 en/zh 文案(title/noModels/connectionFailed/authenticationFailed/accessDenied/endpointNotFound/serverError/timeout/sslError)。
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: deepseek-v4.1-flash
* fix(i18n): align en/zh locale keys for model config and agent pages
补齐两边 locale 缺失 key,使 en/zh 完全对齐:
- zh 补 77 个:model.connectivity/status/filter、modelConfig.addDialog/button/
defaultConfig/delete/editDialog/library/list/pagination/search/spec/table/
update/verify、model.dialog.v2.searchModels、nl2agent.toolRecommendations 复数形式
- en 补 17 个:agent.a2a、agent.deployment、agent.mainAgent、agent.permission、
agent.runPolicy
- 同时移除未生效的嵌套 model.dialog.error.provider 块(keySeparator=false 下
不会被解析,扁平 key 已存在)
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: kimi-k3
* fix(i18n): remove keySeparator/nsSeparator overrides in i18next init
恢复 i18next 默认分隔符行为:
- i18next 的 deepFind 会先把整串 key 当作扁平属性查找,与 keySeparator 无关;
默认 "." 是 keySeparator: false 的超集,显式关闭反而让嵌套数据与数组索引
路径(如 page.features.0.title)静默失效并返回裸 key。
- 全仓无含 ":" 的 key、也无 t("common:...") 形式的调用,nsSeparator 无实际作用。
- 已对 en/zh 全部语言包条目做等价性验证(5940 x 2 key,新旧配置解析差异 0),
并确认移除后 page.features.0.title 恢复为正常文案。
Refs #4084
Co-authored-by: Trae <noreply@trae.ai>
Generated-by: deepseek-v4.1-flash
---------
Co-authored-by: Trae <noreply@trae.ai>
* test:优化测试结果同步sycthing文件夹机制 (#4100)
* test:baseline cases
* test:add local test process
* doc:add test deploy guide
* bugfiix:优化测试流程
* bugfix:修复测试用例
* doc:轻量化bugfix的spec设计和测试用例设计
* test:修复测试用例
* test:修复D1测试用例
* test: 修复 D3 用例脚本并记录失败归因
* test: 移除 D3 变更记录,仅保留测试修复
* fix(test-e2e): make D5 tests portable and isolate evaluation workloads
* fix(test-e2e): repair Windows case contracts and D4 journeys
* feat(test-e2e): launch repository daily from a pinned branch
* test:修复D4读取config问题
* test:修复测试用例,删掉过期用例
* test:修复测试用例
* test:修复测试用例
* doc:测试规范修改
* test:增加外部记忆mock服务
* test:测试用例修复
* fix(prompt): reject blank task descriptions before SSE generation
* fix(agent): return 404 for missing discovery resources
* fix(agent): validate relationships before update writes
* fix(model): preserve provider error status on provider create
A provider failure (e.g. an upstream connection_failed) was raised as
HTTPException(502) by create_provider_models_for_tenant, but the generic
except Exception handlers in the service and the app layer swallowed it and
re-wrapped it, so /model/provider/create answered 500 with the real status
only surviving as text in the message body (API-049).
- service: re-raise HTTPException instead of wrapping it
- app: pass HTTPException through on /provider/create and
/manage/provider/create
- schema: reject a blank provider with 422 at the boundary
- tests: regression coverage for both behaviours
* fix: correct conversation access and stopped-turn regressions
* fix: enforce tenant isolation and edit permissions for agent relations
* fix: enforce tenant isolation and edit permissions for agent relations1
* 🐛 Fix tag projection crash on first-attempt ES write failure
Problem:
project_document_assignments() dereferenced the prior ledger state
without a None guard in its generic exception handler. On a document's
first-ever projection attempt there is no ledger row yet, so an ES write
failure crashed with AttributeError before the failed state was
persisted. The failure then became invisible: no retry_count, no
next_attempt_at, retry_pending_document_projections() never picked the
document up, and tag-filtered retrieval silently ignored the document
until its tags were re-saved.
Fix:
Treat a missing prior state as retry_count 0 in the failure handler
((current or {}).get("retry_count")), so first-attempt failures record a
retryable failed state with correct exponential backoff. Added a
regression unit test for the no-prior-state failure path (previously
only the existing-state path was covered). Also added one blank line
after the import block to satisfy the repo ruff pre-commit hook on this
file (pre-existing I001).
Verification:
- test/backend/services/test_tag_document_projection.py 28/28 passed,
incl. new test_first_attempt_failure_records_retryable_state
- Neighboring regression: test_tag_management_service.py and
test_tag_document_batch_status.py, 53/53 passed
- ruff (E,F,I,W hook rule set) clean on the touched backend file
- Matches the state-machine expectations of e2e case
API-AUTO-357B84F01BA6D321 (daily run 2026-10-09)
* Fix A2A publication smoke scope and remove Mock dependency
* fix(a2a): execute the version recorded by A2A publication
* [WIP] Fix accepted semantic repair stream commits (#4057)
* feat(audit): add security audit logging to backend management APIs (#4055)
* feat: 为模型管理接口添加安全审计日志记录
实现了模型创建、更新、删除、批量操作等接口的安全审计日志功能,过滤了敏感凭证信息,确保审计日志安全合规。新增了审计安全字段过滤工具函数,补充了对应的测试用例验证审计日志的正确性和安全性。
* feat: 为多个接口添加安全审计日志记录
为agent和agent_repository相关的API接口添加安全审计事件记录,包括代理更新、图标上传、删除、导出、导入、版本发布/回滚/更新/删除等操作,同时补充对应的测试用例验证审计日志的正确性,确保敏感数据不被记录。
* feat: 为MCP和技能相关接口添加上下文安全审计日志
为tool、mcp、remote_mcp、skill模块的所有关键增删改接口添加安全审计日志,记录操作人、资源信息等关键字段,同时避免记录敏感信息如凭证、密钥等。新增对应的测试用例验证审计日志的正确性,确保敏感数据不会被泄露。
* feat: 添加安全审计日志并限制审计详情列表长度
在多个服务端点添加安全审计日志,记录关键操作信息
同时统一审计详情列表的长度限制为20,防止日志被恶意payload撑爆
* feat: 为配置相关接口添加安全审计日志记录
为 config_sync_app 和 memory_config_app 的配置操作接口添加安全审计事件记录,记录操作人、租户、操作类型和相关字段信息,同时更新测试用例验证审计日志的正确性,确保敏感配置值不被记录。
* test: 为上传测试用例添加 http_request 参数默认值
为测试用例中的 upload_files 调用添加 http_request=None 参数,避免测试时可能出现的未定义错误
* chore: bootstrap semantic repair stream fix draft
* fix(agent): commit accepted streamed code action repairs
* test(agent): verify repaired streams in deployed runtime and browser
* test(agent): clarify deployed repair assertion failures
---------
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
* fix: repair agent repository e2e cases and API-type MCP health check (#4061)
* fix: repair four failing e2e cases (API-086, API-063, PW-MCP-CONTAINER-01, PW-MCP-MARKET-01)
* fix: skip MCP protocol handshake for API-type MCP health check
* fix(test-e2e): align runtime contracts and strengthen local test diagnostics
* fix(test-e2e): reconcile standalone semantic repair tests with formal cases
* test:修改workflow
* test:修复测试用例
* fix: preserve manual titles and metadata-free A2A calls
* test: repair D1-D5 runtime contracts and execution evidence
* test: repair daily assertions and remove excluded cases
* fix: guard MCP tag refresh and repair daily test isolation
* test:修复测试用例
* test:修复测试用例
* test:修复测试用例
* doc:优化测试用例生成skill
* test:新增测试报告责任人
* test: publish latest complete Daily reports for Syncthing
* fix(test): preserve unrelated files during Daily report publication
---------
Co-authored-by: panyehong <2655992392@qq.com>
Co-authored-by: xuyaqist <xuyaqist@gmail.com>
Co-authored-by: chase <byzhangxin11@126.com>
Co-authored-by: cj2026-bit <647646783@qq.com>
Co-authored-by: Jason Wang <56037774+JasonW404@users.noreply.github.com>
Co-authored-by: charmingchi1 <71816192+charmingchi1@users.noreply.github.com>
Co-authored-by: MoeexT <yuwancumian666@outlook.com>
* 🧪 Test(e2e): migrate the ext-knowledge mock into the formal framework and repair the daily knowledge cases (#4090)
* 🧪 Test(e2e): migrate the ext-knowledge mock into the formal framework and repair the daily knowledge cases
- Move the ext-knowledge mock contract into test-e2e/infra/mock-services/ext-knowledge-mock
(single-source build context, runner/product dual compose overlays, per-case attach tooling
with identity check, endpoint lock, full reset and evidence export, suite-worker integration,
validate_execution mock-service enum + profile selection, publisher evidence whitelist).
- Migrate the eight formal mock consumers (AGT-001/002, CTR-016/017/046/047, PERF-09, REL-02)
onto the framework-managed instance; API-AUTO-FC03F18034CB0D51 is repaired separately below.
- Repair the four daily knowledge cases: the D2 delete signature and audit isolation,
PW-KB-LOCAL-01 (agent-card configure action + AddKnowledgeDrawer autosave),
PW-FILE-01 (composer/attachment and refreshed-chat drift), and the new PW-KB-AIDP-01 journey
with explicit mock/real_smoke profile selection.
- Add the fidelity suite test/ext_components/ext_knowledge (57 original + 6 regressions = 63 tests)
driving the real adapters against the mock; CI collects it through test/ext_components.
- Repair shared D4 helper drift found under live execution (collapsible agent editor sections,
tool-config autosave evidence, high-fidelity conversation guide, collaborator drawer,
guardrail modal, agent publish before a new conversation).
- No product code changed.
* 🧪 Test(e2e): keep prerequisite-failure receipts and align the mock deployment with D-001
Review-fix pass on the framework migration:
- Bind RESULT_DIR in the worker process itself and adopt any prerequisite
receipt (not only preparation-step failures), so attach and dependency
failures report BLOCKED_BY_DEPENDENCY with their concrete reason instead
of a bare AUTOMATION_ERROR. Regression tests cover the classification and
the worker wiring (the previous tests set RESULT_DIR themselves and thus
masked the gap).
- Publish the mock port on loopback only per design D-001; product-side
callers keep using the compose-network DNS name. The registration test
now pins the loopback binding.
- Decide the instance's released/unknown state before releasing the attach
lock (removes the unlock-vs-rewrite race); the schema description now
matches the allowed host-mode equality of runner_url/product_url.
- Fidelity conftest clears the wire log per test and restores the identity
environment variables at teardown.
- Control plane validates the whole /_reset service list before executing
and checks the AIDP sub-app response codes on fail-next/fail-reset.
- PW-KB-AIDP-01 syncs the contract text with the implemented evidence
model and gains acceptance obligations and bindings; drop an unused
variable and a stray blank line.
* 🧪 Test(e2e): record the review re-verification results
Minimum-regression re-run against a fresh one-off deployment on the
review-fix code: PW-TASK-01 and AGT-001 passed, PW-KB-AIDP-01 passed its
full mock-profile journey, and the repaired helpers were exercised
successfully wherever reached (PW-CHAT-01 step 1, PW-CHAT-05 steps 1-3,
PW-PROMPT-02 preconditions, PW-AGENT-01 precondition 3). The remaining
cases fail on their own pre-existing post-#4058 drift (AgentPage.create()
flow, retired 请输入智能体描述 placeholder, 智能体角色 tab, 执行 mode button,
知识库: scope button), recorded per case and left untouched. The negative
attach path was verified live: a foreign identity yields
BLOCKED_BY_DEPENDENCY with the concrete reason written to the case
runtime receipt.
* 📝 Docs(e2e): add the product-UI driving guide and seed catalog to the mock README
Documents what a human enters when binding the mocked services as agent
to…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Adds an incremental copyright header check that blocks PRs introducing source files without a copyright header, without failing on the existing legacy files.
What's included
scripts/check_copyright.py— pure-stdlib checker for.py,.sh,.sql,.ts,.tsx,.js,.jsx,.mjsfiles:python scripts/check_copyright.py— full scanpython scripts/check_copyright.py --files <paths...>— check specific filespython scripts/check_copyright.py --files-from <list>— check a file list (used by CI)--fix— auto-insert the header after shebang/encoding lines, preserving BOM and line endings.github/workflows/copyright-check.yml—Copyright Header Checkjob:develop/release/**/hotfix/**that change at least one tracked file type (.py,.sh,.sql,.ts,.tsx,.js,.jsx,.mjs) or the workflow file itself: checks only files changed vs the base branch (three-dot diff,git diff --diff-filter=ACMR)fetch-depth: 0checkoutworkflow_dispatchsupports a full scan (check_mode: all)AGENTS.md/.cursor/rules/copyright_header.mdc— require the header in AI-assisted coding rulesCONTRIBUTING.md— document the requirement and the local verify/fix commandsHeader requirement
Inserted in the file's comment style (
#for Python/Shell,--for SQL,//for TypeScript/JavaScript), after shebang/encoding lines.Design notes
event.before..HEAD) that includes every file from the merged feature branch and would fail on legacy files, so the push trigger was removed. Trade-off: direct pushes todevelop/release/**/hotfix/**that bypass a PR are not checked — accepted because the normal contribution flow is PR-based.Copyright (c) 2025-2026 Huawei ...andCopyright (c) Huawei ... 2025-2025 ...variants, so headers do not need yearly updates.scripts/check_copyright.py, so the new workflow passes on its own PR (self-bootstrapping).Post-merge follow-up (maintainer action)
To make the check a hard requirement, add
copyright-checkto the required status checks fordevelop:Settings -> Branches -> Branch protection rule for develop -> Require status checks to pass -> add "copyright-check".Important: if you make
copyright-checka required check, remove thepathsfilter first (or docs-only PRs will be blocked). A workflow skipped by path filtering leaves its check in a "Pending" state, and a PR that requires that check cannot merge. The script already succeeds when no tracked files changed, so dropping the filter only costs the full checkout on non-source PRs.Verification
--fixinsertion,--files-fromlist with deleted files).yaml/.mdcorrectly skipped)copyright-checkitself — the workflow-file path entry self-triggers correctly