Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
706 commits
Select commit Hold shift + click to select a range
cadf9c5
docs(cli): clarify snapshot commit path requirements (#5442)
r266-tech Sep 29, 2026
0f31ece
Feat/rfv reindex (#5416)
zhoujh01 Sep 29, 2026
ee010f8
fix(plugins): forward recall URI exclusions in Claude and Codex hooks…
r266-tech Sep 29, 2026
9ed69c5
docs(hermes): align setup and capability guidance (#5423)
ehz0ah Sep 29, 2026
af11ccb
feat(agent-plugins): ov-tasks skill for structured task handoff (#5157)
ZaynJarvis Sep 29, 2026
69e71e4
refactor(retrieval): 改为全局召回并统一候选精排 (#5450)
qin-ctx Sep 29, 2026
ac5950c
fix(dsh): forward MCP diagnostic settings (#5236)
ehz0ah Sep 29, 2026
bdba5f0
fix(hermes-plugin): preserve .env line endings during setup (#5449)
ehz0ah Sep 29, 2026
00490c9
refactor(retrieval): 移除热度加权及其配置 (#5454)
qin-ctx Sep 29, 2026
78a258b
fix(vlm): pass Anthropic body options through LiteLLM (#5447)
r266-tech Sep 29, 2026
f31678e
fix(dsh-plugin): listen on agent/created for session startup (#5444)
ZaynJarvis Sep 29, 2026
3b65218
fix(hermes-plugin): preserve characters in existing env values (#5455)
ehz0ah Sep 29, 2026
acfeb99
feat(ls): 支持返回目录摘要与概览 (#5434)
hezhang-1216 Sep 29, 2026
5b23459
feat(agent-plugins): rename ov-tasks to ov-kanban, fold task detail i…
ZaynJarvis Sep 29, 2026
3874aef
docs(deploy): add lessons from the v0.3.0 private deployment trial (#…
ZaynJarvis Sep 29, 2026
dae5434
fix(vlm): forward extra body to Ark media responses (#5440)
r266-tech Sep 29, 2026
ce8b9e4
fix(cli): accept oidc_token in ovcli.conf (#5448)
JayOfTheKeyboard Sep 29, 2026
f596fa0
fix(parse): keep content before the first top-level Markdown heading …
MohammadHijjawi97 Sep 29, 2026
c1b510f
fix(deps): require Gemini SDK lifecycle APIs (#5439)
r266-tech Sep 29, 2026
3123344
fix(embedding): derive Jina default dimension from the model (#5426)
MohammadHijjawi97 Sep 29, 2026
47b0c40
fix(parse): escape pipes and line breaks in Feishu Markdown tables (#…
MohammadHijjawi97 Sep 29, 2026
42d9a7f
feat(retrieval): add event time-decay ranking (#5214)
cocolord Sep 29, 2026
b20f192
fix(pi): say why /viking commit did not archive (#5468)
ZaynJarvis Sep 29, 2026
4310cc3
feat(installer): install from the TOS release only, confirm before ch…
t0saki Sep 30, 2026
323fe17
feat(installer): download the installer and plugins from the docs sit…
t0saki Sep 30, 2026
f20b4ba
fix(installer): ask openviking.ai for the release to install (#5487)
t0saki Sep 30, 2026
0c650c3
feat(search): add the keywords search type (#5456)
ByteDanceLiuYang Sep 30, 2026
dd04585
fix(installer): ask for the language first, clear old installers' lef…
t0saki Sep 30, 2026
a0421f0
feat(observer): report vector metric and score scale (#5488)
cocolord Sep 30, 2026
1092643
fix(auth): refuse account mutations without a registry baseline (#5483)
r266-tech Sep 30, 2026
36fc7e2
feat(web-studio): manage account memory extraction templates (#5495)
yufeng201 Sep 30, 2026
168037c
fix(server): reject invalid credentials on health check (#5471)
fukalous Sep 30, 2026
ebc8e5d
docs: install through openviking.ai/install in guides, plugin READMEs…
t0saki Sep 30, 2026
5011064
feat(installer): install the OpenViking CLI by default (#5498)
t0saki Sep 30, 2026
fd9e692
feat(mcp): 补齐 ACL 操作与安全的用户目录查询 (#5466)
qin-ctx Sep 30, 2026
3d55637
docs(api): remove the nonexistent `time` field from response examples…
ZaynJarvis Sep 30, 2026
9939f6b
docs: use the `ov` command name and fix SDK tab labels and source pat…
ZaynJarvis Sep 30, 2026
c89688e
docs: fix examples and values that contradict the implementation (#5503)
ZaynJarvis Sep 30, 2026
1394d47
feat: add Jev choice-based reranking (#5486)
chenxiaobin-monkey Sep 30, 2026
006661e
test(installer): include CLI in TRAE default selections (#5517)
r266-tech Oct 1, 2026
eadf2c7
test(installer): isolate fixture config paths from caller environment…
r266-tech Oct 1, 2026
dd19acc
docs(readme): agent-first Quick Start and OpenViking Service product …
t0saki Oct 1, 2026
0fabc5e
docs(mcp,skills): route imports away from write; ship OpenViking skil…
t0saki Oct 1, 2026
a0f3437
docs: tighten setup, CLI and client configuration guidance (#5504)
ZaynJarvis Oct 1, 2026
fa4fc64
docs: align authentication, tenancy and privacy guidance with the ser…
ZaynJarvis Oct 1, 2026
60a19ed
docs(api): review API reference pages against the implementation (#5506)
ZaynJarvis Oct 1, 2026
dcca08f
docs: review agent integration guides and setup panels (#5507)
ZaynJarvis Oct 1, 2026
fbf82ca
docs(guides): review configuration, deployment and observability guid…
ZaynJarvis Oct 1, 2026
1beeb0e
docs(guides): review encryption, backup, OAuth and storage guides (#5…
ZaynJarvis Oct 1, 2026
66ef1ce
docs(concepts): review concept pages and replace the ASCII architectu…
ZaynJarvis Oct 1, 2026
15eac24
docs: rewrite About, FAQ and context compilation pages in plain terms…
ZaynJarvis Oct 1, 2026
86abe90
docs: drop the 0.3.x migration guide and the OAuth proxy note (#5533)
ZaynJarvis Oct 1, 2026
39a39e8
docs: use SyncHTTPClient in Python examples (#5534)
ZaynJarvis Oct 1, 2026
115e572
docs: improve bilingual reading typography with OFL fonts (#5536)
ZaynJarvis Oct 1, 2026
d0dd043
docs: publish variant E branding (#5537)
ZaynJarvis Oct 1, 2026
b597acc
docs: align reading typography with tosaki font scheme (#5543)
ZaynJarvis Oct 1, 2026
9ef2da8
feat(cli): adopt E branding with a tapered mark and solid colors (#5545)
ZaynJarvis Oct 2, 2026
df32bf6
feat(brand): complete E rollout and tidy repository documentation (#5…
ZaynJarvis Oct 2, 2026
914ee57
fix(cli): honor effective config in status and configuration manageme…
ZaynJarvis Oct 2, 2026
d9a21bc
docs: migrate user-facing details and remove historical design notes …
ZaynJarvis Oct 2, 2026
f9a21af
fix(docs): align header logo size with website (#5569)
ZaynJarvis Oct 2, 2026
6134151
docs: fix font licenses link opening the 404 page (#5574)
ZaynJarvis Oct 2, 2026
66418e0
docs: move per-page font licenses link to the sidebar bottom (#5576)
ZaynJarvis Oct 2, 2026
7e47957
docs(zh): rename 多写存储 to 主备存储 and 队列状态与完成语义 to 任务状态 (#5529)
ZaynJarvis Oct 2, 2026
019dc5d
chore(docs): remove PR 2766 screenshot artifacts (#5585)
ZaynJarvis Oct 3, 2026
68ee182
chore(docs): remove unused review artifacts (#5586)
ZaynJarvis Oct 3, 2026
deb8200
docs: reorganize learning paths and unify site navigation (#5583)
ZaynJarvis Oct 3, 2026
e8a197c
build: use absolute image and link URLs in the PyPI long description …
ZaynJarvis Oct 3, 2026
9d9bc85
fix(build): pin LF for routeTree.gen.ts so Windows release builds sta…
ZaynJarvis Oct 3, 2026
8d3e66c
docs: refresh WeChat group QR code (#5634)
ZaynJarvis Oct 5, 2026
ff7295a
fix(docs): add the ocean social preview (#5600)
ZaynJarvis Oct 5, 2026
5dd5b2d
fix(dsh): normalize session ids for portable storage (#5522)
ZaynJarvis Oct 5, 2026
5e59d8e
docs: split CLI setup page into a copyable agent prompt and manual st…
ZaynJarvis Oct 5, 2026
4c2a887
feat(hermes): add Quick Local setup with local embeddings (#5465)
ehz0ah Oct 5, 2026
7d51604
fix(hermes-plugin): preserve per-session upload order (#5641)
ehz0ah Oct 5, 2026
c5b5229
fix(hermes-plugin): classify underlying Quick Local LLM errors (#5643)
ehz0ah Oct 5, 2026
ae0950b
fix(retrieve): use subtree matching for exclude_uris in context assem…
varun-projects Oct 5, 2026
e873b9d
fix(session): restore working memory creation error propagation (#5624)
MohammadHijjawi97 Oct 5, 2026
f20d9a7
fix(crypto): clear cached ephemeral root key when Volcengine KMS pers…
Tong-bit-art Oct 5, 2026
f28cafc
fix(sdk): clean partial archives when directory packing fails (#5557)
HaningZS Oct 5, 2026
a13d2e2
fix(session): preserve sections with malformed update content (#5516)
r266-tech Oct 5, 2026
d9352f2
fix(dsh-plugin): recall only on real user input (#5647)
ZaynJarvis Oct 5, 2026
ba7ca66
feat(plugins): add ov-usage cards showing OpenViking sources per answ…
ZaynJarvis Oct 6, 2026
930173a
feat(claude-code-memory-plugin): show OpenViking source cards under a…
ZaynJarvis Oct 6, 2026
3d33ac3
fix(memory-plugin): keep usage-card failures out of the memory hooks …
ZaynJarvis Oct 6, 2026
6dd0727
fix(embedder): serialize shared local GGUF context calls (#5548)
r266-tech Oct 6, 2026
62ac99f
fix(client): preserve structured server error details (#5559)
HaningZS Oct 6, 2026
40906c1
fix(session): preserve queued commit on shutdown cancellation (#5591)
yu1128-L Oct 6, 2026
ee2bb95
fix(retrieval): preserve explicit session search context scope (#5549)
r266-tech Oct 6, 2026
771db59
refactor(studio): rename Playground to Filesystem (#5681)
ehz0ah Oct 6, 2026
ddfd8b9
docs(concepts): clarify L0/L1 character budgets (#5690)
ZaynJarvis Oct 6, 2026
6cd2bdd
fix(memory-plugin): show usage cards in the desktop app (#5694)
wongzw Oct 6, 2026
36ee31a
feat(context-gateway): add a model API gateway that brings OpenViking…
t0saki Oct 6, 2026
60b32b1
fix(embedding): forward multimodal capability through AccountBoundEmb…
ZaynJarvis Oct 6, 2026
600a41e
fix(harness): default to host-managed history and compaction (#5686)
krsish Oct 6, 2026
25ad26a
feat(codex-plugin): add built-in OpenViking usage summaries (#5699)
wongzw Oct 6, 2026
10f3681
fix(docs): link working-memory examples to GitHub (#5700)
ZaynJarvis Oct 6, 2026
0061054
docs: replace unused banner with social image; register WM upgrade gu…
t0saki Oct 7, 2026
87de989
docs: point README logos at main instead of a dangling commit (#5704)
t0saki Oct 7, 2026
3ee75ed
feat(web-studio): add DSH and per-protocol setup to gateway connect g…
t0saki Oct 7, 2026
469e183
fix(context-gateway): repeat the hard window reminder and ask for exa…
t0saki Oct 7, 2026
78c6d8e
fix(docs): keep the Codex git marketplace stable across docs deploys …
t0saki Oct 7, 2026
a768dfb
fix(hermes-plugin): filter server secrets on released Hermes (#5706)
ehz0ah Oct 7, 2026
9b9ac10
fix(opencode-plugin): serialize overlapping flushes of one session (#…
t0saki Oct 7, 2026
2d9114d
fix(mcp): report remember as submitted for extraction, not stored (#5…
t0saki Oct 7, 2026
0d29cb4
fix(retrieve): skip preset scope directories and backfill unused cont…
t0saki Oct 7, 2026
00a668e
fix(agent-hook-plugin): keep Cursor, TRAE and ZCode hooks inside thei…
t0saki Oct 7, 2026
1c99008
fix(openclaw): inject the user profile into automatic context (#5676)
t0saki Oct 7, 2026
1c01e94
fix(agent-hook-plugin): keep the Kimi Code user turn in captures (#5677)
t0saki Oct 7, 2026
81805e9
fix(queuefs): close worker-loop async clients before closing the loop…
t0saki Oct 7, 2026
6e1030d
fix(langchain): align capture state typing and CI checks (#5717)
ehz0ah Oct 7, 2026
3b64adf
fix(memory): reject non-schema extraction results (#5731)
cocolord Oct 8, 2026
0df1630
fix(dsh-memory-plugin): accept every DSH 0.x release and check new ho…
t0saki Oct 8, 2026
55c3493
fix(memory-plugins): match slash-form bypass patterns against Windows…
t0saki Oct 8, 2026
80a5a76
fix(parse): handle nested markdown frontmatter (#5734)
cocolord Oct 8, 2026
0b8c553
fix(memory): fall back for incomplete case overviews (#5735)
cocolord Oct 8, 2026
c7e333f
fix(hermes-plugin): drop generic session-end hook declaration (#5736)
cocolord Oct 8, 2026
7d77e3d
fix(core): make Working Memory generation opt-in (#5696)
krsish Oct 8, 2026
57a6ea5
feat(brand): refresh OpenViking E logo (#5743)
ZaynJarvis Oct 8, 2026
35fa35b
fix(docs-tos): upload hashed assets before HTML (#5749)
t0saki Oct 8, 2026
961fb46
fix(codex-memory-plugin): stop PostToolUse usage hook from injecting …
t0saki Oct 8, 2026
9f150ec
feat(hermes): update Quick Local releases during setup (#5710)
ehz0ah Oct 8, 2026
01e0366
feat(context-gateway): optional recall summary at the start of replie…
t0saki Oct 8, 2026
2819c08
fix(studio): normalize missing compile sources (#5611)
ehz0ah Oct 8, 2026
7651155
fix(locomo): restrict built-in evaluation tools to OpenViking retriev…
fujiajie666 Oct 8, 2026
71bd217
fix(plugins): archive every message on session commit (#5459)
t0saki Oct 9, 2026
ceb2292
fix(plugins): preserve response-body transport failures (#5661)
ktz03 Oct 9, 2026
b3e78fc
fix(plugins): reject response bodies cut off after headers in opencla…
t0saki Oct 9, 2026
49f7780
refactor(gateway): rename Context Gateway to OpenViking Gateway (#5795)
t0saki Oct 9, 2026
5b5121c
feat(gateway): no default limits on the hidden OpenViking tool loop (…
t0saki Oct 9, 2026
e7b2e97
fix(vikingbot): count event summaries toward recall budgets (#5817)
fujiajie666 Oct 9, 2026
20f9c11
fix(embedding): don't trip account breaker on request-level 400s (#5822)
t0saki Oct 9, 2026
7967eca
feat(compile): add a plannable Map/Shuffle/Reduce pipeline (#5750)
fujiajie666 Oct 9, 2026
1440338
docs(gateway): update hidden tool loop limits to no default limit (#5…
t0saki Oct 9, 2026
589c0d1
fix(security): reject unverifiable remote DNS targets (#5864)
sponge225 Oct 10, 2026
107cf0d
feat(docs): preserve UTM attribution across documentation links (#5870)
LaamGinghong Oct 10, 2026
3de713f
docs(agents): update MCP setup and skills installation guidance (#5875)
LaamGinghong Oct 10, 2026
c89ded1
fix(ragfs): skip vanished localfs entries during listing (#5590)
yu1128-L Oct 10, 2026
28511a5
fix(sdk): expose optional grep traversal depth (#5555)
HaningZS Oct 10, 2026
4c9a755
feat(studio): edit startup configuration and support ROOT restart (#5…
yufeng201 Oct 10, 2026
48781b9
docs: refresh WeChat group QR code (#5925)
ZaynJarvis Oct 12, 2026
b35c3f2
test(opencode): make plugin path assertions portable (#5562)
ktz03 Oct 12, 2026
9d6b1f6
fix(plugins): strip CRLF from doctor command paths (#5567)
ktz03 Oct 12, 2026
3ecfa0a
fix(storage): classify append_file failures instead of collapsing the…
Tong-bit-art Oct 12, 2026
23fa33b
fix(ci): install pnpm for DSH host compatibility smoke (#5859)
r266-tech Oct 12, 2026
50ca28d
fix(search): reject non-positive retrieval limits at the API boundary…
qin-ptr Oct 12, 2026
0cdce96
fix(deps): require openviking-sdk>=0.1.14 for Compile (#5928)
ZaynJarvis Oct 12, 2026
35fd8c8
fix(plugins): forward recall exclusions through agent hooks (#5616)
ktz03 Oct 12, 2026
9093583
fix(recall): factual compression digests, Haiku / gpt-6-luna compress…
t0saki Oct 12, 2026
8c3ef51
fix(plugins): retain Unicode letters in capture text (#5804)
ktz03 Oct 12, 2026
2e706d7
fix(gateway): detect client OpenViking tools under any MCP server nam…
t0saki Oct 12, 2026
a99013a
fix(langchain): run once-only init on explicit async handle initializ…
akushonkamen Oct 12, 2026
84cb68c
fix: 限制语义与向量任务的失败重入队次数 (#5934)
hezhang-1216 Oct 12, 2026
5b69505
fix(bot): reject untrusted identities in rootless trusted mode (#5929)
sponge225 Oct 12, 2026
4e75810
fix(config): remove misleading storage path deprecation warnings (#5941)
qin-ptr Oct 12, 2026
db0d241
fix(vectordb): prune delta records after each index persist (#5940)
ZaynJarvis Oct 12, 2026
df222c0
fix(vector): apply tenant filter to debug scroll and count (#5945)
sponge225 Oct 12, 2026
9179d5b
fix(studio): use managed root key for trusted Feishu connections (#5500)
cocolord Oct 12, 2026
4a2909b
fix(memory): preserve code fences in extraction content (#5852)
cocolord Oct 12, 2026
df2b6df
fix(auth)!: trusted 模式强制要求 root API key (#5947)
qin-ctx Oct 12, 2026
34187bc
fix(auth): stop issuing personal keys in trusted mode (#5946)
qin-ctx Oct 12, 2026
3cdfbc2
fix(auth): escape LDAP direct bind username in DN (#5949)
sponge225 Oct 12, 2026
90df145
Refactor/account store provider (#5933)
runyunzhou Oct 12, 2026
92285e5
fix(pdf): serialize PDFium rendering across parser instances (#5952)
qin-ctx Oct 12, 2026
70d3e1d
feat(docs): add sitemap, robots, canonical/hreflang, page description…
ZaynJarvis Oct 13, 2026
22ea8c7
fix(plugins): parse CR-delimited MCP event streams (#5973)
ktz03 Oct 13, 2026
400b70e
feat(dsh-plugin): commit pending messages on compaction/start (#5254)
almazom Oct 13, 2026
ba33557
feat(hermes-plugin): support extra HTTP headers (ovcli.conf `extra_he…
xiebaiyuan Oct 13, 2026
b962303
feat: 优化studio对话的chatbox样式交互 (#5956)
leowld Oct 13, 2026
f797324
fix(session): serialize initialization with message writes (#5978)
qin-ptr Oct 13, 2026
79ecf74
fix(hermes): defer pending recovery in non-primary contexts (#5917)
stefanielizeth73-art Oct 13, 2026
5ece196
fix(storage): preserve staged source on worker shutdown (#5888)
ehz0ah Oct 13, 2026
8fe792d
fix(langchain): accept mapping values in LangGraph store (#5980)
ZaynJarvis Oct 13, 2026
7b7654e
fix(resources): skip unsafe repository paths during upload (#5953)
chenxiaobin-monkey Oct 13, 2026
5ff645a
fix(compile): bound job and shuffle retry attempts (#5989)
fujiajie666 Oct 13, 2026
d41cd6d
fix(tasks): derive processing time from work timestamps (#5991)
runyunzhou Oct 13, 2026
172d4d9
docs(plugins): point READMEs at the one-line installer (#5994)
t0saki Oct 13, 2026
2f077bb
docs(agent-integrations): put install first on the pi and OpenCode pa…
t0saki Oct 13, 2026
65d89a9
docs(agents): add pi, ZCode and Kimi Code to the agent catalog (#5996)
t0saki Oct 13, 2026
b218cd8
perf(embedding): speed up token guards without changing estimates (#5…
qin-ptr Oct 13, 2026
2da8446
fix(deps): require openviking-sdk 0.1.15 and guard Compile write opti…
ZaynJarvis Oct 13, 2026
1d95584
feat(bot): 支持关闭 Direct 命令执行 (#5999)
qin-ctx Oct 13, 2026
676c403
fix(auth): reject oversized new account IDs before persistence (#5987)
cocolord Oct 13, 2026
ff79020
feat(storage): implement multi-write v2 metadata partitioning (#5741)
baojun-zhang Oct 13, 2026
c90dae8
Feat/batch write rnfv (#5897)
zhoujh01 Oct 13, 2026
0f8c5c5
feat(docs): send copy and search events to Google Analytics (#5990)
ZaynJarvis Oct 13, 2026
7f69dd2
feat(integrations): add Microsoft Agent Framework context provider (#…
ehz0ah Oct 13, 2026
8a74caf
feat(gateway): embed runtime and separate management access (#5960)
t0saki Oct 13, 2026
938ef31
fix(retrieval): bound session search intent analysis (#6007)
cocolord Oct 13, 2026
6c11075
feat(cache): 增加顶层 service_name 配置, 删除 namespace/cache_key_prefix ,使用…
baojun-zhang Oct 13, 2026
dc9f145
docs: update readme (#6021)
MaojiaSheng Oct 13, 2026
bd78cbe
refactor(cache): 统一 cache key format (#6014)
baojun-zhang Oct 13, 2026
b15426b
refactor(model): 统一 VLM 与 Embedding 重试策略 (#5950)
hezhang-1216 Oct 14, 2026
6c802cd
fix(storage): 保持写入锁直到异步索引完成 (#6016)
hezhang-1216 Oct 14, 2026
da5e61b
fix(langchain): recognize SDK system health flag (#5878)
r266-tech Oct 14, 2026
2d43f20
fix(storage): sanitize persisted search tags on index writes (#5862)
fancyboi999 Oct 14, 2026
e054609
fix(memory-plugin): carry OPENVIKING_EXTRA_HEADERS on the runtime pat…
xiebaiyuan Oct 14, 2026
b8ec9d8
perf(retrieval): align default intent planner with compact v4 prompt …
ZaynJarvis Oct 14, 2026
3385dd5
fix(api): 修正输入错误与模型失败的 HTTP 状态码 (#6045)
qin-ctx Oct 14, 2026
4f712cc
fix(svg): 补齐 SVG 转 PNG 所需的运行依赖 (#6049)
qin-ptr Oct 14, 2026
4496edb
refactor(api)!: 移除等待专用 timeout 参数 (#6048)
qin-ctx Oct 14, 2026
ad4d99d
feat(cli): support list and context search modes (#5951)
fengluodb Oct 14, 2026
89006ab
fix(snapshot): 复用外层目录锁完成加密快照恢复 (#6052)
qin-ptr Oct 14, 2026
5242d28
test(queuefs): support script-aware cache mocks (#6055)
MaojiaSheng Oct 14, 2026
f047d80
fix(openwebui): validate session IDs before forwarding requests (#6059)
qin-ctx Oct 14, 2026
a55e423
fix(ci): 修正 API 契约断言和工作流配置 (#6062)
qin-ctx Oct 14, 2026
f2b09cd
fix(memory): preserve Markdown structure in resource links (#6054)
sponge225 Oct 14, 2026
ae1e45e
fix: 兼容索引 ACL 列表中的空字符串 (#6067)
chuanbao666 Oct 14, 2026
6cf6767
Feat/redis mysql account store (#5955)
runyunzhou Oct 14, 2026
46e15a2
docs: 新增数据组织指引,并支持 MCP add_resource parent 自动建目录 (#6060)
MaojiaSheng Oct 14, 2026
89fbcb9
feat(session): distributed Redis-backed idle auto-commit scheduler (#…
jiakun-lu Oct 15, 2026
9baf83f
feat(gateway): allow exact upstream endpoint URLs (#6100)
CaucherWang Oct 15, 2026
acd7caf
refactor(models): 统一模型错误分类与重试边界 (#6047)
hezhang-1216 Oct 15, 2026
bd26e83
feat(web-studio): workspace-first setup and dual-provider experience …
leowld Oct 15, 2026
2290984
fix(acl): resolve ACLs from records hidden by the caller's scroll fil…
t0saki Oct 15, 2026
f75b614
fix(vectordb): surface native store mutation failures (#5803)
kassdinzheng123 Oct 15, 2026
7928018
fix(vectordb): validate snapshot payload in PersistentIndex newest-ve…
akushonkamen Oct 15, 2026
f0743df
fix(storage): propagate Volcengine deletion request failures (#5268)
cocolord Oct 15, 2026
6d1145a
refactor(integrations): organize framework packages (#6017)
ehz0ah Oct 15, 2026
ec56b94
refactor(tasks): unify task and queue work tracking (#6043)
runyunzhou Oct 15, 2026
5680dac
fix(retrieve): stop served directories from hiding new files in recal…
t0saki Oct 15, 2026
60629f9
fix(opencode-plugin): prune stale fully-captured sessions from local …
t0saki Oct 15, 2026
a0c3574
fix(opencode-plugin): drop local session mapping when the server no l…
t0saki Oct 15, 2026
e05452e
fix(gateway): log the capture status a request ends with (#5981)
t0saki Oct 15, 2026
cc9dff6
fix(retry): classify Ark "timed out" and bare TimeoutError as transie…
t0saki Oct 15, 2026
1241f0c
fix(tasks): preserve task owner in queue work (#6122)
runyunzhou Oct 15, 2026
afc5169
refactor(session): 清理无生产调用的旧实现 (#6117)
qin-ptr Oct 15, 2026
621b1dd
fix(plugins)!: apply captureFilters substitutions to tool call inputs…
t0saki Oct 15, 2026
c79600a
feat(gateway): test upstreams with model generation (#6118)
CaucherWang Oct 15, 2026
d1984f1
refactor(session)!: 移除独立 extract 入口,统一使用 commit (#6131)
qin-ptr Oct 15, 2026
465b146
refactor(embedding): remove unused token estimator (#6134)
qin-ptr Oct 15, 2026
c1d3ad9
fix(openwebui): parse bracketed IPv6 bind addresses (#6106)
ktz03 Oct 15, 2026
54e199f
fix(embedding): truncate plain list inputs to max_input_tokens (#5760…
akushonkamen Oct 15, 2026
ee908e7
fix(vlm): default affected GPT tool calls to no reasoning (#6137)
qin-ptr Oct 15, 2026
84cc2b4
perf(memory): streamline extraction prompts and deduplicate inputs (#…
yeshion23333 Oct 15, 2026
6ff9ae4
fix: replace deprecated datetime.utcnow() with datetime.now(timezone.…
yuee3 Oct 15, 2026
83f6831
fix(bot): use home alias for session tool URIs (#6121)
yeshion23333 Oct 15, 2026
6006fc3
feat(agent-plugins): add ov-resources skill (#6092)
ZaynJarvis Oct 15, 2026
e24295f
fix(session): record SessionCommit Phase-2 worker failures as termina…
akushonkamen Oct 16, 2026
594f5f2
fix(studio): restore saved setup and fix connection branding (#6148)
yufeng201 Oct 16, 2026
015aa74
fix(session): 在任务结果保存后写入归档完成标记 (#6153)
qin-ptr Oct 16, 2026
0230cc1
fix(resource): return from on_resource_added once the reason commit i…
OnePerson2020 Oct 16, 2026
b0d1d63
fix(storage): avoid blocking executor on PathLock waits (#4548)
qin-ctx Oct 16, 2026
1c7b86d
feat(gateway): quick mode on the Studio overview and lost management …
t0saki Oct 16, 2026
8483463
feat(gateway): Azure and key-in-URL upstreams on top of exact endpoin…
t0saki Oct 16, 2026
119eba5
feat(mcp): add download tool with single-use links, proxied by the ga…
t0saki Oct 16, 2026
26fa00b
perf(gateway): cut per-request CPU in request preparation, reply rela…
t0saki Oct 16, 2026
842ae41
docs: point hosted Studio links at canonical domain (#6156)
ehz0ah Oct 16, 2026
f64fb5b
fix(resource): report a queued reason commit as accepted (#6157)
OnePerson2020 Oct 16, 2026
8c170db
fix(server): restrict dev CORS to loopback origins
sponge225 Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
10 changes: 10 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Shared runtime copies generated by examples/memory-plugin-shared/sync.mjs.
# Only the plugins a host installs by pointing at a directory in this repository
# keep their copies in git; the rest are built at pack time and gitignored.
examples/claude-code-memory-plugin/scripts/shared/*.mjs linguist-generated=true
examples/codex-memory-plugin/scripts/shared/*.mjs linguist-generated=true
agent-plugins/servers/shared/*.mjs linguist-generated=true

# Regenerated by the TanStack Router plugin during every Studio build, which
# writes LF. Pin LF so Windows checkouts (core.autocrlf=true) stay clean.
web-studio/src/routeTree.gen.ts text eol=lf
52 changes: 52 additions & 0 deletions .github/host-compat.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{
"hosts": [
{
"id": "dsh",
"name": "DeepSeek Harness",
"plugin": "examples/dsh-memory-plugin",
"probe": "@deepseek-ai/dsh",
"tags": [
"latest",
"next",
"alpha"
],
"packages": "^@deepseek-ai/dsh(-.+)?$",
"includePrerelease": true,
"tests": "*.test.mjs",
"skipTests": [
"bundle.test.mjs"
],
"smoke": [
{
"run": [
"npm",
"install",
"--no-audit",
"--no-fund",
"@deepseek-ai/dsh@{version}"
]
},
{
"run": [
"./node_modules/.bin/dsh",
"plugin",
"--profile",
"web",
"add",
"{tarball}"
]
},
{
"run": [
"./node_modules/.bin/dsh",
"--profile",
"web",
"--dump-config"
],
"expect": "^- id: openviking-memory-runtime$"
}
],
"notes": "DSH checks @deepseek-ai/dsh-* peers at plugin load with prereleases included. bundle.test.mjs asserts the dev pins stay at the tested minimum, which this check replaces on purpose. The smoke steps install that dsh release, add the packed bundle to a profile, and require the composed profile to include the bundle; DSH refuses to add a bundle whose peers reject the release, so the add step fails first."
}
]
}
75 changes: 75 additions & 0 deletions .github/scripts/build-plugin-downloads.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#!/usr/bin/env bash
# Build the downloads the docs site serves under /dl: the installer, the plugin
# bundle, the Claude Code URL marketplace, the Codex git marketplace and the
# channel data of the version check, laid out like the TOS release bucket. Each docs host publishes the tree built from
# the commit it deploys, with its own address in the marketplace manifest.

set -euo pipefail

USAGE="usage: build-plugin-downloads.sh <out-dir> <base-url>"
OUT="${1:?${USAGE}}"
BASE="${2:?${USAGE}}"
BASE="${BASE%/}"

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)"
SCRIPTS="${ROOT}/.github/scripts"
SHARED="${ROOT}/examples/memory-plugin-shared"
WORK="$(mktemp -d "${TMPDIR:-/tmp}/ov-downloads.XXXXXX")"
trap 'rm -rf "${WORK}"' EXIT

# The commit the tree was built from, so a published installer can be compared
# with the repository copy at that commit.
VERSION="$(TZ=UTC git -C "${ROOT}" log -1 --abbrev=10 --format=%cd-%h --date=format-local:%Y%m%d)"
# Docs deploy on every change, so a zip must only change when its content does:
# the Claude Code zip keeps its name for as long as the plugin version does.
export ZIP_STAMP=200001010000.00

STAGE="${WORK}/memory-plugin-marketplace"
bash "${SCRIPTS}/stage-memory-plugin-marketplace.sh" "${STAGE}"
PLUGIN_VERSION="$(jq -r .version "${STAGE}/claude-code-memory-plugin/.claude-plugin/plugin.json")"
CLAUDE_ZIP="plugins/claude/openviking-memory-${PLUGIN_VERSION}.zip"

rm -rf "${OUT}"
mkdir -p "${OUT}/memory-plugin-shared" "${OUT}/releases/latest" "${OUT}/plugins/claude"
case "${OUT}" in /*) ;; *) OUT="${PWD}/${OUT}" ;; esac

bash "${SCRIPTS}/stamp-installer-version.sh" "${SHARED}/install.sh" "${VERSION}" "${OUT}/memory-plugin-shared/install.sh"
cp "${SHARED}/bootstrap.sh" "${OUT}/memory-plugin-shared/bootstrap.sh"

# The git marketplace is committed before the zips are built: zipping resets
# the staged files' times. Like the zips, the repository keeps its bytes until
# the plugins change: a new commit and pack name on every deploy leaves the CDN
# serving refs and packs of different deploys for a while, failing git clients.
SRC="${WORK}/memory-plugins-src"
cp -R "${STAGE}" "${SRC}"
git -C "${SRC}" init -q -b main
git -C "${SRC}" add -A
# Background auto-maintenance would repack while the clone below reads.
GIT_AUTHOR_DATE="2000-01-01T00:00:00Z" GIT_COMMITTER_DATE="2000-01-01T00:00:00Z" \
git -C "${SRC}" -c maintenance.auto=false -c user.email=release@openviking.org -c user.name="OpenViking Release" \
commit -qm "OpenViking memory plugins"
git clone -q --bare "${SRC}" "${OUT}/plugins/memory-plugins.git"
git -C "${OUT}/plugins/memory-plugins.git" -c pack.threads=1 repack -adq
git -C "${OUT}/plugins/memory-plugins.git" update-server-info
# Static hosts serve files only; the sample hooks are of no use to a client.
rm -rf "${OUT}/plugins/memory-plugins.git/hooks"

bash "${SCRIPTS}/reproducible-zip.sh" "${OUT}/releases/latest/memory-plugin-marketplace.zip" "${WORK}" memory-plugin-marketplace
bash "${SCRIPTS}/reproducible-zip.sh" "${OUT}/${CLAUDE_ZIP}" "${STAGE}" claude-code-memory-plugin
bash "${SCRIPTS}/generate-claude-marketplace-json.sh" "${BASE}/${CLAUDE_ZIP}" \
"${OUT}/${CLAUDE_ZIP}" "${STAGE}" "${OUT}/plugins/claude/marketplace.json"

# What the install site's version check answers with. No checksum: the two
# hosts deploy one after the other and keep no earlier build, so a pinned
# bundle would fail to verify while they differ.
jq -n \
--arg version "${VERSION}" \
--arg git_url "${BASE}/plugins/memory-plugins.git" \
--arg bundle_url "${BASE}/releases/latest/memory-plugin-marketplace.zip" \
'{schema: 1, harnesses: (
{codex: {version: $version, git_url: $git_url}}
+ (["claude", "cursor", "trae", "trae-cli", "trae-cn", "zcode", "kimicode",
"opencode", "pi", "dsh"] | map({key: ., value: {version: $version, bundle_url: $bundle_url}}) | from_entries)
)}' > "${OUT}/releases/latest/channels.json"

echo "Built plugin downloads ${VERSION} for ${BASE}"
252 changes: 252 additions & 0 deletions .github/scripts/check-marketplace-archive.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,252 @@
#!/usr/bin/env node

// What the marketplace archive must contain is not a list anybody keeps: it is
// what each plugin's manifests name, what those entrypoints import, and what the
// shared-module sync generates. The hand-typed list this replaced was a second
// copy of all three and had drifted from every one of them — it named eleven of
// the twenty-two modules the installer assembles and four of the thirty-eight
// copies the sync generates.

import { realpathSync } from "node:fs";
import { readdir, readFile, stat } from "node:fs/promises";
import { dirname, join, relative, resolve, sep } from "node:path";
import { fileURLToPath } from "node:url";

import {
MANIFEST_PATH,
ROOT,
assembledClosure,
importSpecifiers,
resolveTargets,
} from "../../examples/memory-plugin-shared/sync.mjs";

const EXAMPLES = join(ROOT, "examples");

// Manifests a host reads by name to find everything else.
const HOST_MANIFESTS = ["openviking.integration.json", ".mcp.json", "hooks.json", join("hooks", "hooks.json")];
const PACKAGE_MANIFESTS = ["plugin.json"];

// Directories a host loads whole; what is inside them is named nowhere.
const CONTENT_DIRS = ["skills", "rules", "commands"];

// Command hooks name .mjs/.cjs/.js scripts; a Claude Code hooks module (`modules`
// in hooks.json) names a .ts/.tsx file.
const SCRIPT_RE = /[^\s"'`]+\.(?:mjs|cjs|js|tsx?)\b/g;

// TypeScript imports leave the extension off: "./sources" is sources.ts.
const TS_EXTENSIONS = ["", ".ts", ".tsx", ".d.ts"];

async function isFile(path) {
return stat(path)
.then((info) => info.isFile())
.catch(() => false);
}

async function isDirectory(path) {
return stat(path)
.then((info) => info.isDirectory())
.catch(() => false);
}

async function filesUnder(dir, out = []) {
const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);
for (const entry of entries) {
const path = join(dir, entry.name);
if (entry.isDirectory()) await filesUnder(path, out);
else if (entry.isFile()) out.push(path);
}
return out;
}

/** Every string a JSON document holds, at any depth. */
function jsonStrings(value, out = []) {
if (typeof value === "string") out.push(value);
else if (Array.isArray(value)) for (const item of value) jsonStrings(item, out);
else if (value && typeof value === "object") for (const item of Object.values(value)) jsonStrings(item, out);
return out;
}

/**
* The file a host-templated command names, if the plugin has it.
*
* Each host writes its plugin root differently — `${CLAUDE_PLUGIN_ROOT}`,
* `__OPENVIKING_PLUGIN_ROOT__`, `$PLUGIN_DIR`, or nothing at all — so the
* prefix is dropped a segment at a time until what is left is a file in the
* plugin, which may be one the plugin reaches across its own boundary.
*/
async function resolveInPlugin(root, token) {
const parts = token.split("/").filter((part) => part && part !== ".");
for (let i = 0; i < parts.length; i += 1) {
const candidate = join(root, ...parts.slice(i));
if (await isFile(candidate)) return candidate;
}
return null;
}

async function namedScripts(root, text) {
const found = [];
for (const token of text.match(SCRIPT_RE) || []) {
const path = await resolveInPlugin(root, token);
if (path) found.push(path);
}
return found;
}

/** Every module reachable from `entries` by relative import, entries included. */
async function importClosure(entries) {
const reached = new Set();
const pending = [...entries];
while (pending.length) {
const spec = pending.pop();
let file = null;
for (const ext of TS_EXTENSIONS) {
if (await isFile(spec + ext)) {
file = spec + ext;
break;
}
}
if (!file || reached.has(file)) continue;
reached.add(file);
const source = await readFile(file, "utf-8");
for (const spec of importSpecifiers(source)) {
if (spec.startsWith(".")) pending.push(resolve(dirname(file), spec));
}
}
return reached;
}

/**
* Where one plugin's host manifests sit: its own root, plus a directory per host
* for a plugin that serves several of them.
*/
async function manifestRoots(root) {
const roots = [root];
for (const entry of await readdir(join(root, "hosts"), { withFileTypes: true }).catch(() => [])) {
if (entry.isDirectory()) roots.push(join(root, "hosts", entry.name));
}
return roots;
}

/** The manifests, entrypoints and content one staged plugin directory owes. */
async function pluginRequirements(root) {
const required = new Set();
const entrypoints = new Set();
for (const manifest of PACKAGE_MANIFESTS) {
if (await isFile(join(root, manifest))) required.add(join(root, manifest));
}

for (const entry of await readdir(root, { withFileTypes: true }).catch(() => [])) {
// `.claude-plugin/`, `.codex-plugin/`: the host's own manifest directory,
// always small and always shipped whole.
if (entry.isDirectory() && entry.name.startsWith(".")) {
for (const file of await filesUnder(join(root, entry.name))) required.add(file);
}
}
for (const host of await manifestRoots(root)) {
for (const manifest of HOST_MANIFESTS) {
if (await isFile(join(host, manifest))) required.add(join(host, manifest));
}
for (const dir of CONTENT_DIRS) {
for (const file of await filesUnder(join(host, dir))) required.add(file);
}
}

for (const file of [...required]) {
if (file.endsWith(".json")) {
for (const value of jsonStrings(JSON.parse(await readFile(file, "utf-8")))) {
for (const script of await namedScripts(root, value)) entrypoints.add(script);
}
} else if (file.endsWith(".md")) {
// A skill's own document is its manifest: the command it tells the agent
// to run has to be in the archive too.
for (const script of await namedScripts(root, await readFile(file, "utf-8"))) {
entrypoints.add(script);
}
}
}

for (const file of await importClosure([...entrypoints])) required.add(file);
return required;
}

/** Every file the staged marketplace tree must hold, relative to its root. */
export async function requiredArchiveFiles(stagedNames) {
const staged = new Set(stagedNames);
const required = new Set();
// The config-driven hook hosts import the shared runtime across the plugin
// boundary; anything outside the staged tree is not this archive's.
const addIfStaged = (path) => {
const name = relative(EXAMPLES, path);
if (!name.startsWith("..") && staged.has(name.split(sep)[0])) required.add(name);
};

for (const name of staged) {
if (name === "memory-plugin-shared") continue;
const root = join(EXAMPLES, name);
if (!(await isDirectory(root))) continue;
// `.claude-plugin/` and `.agents/` are the marketplace manifests the
// installer registers the unzipped directory with, not plugins.
if (name.startsWith(".")) {
for (const file of await filesUnder(root)) addIfStaged(file);
continue;
}
for (const file of await pluginRequirements(root)) addIfStaged(file);
if (name === "pi-coding-agent-extension") {
addIfStaged(join(root, "package.json"));
addIfStaged(join(root, "package-lock.json"));
}
}

// The plugins that vendor a copy of the shared runtime ship what the sync put
// there, and the harnesses that vendor nothing ship the closure the installer
// assembles for them, named by the manifest the installer reads.
for (const target of await resolveTargets()) {
const dir = relative(EXAMPLES, target.dir);
if (dir.startsWith("..") || !staged.has(dir.split(sep)[0])) continue;
for (const file of target.files) required.add(join(dir, file));
}
if (staged.has("memory-plugin-shared")) {
addIfStaged(MANIFEST_PATH);
for (const file of await assembledClosure()) addIfStaged(join(dirname(MANIFEST_PATH), file));
}

return [...required].sort();
}

async function main(stage, expected) {
const missing = [];
for (const name of expected) {
if (!(await isDirectory(join(stage, name)))) missing.push(`${name}/`);
}
for (const file of await requiredArchiveFiles(expected)) {
if (!(await isFile(join(stage, file)))) missing.push(file);
}
if (missing.length) {
for (const file of missing) process.stderr.write(`Marketplace archive is missing ${file}\n`);
process.exit(1);
}
}

function isDirectRun() {
if (!process.argv[1]) return false;
try {
return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));
} catch {
return resolve(process.argv[1]) === fileURLToPath(import.meta.url);
}
}

if (isDirectRun()) {
const [stage, ...expected] = process.argv.slice(2);
// The expected directories are the caller's list, not the stage's own: a name
// dropped from it would otherwise leave both this check and the staging script
// agreeing that whatever happens to be there is complete.
if (!stage || !expected.length) {
process.stderr.write("usage: check-marketplace-archive.mjs <stage-dir> <plugin-dir>...\n");
process.exit(2);
}
main(stage, expected).catch((err) => {
process.stderr.write(`${err?.stack || err}\n`);
process.exit(1);
});
}
Loading
Loading