Commit Graph
2352 Commits
Author SHA1 Message Date
b54001e2e5 fix(storage): 启动时初始化完整 agent 目录 (#4956)
* fix(storage): 初始化账户共享技能目录

* fix(storage): 补全启动时的 agent 目录初始化

---------

Co-authored-by: qin-ptr <222410531+qin-ptr@users.noreply.github.com>
Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>
cli@0.4.20 python-sdk@0.1.11 v0.4.20
2026-09-14 11:46:07 +08:00
bot-of-qin-ctxandqin-ptr 4c014ab346 docs: 清理显式等待的调用示例 (#4998)
* docs: 清理显式等待的调用示例

* docs: 省略 Go 示例中默认关闭的等待参数

---------

Co-authored-by: qin-ptr <222410531+qin-ptr@users.noreply.github.com>
2026-09-14 11:33:16 +08:00
dingbenandTRAE CLI fbeb1345e6 perf(vectordb): reuse pooled HTTP session per client (#4696)
* perf(vectordb): reuse pooled HTTP session per client

VikingDB clients issued every request through module-level
requests.request/post/get, which builds and discards a Session per
call. That means no connection pool and no keep-alive, so every
search/find pays a fresh TCP + TLS handshake.

Give each client one long-lived requests.Session backed by an
HTTPAdapter connection pool (mounted on both http:// and https://) and
route do_req through it, so repeated calls reuse warm connections.

Covers ClientForConsoleApi, ClientForDataApi, ClientForDataApiWithApiKey
and the private VikingDBClient.

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

* perf(vectordb): reuse one pooled client in VikingDBProject

has_collection/get_collection/_get_collections built a fresh
VikingDBClient per call, so each rebuilt a pooled Session whose
keep-alive connection died with the GC'd client. Hoist the client to an
instance attribute so all metadata calls share one warm pool.

Note: requests.Session persists Set-Cookie across calls (the old
one-shot requests.request did not). These APIs are HMAC/Bearer
authenticated and do not use cookies, so this is only relevant if a
fronting LB sets affinity cookies, which would now stick per client.

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

---------

Co-authored-by: TRAE CLI <traecli@bytedance.com>
2026-09-14 11:14:37 +08:00
Zayn Jarvis 2d774d835c docs: refresh WeChat group QR code (#4995) 2026-09-14 10:34:10 +08:00
yufeng dd33e5c1d6 feat(studio): configure user memory policies (#4975)
* feat(studio): configure user memory policies

* fix(studio): refresh user memory policies before editing
2026-09-14 09:59:09 +08:00
bot-of-qin-ctxandqin-ctx 9b5f43d828 fix(parse): 保留 Understanding 上传文件的已识别扩展名 (#4981)
* fix(parse): preserve detected extensions in Understanding uploads

* test(parse): trim upload filename regression coverage

---------

Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>
2026-09-14 02:03:00 +08:00
bot-of-qin-ctxandqin-ptr fafccb1c2b feat(skills): 支持服务端导入 Git 技能 (#4957)
Co-authored-by: qin-ptr <222410531+qin-ptr@users.noreply.github.com>
2026-09-14 01:40:56 +08:00
Zayn Jarvisandtangtao e757dd3749 fix(openclaw): support turn retention and consistent pending tokens (#4972)
Reuse the server turn-budget planner for opt-in auto-commit retention, preserve manual full compaction and setup configuration, and handle zero retained turns when rebuilding pending tokens.

Refs #4415 (items 3 and 6).

Co-authored-by: tangtao <1024583279@qq.com>
2026-09-13 17:51:41 +08:00
yufeng add229566c fix(studio): group agent session messages and improve chat readability (#4968)
* fix(studio): group agent session messages and improve chat readability

* feat(studio): refine sidebar icon system

* fix(studio): align session images with server format and localize errors

* fix(studio): unify active sidebar icon color
2026-09-13 11:25:10 +08:00
Zayn Jarvis 46129f143a feat(bot): make the Feishu channel domain configurable for Lark (#4962) 2026-09-12 21:11:09 +08:00
Hao Zhe 84bbf79711 feat(parser): add LlamaParse v2 bridge (#4824)
* feat(examples): add LlamaParse understanding bridge

* docs(parser): document long-running live test behavior

* feat(parser): support LlamaParse image and audio URLs

* fix(parser): harden LlamaParse bridge results

* refactor(examples): simplify LlamaParse bridge
2026-09-12 19:49:18 +08:00
alanhuangyooandClaude Opus 5 0f77ab5625 fix(mcp): bound search's context arguments the way POST /search does (#4892)
`SearchRequest` constrains four of them with pydantic `Field`; the tool declared them
as plain ints and a plain list, so the MCP face accepted values the REST face rejects:

    max_tokens           REST ge=64 le=32000        tool: any int
    dedup_turns          REST ge=0  le=100          tool: any int
    rewrite_max_bullets  REST ge=1  le=20           tool: any int
    exclude_uris         REST max_length=200        tool: any length

Three of those are only permissive -- the values are clamped downstream. `exclude_uris`
is not. `normalize_exclude_uris` slices to MAX_EXCLUDE_URIS regardless, so the extra
exclusions were dropped in silence and the URIs the caller asked to exclude came back
in the results:

    MAX_EXCLUDE_URIS = 200; asking to exclude 250 URIs
      MCP path  -> kept 200 of 250; silently dropped 50
      REST path -> too_long: List should have at most 200 items after validation, not 250

Declare the bounds with Annotated/Field rather than checking them in the body: FastMCP
puts them in the tool's published input schema (minimum/maximum/maxItems), so the model
driving the tool sees them before it picks a value, and enforces them on call_tool,
which is the path an MCP client takes.

MAX_EXCLUDE_URIS is imported rather than repeated, so the cap and the slice that
motivated it cannot drift apart.

Independent of #4886: that one is the list-mode guard, this is the context-mode bounds.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 01:34:22 +08:00
NanHan Qing 7c88d5c5ad fix(pi-plugin): preserve camelCase tool result messages (#4940)
* fix(pi-plugin): preserve camelCase tool result messages

* test(pi-plugin): cover native tool result capture and incremental sync

Refactor tests for extractBranchCapturePayloads to handle various tool result scenarios and ensure correct payload extraction.
2026-09-12 01:27:39 +08:00
Zayn Jarvis 5ad383772b docs: fix table striping, community heading case, add contributor graph (#4952)
* docs: stop the integration table from zebra-striping its second row

* docs: title-case the community heading and add the contributor graph

* docs: lay out the contributor graph in 15 columns
2026-09-12 00:07:44 +08:00
Zayn Jarvis 9a408aa5ef docs: regroup integration tables and rename helper section (#4951)
* docs: regroup integration tables and rename helper section

* docs: shrink integration cell captions

* docs: restore caption size, shorten Hermes caption

* docs: normalize integration logo sizes, tighten pi logo viewBox

* docs: add normalized integration logo set

* docs: refresh studio hero with light and dark variants

* docs: use OpenAI mark for the Codex entry

* docs: add DSH and Doubao Work to the integration table
2026-09-11 23:56:32 +08:00
Zayn Jarvis a11a1cde81 docs: refresh WeChat group QR code (#4950) 2026-09-11 23:56:24 +08:00
Qin Haojie b3104fbd0c fix(parse): preserve source filenames in Understanding uploads (#4947)
Pass prepared source identity through every local upload entry point so
HTTP temporary basenames do not leak into parser artifacts.
2026-09-11 21:38:28 +08:00
Zayn Jarvis 420dfa42b4 docs(readme): improve copy while preserving layout (#4931)
* docs(readme): clarify value, concepts, and getting started

* docs(readme): fit concept and integration tables on narrow screens

* docs(readme): preserve original structure and header

* docs(readme): preserve research copy and Claude label

* docs(readme): keep Agent Plugins label on one line

* docs(readme): emphasize direct filesystem operations

* docs(readme): add new-tab attributes to Studio image links

* docs(readme): feature context compilation in Why section

* docs(readme): label DeerFlow integration as Plugin plus MCP

* docs(readme): keep MCP client labels on one line
2026-09-11 20:10:03 +08:00
Nguyễn Đăng Minh Lực ecd0fdba60 ci: run rust build and check workflows on crates changes (#4921) 2026-09-11 19:52:30 +08:00
Zayn Jarvis b1c0bef43a feat(reset-context): on session commit clear, reset context without changing session identity (#4937)
* fix(openclaw): clear reset context without changing session identity

* fix(sessions): unblock commits after reset boundary write failure

* refactor(sessions): read reset boundary from .done and skip duplicate empty resets

- _is_context_reset_archive reads the context_reset property directly instead
  of inferring it from a missing overview
- reset on an already-reset empty session returns confirmation without
  appending another empty archive directory

* refactor(sessions): reset boundary archive holds only .done

Terminal archives never have messages.jsonl read and a missing overview
already reads as empty, so the empty placeholder files were unused.
2026-09-11 19:38:44 +08:00
Jiahui ZhouandTRAE CLI 182f3d58de fix(admin): avoid full reload for list endpoints (#4935)
Co-authored-by: TRAE CLI <traecli@bytedance.com>
2026-09-11 18:05:14 +08:00
Qin Haojie 4f430f65fe fix(cli): 统一 add-skill 与 skills add 的导入流程 (#4939)
复用已有 Git 技能发现、选择和上传能力,避免两个 CLI 入口行为分叉。
移除技能导入命令的 timeout 选项,保留现有服务端处理及 wait 语义。
2026-09-11 17:27:11 +08:00
t0saki bf8c5e9d34 feat(examples): experimental pi extension where the agent manages its own context windows (#4941)
* feat(pi-experimental): fork pi extension into experimental context-management skeleton

* feat(pi-experimental): add context-window core, OV archive client methods and contextWindow config

- lib/context-window-core.mjs: pure, io-injected core for agent-driven context
  windows (tool-call-anchored cut, frozen window header, blocking reset
  pipeline with a single deadline, pending-overview refresh, reminder ladder,
  pi-compaction fallback rules)
- client.ts: sessionRootUri, readArchiveOverview/readArchiveMessages via
  content/read, listSessionArchives, grepSessionArchives, getTask; the
  /sessions/{id}/archives route is not used (blocked on the target gateway)
- config.ts/config.json: contextWindow block with clamps and env overrides;
  dead captureMode key removed

* feat(pi-experimental): wire agent-driven context windows into pi

- context-window.ts adapter binds the core to SyncManager/OVClient/pi
- tools.ts: new_context, history (list_windows/list_items/read_item/
  search_contents) and get_context_remaining with Codex-style names
- index.ts: offline restore before the health check, cut before recall,
  per-prompt [context-status] message, one-shot reminders, pi-compaction
  fallback through the core
- core follow-ups: abort checks before the handoff post, flush budget floor,
  syncBranch in handleBeforeCompact, lazy session validation, persisted
  previous overview
- docs: README, CONTEXT-WINDOW.md, agent-integrations pages; CI test glob
- scripts/e2e-window.mjs live gate replaces the takeover-era e2e-live

* fix(pi-experimental): apply three-lens review findings

- coexistence guard keyed on tool sourceInfo.path and re-checked on
  start/before_agent_start/turn_end
- reminders: ignore aborted/error turns as first observation, gate the idle
  note on the gap the user just returned from, threshold-free guidance
- core: persisted archives ledger for window/archive mapping, stale reminder
  detection for custom-role messages, task-aware overview wait, retracted
  handoff on post-handoff refusals, notes cleared on compaction fallback
- tools: refusal instructions, history fails closed on unreadable listings,
  grep line/item index kept stable, viking_search scope text without ~
- config: recentResetGuardMs exposed, dead keys removed; docs synced

* fix(pi-experimental): status line metrics from the branch on a fresh process, archive line index stability, wording nits

* test(pi-experimental): reasoning level, deterministic tool output and keepable OV session in the e2e gate

- E2E_LLM_REASONING=off|minimal|low|medium|high|xhigh marks the model as
  reasoning-capable and sets pi's defaultThinkingLevel; a custom relay also
  needs compat.supportsReasoningEffort, which URL auto-detection cannot infer
- T1 now reads a seeded release.md, so the archive reliably carries a
  [tool-result ...] entry instead of depending on the model reaching for a tool
- E2E_KEEP_OV_SESSION=1 skips the session delete so the archives stay readable
  for a demo

* test(pi-experimental): add a long-context scenario where the agent resets under pressure

E2E_WINDOW_LONG=1 seeds the extension's own sources (22 files, ~105k tokens of
material) into the workspace and asks for a file-by-file inventory, without ever
mentioning the context tools. The gate then checks what the agent did on its
own: how full the window got, whether it reset, whether the cut was legal, and
whether the work continued across the boundary.

- peak pressure is measured from the provider payloads, not only from the
  per-prompt [context-status] line, which undersamples a tool-heavy turn
- runTurn takes a timeout; the long turns get 25 minutes instead of 10
- judgement-dependent checks warn, harness behaviour still fails the gate

Observed on doubao-seed-2-1-pro with reasoning high: 96 requests, peak 47% of a
128k window, three self-initiated resets, 22/22 files inventoried.

* docs(pi-experimental): publish redacted demo evidence, drop the hardcoded relay

- demo-evidence/pi-ctxwin-demo.zip: two real runs against a live OpenViking
  server and a live model, with transcripts, the provider payloads either side
  of every reset and the archives pulled back off the server. Secrets file
  absent, relay hostname and operator username replaced; REDACTIONS.md inside
  the archive lists every substitution
- e2e-window.mjs no longer defaults E2E_LLM_BASE_URL / E2E_LLM_MODEL to a
  private relay: both are now required, so no endpoint of anyone's is baked in
- CONTEXT-WINDOW.md documents the reasoning, long-context and keep-session
  knobs added with those scenarios

* docs(pi-experimental): name the real endpoint and model in the demo evidence

The published archive now says what the runs actually used — Volcengine's
Doubao 2.1 Pro (doubao-seed-2-1-pro-260628) on Ark at
https://ark.cn-beijing.volces.com/api/v3 — instead of an anonymous relay
placeholder. The runs went through a private proxy in front of Ark; the same
key reaches the official endpoint directly, and REDACTIONS.md says so.

* docs(pi-experimental): say which repo-level hooks this directory deliberately does not touch

The extension keeps its diff inside its own folder, so the CI test glob and the
shared-file sync TARGETS entry are not added. Record both, plus the local
.gitignore that re-includes lib/, so a maintainer promoting this out of
experimental status knows what to wire up.
2026-09-11 17:19:15 +08:00
Jiajie - He/him/his 985bd1d7c7 fix: support hash characters in file paths and Markdown references (#4927)
* fix: support hash characters in file paths and Markdown references

* fix: preserve literal resource references and chunk-named files
2026-09-11 14:28:07 +08:00
Zayn Jarvis 4375f5e9ac docs(readme): add integration logos and fix publication formatting (#4929)
* docs(readme): fix publication citation line breaks

* docs(readme): present agent integrations in a logo table

* docs(readme): align integration logos across each row

* docs(readme): shorten Claude label and link integration details

* docs(readme): add DeerFlow and general integration logos

* docs(readme): keep integration captions and mode names on one line

* docs(readme): prevent CJK MCP labels from wrapping

* docs(readme): remove redundant MCP integration note
2026-09-11 14:15:30 +08:00
baojun-zhang 581a91ad21 fix(test): 修复测试异常问题 (#4925) 2026-09-11 14:13:56 +08:00
Zayn Jarvis bf3062975a docs: refresh WeChat group QR code (#4930) 2026-09-11 13:54:56 +08:00
Zayn Jarvis c31e261b28 docs(readme): add research publications and their OpenViking relevance (#4924)
* docs(readme): add research publications and conference milestones

* docs(readme): connect publications to agent memory and retrieval

* docs(readme): add VikingRAG research and submission status
2026-09-11 13:44:34 +08:00
DuTao cb848fd568 fix(bot): deliver explicit OpenViking images in Feishu cards (#4867)
* fix(bot): deliver explicit OpenViking images in Feishu cards

* refactor(bot): shorten Feishu image delivery prompt
2026-09-11 12:43:07 +08:00
Qin Haojie f6ae7814d4 fix(startup): tolerate malformed preset directory abstracts (#4923) 2026-09-11 12:15:28 +08:00
Jiahui ZhouandTRAE CLI f2832b7b9b Feat/configurable executor workers (#4913)
* feat(server): configure asyncio executor workers

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

* refactor: clarify executor thread configuration

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

---------

Co-authored-by: TRAE CLI <traecli@bytedance.com>
2026-09-11 11:02:33 +08:00
Hao Zhe f55cb4170f fix(openclaw): recall from the incoming assembly prompt (#4906)
* fix(openclaw): recall from the incoming assembly prompt

* fix(openclaw): allow fresh recall after transient injection
2026-09-10 20:49:02 +08:00
baojun-zhang e4c4395f5b feat(storage): 修复脏读导致的pathlock文件读取后格式异常问题 (#4908) 2026-09-10 20:09:23 +08:00
Qin Haojie cf0fb06d0e fix(tasks): treat missing task records as deleted (#4907) 2026-09-10 20:04:20 +08:00
Xiaoxi 0ef6217583 fix: avoid signaling Windows processes during PID checks (#4791) 2026-09-10 19:40:01 +08:00
Zayn Jarvis 6b9d54900f fix(openclaw): preserve capture across host turn protocols (#4900) 2026-09-10 19:19:07 +08:00
chenyu a57d7f941a feat(tasks): show persisted execution events in Studio (#4864)
* feat(tasks): persist bounded execution events in task snapshots

* feat(tasks): expose execution history on detail requests

* test(tasks): cover persisted event ordering and durability

* test(tasks): verify event API ownership and opt-in responses

* feat(studio): define and format recorded task events

* fix(studio): replace synthetic logs with persisted task events

* chore(studio): add the task event query option

* feat(studio): localize execution events in English

* feat(studio): localize execution events in Chinese

* docs(tasks): document persisted execution events

* docs(tasks): document execution events in Chinese
2026-09-10 18:45:04 +08:00
Jiahui ZhouandTRAE CLI b50431770e feat(auth): batch register trusted identities (#4861)
Co-authored-by: TRAE CLI <traecli@bytedance.com>
2026-09-10 16:44:55 +08:00
Nguyễn Đăng Minh Lực 75deb0904b fix(server): accept slash in X-Request-ID and regenerate invalid ids instead of 400 (#4827)
OpenAI Secure MCP Tunnel forwards X-Request-Id values formatted as
<uuid>/<suffix>. The strict charset [A-Za-z0-9._:-] rejected them with
HTTP 400, breaking MCP connectors created through the tunnel.

- allow '/' in the request id pattern (still capped at 128 chars)
- replace rejection with a regenerated uuid4 plus a warning log;
  invalid raw values are never logged
2026-09-10 16:39:56 +08:00
LI ee14341a10 fix(fs): normalize S3 virtual-directory ls rows without modTime (#4875)
Fixes #4859: CommonPrefixes under directory_marker_mode=none can omit modTime/size; keep those directory rows listable for WebDAV PROPFIND.
2026-09-10 16:36:25 +08:00
黄飞虹and黄飞虹 45e011ceaf fix(bot): preserve OpenViking credentials with --with-bot (#4847)
Co-authored-by: 黄飞虹 <aaronwong1989@gmail.com>
2026-09-10 16:27:26 +08:00
chenyu 00e5e79da8 fix(studio): align pending labels and cover task page status / 统一等待文案并补齐任务页回归 (#4856)
* test(studio): cover task filtering after removing unused status helper

* fix(studio): align pending labels and cover task page status
2026-09-10 14:58:55 +08:00
Zayn Jarvis e03ce0a91b feat(agent-plugins): add memory extraction troubleshooting skill (#4890)
* feat(agent-plugins): add memory extraction troubleshooting skill

* docs(agent-plugins): simplify memory troubleshooting to backward tracing
sdk/go/v0.0.2
2026-09-10 14:27:44 +08:00
Nick Jamesandpc.yu 3841e6f299 fix(plugins): drain the dsh pending queue in-process so a transient write failure self-heals (#4779)
* fix(plugins): drain the pending queue in-process so a transient write failure self-heals

The dsh memory plugin latches capture and commit on the first retryable
write failure (hasPendingWrites) and only reset the latch at session
init, so the long-lived dsh process stayed stuck until restart.

Add a per-process single-flight drainer (default 60s, env
OPENVIKING_PENDING_DRAIN_INTERVAL_MS) that follows the session-start
flow: probe health, replay the queue without consuming retry budgets,
then re-derive every session's latch from the queue. replayPending gains
an optional consumeRetries flag (default true, byte-compatible):
drainers release a failed claim back to its original filename instead of
incrementing the retry count, so the session-start path keeps owning all
retry accounting and D4 deletions. Latch and health transitions are
logged once per flip for observability.

* test(plugins): cover the drainer and non-consuming replay mode

Add pending-queue coverage for consumeRetries:false (retryable failures
stay retryable and ordered, non-retryable and exhausted entries still
delete, commitSession failures keep the run going, default mode
unchanged) and runtime drainer coverage (recovery clears the latch,
outages keep it and leave entries retryable, empty queue means zero
HTTP, commit resumes after the drain, single-flight, per-session latch
isolation, interval wiring with env fallback).

---------

Co-authored-by: pc.yu <nick@fourieralpha.com>
2026-09-10 13:26:46 +08:00
Qin Haojie a386269d38 fix(resources): 明确等待超时语义并改用任务轮询示例 (#4888)
等待超时返回任务 ID 和状态查询提示,避免误认为后台导入失败;主要文档和示例改为提交后查询任务状态。
2026-09-10 11:52:14 +08:00
ManAsWindandlinweiye 98f7dfe0e3 docs: remove duplicate CLI API key block (#4878)
Co-authored-by: linweiye <linweiye.voph@bytedance.com>
2026-09-09 20:36:10 +08:00
Qin Haojie f60a71d003 fix(compile): keep API keys private while forwarding runtime args (#4865) 2026-09-09 19:47:55 +08:00
Qin Haojie 39670e7b95 feat(compile): 同库同目标任务轮转排队 (#4863)
* feat(compile): 同一目标的任务轮转排队

* fix(compile): handle cancellation rejection during queue rotation
2026-09-09 19:29:52 +08:00
Nick Jamesandpc.yu c82ae5f664 fix(embedding): harden request-scoped query embedding cache (#4822)
Follow-up to #4794: install the cache scope at the fan-out owners via a
query_embed_cache_scope context manager (covers /recall and the MCP
search tool), cover the /skills/find two-find fan-out, shield the shared
embed task against waiter cancellation, key entries by embedder identity,
and reset the ContextVar token on scope exit.

Co-authored-by: pc.yu <nick@fourieralpha.com>
2026-09-09 19:21:10 +08:00
now-ingandmac e58d3ab1ba fix(bot): reject non-bare filenames in send:// URIs (#4669)
The send:// branch of _parse_data_uri joined the URI remainder onto
get_data_path()/images/ with no validation, so a crafted outbound URI
such as send://../../secrets.txt read an arbitrary server file, and the
channel image delivery path would attach and exfiltrate it to the chat
platform. The URI text is model-authored at runtime, i.e. untrusted
exactly like the resource content fenced on the extraction paths
(#4292).

send:// remainders must now be bare image filenames ([A-Za-z0-9][A-Za-z0-9._-]{0,200}); anything containing path
separators, leading dots, or escapes raises ValueError before any file
is opened. #4660 widens the delivery surface to Discord/Slack/Telegram,
so the underlying loader needs this regardless of which channels ship.

Co-authored-by: mac <bishopapril850965@yahoo.com>
2026-09-09 17:23:29 +08:00