Commit Graph
2088 Commits
Author SHA1 Message Date
604275f272 feat(resources): support TOS auth args for HTTP imports (#4248)
* feat(resources): support source headers for HTTP imports

Allow HTTP(S) resource imports to pass request headers for authenticated object storage sources. Fetch authenticated sources into a request-scoped snapshot and keep credentials out of parser inputs and queued jobs.

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

* fix(resources): reserve source headers from args

Treat source_headers as a top-level add_resource field so it is rejected from args and filtered consistently from queued processor inputs.

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

* feat(resources): accept TOS auth through args

Replace generic source header passthrough with explicit tos_signature and tos_access args for HTTP TOS object imports. Keep credentials request-scoped and out of parser and queue payloads.

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

* refactor(resources): name transient TOS args

Centralize TOS credentials that are accepted from args but excluded from durable resource jobs.

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

---------

Co-authored-by: TRAE CLI <noreply@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
python-sdk@0.1.9
2026-08-24 19:09:09 +08:00
8ab07b1e4c fix(semantic): use Markdown links instead of [N] indices in L1 overview (#4251)
Directory L1 overviews previously fed the model bare `[N]` file indices and
`[N] filename: summary` source lines, then post-processed by replacing `[N]`
with the entry filename. Because the model naturally copied the filename next
to the index (e.g. `### [1] filename` or `→ [1] filename`), the substitution
produced duplicated headings like `### filename filename` in both Quick
Navigation and Detailed Description sections.

Replace the index-reference scheme with collision-free link placeholders:

- Feed each entry a compact placeholder `(link: viking://input_sample_fN)` for
  files and `viking://input_sample_cN` for subdirectories, and instruct the
  model to emit standard Markdown links `[display title](placeholder)`.
- Resolve placeholders back to real `viking://` URIs (built from
  `dir_uri + "/" + name`) in post-processing via `_replace_link_references`,
  replacing the old `_replace_index_references`.
- Apply consistently across the single, truncated, and batched generation
  paths; batched partials resolve placeholders before merge so the merge step
  needs no further substitution.

This eliminates the duplicated-heading class of bugs entirely (bare `[N]`
collisions are far less likely than reused digits) and yields clickable,
accurate resource links in the generated overview, matching the Markdown
link convention already used elsewhere (session memory extraction).

Co-authored-by: Maojia Sheng <shengmaojia@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
2026-08-24 17:50:33 +08:00
bianbiandashen 4ede9c49bd fix(memory): preserve all patch blocks when creating a new memory (#3682)
When a memory has no existing content (current_value is None), PatchOp routed
the write through _extract_replace_when_no_original, which returned only the
FIRST block's replace text — via StrPatch.get_first_replace() for objects, and
blocks[0] for the dict (JSON-parsed) form.

The StrPatch schema instructs the model to split non-adjacent edits into
separate blocks, so a brand-new memory routinely arrives as a multi-block
patch (e.g. one block per extracted fact or preference). Taking only blocks[0]
silently discarded every subsequent block — entire facts/preferences extracted
from the session were dropped with no log, warning, telemetry, or
caller-visible signal. The existing-content path (apply_str_patch) already
iterates all blocks; the no-original branch was an asymmetric omission.

Concatenate every block's replace content (joined by newline) in both the
StrPatch and dict forms. The common single-block case is unchanged
("\n".join([x]) == x), and the existing-content path is untouched.

Add regression tests covering multi-block StrPatch and dict-form patches
(silent loss before the fix), plus single-block and existing-content cases
to pin the unchanged behaviour.
2026-08-24 17:26:47 +08:00
LeoFreeandliuyuxin a5dc9b0248 fix(storage): exclude watch control files from backups (#4149)
Co-authored-by: liuyuxin <uyuc@liuyuxindeMacBook-Air.local>
2026-08-24 17:18:36 +08:00
d1fd66eb82 fix(bot): use user-scoped resources URI in VikingSearchTool (#4214)
* fix(bot): use user-scoped resources URI in VikingSearchTool

VikingSearchTool hardcoded `viking://resources/` (shared namespace)
as the search target for resources, but user-uploaded resources are
stored under `viking://user/<user_id>/resources/`. The server correctly
treats `resources` as a standalone scope without user-path resolution,
so the shared URI returned zero results in user API key mode.

This patch adds `_current_resources_uri()` — mirroring the existing
`_current_skill_uri()` pattern — to derive the user-scoped resources
URI from the current memory URI. All three hardcoded sites are replaced:

1. `_fs_retrieval_uris()` — default root retrieval list
2. `VikingSearchTool.execute()` — sender-fanout branch
3. `VikingSearchTool.execute()` — actor-peer-id branch

Verified: Vikingbot chat API search for resources now returns correct
results instead of empty arrays.

* fix(bot): include current resource targets in retrieval

* fix(bot): use home aliases for scoped file targets

Emit current-user resource, memory, and skill targets with viking://~/ aliases instead of deriving sibling URIs from memory targets.

---------

Co-authored-by: 王旭晨 <wangxc4@chinatelecom.cn>
Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>
2026-08-24 17:02:14 +08:00
Zayn Jarvis 69dd1d6556 fix(pi-extension): key recall ledger by stable entry ids (#4237) 2026-08-24 16:50:55 +08:00
DamonDay 029e203d53 build: stop vendored leveldb from linking system tcmalloc (#4034)
third_party/leveldb-1.23 auto-detects a system tcmalloc with
check_library_exists() and links it with PUBLIC propagation. Because the
Python abi3 engine module transitively links that tcmalloc, it mixes the
tcmalloc heap with the Python allocator inside the same process, which
corrupts memory and intermittently SIGSEGVs in vectordb::Schema /
bytes_row construction. Official wheels never link tcmalloc, so this
only reproduced on machines that have libtcmalloc installed.

Force HAVE_TCMALLOC off by default (opt-in via -DHAVE_TCMALLOC=ON) so
source builds behave like the released wheels.
2026-08-24 16:39:18 +08:00
Onefly b02f602526 fix(dsh): prevent duplicate profile injection after re-seed (#4231) 2026-08-24 16:33:46 +08:00
Yu ZhangandClaude Sonnet 4.6 85228eb38d fix(vlm): pass Codex reasoning effort (#4244)
Allow openai-codex VLM configuration to carry reasoning_effort through credential normalization and into Responses API requests so deployments can tune model effort without out-of-tree patches.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-24 16:27:36 +08:00
DuTao 4369e28dca fix(memory): expose reasons for skipped empty-URI operations (#4168)
* 增加空uri的原因

* fix  pr bug

* 加入Memory diff

* fix(memory): preserve semantics for skipped URI reporting
2026-08-24 16:21:04 +08:00
LH-kevin acfb3965cb fix(semantic): stop parent refresh at namespace roots (#4232) 2026-08-24 16:18:29 +08:00
bot-of-qin-ctxandqin-ctx 84156432b0 fix(ragfs): normalize localfs mkdir already exists (#4246)
Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>
2026-08-24 16:05:50 +08:00
LinQiang391 54171182da fix(ci): avoid generated branches for plugin releases (#4242) 2026-08-24 15:34:30 +08:00
baojun-zhang c66b915502 feat(ragfs): fine-grain lease-mode pathlock control (#4235)
* feat(ragfs): fine-grain lease-mode pathlock control

* fix(ragfs): fix adopted lock kinds and bounded downgrade

* fix(ragfs): fix pathlock downgrade race handling
2026-08-24 14:49:40 +08:00
XiaoChen 0554308e0c fix(memory): render fields without init_value as empty on init (#4213)
Previously initialize_memory_files only seeded template variables for
fields that declared an init_value. Fields without one were omitted from
extra_fields, so Jinja (DebugUndefined) wrote their literal "{{ field }}"
placeholders into initialized memory files such as identity.md.

Seed every field, defaulting a missing init_value to an empty string, so
placeholders resolve to empty instead of leaking into the file.

Fixes #4207
2026-08-24 14:25:50 +08:00
9eac8a6d3d feat(sdk): sync go/ts/python SDKs with server find/search, recall, an… (#3737)
* feat(sdk): sync go/ts/python SDKs with server find/search, recall, and admin changes

Server-side changes recently landed that the language SDKs had drifted from:

- find/search results now return `tags` and no longer return
  `category`/`match_reason`/`relations`/`overview` (#3730). Go's strict
  struct was the only one broken; update MatchedContext accordingly.
- new admin endpoints for agent-evolution and per-account settings (#3695).
- public `search/recall` endpoint was missing from all SDKs.

Changes:
- python: add `level`/`since`/`until`/`time_field` to find/search; add an
  `extra` escape hatch to find/search/add_resource/write/batch_write so new
  server fields can be passed without an SDK bump (only forwarded when set,
  preserving `level=0`); add `recall` and the four admin methods.
- go: fix MatchedContext (add Tags, drop removed fields), add Recall and the
  four admin methods.
- typescript: type MatchedContext/FindResult, add RecallOptions, add `recall`
  and the four admin methods.

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

feat(sdk): unify options APIs and sync latest server interfaces

- migrate complex Python SDK calls to typed options dictionaries
- add dedicated context search and consistent extra-field handling
- align Go and TypeScript options with omission-aware serialization
- support session config, event tags, Agent Evolution date filters,
  OpenViking Assets, batch write, downloads, and create_parent
- refresh SDK tests and examples across all three languages

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

fix(sdk): address options API review findings

- fix Go session extra merging and Python message precedence
- adapt LangChain calls to the Python options API
- migrate repository examples, tests, and documentation

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

fix(sdk): complete options migration and message parity

- migrate remaining Python SDK benchmarks to options dictionaries
- normalize empty parts consistently for single and batch messages
- add regression guards for repository SDK call sites

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

fix(sdk): align reindex options after main rebase

- preserve reindex tags in Python typed options
- add reindex extra support for Go and TypeScript
- reject official fields passed through extra across SDKs

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

feat(sdk): support legacy keyword options

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

docs(sdk): use explicit Python SDK arguments

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

fix(sdk): support set tags extra options

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

fix(sdk): expose Go add resource options

Expose AddType and ProcessingMode through Go AddResourceOptions and serialize them to the resources API. Add a regression test covering the resulting request payload.

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

feat(sdk): flatten core Python client options

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

docs(sdk): align Python examples with flattened options

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

fix(sdk): preserve core API compatibility

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

refactor(python-sdk): move resource hints to options

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

fix(sdk): align resource option callers

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

test(sdk): cover recursive reindex forwarding

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

fix(sdk): preserve Go options compatibility

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

feat(python-sdk): expose message peer id

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

test(python-sdk): consolidate options coverage

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

feat(python-sdk): add parts and flatten image search

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

* docs(sdk): align Python call examples

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

---------

Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: Qin Haojie <qinhaojie.exe@bytedance.com>
2026-08-24 14:09:11 +08:00
Qin Haojie ad750121ed fix(api-keys): hide deleting users from list (#4234) 2026-08-24 14:03:50 +08:00
Zayn Jarvis 167951eaa6 fix(pi-extension): persist recall injections for prompt caching (#4143)
Reapply previously injected recall blocks to historical user messages from a per-session, atomically persisted ledger. This preserves byte-stable request prefixes across turns while still performing fresh recall for the newest prompt.\n\nFixes #4137
2026-08-24 13:06:07 +08:00
yufeng e7ab26ab24 fix(docs): remove duplicate CLI API key block (#4236) 2026-08-24 12:27:54 +08:00
Nguyen Thanh Datandqin-ctx c66fee4d12 fix(ov_dream): accept a message whose content is a plain string (#4221) (#4228)
* fix(ov_dream): accept a message whose content is a plain string (#4221)

parse_messages() assumed every OpenClaw message body was a block list.
Iterating a plain string yields characters, so `"p".get("type")` raised
AttributeError out of the parser — before any session was committed, which
made one such message disable the skill for the whole workspace rather than
skip that message. The reporter measured 91 string bodies in 1609 real
messages.

Flatten the body through a helper that treats a string as text and skips
blocks that are not dicts.

* test(ov_dream): consolidate string content coverage

---------

Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>
2026-08-24 12:16:54 +08:00
Axiomoth 6e944cc3e1 fix(studio): prevent token chart axis label clipping (#4105) 2026-08-22 09:37:44 +08:00
Axiomoth 69cad83737 fix(web-studio): avoid duplicate version prefix (#4203)
Signed-off-by: Axiomoth <alearner@splrad.com>
2026-08-22 08:50:58 +08:00
ManAsWindandlinweiye 2af48624e0 docs: remove duplicate OpenClaw API key copy (#4195)
* docs: add API key blocks to agent guides

* docs: use connect agent template tokens

* docs: remove page wording from agent copy

* docs: sync English agent integration copy

* docs: remove duplicate OpenClaw API key copy

---------

Co-authored-by: linweiye <linweiye.voph@bytedance.com>
2026-08-21 21:03:30 +08:00
Zayn Jarvis 2cc7ec4724 refactor(agent-plugins): split optional MCP tools into a skill reference subdirectory (#4199)
SKILL.md now teaches only the core tool set that every supported
deployment registers; deployment-dependent tools (tree/write/edit,
watch management) move to
skills/openviking-memory/references/optional-tools.md, read only when
the session actually registered them. Legacy recall is dropped
entirely (0.4.15 folds it into search mode="context"). Adds a test
that relative markdown links inside skills resolve. Rebased onto the
viking://~ URI convention from a83b8171.
2026-08-21 19:04:26 +08:00
t0saki a83b81715b feat(uri)!: remove uid-less current-user shorthand in favor of viking://~ (#4196)
* feat(uri)!: reject uid-less current-user shorthand in favor of viking://~

viking://user/<segment> (memories/resources/skills/peers/privacy/sessions
without a user id) was ambiguous with a user literally named after the
segment, and a user actually named e.g. "memories" was unreachable for
USER/ADMIN callers. Now that the viking://~ home alias (#4167) covers the
same need unambiguously, the shorthand fails closed at the request
boundary instead of expanding:

- resolve_current_user_uri raises NamespaceShapeError with a corrective
  hint naming both viking://~/<rest> and the explicit-uid form. Silently
  parsing the reserved segment as a peer user id would misdirect reads
  and writes, so rejection is the only safe removal.
- Bare viking://user falls through to the canonical parser and keeps
  container semantics (a user key listing it sees only its own space).
- The self-id escape stays: a caller whose user_id equals a reserved
  name keeps viking://user/<own-id> as their canonical root. ROOT-role
  literal parsing and the legacy viking://session alias are unchanged.
- AddTargetsConfig normalizes stored legacy config spellings
  (viking://user/resources|skills) to the viking://~ form at validation
  so existing ov.conf/user_config deployments keep working; the accepted
  per-user spelling is now viking://~/resources and viking://~/skills.
- usage_reporter keeps canonicalizing the historical shorthand found in
  old transcripts and additionally recognizes viking://~/memories/.

BREAKING CHANGE: requests using the uid-less viking://user/<segment>
spelling now fail with 400; use viking://~/<segment> or an explicit
viking://user/{user_id}/<segment> URI.

* refactor(clients): migrate first-party emitters to the viking://~ home alias

Every in-repo client that emitted the removed uid-less current-user
shorthand now sends viking://~/... instead: vikingbot fallbacks and
default sentinels, the LangChain store/tools defaults, the shared
recall-core.mjs (all synced plugin copies), the codex/claude-code/
openclaw/openwebui/dsh/zcode/pi plugin emitters, quick-app examples,
Go SDK example, tau2 benchmark targets, and the eval golden dataset.

Compat kept where legacy strings live in stored user configs: bot and
ov_dream sentinels accept both spellings while emitting only ~, and
recall-core still rewrites legacy viking://user/<reserved> config values
client-side. langchain_openviking._uri now classifies viking://~ with
the explicit-user shape so canonicalized server responses keep matching
a ~ root. Plugin READMEs note the server requirement for the alias.

* docs: replace current-user shorthand guidance with the viking://~ home alias

Rewrite every EN/ZH doc and model-facing prompt that advertised the
uid-less viking://user/<segment> spelling: URI concept catalogue,
context-types/storage/extraction/retrieval/session/privacy concepts,
configuration guide (with the legacy add_targets auto-normalization
note), resources/skills/sessions/retrieval/admin API references, FAQ,
capability reference, and the openviking-memory / ov-experience-memory /
openclaw / ov-resources skills. The stale MCP viking://user/<path>
dialect passage in the MCP guide is replaced by ~ guidance, and bare
viking://user is documented as the container of user spaces.

* test(api): migrate live API session-used tests off the removed shorthand

tests/api_test/sessions sent uid-less viking://user/skills/... URIs to
record_used, which the request boundary now rejects with 400 (caught by
the API & CLI Integration Tests CI job; these tests need a live server
and are not part of the local suites). The api_test client authenticates
as an admin-role user key, so the viking://~ home alias expands for it.
tests/api_test/common/test_edge_cases.py is left as is: it asserts a 400
for a non-resource add target, which still holds.
2026-08-21 19:00:19 +08:00
dingbenandTRAE CLI 45c3295945 fix(api-keys): bypass S3FS stat cache for key-store change signature (#4192)
The api_key_watch_interval mechanism reloads account info across replicas
by polling compute_store_signature() (a (path, size, modTime) signature
over accounts.json + users.json). On S3FS this never detected writer-side
changes: S3FS stat() serves from a sliding-TTL StatCache (default 60s,
re-armed on every get()), so the watcher's 30s poll kept the entry alive
forever and the signature never moved -> reload() never fired. localfs
stats live, so it worked there.

Thread a bypass_cache flag from the watcher's stat call down to S3FS so
signature stats read fresh backend metadata:
- FsContext(View): add bypass_cache field + builder/getter
- ragfs-python build_fs_context: parse ctx["bypass_cache"]
- S3FS stat(): skip stat_cache.get() when bypass_cache is set
- AsyncAGFSClient.stat(bypass_cache=...): inject ctx flag
- legacy _stat_signature: stat with bypass_cache=True

Co-authored-by: TRAE CLI <traecli@bytedance.com>
2026-08-21 17:55:23 +08:00
ManAsWindandlinweiye c92ad738c1 docs: refine Chinese agent integration copy (#4194)
* docs: add API key blocks to agent guides

* docs: use connect agent template tokens

* docs: remove page wording from agent copy

* docs: sync English agent integration copy

---------

Co-authored-by: linweiye <linweiye.voph@bytedance.com>
2026-08-21 17:39:29 +08:00
Tequila Sunset 9042a0254f fix(codex): configure recall compressor base URL (#3601) 2026-08-21 17:33:21 +08:00
MaojiaShengandTRAE CLI a7c77e6cf7 feat: add freshness-aware parent aggregation (#4180)
* feat: add freshness-aware parent aggregation

Defer wide-directory abstract/overview regeneration until the configured freshness threshold is reached while continuing changed-file semantic and vector processing.

Persist freshness metadata atomically, make parent bubbling L0-aware, preserve separate semantic/vector statuses, and keep explicit waits synchronous.

Rebuild every sampled summary on threshold refresh and always retry directory vectorization so stale sidecars or transient vector failures cannot be silently accepted.

Add focused coverage for freshness policy, pending-state consumption, sampled-summary refresh, vector retries, and parent bubbling.

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

* feat: ov reindex support --recursive

* feat: ov reindex support --recursive

* feat: ov reindex support --recursive

* feat: ov reindex support --recursive, and applied to memory

* feat: ov reindex support --recursive, and applied to memory

---------

Co-authored-by: TRAE CLI <traecli@bytedance.com>
2026-08-21 16:30:44 +08:00
Jiahui ZhouandTRAE CLI 499995f3ed fix(search): filter invalid result tags (#4153)
Co-authored-by: TRAE CLI <traecli@bytedance.com>
v0.4.16
2026-08-21 14:59:07 +08:00
chenjwandTRAE CLI 9a0f54b300 docs: note benchmark model configuration (#4183)
* docs: note benchmark model configuration

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

* docs: link benchmark VLM model details

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

* docs: specify benchmark embedding model

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

---------

Co-authored-by: TRAE CLI <traecli@bytedance.com>
2026-08-21 14:04:10 +08:00
DuTao 32a6aff8f9 fix(bot): make session paths portable on Windows (#4162)
* fix session id

* fix(bot): make session paths portable on Windows

* fix(bot): address portable session review feedback

* fix  pr bug
2026-08-21 12:59:31 +08:00
baojun-zhang 2b92624794 fix(storage): fix recursive flag for file/dir delete (#4181) 2026-08-21 12:33:40 +08:00
Hao Zhe a809a0aaef feat(studio): show error details in request logs (#4172)
* feat(studio): show error details in request logs

* fix(observability): harden audit error details
2026-08-21 11:57:08 +08:00
zihengli 00bc96258b feat: new tos connector args (#4129)
* feat: new tos connector args

* fix: skill ut

* fix: param check

* fix: param check

* fix: param check

* fix: clarify connector watch eventual consistency

* fix: allow plaintext connector watches and tighten TOS URI validation
2026-08-21 11:00:45 +08:00
Zayn Jarvis daf5fb1774 fix(dsh): support current release candidate peers (#4169) 2026-08-20 21:24:03 +08:00
t0saki ff38bb5dd1 feat(uri): add viking://~ home alias for the caller's user root (#4167)
* feat(uri): add viking://~ home alias for the caller's user root

Accept `viking://~` (and `viking://~/<suffix>`) as a server-side alias
for the authenticated caller's user namespace root. The alias is
expanded at the request boundary by resolve_current_user_uri for
USER/ADMIN identities, so every control plane that already funnels
through validate_request_viking_uri (REST, MCP, and therefore CLI/SDK
clients) gets it with no client changes.

Design points:
- `~` is a reserved token that can never collide with a real user id
  (validate_user_id's charset excludes it), so segment-0 aliasing does
  not weaken canonical-first parsing.
- The canonical parser (resolve_uri) rejects the alias outright,
  mirroring the legacy-session handling: root-role requests, internal
  callers, and storage paths fail closed instead of materializing a
  literal '~' directory.
- The alias is accepted but never advertised: scope error copy
  ("Must be one of: ...") filters it at both the parser and the public
  validator, and VikingURI.build refuses to mint it, so responses and
  persisted data stay canonical.
- MCP search now resolves exclude_uris with the same strictness as the
  REST search router (closes the one entry point that skipped it).

* refactor(mcp): drop tilde mention from tool docstrings

Agents pass viking://~ through verbatim and responses echo the
canonical form, so the alias is self-explanatory on contact; carrying
the sentence in 12 tool descriptions costs every MCP session tokens.
Docs keep the alias documented for humans.
2026-08-20 20:44:40 +08:00
Monday 3bdf9995d2 fix: treat TOS NotFound as missing S3 object (#4165) 2026-08-20 20:39:24 +08:00
agent 056f875e90 feat: restore user-scoped memory extraction policies (#4126)
* feat: add user-scoped memory extraction policies

* refactor: minimize user memory policy session changes

* fix: resolve user memory policy consistently

* refactor: resolve user memory policy once per commit

* refactor: simplify memory policy provider typing

* fix: apply server default user memory policy

* fix: allow resetting user memory policy
2026-08-20 20:28:33 +08:00
Jiajie - He/him/his 1efb0dce59 feat(compile): improve source materialization and long-running agent loops (#4059)
* feat(compile): compact agent context in-loop and remind iteration budget

* feat(compile): materialize sources for local exec and track reads

* feat(compile): survey-then-targeted read workflow and relaxed submission

* feat(compile): accept file sources, enable exec by default, update docs and tests

* fix(bot): harden compile source handling and compaction (#4099)

* feat(compile): add skill examples and update render

* feat(compile): add checkout workflow and task cancellation

* feat(cli): support compile task status and cancellation

* feat(examples): add compile knowledge graph tools

* docs(compile): document checkout and cancellation APIs

* docs(compile): add context compilation guides and skill examples
2026-08-20 20:17:55 +08:00
Hao Zhe 651f8fa2b5 fix(web-studio): respect task API limits (#4148)
* fix(web-studio): respect task API limits

* fix(web-studio): remove unsupported task time scope

* test(web-studio): pin task API limit
2026-08-20 19:35:05 +08:00
t0saki c7044075ef feat(dsh): serve tools over the shared stdio MCP proxy (#4157)
* feat(dsh): serve tools over the shared stdio MCP proxy

Replace the dsh bundle's seven hand-registered `viking_*` tools with the
OpenViking MCP surface, reached through the same stdio proxy every other
memory integration starts, and collapse the four duplicated proxy
entrypoints onto a shared config builder.

The bundle now mounts `@deepseek-ai/dsh-mcp-client` (which ships with dsh
itself) on `servers/mcp-proxy.mjs`. Pointing an MCP SDK client straight at
the server's `/mcp` endpoint does not work: with `stateless_http=True` the
server still answers `GET /mcp` with an idle 200 SSE stream, and once the
SDK client opens that standalone stream it stops resolving POST responses,
so `tools/list` never returns. The stdio proxy owns the transport itself
and is unaffected.

`trimSlash`, `normalizePath`, `uniq`, the watched-credential-path list and
the cfg -> proxyConfig mapping existed in four near-identical copies
(claude-code, codex, opencode, agent-plugins; the last one carried a
"keep in sync with claude-code" comment). They move to
`memory-plugin-shared/lib/mcp-proxy-config.mjs` and all five entrypoints —
including the new dsh one — now shape their config through
`buildMcpProxyConfig`. Behavior is preserved per field, including codex's
explicit `mcpUrl` override, claude-code's `ovcli.conf` credential-source
probe, and opencode's extra watched config file.

The bridge is mounted last in `apply()` so a proxy that fails to start
cannot hold up profile injection, recall, capture, commit, or the URI
guard registrations above it.

* feat(dsh): add to the unified installer and ship the shared skill

The bundle now registers its own isolated `ctx.skills` provider serving the
shared `openviking-memory` skill, so DSH gets the same guidance the Claude
Code, Codex, and Cursor integrations ship. `sync.mjs` distributes the skill
to the bundle, and the provider uses `includeDefaultRoots: false` so it
never shadows DSH's own project/user skill catalog.

`install.sh` grows a `dsh` harness id, auto-detected like the others, plus a
profile prompt that defaults to `web` (`--dsh-profile` / `OPENVIKING_DSH_PROFILE`
answer it up front). The installer always installs the published package:
`dsh plugin` forwards to pnpm, and a linked source tree cannot resolve the
dsh peers the bundle imports because Node resolves them from the checkout's
realpath rather than from the profile.

Documentation is restructured around installing rather than internals. The
integration page now leads with the one-line installer and keeps behavior at
the level the other harness pages use, with configuration in a details block;
design rationale moves to the bundle README, which itself leads with Install
and groups the rationale under "Design notes". Capability-reference claims
that dsh is outside the unified installer are corrected.

* chore(dsh): release 0.2.0

The MCP tool surface, the stdio proxy transport, and the bundled skill all
change what the bundle does for an existing user, so this is a minor bump
rather than a patch. 0.1.0 remains the native-`viking_*` tool surface.

* docs(dsh): note pnpm's 24h minimum release age

pnpm 11 refuses releases younger than minimumReleaseAge (24 hours by
default), and surfaces it as a registry 404, so installing a freshly
published version reads as "the package does not exist".

* fix(dsh): honour dev source mode in the installer

install_dsh ignored SOURCE_MODE and always fetched the published package,
so selecting "current checkout" installed npm's build instead of the
working tree and validation still reported success.

npm is the bundle's only distribution channel, so the github/tos choice
does not apply to it: every mode except dev now installs the published
package, and dev packs the checkout with npm pack first. It has to arrive
as a real package rather than a link, because a linked source tree
resolves its dsh peers from its own realpath and misses the profile's
hoisted node_modules. The install line reports which source was used.

* fix(dsh): make repeated installs actually overwrite

Two ways a re-run silently kept stale code:

pnpm treats an already-satisfied version as a no-op regardless of which
tarball the file: dependency points at, so a dev re-install after editing
the checkout left the previous build in place. Local installs now drop the
package before adding it back; that is confined to local sources, since
doing it for the registry path would leave nothing installed when add
fails.

A bare package name has the same effect in reverse: a profile holding a
dev build satisfies it, so switching back to the published package was a
no-op. The registry path now asks for @latest.

The packed tarball is named after a fingerprint of the checkout's shipped
files, so an unchanged checkout skips the pack and keeps a stable path in
the profile lockfile.
2026-08-20 19:05:18 +08:00
chuanbao666 421c73be9d fix(storage): 修复 ov add-resource在向量库返回4xx是吞异常问题 (#4160) 2026-08-20 17:42:28 +08:00
ManAsWindandlinweiye 42d37996cf docs: use connect agent template tokens (#4152)
* docs: add API key blocks to agent guides

* docs: use connect agent template tokens

---------

Co-authored-by: linweiye <linweiye.voph@bytedance.com>
2026-08-20 17:37:42 +08:00
Zayn Jarvis 2c205d8a7a docs: tag GitHub referrals with UTM (#4155)
* docs: tag GitHub referrals with UTM

* docs: tag GitHub referrals with UTM
2026-08-20 16:48:00 +08:00
Yu Zhang a0224b11cf fix(embedding): truncate LiteLLM async vectors (#4146) 2026-08-20 16:37:26 +08:00
bot-of-qin-ctxandqin-ctx 1ed5e21135 fix(uri): expand current-user URIs for admins (#4145)
Co-authored-by: qin-ctx <qinhaojie.exe@bytedance.com>
2026-08-20 12:58:18 +08:00
98a0104aaa Fix/filter invalid attr tags (#4123)
* fix(fs): filter invalid tags from attrs

Hide legacy non key-value search tags from filesystem attributes while preserving valid tags. Add regression coverage for the read boundary.

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

* feat(session): update auto commit policy defaults

Raise token and message thresholds, clear the retained-message default, and expand the corresponding bounds. Synchronize the session API and configuration documentation.

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

---------

Co-authored-by: TRAE CLI <noreply@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
2026-08-19 21:11:18 +08:00
Jiajie - He/him/his b9ec4f5b9a fix(memory): make cross-session updates and partial deletions reliable (#4121)
* fix(memory): refresh nested overview correctly

* improve 1

* add log

* fix(memory): merge cross-session operations by kind

* feat(memory): add DELETE blocks for partial memory removal

* refactor(memory): disable decision reasoning output

* chore(memory): add temporary bad-case diagnostics

* chore(memory): remove temporary bad-case logging

* fix(memory): delete unnecessary prompt

* fix(memory):update revert

* fix(memory):delete lines
2026-08-19 21:05:38 +08:00
stometaverseandleilei-chen-sto 84467b1be8 fix(memory): canonicalize entity URI casing (#4070)
* fix(memory): canonicalize entity URI casing

Signed-off-by: leilei-chen-sto <leilei@moego.pet>

* fix: canonicalize entity URI identity

* Revert "fix: canonicalize entity URI identity"

This reverts commit d403150849.

---------

Signed-off-by: leilei-chen-sto <leilei@moego.pet>
Co-authored-by: leilei-chen-sto <leilei@moego.pet>
2026-08-19 20:46:00 +08:00