What's Changed
- fix(docs): stabilize anchor navigation and link release topics by @lyingbug in #4287
- feat(agent): persist human-in-the-loop prompts with a shared broker by @lyingbug in #4250
- feat(search): add RRF controls in a tabbed settings popover by @lyingbug in #4300
- docs(swagger): document the real request and response types by @lyingbug in #4304
- feat(agent): add the built-in WeKnora assistant with an operation catalog by @lyingbug in #4302
- feat(agent): let the WeKnora assistant read the bundled documentation by @lyingbug in #4303
- fix(ui): compact resource list headers in Lite mode by @lyingbug in #4316
- fix(agent): admit catalog operations only from knowledge API areas by @lyingbug in #4317
- fix(agent): let the WeKnora assistant search without its own rerank model by @lyingbug in #4315
- feat(frontend): open the WeKnora assistant from anywhere with page context by @lyingbug in #4314
- feat(agent): open more workspace operations to the WeKnora assistant by @lyingbug in #4318
- feat(agent): let the assistant delete and move documents in batches by @lyingbug in #4319
- docs(site): add the model leaderboard page by @begoniezhao in #4333
- feat(agent): let the assistant manage FAQ entries by @lyingbug in #4327
- feat(assistant): side panel, access levels and role-aware operations by @lyingbug in #4342
- feat(assistant): manage agents and skills, separate history, refresh pages by @lyingbug in #4344
- fix(assistant): reject restored ordinary sessions by @hahahahahayesyeseys in #4356
- feat(assistant): let the assistant manage knowledge bases by @lyingbug in #4353
- refactor(image): turn the hard-coded image flow into configurable pipelines by @tayadwx in #3746
- feat(datasource): deep-adapt Feishu/Lark sync with folder mirror, block parsing and embedded objects by @Greenplumwine in #3497
- fix(im): cap IM callback bodies before any adapter reads them by @Tong-bit-art in #4369
- fix(web-search): bound provider response bodies instead of buffering them whole by @Tong-bit-art in #4370
- fix(mcp): avoid replaying tools after ambiguous call failures by @Guo-Yixin in #4124
- fix(embedding): read the pool's first-error guard under its own mutex by @Tong-bit-art in #4014
- fix(chat): persist failed quick-answer turns so errors survive refresh by @AstonKrss in #4306
- fix(data-analysis): resolve workspace storage backends in quick answers by @kerthans in #4214
- fix(mcp): separate SSE connection lifetime from request timeouts by @yeliheng-010 in #4140
- fix(docparser): bound MinerU result packages and their expansion by @Tong-bit-art in #4396
- fix(embed): hide host context in user messages by @LuckVd in #4388
- fix(embed): send images when an OpenAI-compatible row declares them by @JSJ189 in #4389
- fix(models/api): cap non-streaming provider response bodies by @Tong-bit-art in #4397
- fix(tools): reject legacy binary .xls with an actionable error by @Jay0130-a in #4374
- build(docker): mount the Go build cache when building the app image by @tayadwx in #4320
- feat(assistant): trial runs, session grants, page links, and MCP/model/skill management by @lyingbug in #4375
- fix(frontend): cap concurrent status requests in upload polling by @ignity21 in #4348
- fix(frontend): label the parser engine the backend will actually pick by @NIU-123370 in #4354
- fix(knowledge): leave the root span open while a retry is left by @NIU-123370 in #4357
- feat(assistant): expand management operations and polish interaction UI by @lyingbug in #4427
- feat(assistant): let the assistant find skills and MCP services on the web by @lyingbug in #4429
- fix(anydoc): upgrade patched zip dependency to 9 by @lyingbug in #4437
- fix(docreader): keep a pipe inside an HTML table cell in that cell by @L4XB in #4433
- fix(agent): share one configurable budget for web_fetch by @Frank-zhu2000 in #4432
- fix(docparser): keep JSON numbers and <, >, & as written in JSON uploads by @L4XB in #4436
- fix(knowledge): 文件夹树显示递归文档数,不再把有子目录的文件夹显示成 0 by @linus-liu-web in #4428
- fix(chat): 消息历史与搜索的 limit 补上下界,limit=-1 不再取消 SQL LIMIT by @linus-liu-web in #4409
- fix(wiki): 列 wiki 页面的 page_size 补上界,与兄弟路径一致 by @linus-liu-web in #4407
- fix(models): 图片解析复用仓储层的 provider scheme 表,对象存储上的图片不再原样交给厂商 by @linus-liu-web in #4405
- fix(mcp): clarify read_document query and pagination semantics by @Jarvis636431 in #4403
- fix(search): preserve chunk types in tool results by @Jarvis636431 in #4402
- fix(feishu): keep nested text in native table cells by @davien in #4400
- feat(graph): add standalone JSON graph search API by @ZXLyyds100 in #4395
- fix(docparser): keep every row and cell of a CSV upload in its table by @L4XB in #4435
- fix(wiki): read scanned-page OCR when the text chunks are only images by @wangrui19971019 in #4430
- feat(resource): 相同图片字节复用一个 handle,不再重复写字节与重复注册 by @linus-liu-web in #4419
- fix(docreader): Excel 百分比被读小 100 倍 —— 加开关(默认关) by @linus-liu-web in #4423
- fix(helm): make the data-files claim access modes configurable by @Jay0130-a in #4425
- feat(datasource/dingtalk): 保留来源目录结构(开关控制,默认关) by @linus-liu-web in #4422
- fix(datasource/dingtalk): Validate 只校验所选范围,不再扫全租户 by @linus-liu-web in #4421
- fix(datasource): 数据源类型图标的 alt 用本地化显示名,不再用裸 type by @linus-liu-web in #4420
- fix(yuque): 两处 offset 分页补跳数上限、重复页检测与 meta.total 提前结束 by @linus-liu-web in #4415
- fix(notion): 附件下载失败中止本轮不再推进游标,附件不再永久缺失 by @linus-liu-web in #4413
- fix(notion): 递归子块分页补重复游标与跳数上限,兜底不再被空页绕过 by @linus-liu-web in #4411
- test(mcp): cover read_document query and pagination contract by @Activer007 in #4426
- fix(frontend): bundle PDF.js wasm decoders by @LuckVd in #4382
- feat(docreader): 上传 HTML 只索引正文,与 URL 导入路径对齐(开关,默认关) by @linus-liu-web in #4424
- fix(feishu): stop logging tenant access token fragments by @davien in #4399
- feat(assistant): add durable multi-agent collaboration and live task views by @lyingbug in #4438
- fix(agent): let open_page finish the turn with the answer above it by @lyingbug in #4472
- style(assistant): tone down the running child agent highlight by @lyingbug in #4476
- fix: reject invalid image inputs before multimodal extraction by @lyingbug in #4489
- feat(agent): unified agent permission model with grants and run modes by @lyingbug in #4490
- fix: preserve business session identity in model requests by @lyingbug in #4491
- feat(chat): fold long streaming timelines and steady their height by @lyingbug in #4496
- feat(automation): scheduled agent runs with in-app notifications by @lyingbug in #4492
- feat(sandbox): 双模式沙箱分配的基础(门控关闭,线上行为不变) by @nullptr-error in #4507
- fix(automation): enforce execution identity, cancellation, and scheduling limits by @lyingbug in #4506
- feat(sandbox): 按分配记录定位共享沙箱(门控仍关闭) by @nullptr-error in #4509
- feat(sandbox): 共享机器的用户模式闭环(删除、回收、管理与桌面) by @nullptr-error in #4510
- feat(automation): improve model settings, task controls, and notification inbox by @lyingbug in #4514
- fix(agent): route new knowledge through document ingestion by @lyingbug in #4525
- refactor(automation): run scheduled tasks through the assistant by @lyingbug in #4522
- fix: preserve source references and refine chat automation UI by @lyingbug in #4534
- feat(chat): animate active timeline icons by @lyingbug in #4535
- fix(settings): keep direct settings closes inside the app by @jiangjiang248 in #4524
- feat(sandbox): 共享沙箱短会话目录 + 移除工具层目录限制 by @nullptr-error in #4533
- fix(mcp): invalidate stale OAuth dialog requests by @dakjdakd in #4531
- perf(sourceloc): index align matches in one document scan by @sun-sh in #4544
- fix(auth): let retrieve-scoped API keys discover shared knowledge bases by @u7-u7 in #4523
- fix(datasource): enforce sync log retention policies by @dakjdakd in #4532
- fix(qa): resolve shared KB chat models in their owner tenant by @lyingbug in #4557
- fix(web_fetch): decode non-UTF-8 HTML pages by declared charset by @kerthans in #4556
- fix(db): stop logging bound parameters in GORM slow-query logs by @Frank-zhu2000 in #4561
- fix(export): sort conversation messages by timestamp instants by @fengyue-xve in #4559
- fix(citations): match canonically equivalent Unicode text by @fengyue-xve in #4560
- fix(datasource): truncate failed sync detail at rune boundary by @kerthans in #4555
- fix(router): truncate dead-letter knowledge errors at rune boundary by @kerthans in #4554
- fix(agent): show legacy empty MCP config as all in editor by @wzxsdf in #4558
- fix(automation): reject nonexistent one-shot local times by @fengyue-xve in #4551
- feat(confluence): support personal access token authentication by @Jarvis636431 in #4549
- fix(rerank): preserve literal fenced code in model passages by @mmhh256 in #4521
- fix(rerank): accept bare array responses from self-hosted runtimes by @u7-u7 in #4518
- fix(download): honor language tags in extended filenames by @fengyue-xve in #4517
- fix(preview): distinguish image and audio ISO media brands by @fengyue-xve in #4515
- fix(postgres): 兼容 pgsearch 关键词评分函数 by @panjiedev in #4502
- fix(im): resolve resource URLs through bound storage backends by @lyingbug in #4578
- feat(image): add opt-in, bounded preprocessing before OCR by @tayadwx in #4381
- fix(web-search): keep error previews valid UTF-8 by @sun-sh in #4583
- fix(faq): preserve disabled state when importing entries by @Jarvis636431 in #4581
- feat(background): shared background-work runtime by @nullptr-error in #4579
- feat(shell): async shell jobs for web and Lite by @nullptr-error in #4580
- fix(frontend): ignore stale document detail responses by @dakjdakd in #4627
- fix(rss): preserve full text during article refresh failures by @dakjdakd in #4625
- fix(knowledge): preserve shared resources during clone rollback by @dakjdakd in #4623
- fix(gallery): cancel stale image fetches before Blob allocation by @Jarvis636431 in #4588
- fix(ui): avoid full list reloads while awaiting batch reparse by @jiangjiang248 in #4618
- fix(datasource): truncate connector error previews at rune boundaries by @yetuge in #4614
- fix(errors): truncate error messages at rune boundaries by @sun-sh in #4609
- fix(import): accept formats advertised by parser engines by @Jarvis636431 in #4602
- fix(feishu): 支持知识库快捷方式子文档同步 by @Lyang77 in #4565
- fix(wiki): restore rewritten wkimg placeholders instead of persisting broken links by @u7-u7 in #4552
- fix(agent): reject oversized sandbox appends before reading by @icearia0219 in #4577
- fix(agent): honor read_file match limits when searching by @icearia0219 in #4575
- fix(data-analysis): allow safe scalar casts in SQL validation by @kerthans in #4215
- fix(openaicompletions): keep streamed tool calls without an index apart by @pcbeingused333 in #4593
- fix(googlegenai): map the remaining safety finish reasons to content_filter by @pcbeingused333 in #4592
- fix(agent): treat model_context_window_exceeded as a length finish reason by @pcbeingused333 in #4589
- fix(logger): namespace log format configuration and isolate log tests by @lyingbug in #4639
- fix(agent): preserve multimodal content during message sanitization by @icearia0219 in #3949
- fix(docparser): treat anydoc resource limits as permanent parse failures by @Frank-zhu2000 in #4573
- fix(retriever): bound vector indexing memory with saved windows by @mmhh256 in #4584
- fix(docreader): crop the original image after detecting on a probe by @tayadwx in #4586
- fix: store inline images and apply AI budget in document order by @jacentsao in #4121
- fix(frontend): preserve numeric literals in JSON preview by @Zicheng-Xie in #4620
- fix(preview): reject invalid UTF-8 before decoding CSV by @XY-code1 in #4479
- fix(wiki): support similar page lookup on SQLite by @huong8373tt-beep in #4605
- fix(docreader): release raw PDF images after encoding by @uhhgxg in #4562
- fix(sandbox): rebind when attachment staging loses its container by @wangrui19971019 in #4220
- feat(faq): add list view toggle by @Arc10p in #4566
- fix(lite): reclaim superseded reparse chunks by @huong8373tt-beep in #4595
- fix(im): only reply to Feishu group messages mentioning this bot by @johnnyjy in #3505
- fix(vectorstore): clarify PostgreSQL requirements by @huong8373tt-beep in #4655
- fix(knowledge): keep document toolbar actions inside the pane by @Jarvis636431 in #4653
- fix(datasource): escape filenames in generated multipart uploads by @sun-sh in #4647
- perf(wiki): coalesce graph label updates and skip hidden SVG layout by @Jarvis636431 in #4646
- fix(login): keep the sign-in form visible on phones by @huong8373tt-beep in #4645
- fix(datasource): honor skip conflict strategy by @LuckVd in #4643
- perf(chunker): avoid quadratic protected span sorting by @po-et in #4633
- fix(docreader): keep Markdown block structure in EPUB chapters by @MaxFreedomPollard in #4632
- fix(docreader): reclaim memory after large read requests by @helloxjade in #4628
- fix(knowledge): hide parser hint for read-only users by @LuckVd in #4487
- fix(search): isolate multi-KB embedding dimensions by @sun-sh in #4659
- fix(mcp): offload chat metadata lookups from event loop by @Linxiushen in #4499
- fix(docreader): preserve transparency in PPTX fallback images by @LingYi-Liang in #4678
- fix(docreader): preserve external EPUB image references by @po-et in #4676
- fix(wiki): respect word boundaries in SQLite trigram candidates by @wcy12378 in #4679
- fix(agent): clear the exhausted-compaction mark when a compaction succeeds by @ydflow in #4677
- fix(system): keep sandbox deep-check probe previews valid UTF-8 by @ydflow in #4675
- fix(sandbox): keep stderr previews in user-facing errors valid UTF-8 by @ydflow in #4674
- fix(agent): truncate tool-call hints by runes, not bytes by @ydflow in #4673
- fix(agent): compact the unsanitized history on overflow recovery by @ydflow in #4672
- fix(client): cap SDK error response bodies at 1 MiB by @Tong-bit-art in #4721
- fix(chat): keep distinct facts in partial-overlap dedup by @Frank-zhu2000 in #4719
- fix(docparser): recover malformed PDFs with the builtin reader by @acse-bq23 in #4716
- fix(docreader): bound embedded PDF image selection memory by @acse-bq23 in #4715
- fix: preserve shared sandboxes across skill updates by @lyingbug in #4729
- fix(settings): preserve retrieval changes during autosave by @wuning159 in #4722
- fix: show async postprocess duration in trace by @FOWEPJF255 in #4711
- fix(rerank): describe score scales by endpoint output by @mmhh256 in #4701
- fix(sqlite): support organization and wiki searches by @wzxsdf in #4698
- fix(knowledge): cap the knowledge-base definition body at 1 MiB by @yetuge in #4730
- docs(api): document VLM setup when creating a knowledge base by @Linxiushen in #4695
- fix(knowledge): configurable question-generation token budget by @LuckVd in #4690
- fix(knowledge): feed OCR chunks to auto-tag classification by @LuckVd in #4689
- fix(organization): ignore stale member search responses by @wuning159 in #4726
- fix(cli): trim env credentials in auth token output by @ydflow in #4696
- fix(docreader): prevent XLSX chunking timeouts by @wzxsdf in #4683
- fix(agent): stop repeated failed tool calls by @LuckVd in #4334
- fix(docreader): report the file size limit in MB by @LingYi-Liang in #4670
- fix(cli): carry --modified-args/--reason in the exit-10 retry argv by @ydflow in #4686
- fix(docparser): budget the CSV table render before padding it out by @ydflow in #4702
- fix(knowledge): cap the hybrid-search body at 1 MiB by @yetuge in #4731
- fix(docreader): preserve regex semantics when splitting text by @LingYi-Liang in #4669
- fix(docreader): preserve declared XLSX shared string parts by @LingYi-Liang in #4666
- fix(skills): truncate a downloaded skill error body at a rune boundary by @yetuge in #4665
- fix(docreader): bound streamed PDF image memory by @LuckVd in #4664
- fix(memory): resolve shared-agent memory in the caller's workspace by @cainbit in #4663
- fix(agent): treat model_context_window_exceeded as a length stop in compaction by @ydflow in #4681
- fix(modelcontext): preserve citations in JSON strings by @errpunk in #4733
- fix(models): ask Claude for summarized thinking in adaptive mode by @pcbeingused333 in #4184
- fix(agent): preserve native integer literals during parameter casting by @icearia0219 in #4483
- fix(agent): normalize Python physical newlines before quote checks by @icearia0219 in #4482
- fix(docparser): escape standalone image filenames in Markdown by @Jarvis636431 in #4475
- fix(settings): ignore stale member list search responses by @wuning159 in #4735
- fix(docparser): attach api key in MinerU protocol detection by @JSJ189 in #4470
- fix(search): keep vector hits when keyword retrieval fails by @LuckVd in #4459
- feat(assistant): add contextual entry points and guided actions by @lyingbug in #4757
- feat(assistant): tailor welcome questions to the current page by @lyingbug in #4758
- fix(mcp): add VS Code setup and pin the stdio fallback by @playb0t in #4363
- fix(multimodal): fall back to knowledge base VLM when document model is unavailable by @LuckVd in #4743
- fix(feishu-drive): skip OS metadata files instead of failing the sync by @u7-u7 in #4738
- fix(web-fetch): report a Chromium deadline as a retryable timeout by @wangrui19971019 in #4468
- fix(feishu): checkpoint sync rounds that skip every node by @u7-u7 in #4736
- fix(helm): derive safe app rollout strategy for RWO storage by @wzxsdf in #4756
- fix(models): prevent heartbeats from restoring released concurrency leases by @ydflow in #4755
- fix(cli): classify keychain read failures as keychain_denied, not token_expired by @ydflow in #4684
- fix(im): preserve attachment filenames by @sun-sh in #4752
- fix(client): expose knowledge-base parser engine rules by @jiangjiang248 in #4753
- fix(sandbox): rebind a file op when the container has already stopped by @wangrui19971019 in #4749
- fix(modelcontext): keep literal ref text out of citation expansion by @wangrui19971019 in #4748
- fix(metric): keep every sentence in BLEU and ROUGE scores by @xiashao in #4746
- refactor(wiki): remove unused string truncation helper by @xiashao in #4744
- fix(docparser): 限制 CSV 转换膨胀并支持取消 by @Jarvis636431 in #4485
- fix(parser): route PPTX vector media through docreader by @mmhh256 in #4705
- fix(googlegenai): count tool-use prompt tokens as input tokens by @pcbeingused333 in #4594
- fix(web-search): truncate the DuckDuckGo result title at a rune boundary by @yetuge in #4615
- fix(knowledge): bound batch polling and ignore stale responses by @wuning159 in #4648
- feat(server): allow explicit frontend directory in standard edition by @alikatgh in #4637
- fix(docreader): honor explicit MHTML root parts by @po-et in #4636
- fix(docreader): preserve code fences during table normalization by @fengyue-xve in #4494
- feat(vlm): make max_tokens configurable via VLM_MAX_TOKENS by @OUAO-FRANK in #4478
- feat(mcp): support document-scoped knowledge search by @Jarvis636431 in #4463
- fix(chat): generate concise sidebar session titles by @Annabelle0726 in #4465
- fix(web-search): make default provider changes atomic by @hahahahahayesyeseys in #4454
- fix(docreader): keep spreadsheet cells that say N/A, None or NULL by @L4XB in #4452
- fix(docreader): keep the text of DOCX content controls and tracked insertions by @L4XB in #4448
- fix(docreader): keep the footer rows of an HTML table in that table by @L4XB in #4441
- fix(preview): 知识库文档预览的 Markdown 排版(标题层级/间距/代码块/去重标题) by @linus-liu-web in #4439
- fix(agent): describe uploads when the chat model cannot see images by @wangrui19971019 in #4219
- fix(data-analysis): read legacy xls workbooks by @wangrui19971019 in #4218
- fix(client): close the response body on the duplicate-URL path by @Tong-bit-art in #4202
- fix(cli): emit bool retry_argv flags in the form pflag can parse back by @Tong-bit-art in #4197
- fix(frontend): distinguish graph availability errors from disabled state by @yeungmingyik in #4172
- fix(docreader): keep Excel header labels unique by @ranjianghong526-hash in #4160
- feat(helm): support app.extraVolumes and app.extraVolumeMounts by @kalandramo in #4332
- fix(housekeeping): scan the queues once per sweep, not once per row by @ignity21 in #4360
- fix(docreader): preserve numeric rows in PDF text extraction by @dvd233 in #3228
- fix(frontend): tolerate malformed EPUB paths and clean up failed previews by @Jarvis636431 in #4324
- perf(search): reuse fixed query-expansion regexps by @xiashao in #4309
- fix(audit_log): stop the retention loop in the ticker cadence test by @AnonymousLesserPanda in #4308
- fix(repository): SearchUsers 兼容 SQLite 方言并转义 LIKE 通配符 by @Winoren in #3996
- fix(agent): preserve user requests during context overflow recovery by @yeliheng-010 in #4280
- fix(ui): preserve explicit zero chunk_overlap when loading KB settings by @Li-john1021 in #4274
- fix(frontend): keep distinct reasoning visible beside final answers by @rudycelekli in #4267
- fix(docreader): preserve all modern XMind topic groups by @rudycelekli in #4266
- fix(frontend): release queued refreshes when browser storage fails by @rudycelekli in #4265
- fix(client): preserve agent reasoning effort during updates by @rudycelekli in #4264
- test: cover qdrant copy pagination by @Goodnight77 in #4162
- test(security): cover NAT64 encodings in TestIsRestrictedIP_IPv6 (fixes #4092) by @RerankerGuo in #4263
- fix(mcp): honor a leading UTF-8 BOM in chat streams by @rudycelekli in #4262
- fix(cli): report chunk truncation only when rows are omitted by @rudycelekli in #4260
- fix(cli): reject invalid jq syntax before polling by @rudycelekli in #4258
- fix(cli): preserve raw MCP document download bytes by @rudycelekli in #4256
- fix(client): encode file type filters as a comma-separated value by @xili-ytl in #4240
- fix(ui): allow Owner to demote themselves on the members page by @Li-john1021 in #4213
- fix(knowledge): drop generated questions when the switch is off by @wangrui19971019 in #4096
- fix(embed): keep allowed_origins when a channel update omits it by @VictorMaznyuk in #4205
- fix(skills): explain unfederated skills.sh imports by @tsumon in #4196
- fix(agent): invalidate context checkpoints when rewinding steered turns by @yeliheng-010 in #4143
- fix(session): cap text attachments at 32 KiB instead of failing on long lines by @Jinzhengxu in #4148
- fix(frontend): 通用选择器创建临时数据源前先校验可创建 by @linus-liu-web in #4050
- fix: reject missing qdrant embeddings by @Goodnight77 in #4165
- fix qdrant collection matching by @Goodnight77 in #3089
- fix(chat): lazy-load noVNC only when opening sandbox desktop by @JYao-Chen in #4034
- fix(build): inject version metadata into compose-built app images by @DerrickLinus in #4123
- fix(embed): preserve draft when attachment read fails by @hahahahahayesyeseys in #4118
- fix(sandbox): support Docker Desktop socket permissions by @helloxjade in #3088
- fix(lite): load dotenv files before server startup by @tsumon in #3618
- fix(chat): preselect the answer's knowledge base when saving to a KB by @Yi-111-a in #3853
- fix(agent): validate graph relation evidence in every query scope by @knqiufan in #3955
- fix(mineru): split large Cloud PDFs without checkpoint storage by @JYao-Chen in #4030
- fix(download): preserve existing files when transfers fail by @LeonSGP43 in #3988
- fix(agent): retain new file paths when compaction tracking is full by @icearia0219 in #4003
- fix(agent): reject overlapping matches in unique sandbox edits by @icearia0219 in #4002
- feat(assistant): give each settings page its own starter questions by @lyingbug in #4762
- fix(datasource): make knowledge replacement transactional by @younggglcy in #4473
- fix(datasource): retain retry cursors on ingestion failure by @yeliheng-010 in #3852
- fix(automation): prevent premature SQLite automation claims by @LuckVd in #4501
- fix(agent): recover final-answer context overflow and propagate synthesis errors by @rtmalikian in #4629
- fix(models): preserve string fields in streamed tool arguments by @rudycelekli in #4253
- fix(models): assemble multiline provider SSE packets by @rudycelekli in #4255
- fix(chat-pipeline): honor normalized graph search targets by @dakjdakd in #4530
- fix(kb-delete): give wiki cleanup its own longer timeout budget by @tsumon in #4292
- fix(sandbox): 被超时杀掉的文件系统操作不再误报为请求错误 by @Goodeve0 in #3921
- fix(knowledge): add missing POST /knowledge-bases/:id/rebuild-index route by @tsumon in #4621
- fix(docparser): decode GBK and UTF-16 text files in the simple reader by @L4XB in #4446
- fix(docreader): recognize Unicode BOMs before legacy decoding by @fengyue-xve in #4498
- fix(chunker): preserve explicit zero chunk_overlap on ingest by @Li-john1021 in #4276
- fix(knowledge): strip think blocks from generated questions and summaries by @stanleys12 in #4691
- fix(chat): retry history loading after transient failures by @hahahahahayesyeseys in #4186
- fix(tenant): honor default storage quota across creation paths by @tianhaotian in #3213
- fix(datasource): 保留钉钉超限文件失败后的定时同步 by @panjiedev in #4505
- fix(ui): keep knowledge folders readable and shrink tag editing by @lyingbug in #4765
- fix(agent): discard failed stream drafts before retry by @sun-sh in #4780
- fix(mcp): reject malformed knowledge base selectors by @ydflow in #4773
- fix(config): reject malformed environment-expanded YAML by @xiashao in #4770
- fix(models): preserve Responses API refusal text by @ydflow in #4766
- fix(agent): show matches in long file search lines by @ydflow in #4774
- fix(metric): normalize MAP by all relevant documents by @xiashao in #4771
- feat(lite): ask before host deletes and widen the sandbox on approval by @nullptr-error in #4076
- fix(frontend): 持久化审批卡片直接显示后台等待 by @lyingbug in #4824
- feat: add workspace default settings for models and web search by @lyingbug in #4822
- fix(openaicompletions): recover leaked DSML tool calls safely by @lyingbug in #4851
- fix(agent): preserve manual markdown whitespace by @ydflow in #4844
- fix(mcp): reject chat streams without completion by @ydflow in #4843
- fix(vlm): bound WeKnoraCloud vision response bodies by @Tong-bit-art in #4806
- fix(agent): disable thinking during final answer synthesis by @errpunk in #4783
- fix(chat): carry Ollama's done_reason on the final stream chunk by @pcbeingused333 in #4845
- fix(metric): preserve zero precision in unsmoothed BLEU by @xiashao in #4833
- fix(metric): normalize NDCG against the full ideal ranking by @xiashao in #4832
- fix(lite): skip empty tokenized FTS queries by @u7-u7 in #4819
- feat: prepare v0.9.0 release with assistant onboarding by @lyingbug in #4836
- docs: finalize v0.9.0 release notes and upgrade guidance by @lyingbug in #4864
New Contributors
- @JSJ189 made their first contribution in #4389
- @ignity21 made their first contribution in #4348
- @NIU-123370 made their first contribution in #4354
- @davien made their first contribution in #4400
- @ZXLyyds100 made their first contribution in #4395
- @Activer007 made their first contribution in #4426
- @jiangjiang248 made their first contribution in #4524
- @dakjdakd made their first contribution in #4531
- @sun-sh made their first contribution in #4544
- @u7-u7 made their first contribution in #4523
- @fengyue-xve made their first contribution in #4559
- @wzxsdf made their first contribution in #4558
- @mmhh256 made their first contribution in #4521
- @panjiedev made their first contribution in #4502
- @Zicheng-Xie made their first contribution in #4620
- @XY-code1 made their first contribution in #4479
- @huong8373tt-beep made their first contribution in #4605
- @uhhgxg made their first contribution in #4562
- @Arc10p made their first contribution in #4566
- @johnnyjy made their first contribution in #3505
- @wcy12378 made their first contribution in #4679
- @ydflow made their first contribution in #4677
- @wuning159 made their first contribution in #4722
- @FOWEPJF255 made their first contribution in #4711
- @errpunk made their first contribution in #4733
- @playb0t made their first contribution in #4363
- @xiashao made their first contribution in #4746
- @alikatgh made their first contribution in #4637
- @OUAO-FRANK made their first contribution in #4478
- @Annabelle0726 made their first contribution in #4465
- @yeungmingyik made their first contribution in #4172
- @ranjianghong526-hash made their first contribution in #4160
- @kalandramo made their first contribution in #4332
- @AnonymousLesserPanda made their first contribution in #4308
- @Winoren made their first contribution in #3996
- @Li-john1021 made their first contribution in #4274
- @rudycelekli made their first contribution in #4267
- @RerankerGuo made their first contribution in #4263
- @xili-ytl made their first contribution in #4240
- @Yi-111-a made their first contribution in #3853
- @rtmalikian made their first contribution in #4629
- @Goodeve0 made their first contribution in #3921
- @stanleys12 made their first contribution in #4691
- @tianhaotian made their first contribution in #3213
Full Changelog: v0.8.3...v0.9.0