Skip to content

ci: add copyright header check for changed source files - #4087

Merged
jeffwu-1999 merged 4 commits into
developfrom
ci/copyright-header-check
Oct 14, 2026
Merged

jeffwu-1999 merged 4 commits into
developfrom
ci/copyright-header-check

Conversation

@TiTi-iTiT

@TiTi-iTiT TiTi-iTiT commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

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, .mjs files:
    • python scripts/check_copyright.py — full scan
    • python scripts/check_copyright.py --files <paths...> — check specific files
    • python 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
    • Missing files in the list are skipped silently (PRs may delete files)
  • .github/workflows/copyright-check.yml — Copyright Header Check job:
    • On PRs to 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)
    • PRs that change none of those paths (e.g. docs-only PRs) skip the workflow entirely, avoiding the fetch-depth: 0 checkout
    • workflow_dispatch supports a full scan (check_mode: all)
  • AGENTS.md / .cursor/rules/copyright_header.mdc — require the header in AI-assisted coding rules
  • CONTRIBUTING.md — document the requirement and the local verify/fix commands

Header requirement

Copyright (c) 2025-2026 Huawei Technologies Co., Ltd. All rights reserved.

Inserted in the file's comment style (# for Python/Shell, -- for SQL, // for TypeScript/JavaScript), after shebang/encoding lines.

Design notes

  • Incremental checking: a full scan would fail immediately on ~3000 legacy files; checking only PR-changed files lets existing files converge naturally as they are touched.
  • PR-only trigger: merge commits pushed to protected branches are diffed with a two-dot diff (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 to develop/release/**/hotfix/** that bypass a PR are not checked — accepted because the normal contribution flow is PR-based.
  • Year-agnostic matching: the regex accepts both Copyright (c) 2025-2026 Huawei ... and Copyright (c) Huawei ... 2025-2025 ... variants, so headers do not need yearly updates.
  • This PR itself carries the header on 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-check to the required status checks for develop:
Settings -> Branches -> Branch protection rule for develop -> Require status checks to pass -> add "copyright-check".

Important: if you make copyright-check a required check, remove the paths filter 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

  • Local multi-scenario testing of the script (pass with header, block without, --fix insertion, --files-from list with deleted files)
  • Workflow YAML syntax validated
  • End-to-end simulation of the PR incremental path against a real commit's changed files (7 Python files blocked, .yaml/.md correctly skipped)
  • After the trigger/paths rework (90b7d77): all checks on this PR pass, including copyright-check itself — the workflow-file path entry self-triggers correctly
image

- 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
Comment thread .github/workflows/copyright-check.yml Fixed
@codecov

codecov Bot commented Oct 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

zz287613978 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.
Comment thread .github/workflows/copyright-check.yml
Comment thread scripts/check_copyright.py
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
jeffwu-1999 merged commit 2e68c9d into develop Oct 14, 2026
19 checks passed
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
…itest config

develop already added oxc.jsx to vitest.workbench.config.ts in #4085, so replaying our own copy produced a duplicate object key and broke tsc (TS1117). The file also carries the copyright header that #4087 now requires for changed files.
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…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants