Commit Graph
1656 Commits
Author SHA1 Message Date
79117ebf0c fix(semantic-index): return global Response from proxied model downloads
When a model download proxy is configured, createProxyFetch() returned the
Response from undici's own fetch, which is not the global Response.
Transformers.js only writes `instanceof Response` results to its file cache,
so the ONNX weights were never cached and preload failed with "Unable to get
model file path or buffer." Keep undici's fetch and ProxyAgent, and re-wrap the
response body stream in a global Response.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
2026-09-28 17:11:11 +08:00
digua eadadda071 feat(electron): add persistent UI scale setting 2026-09-28 16:59:25 +08:00
digua 220f9902be refactor(sql): align schema sidebar collapse interaction 2026-09-28 14:53:15 +08:00
digua 23f77f9a89 refactor(ai): remove unused data source panel 2026-09-28 14:53:15 +08:00
digua 245a99b8ff feat(sidebar): integrate chat topics into shared right panel 2026-09-28 14:53:15 +08:00
digua 5e34b7d255 feat(sidebar): unify chat records and contact detail panels 2026-09-28 14:53:15 +08:00
digua 3e0e0fbbfb fix(sync): protect data source configuration from failed writes 2026-09-24 10:15:02 +08:00
digua af0e844f8a fix(storage): avoid rewriting satisfied data directory compatibility markers 2026-09-24 10:11:59 +08:00
digua 8a77a759db release: v0.37.4 v0.37.4 2026-09-23 16:23:26 +08:00
digua 80fcaa7ea2 fix: preserve complete session loading error details 2026-09-23 11:36:38 +08:00
Sanssssssssssssssss 83c28c026f fix(ai): bound cumulative tool results per request (#464)
每次模型请求前检查总预算并裁剪工具结果副本,保留原记录、调用配对和计费,避免并行或跨轮结果累积超窗。
Fit cumulative tool results before each model request while preserving the transcript, call pairing and usage.

Verified with 121 related tests, 40 stress scenarios, Pi HTTP failure injection and independent reviews.
2026-09-22 18:47:38 +08:00
digua b50c495e7d fix(ai): handle Qwen topic reasoning and output limits 2026-09-22 18:36:13 +08:00
digua a67e38b816 fix(release): reuse CLI tarball for Docker publishing 2026-09-22 18:23:42 +08:00
digua 45cfe87037 fix(ai): complete analysis time parameter metadata 2026-09-22 18:23:42 +08:00
digua b233725d7d release: v0.37.3 v0.37.3 2026-09-22 17:13:59 +08:00
Chris ChengandClaude Opus 5 6e27968bb0 feat(tools): localize tool descriptions by locale for every runtime
Tool and parameter descriptions were handed to the LLM in Chinese on every
runtime regardless of locale: the English metadata table in
packages/tools/src/tool-metadata.ts had no caller, the desktop translateTool
looked up i18n keys that exist in no locale file, and the MCP server had no
locale at all.

Fill the table for every tool whose definition text is Chinese (37 entries,
only translating what the definitions write in Chinese so the two copies
cannot drift), and route the four consumers through getLocalizedToolMetadata:
the cross-chat agent adapters, the CLI Web agent adapter, the desktop shared
tool adapter (replacing the dead translateTool), and the MCP server, which
now resolves its locale from config.locale.lang or the system locale for both
the standalone binary and the chatlab mcp subcommand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 16:54:06 +08:00
digua e295a80bdf fix(test): resolve MCP workspace imports from source 2026-09-22 16:43:42 +08:00
Chris ChengandClaude Opus 5 819e34e315 fix(i18n): add missing Japanese labels to the language preference card
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 15:12:25 +08:00
digua 2e385bd401 fix(ai): preserve system role for Qwen chat completions 2026-09-22 10:51:11 +08:00
digua 14c9defdf1 fix(query): use indexed ranges for message context 2026-09-21 18:51:50 +08:00
digua 29c184387e fix(query): reuse chronological segment context per search
Sort each indexed segment once per request instead of scanning and sorting it for every hit. Preserve backfilled chronological neighbors and segment boundaries in both query adapters, with a large-segment regression test.
2026-09-21 18:51:50 +08:00
Sanssssssssssssssss 20199345ba fix(query): preserve chronological context after backfill
补导历史后按时间和 ID 选取相邻消息,保留分段边界并补充回归测试。
Select neighbors by timestamp and ID after backfill; preserve segment boundaries and add regressions.
2026-09-21 18:51:50 +08:00
liuyy2 62b5db4922 fix(ai): forward selected time ranges from chat pages 2026-09-21 18:45:55 +08:00
liuyy2 a57009d56f docs(ai): clarify analysis time parameter precedence 2026-09-21 18:45:55 +08:00
liuyy2 600decf148 test(ai): cover analysis time range precedence 2026-09-21 18:45:55 +08:00
liuyy2 aea7e2540c fix(ai): respect time ranges in analysis tools 2026-09-21 18:45:55 +08:00
Sanssssssssssssssss f72198f2c5 fix(cli): persist tool history for continuation / 保存工具历史供续聊
CLI dropped completed tool results from replay. Persist bounded results by call ID with error state.
CLI 续聊遗漏已完成的工具结果;按调用 ID 保存限长结果和错误状态。

Add SQLite reload regression for concurrent calls and truncated answers.
新增 SQLite 重载回归,覆盖并行调用与回答截断。
2026-09-21 11:19:53 +08:00
digua c48d2837f1 fix(release): wait for npm package availability
Wait for newly published CLI versions to become visible before building Docker images. Bound registry probes and the overall wait so npm outages cannot stall release jobs for hours.
2026-09-19 09:54:07 +08:00
digua 3b44facf87 release: v0.37.2 v0.37.2 2026-09-18 18:37:42 +08:00
digua db4ce30852 fix(ai): persist truncated turns across chat entry points
Preserve partial output and token usage in CLI turns and edited UI rounds while leaving ordinary failures and cancellation unchanged. Use OutputLimitError across agent runners so incomplete turns remain visibly unsuccessful but can be reloaded and continued.

Cover real stream handling, SQLite persistence, reload, CLI continuation, and unsuccessful one-shot JSON output.
2026-09-18 10:53:06 +08:00
digua a2c4176f89 test(ai): use source imports in root integration test
Reference the shared runtime through its source path, matching the other root integration tests. This fixes workspace dependency validation without adding a root package dependency or changing the test behavior.
2026-09-18 10:53:06 +08:00
digua 1d2eae586c fix(electron): preserve usage on truncated AI responses
Retain cumulative Agent usage from status events and emit it in the terminal done event after an error so truncated Desktop replies keep their token totals.

Cover the real Desktop Agent and stream runner alongside CLI and global entries, including partial output, completion state, and persisted usage.
2026-09-18 10:53:06 +08:00
digua 1388aaccf7 fix(ai): handle model output truncation 2026-09-18 10:53:06 +08:00
Sanssssssssssssssss 02b75f8532 fix(ai): cancel session context compression with the request
向会话压缩传递取消信号,防止停止后继续请求并写入摘要。
Forward the request signal to session compression to prevent requests and summary writes after cancellation.
2026-09-12 23:49:32 +08:00
Sanssssssssssssssss a8e8644c7c fix(ai): persist stopped agent turns before continuing
停止后保留已收到的内容并落库,保存完成后才允许续聊;预处理取消不再启动请求。
Persist received content on stop before allowing continuation; skip requests cancelled during preprocessing.

Verified with SQLite reload/continuation, 140 stop scenarios and two independent reviews.
2026-09-12 23:49:15 +08:00
ttsdj 89974f34e3 fix(cache): keep download writes inside the downloads directory
POST /_web/cache/save-to-downloads joined the caller-supplied `filename`
straight into the downloads directory:

    const filePath = path.join(downloadsDir, filename)

`path.join` collapses `..`, so `{"filename":"../escaped.txt"}` resolved
one level above the downloads directory and the route wrote
attacker-chosen bytes there, returning `{ success: true }`. Any client
that can reach the route could therefore write outside the downloads
directory as the app user.

The route is registered by the shared web routes on both CLI Web and the
Electron internal API, so the fix covers both. Its own siblings already
constrain this input — merge.ts and the CLI upload route both run the
name through `path.basename` — so the missing guard here was an
oversight rather than a documented allowance.

Reject anything that is not a plain file name, and join only the
validated basename. Names the app itself sends stay unchanged: every
caller (conversation export, SQL export, screen capture) already passes a
flat file name.
2026-09-10 16:17:10 +08:00
digua 0e8339bc4c fix(analytics): defer insight views until foregrounded
Only count insight views when the page is visible and focused. Defer background activations until the first foreground transition without resuming cancelled tab dwell timers, and cover focus and visibility ordering in regression tests.
2026-09-08 15:52:11 +08:00
digua b9903e77e6 feat(analytics): track deliberate insight tab visits after dwell 2026-09-08 15:52:11 +08:00
digua 16cbdb96b6 fix(analysis): preserve bracketed annotations in language profiles
Reusing emoji cleaning also removed ordinary bracketed labels from language vocabulary. Preserve unknown bracketed text for language profiles while retaining known emoji filtering and the existing word-frequency behavior. Add a regression for annotated chat messages.
2026-09-06 01:19:44 +08:00
babybitter 6191956338 feat(analysis): recognize Douyin export emoji codes
补充抖音导出表情代码识别表,让文本分析把 [微笑]、[星星眼]、[666]、[V5]、[kisskiss] 等带方括号的抖音表情代码当作表情,而不是普通文本词汇。

新增平台表情代码数据模块 bracket-emoji,集中管理微信经典表情映射与从抖音导出中收集到的表情代码名(含此前的 [躺平]、[强壮]);cleanText 按 [代码]/【代码】 形式识别已知平台表情代码并在清洗时剥离。此前非中文名的抖音表情代码(如 [V5]、[ok]、[kisskiss])会被当作普通词汇进入词频统计;语言偏好分析的分词清洗也改用与词频一致的 cleanText,表情代码不再混入高频词,而口头禅与短语统计仍保留 [表情] 原始形式。

补充脱敏合成数据回归测试,覆盖括号格式文本清洗、Node 与 Browser 词频统计以及语言偏好分析;新测试在识别逻辑缺失时会失败。

(cherry picked from commit c80885e0e3)
2026-09-06 01:17:13 +08:00
digua 29bea9a35d fix(skills): preserve released import skill selector
Released Chinese and Traditional Chinese clients install chatlab-import-cn from the default branch. Keep a deprecated, self-contained English entry so those commands continue to work, and document migration to the unified skill.
2026-09-06 00:00:36 +08:00
digua 8c36f5b999 fix(docs): restore converter privacy warning containers
Separate warning titles, bodies, and closing fences with blank lines so VitePress renders the privacy notices correctly and Prettier preserves their structure.
2026-09-06 00:00:36 +08:00
digua 7c6531f846 fix(skills): use unified import skill in home card 2026-09-06 00:00:36 +08:00
digua 59520a2e61 refactor(skills): unify multilingual skill entrypoints 2026-09-06 00:00:36 +08:00
digua 7310b0670f docs(skills): streamline agent guidance and workflows 2026-09-06 00:00:36 +08:00
digua 42d8171d5d docs(agents): refine verification and authorization rules 2026-09-06 00:00:36 +08:00
digua d844578bab release: v0.37.1 v0.37.1 2026-09-04 16:49:46 +08:00
digua a9ec32ad31 feat(changelog): add contributor attribution 2026-09-04 16:39:54 +08:00
digua 4392519d30 fix(analysis): omit members without repeated catchphrases
Voice transcription normalization can remove every phrase for a member while leaving an empty member entry. Filter those entries from the result so overview and selected-member views retain their empty states.

Add a regression test for single-use transcriptions alongside another member with valid catchphrases.
2026-09-04 00:27:29 +08:00
babybitter 8b7d62e248 fix(analysis): separate system messages from emoji phrases
区分抖音导出中的显式系统通知、分享占位和用户表情,避免系统提示进入口头禅及语言、词频统计。

新增统一的系统/分享前缀识别,覆盖 [系统]、[系统消息]、[分享内容] 及对应全角和英文形式;不误判 [强壮]、[躺平] 等表情标签。口头禅、语言偏好以及 Node/Browser 词频分析支持文本与表情消息,并在统计阶段排除系统通知和分享占位;原始聊天记录保持不变。

补充脱敏合成数据回归测试,覆盖系统通知、分享内容占位排除以及表情保留。
2026-09-04 00:19:21 +08:00