| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
perf(ci): skip Rust validation for proven Web-only changes | 1 个月前 | |
feat: integrate managed opencode plugin host | 1 个月前 | |
feat(browser): add OHOS Haitai TCP CDP control | 27 天前 | |
refactor(flowchat): give the viewport one register, and a permanent trail Six viewport faults were fixed this week and four were the same shape: a writer moved the viewport on purpose, and another component read that movement as a displacement to undo. What coordinated them was a hand-written predicate per writer — O(n^2) pairs, where forgetting one pair is a bug. The snap back that travelled 0.7px and was reissued 958 times over 20 seconds was one forgotten pair. The pairs collapse into a register. flowChatViewportOwnership.ts is a pure state machine over an ordered list of owners; useFlowChatViewportOwner.ts holds the claim and performs the write, because taking ownership and moving the viewport being one call is what stops a writer being added without the rest of FlowChat knowing. The order is the design: user-gesture > one-shot-navigation > snap-back > follow-output > layout-correction > anchor-correction The register decides whether, never where. Targets stay with the writer that owns them and the anchor's correction stays idempotent — ordering answers what idempotency cannot, which is whether a movement was ours on purpose. The contract carried a standing objection to any coordinator: single-writer semantics are unreachable while the virtualizer writes scrollTop from inside the library. Both halves of that premise have since expired. Its adjustment for a re-measured item is off, and scrollToFn is a first-class option, so every library write — scrollToIndex, scrollToOffset, and the re-aim that follows them for up to 5s — is now attributed to whoever asked for the aim and refusable like any other. That attribution is also what lets a gesture preempt a navigation still chasing its Turn, with no extra machinery. Two departures from the design as planned, both found while building it. The opening reveal cannot be an owner: it is a phase, the thing moving the viewport during it is follow-output, and a claim standing in for the reveal would outrank and refuse follow-output. And prepend-compensation became layout-correction, since putting the reader back after history arrives above them and after the box resizes is one act. Fewer flags collapsed than expected: only isViewportOwnedElsewhere and isSnapBackInFlight were really answering "is someone else moving the viewport". smoothScrollFramesRef is follow-output yielding to its own animation, and the rest are frame budgets and paging policy. The trail is the other half. Every fault here has been intermittent, invisible in the DOM once over, and identical in the UI to two other causes: a Turn that lands and is dragged away and a Turn that never landed leave the same final position. So flowChatViewportDiagnostics.ts records, behind the existing app.logging.flow_chat_diagnostics switch, the writes at the register — with every refusal — and the decisions at each writer. The second half is the one that pays: a write that never happened leaves nothing at the register to find, and "nothing happened" has been the report more often than a wrong move has. A placement is recorded with what became of it, sampled a frame later and again once settled, which is how the two writers that do not go through the register — the sticky Task indicator and cross-session focus — are watched without being changed on no evidence. Repeated events collapse into one entry per 500ms carrying the count and travel they stand for, keyed so that a transition always emits. analyze-flowchat-log.mjs is rewritten around that stream: episodes of activity ranked by travel per pixel of progress, placements that did not stick ranked by drift, refusals as owner by who outranked them, declines as writer by reason. It weighs a coalesced entry by the run it stands for, and says so at the top when entries were dropped, because both would otherwise flatter the result. The two existing regression nets pass unchanged: useFlowChatFollowOutput needed the real register wired into its harness, and useFlowChatViewportAnchor a writeViewport that assigns scrollTop. Manual verification of contract items 25-30 is pending. | 1 个月前 | |
feat: add MCP import and product customization foundations | 1 个月前 | |
feat(relay): deploy from prebuilt multi-arch image (#2013) * feat(relay): deploy from published multi-arch image * fix(relay): prefer verified China image route * test(relay): smoke published image platforms * fix(ci): isolate Relay platform smoke pulls | 1 个月前 | |
feat(tracing): capture context compression model exchanges - add model exchange tracing support to aggregated ai-adapter requests - trace auto and manual context compression model calls as operations - replace round-specific trace metadata with operation metadata - update request trace CSV/dashboard tools for the new trace shape | 3 个月前 | |
fix(appearance): skip dependency dirs in contract audit walks Prevent MiniApp local node_modules and build outputs from triggering false ThemeService contract failures during desktop builds. | 1 个月前 | |
refactor(theme): compress cross-surface color contracts | 2 个月前 | |
refactor(theme): tighten extension color governance | 2 个月前 | |
test(appearance): enforce contracts and add end-to-end coverage | 1 个月前 | |
test(appearance): enforce contracts and add end-to-end coverage | 1 个月前 | |
feat(web-ui): polish interaction motion and presence | 1 个月前 | |
fix(frontend): restore footer actions and add Rust-free build option | 1 个月前 | |
fix(scripts): detect cargo/rustc per image on Windows without cmd.exe Run tasklist with /NH for each image separately instead of shelling through cmd.exe with /FI chains, which misdetected compiler activity on some Windows hosts. | 1 个月前 | |
fix(scripts): detect cargo/rustc per image on Windows without cmd.exe Run tasklist with /NH for each image separately instead of shelling through cmd.exe with /FI chains, which misdetected compiler activity on some Windows hosts. | 1 个月前 | |
feat: integrate managed opencode plugin host | 1 个月前 | |
feat: integrate managed opencode plugin host | 1 个月前 | |
refactor(runtime): move function-agent git service owner | 3 个月前 | |
Merge remote-tracking branch 'upstream/main' into wc/rebase | 30 天前 | |
chore(ci): refresh GitHub Actions Node runtime | 2 个月前 | |
perf(ci): skip Rust validation for proven Web-only changes | 1 个月前 | |
feat(harmonyos): switch the phone UI between Chinese and English The in-app language never changed because RemoteI18n only had a hardcoded zh-CN map and no locale state. Keep catalogs, persistence, and Settings selection on the phone so the current surface rebuilds immediately after a switch. Co-authored-by: Cursor <cursoragent@cursor.com> | 1 个月前 | |
fix: reduce false positives in repo hygiene path checks | 3 个月前 | |
feat: integrate managed opencode plugin host | 1 个月前 | |
feat: integrate managed opencode plugin host | 1 个月前 | |
feat(auto-update): add auto-update | 4 个月前 | |
Init | 7 个月前 | |
feat(web-ui): non-blocking historical session switch; add debug log server - Switch FlowChat UI immediately; load history in background via loadSessionHistory - Add scripts/debug-log-server.mjs and document frontend debugging in AGENTS.md | 5 个月前 | |
fix(desktop): keep the DeepSeek bridge off the compile path cargo check and desktop:dev no longer require packages/dsh-acp/dist-profile. Official packaging still builds the profile and injects it as a Tauri resource. | 1 个月前 | |
fix(desktop): keep the DeepSeek bridge off the compile path cargo check and desktop:dev no longer require packages/dsh-acp/dist-profile. Official packaging still builds the profile and injects it as a Tauri resource. | 1 个月前 | |
fix(desktop): keep the DeepSeek bridge off the compile path cargo check and desktop:dev no longer require packages/dsh-acp/dist-profile. Official packaging still builds the profile and injects it as a Tauri resource. | 1 个月前 | |
feat(ohos): implement privacy and anonymous feedback | 1 个月前 | |
refactor: unify shared coding agent profiles - Rename mode profile config APIs, storage, and schema to agent profiles. - Share agentic customization defaults across plan, debug, and multitask via the coding_shared profile and update the agents UI to reflect the shared scope. - Keep fmt:rs scoped to touched Rust files by restoring collateral module formatting changes. | 3 个月前 | |
fix(desktop): keep the DeepSeek bridge off the compile path cargo check and desktop:dev no longer require packages/dsh-acp/dist-profile. Official packaging still builds the profile and injects it as a Tauri resource. | 1 个月前 | |
refactor: simplify low-risk Rust lint findings | 2 个月前 | |
feat(release): deploy latest binaries with mirror fallback | 1 个月前 | |
feat(appearance): persist selection and bootstrap desktop startup | 1 个月前 | |
feat(appearance): persist selection and bootstrap desktop startup | 1 个月前 | |
fix(release): publish versioned manual installer metadata | 1 个月前 | |
feat(release): add beta packaging channel | 1 个月前 | |
refactor(core): organize crates into six ownership layers | 3 个月前 | |
refactor(core): organize crates into six ownership layers | 3 个月前 | |
feat(ai): add GLM and DeepSeek reasoning support - add trusted OpenBitFun reasoning bindings and an OpenAI-compatible endpoint - lower GLM-5.2 and DeepSeek V4 presets for Anthropic and Chat Completions APIs - extend models.dev projections and adapter fallbacks with toggle and effort support - localize OpenBitFun endpoint choices and update the Installer i18n audit proof | 1 个月前 | |
feat(flow-chat): add recursive agent session tree - Add recursive Agents session lineage tree with live status tracking. - Replace the background activity panel with a background command panel. - Support non-cascading cancellation for individual agent sessions. - Highlight the Agents entry for active foreground and background descendants. - Preserve persisted session titles and manual tree collapse state. - Update desktop/server APIs, localization, styles, and focused tests. | 1 个月前 | |
refactor: harden i18n resource audit | 3 个月前 | |
refactor(i18n): tighten l10n signal governance | 3 个月前 | |
refactor(i18n): clear static fallback baseline | 3 个月前 | |
refactor(i18n): reduce fallback and format debt | 3 个月前 | |
feat(cli): make bitfun the cross-platform primary command | 2 个月前 | |
feat(cli): make bitfun the cross-platform primary command | 2 个月前 | |
docs(deploy): restore the OpenBitFun origin from the BitFun checkout Keep release-sync cron on the in-repo script and document the host export/import path so a new server does not need a detached AutoUpdate copy. | 1 个月前 | |
perf: multi-dimension optimization pass (build, runtime, UI fluency, startup & bundle size) (#1778) * perf(build): speed up dev and release build pipeline - Run web type-check and vite build in parallel (scripts/build-web-parallel.mjs); enable incremental tsc for web-ui and mobile-web; drop duplicate type-check in desktop packaging CI - Trim dev profile debuginfo to line-tables-only and inject CARGO_PROFILE_DEV_CODEGEN_UNITS=256 into tauri dev (matching preview path) - Switch release profile to thin LTO and panic=abort (packaging regression recommended); remove per-platform LTO override in desktop-package.yml - Skip mobile-web rebuild when inputs are unchanged (mtime short-circuit, --force escape hatch) - Unify image crate to workspace 0.25 (was pinned 0.24 in desktop), migrate computer_use call sites and bridge screenshots-crate buffers at the boundary - Remove forced 100ms polling watcher in vite dev (VITE_USE_POLLING opt-in) - Make build.rs codegen deterministic (sorted keys) in core and cli - Parallelize beforeBuildCommand (web + mobile-web) and dev.cjs prepare steps - Prune unused Monaco NLS language packs (keep en/zh-cn/zh-tw), with verify-monaco-assets guard * perf(runtime): cut hot-path allocations, blocking IO and redundant syscalls - Emit backend->frontend events without unconditional payload deep-copies: peer fanout guard now runs before clone/to_value (global + terminal emitters) - Wrap directory listing in spawn_blocking (aligning with grep/glob tools), drop per-entry re-stat, preallocate results - LSP: take diagnostics by value instead of cloning, share cached diagnostics via Arc, move diagnostics cache to its own lock (no read-lock across await) - Session persistence: sanitize messages copy-on-write, serialize turn snapshots compact instead of pretty - File tree scan: stat once per entry (sort comparator is now syscall-free), reuse metadata for permissions, canonicalize via spawn_blocking, preallocate - Terminal transcript: keep files open with BufWriter and flush on a timer / rotation / close instead of open+write+flush per chunk - ACP tool-call tracker: share raw_input via Arc, removing repeated deep copies - Search: match before allocating per line, drop redundant is_file stats, return sink results without split/join round-trip, mem::take result buffers - File watcher: replace per-event block_on with sync path-table snapshot, register watches incrementally instead of rebuilding the watcher - PTY output: zero-copy UTF-8 conversion, Arc<str> tap fan-out, byte ring buffer for head/tail capture - Statically cache front-matter regex; evict per-path persistence locks (Weak) * perf(startup): parallelize backend init, dedupe Monaco, shrink assets - Run independent startup steps (i18n, AI client factory, log level) with tokio::join! after config init; bound the workspace bootstrap snapshot block_on with a 4s timeout falling back to the frontend init command - Stop bundling a second ESM copy of Monaco into the entry chunk: all monaco-editor value imports become type imports, runtime access goes through the AMD loader singleton (new monacoRuntime accessor). Entry chunk 5.44 MB -> 2.14 MB (-61%) - Replace three static Noto Sans SC weights (12.7 MB) with the fontsource variable font (4.6 MB) - Recompress oversized PNGs (logo, panda art, pet spritesheet) preserving alpha and dimensions (-2.85 MB) * perf(ui): keep streaming and interactions off the re-render hot path - Split FlowChatContext into stable (callbacks + scalar ids) and volatile contexts; stop depending on the whole activeSession object so streaming flushes no longer re-render every visible message past React.memo - Stabilize Markdown renderer props (useCallback) so completed messages skip remark re-parsing during streaming - Nav divider drag writes --nav-width directly with rAF batching; state commits on mouseup; unmount cleanup for window listeners - Replace per-message window resize listeners with a shared ResizeObserver - Desktop pet: typewriter moves to rAF with ref targets (no interval churn), 120ms cursor polling pauses when hidden/idle and caches rects - Fine-grained zustand selectors for canvas store consumers and message edit state (editingTurnId gating) - rAF-throttle scroll handlers (file explorer, insights, explore groups) and Tooltip scroll tracking (passive, merged state) - EventBus history becomes a ring buffer; payload references only kept in dev - Fix listener leaks/races: GitStateManager dispose, PeerHostInvokeBridge and useWindowControls await-races, WorkspaceAPI abort listener, App.tsx disposed flags, tool-execution-service unlisten tracking - Cap second-tier session list expansion with incremental loading - Narrow transition properties in resizer/session styles (no layout-property hover animations) * docs(performance): add multi-dimension performance review reports Four review reports (compile/build, runtime, UI fluency, startup & bundle size) backing the optimizations in this branch, including the findings that were intentionally deferred as follow-ups. * fix(build): repair image 0.25 migration in test code, drop panic=abort The JpegEncoder in the computer_use integration test still used the image 0.24 by-value encode signature, breaking cargo test -p bitfun-desktop (CI Rust Build Check) even though cargo check on the lib target passed. Also revert panic = "abort" from the release profile: browser_get_url and the relay client's TLS setup deliberately use catch_unwind to contain known third-party panics, and aborting would convert those recoverable errors into process crashes. Thin LTO is kept. * fix(runtime): repair regressions found reviewing the optimization pass - file_watch: re-registering an existing path was a no-op after the switch to incremental watch registration. ensure_watch_roots marks a vanished root inactive without calling unwatch_path, so when the directory reappeared the watch was never restored and that root silently stopped reporting changes (the old code rebuilt the whole watcher every time, which hid this). Now re-registration always unwatches before watching again; covered by a new file_watch contract test. - transcript: buffering moved structured markers (command, cwd, exit code, resume/finish) off the immediate-write path, so a crash or force-quit could lose the anchors agents grep for. Markers now flush immediately (carrying any buffered output with them) while plain output keeps the buffered write. - grep: returning sink results as one entry per match changed head_limit and offset from physical lines to match blocks in multiline mode. Entries are split again only when they actually contain newlines. * fix(ui): repair regressions found reviewing the optimization pass - UserMessageItem: the shared ResizeObserver captured the content node at effect time, while the window listener it replaced re-read the ref on every event. contentRef is attached inside conditional branches, so leaving edit mode or a turn failing left the observer bound to a detached node — the overflow/expand affordance froze and the node leaked. Re-observe when those branches change. - Desktop pet: the new getBoundingClientRect cache was only invalidated on size/overlay/task changes, but typewriter output grows bubbles and shifts the ones below, so hover hit-testing used stale rects for a whole streaming task. The cache epoch now also advances on typed-output flush. - Nav drag: a drop landing between animation frames left the DOM at the last painted width because React only rewrites the CSS variable when the committed width actually changes. The final width is now applied synchronously on cleanup, while the transition is still suppressed. - SessionScene: narrowing the transition list dropped box-shadow, which those resizer handles animate on hover — restored. - sharedResizeObserver: one throwing subscriber aborted the entry batch and killed resize handling for every observed element (a failure mode introduced by sharing the observer). Each callback is now isolated. - EventBus: the dev gate used process.env.NODE_ENV, which never resolves in the Vite browser build, so payloads were dropped even in dev, contrary to the documented behavior. Use import.meta.env.DEV. - Add monacoRuntime tests asserting the lazy proxy fails diagnosably when the runtime has not been injected yet. * docs(build): document the new build escape hatches; keep piped output intact The optimization pass traded some flexibility for speed without saying so anywhere a contributor would look. Document CARGO_PROFILE_DEV_DEBUG=2 (the dev profile now ships line-tables-only), BITFUN_MOBILE_WEB_FORCE_BUILD=1 / --force (mobile-web builds are skipped when its dist is up to date) and VITE_USE_POLLING=1 (native watch events are the default again), plus a note that build:web now interleaves prefixed type-check and bundler output. The two parallel build wrappers also ended with process.exit(), which drops whatever is still queued on stdout when it is a pipe — as it is under CI. Set process.exitCode instead and let the process end on its own. * test(review): harden second-review findings - grep: add a multiline + head_limit test pinning pagination to physical lines (the property the earlier fix restored) - sharedResizeObserver: report subscriber callback errors instead of swallowing them silently - vite: when the project sits on a UNC share or WSL mount during dev, print a one-line hint about VITE_USE_POLLING=1 — users upgrading from the polling-based watcher would otherwise silently lose HMR there * chore(review): fix stale comments, drop dead API, gate new tests in CI Final read-through of the whole diff: - workspace_manager: the comment justified the dedicated cache handle by contention with "start_server's write lock", but nothing in the repo ever takes that lock for writing. Describe what the handle actually avoids. - markdown: front_matter_regex() was introduced with no callers (agent-runtime cannot depend on services-core and keeps its own static), so use the static directly and drop the exported wrapper. - dev.cjs / prune-monaco-nls.cjs: comments overstated what they do — the dev codegen-units override only matters with CARGO_INCREMENTAL=0, and the 1.4 MB figure covers the seven pruned NLS packs, not all nine. - fonts README still described the three deleted static weights as the directory's contents; rewrite it for the variable subset build. - CI: the file watch contract suite sits behind a non-default feature and neither it nor tool-runtime were in any cargo test step, so the regression guards added by this PR never ran. Add both to the OS matrix, matching the existing rationale for platform-sensitive contract suites. Also address the frontend read-through: move a render-phase ref write into the layout effect that already batches with it, use the repo's logger instead of a bare console.error, and assert repo-wide that monaco-editor is only ever imported as a type (the guard that keeps the 3.4 MB ESM copy out of the entry chunk). * ci: scope the new Rust test steps to green platform combinations Enabling these suites surfaced failures that predate this branch: - the file watch contracts fail on macOS (debounce and atomic-rename contracts time out under FSEvents coalescing) — tests this branch does not touch, on a suite that has never run in CI - tool-runtime's glob tests fail on Windows (walk-root derivation handles separators differently) — this branch does not touch glob at all Neither belongs to a performance change, so run what is green rather than either turning CI red or dropping the coverage: file watch on Linux and Windows (the platforms whose watch registration this branch alters), and the search module where the grep changes live. Both deserve their own fix. * ci: quote the search test filter so the workflow parses search:: at the end of an unquoted YAML scalar reads as a nested mapping, which made the whole workflow file invalid — GitHub failed the run at startup with no jobs at all. --------- Co-authored-by: bowen628 <bowen628@noreply.gitcode.com> | 1 个月前 | |
feat(ohos): auto-sign native ELF modules for HarmonyOS PC HarmonyOS PC (hmfs) rejects dlopen/exec of unsigned ELF files with ERR_DLOPEN_FAILED / Permission denied. Native modules pulled in by pnpm (rollup .node binaries, esbuild launchers, etc.) therefore break every frontend build on device. Add scripts/ohos-sign-native.mjs which scans node_modules for native ELFs (*.node, *.so*, extension-less bin/ executables) and self-signs unsigned ones via binary-sign-tool. Wire it into postinstall and the root build script so signatures stay applied across dependency updates. Skips silently when binary-sign-tool is unavailable so non-HarmonyOS development is unaffected. | 28 天前 | |
docs(deploy): restore the OpenBitFun origin from the BitFun checkout Keep release-sync cron on the in-repo script and document the host export/import path so a new server does not need a detached AutoUpdate copy. | 1 个月前 | |
feat(desktop): DMG helper docs; simplify Computer Use session UI (#385) * feat(desktop): inject helper docs into macOS DMG after build Run patch-dmg-extras.sh on successful darwin builds to add bilingual TXT files with quarantine/gatekeeper guidance to the generated .dmg. * refactor(web-ui): remove Computer Use request-permission shortcut Drop the session settings button that invoked computer_use_request_permissions; keep open-settings and refresh flows. Remove unused computerUse.request i18n keys. --------- Co-authored-by: bowen628 <bowen628@noreply.gitcode.com> | 5 个月前 | |
feat(release): add beta packaging channel | 1 个月前 | |
feat(ohos): enable DeepSeek Harness ACP setup Restore the upstream bundled DSH ACP profile removed by the prior commit and package it for HarmonyOS resources. Install DeepSeek Harness through the official HarmonyBrew formula, bind profile setup to the managed runtime environment, and expose consistent localized preset UI. | 19 天前 | |
feat(ohos): enable DeepSeek Harness ACP setup Restore the upstream bundled DSH ACP profile removed by the prior commit and package it for HarmonyOS resources. Install DeepSeek Harness through the official HarmonyBrew formula, bind profile setup to the managed runtime environment, and expose consistent localized preset UI. | 19 天前 | |
fix: support remote flashgrep workspace search | 4 个月前 | |
fix(release): publish versioned manual installer metadata | 1 个月前 | |
perf: multi-dimension optimization pass (build, runtime, UI fluency, startup & bundle size) (#1778) * perf(build): speed up dev and release build pipeline - Run web type-check and vite build in parallel (scripts/build-web-parallel.mjs); enable incremental tsc for web-ui and mobile-web; drop duplicate type-check in desktop packaging CI - Trim dev profile debuginfo to line-tables-only and inject CARGO_PROFILE_DEV_CODEGEN_UNITS=256 into tauri dev (matching preview path) - Switch release profile to thin LTO and panic=abort (packaging regression recommended); remove per-platform LTO override in desktop-package.yml - Skip mobile-web rebuild when inputs are unchanged (mtime short-circuit, --force escape hatch) - Unify image crate to workspace 0.25 (was pinned 0.24 in desktop), migrate computer_use call sites and bridge screenshots-crate buffers at the boundary - Remove forced 100ms polling watcher in vite dev (VITE_USE_POLLING opt-in) - Make build.rs codegen deterministic (sorted keys) in core and cli - Parallelize beforeBuildCommand (web + mobile-web) and dev.cjs prepare steps - Prune unused Monaco NLS language packs (keep en/zh-cn/zh-tw), with verify-monaco-assets guard * perf(runtime): cut hot-path allocations, blocking IO and redundant syscalls - Emit backend->frontend events without unconditional payload deep-copies: peer fanout guard now runs before clone/to_value (global + terminal emitters) - Wrap directory listing in spawn_blocking (aligning with grep/glob tools), drop per-entry re-stat, preallocate results - LSP: take diagnostics by value instead of cloning, share cached diagnostics via Arc, move diagnostics cache to its own lock (no read-lock across await) - Session persistence: sanitize messages copy-on-write, serialize turn snapshots compact instead of pretty - File tree scan: stat once per entry (sort comparator is now syscall-free), reuse metadata for permissions, canonicalize via spawn_blocking, preallocate - Terminal transcript: keep files open with BufWriter and flush on a timer / rotation / close instead of open+write+flush per chunk - ACP tool-call tracker: share raw_input via Arc, removing repeated deep copies - Search: match before allocating per line, drop redundant is_file stats, return sink results without split/join round-trip, mem::take result buffers - File watcher: replace per-event block_on with sync path-table snapshot, register watches incrementally instead of rebuilding the watcher - PTY output: zero-copy UTF-8 conversion, Arc<str> tap fan-out, byte ring buffer for head/tail capture - Statically cache front-matter regex; evict per-path persistence locks (Weak) * perf(startup): parallelize backend init, dedupe Monaco, shrink assets - Run independent startup steps (i18n, AI client factory, log level) with tokio::join! after config init; bound the workspace bootstrap snapshot block_on with a 4s timeout falling back to the frontend init command - Stop bundling a second ESM copy of Monaco into the entry chunk: all monaco-editor value imports become type imports, runtime access goes through the AMD loader singleton (new monacoRuntime accessor). Entry chunk 5.44 MB -> 2.14 MB (-61%) - Replace three static Noto Sans SC weights (12.7 MB) with the fontsource variable font (4.6 MB) - Recompress oversized PNGs (logo, panda art, pet spritesheet) preserving alpha and dimensions (-2.85 MB) * perf(ui): keep streaming and interactions off the re-render hot path - Split FlowChatContext into stable (callbacks + scalar ids) and volatile contexts; stop depending on the whole activeSession object so streaming flushes no longer re-render every visible message past React.memo - Stabilize Markdown renderer props (useCallback) so completed messages skip remark re-parsing during streaming - Nav divider drag writes --nav-width directly with rAF batching; state commits on mouseup; unmount cleanup for window listeners - Replace per-message window resize listeners with a shared ResizeObserver - Desktop pet: typewriter moves to rAF with ref targets (no interval churn), 120ms cursor polling pauses when hidden/idle and caches rects - Fine-grained zustand selectors for canvas store consumers and message edit state (editingTurnId gating) - rAF-throttle scroll handlers (file explorer, insights, explore groups) and Tooltip scroll tracking (passive, merged state) - EventBus history becomes a ring buffer; payload references only kept in dev - Fix listener leaks/races: GitStateManager dispose, PeerHostInvokeBridge and useWindowControls await-races, WorkspaceAPI abort listener, App.tsx disposed flags, tool-execution-service unlisten tracking - Cap second-tier session list expansion with incremental loading - Narrow transition properties in resizer/session styles (no layout-property hover animations) * docs(performance): add multi-dimension performance review reports Four review reports (compile/build, runtime, UI fluency, startup & bundle size) backing the optimizations in this branch, including the findings that were intentionally deferred as follow-ups. * fix(build): repair image 0.25 migration in test code, drop panic=abort The JpegEncoder in the computer_use integration test still used the image 0.24 by-value encode signature, breaking cargo test -p bitfun-desktop (CI Rust Build Check) even though cargo check on the lib target passed. Also revert panic = "abort" from the release profile: browser_get_url and the relay client's TLS setup deliberately use catch_unwind to contain known third-party panics, and aborting would convert those recoverable errors into process crashes. Thin LTO is kept. * fix(runtime): repair regressions found reviewing the optimization pass - file_watch: re-registering an existing path was a no-op after the switch to incremental watch registration. ensure_watch_roots marks a vanished root inactive without calling unwatch_path, so when the directory reappeared the watch was never restored and that root silently stopped reporting changes (the old code rebuilt the whole watcher every time, which hid this). Now re-registration always unwatches before watching again; covered by a new file_watch contract test. - transcript: buffering moved structured markers (command, cwd, exit code, resume/finish) off the immediate-write path, so a crash or force-quit could lose the anchors agents grep for. Markers now flush immediately (carrying any buffered output with them) while plain output keeps the buffered write. - grep: returning sink results as one entry per match changed head_limit and offset from physical lines to match blocks in multiline mode. Entries are split again only when they actually contain newlines. * fix(ui): repair regressions found reviewing the optimization pass - UserMessageItem: the shared ResizeObserver captured the content node at effect time, while the window listener it replaced re-read the ref on every event. contentRef is attached inside conditional branches, so leaving edit mode or a turn failing left the observer bound to a detached node — the overflow/expand affordance froze and the node leaked. Re-observe when those branches change. - Desktop pet: the new getBoundingClientRect cache was only invalidated on size/overlay/task changes, but typewriter output grows bubbles and shifts the ones below, so hover hit-testing used stale rects for a whole streaming task. The cache epoch now also advances on typed-output flush. - Nav drag: a drop landing between animation frames left the DOM at the last painted width because React only rewrites the CSS variable when the committed width actually changes. The final width is now applied synchronously on cleanup, while the transition is still suppressed. - SessionScene: narrowing the transition list dropped box-shadow, which those resizer handles animate on hover — restored. - sharedResizeObserver: one throwing subscriber aborted the entry batch and killed resize handling for every observed element (a failure mode introduced by sharing the observer). Each callback is now isolated. - EventBus: the dev gate used process.env.NODE_ENV, which never resolves in the Vite browser build, so payloads were dropped even in dev, contrary to the documented behavior. Use import.meta.env.DEV. - Add monacoRuntime tests asserting the lazy proxy fails diagnosably when the runtime has not been injected yet. * docs(build): document the new build escape hatches; keep piped output intact The optimization pass traded some flexibility for speed without saying so anywhere a contributor would look. Document CARGO_PROFILE_DEV_DEBUG=2 (the dev profile now ships line-tables-only), BITFUN_MOBILE_WEB_FORCE_BUILD=1 / --force (mobile-web builds are skipped when its dist is up to date) and VITE_USE_POLLING=1 (native watch events are the default again), plus a note that build:web now interleaves prefixed type-check and bundler output. The two parallel build wrappers also ended with process.exit(), which drops whatever is still queued on stdout when it is a pipe — as it is under CI. Set process.exitCode instead and let the process end on its own. * test(review): harden second-review findings - grep: add a multiline + head_limit test pinning pagination to physical lines (the property the earlier fix restored) - sharedResizeObserver: report subscriber callback errors instead of swallowing them silently - vite: when the project sits on a UNC share or WSL mount during dev, print a one-line hint about VITE_USE_POLLING=1 — users upgrading from the polling-based watcher would otherwise silently lose HMR there * chore(review): fix stale comments, drop dead API, gate new tests in CI Final read-through of the whole diff: - workspace_manager: the comment justified the dedicated cache handle by contention with "start_server's write lock", but nothing in the repo ever takes that lock for writing. Describe what the handle actually avoids. - markdown: front_matter_regex() was introduced with no callers (agent-runtime cannot depend on services-core and keeps its own static), so use the static directly and drop the exported wrapper. - dev.cjs / prune-monaco-nls.cjs: comments overstated what they do — the dev codegen-units override only matters with CARGO_INCREMENTAL=0, and the 1.4 MB figure covers the seven pruned NLS packs, not all nine. - fonts README still described the three deleted static weights as the directory's contents; rewrite it for the variable subset build. - CI: the file watch contract suite sits behind a non-default feature and neither it nor tool-runtime were in any cargo test step, so the regression guards added by this PR never ran. Add both to the OS matrix, matching the existing rationale for platform-sensitive contract suites. Also address the frontend read-through: move a render-phase ref write into the layout effect that already batches with it, use the repo's logger instead of a bare console.error, and assert repo-wide that monaco-editor is only ever imported as a type (the guard that keeps the 3.4 MB ESM copy out of the entry chunk). * ci: scope the new Rust test steps to green platform combinations Enabling these suites surfaced failures that predate this branch: - the file watch contracts fail on macOS (debounce and atomic-rename contracts time out under FSEvents coalescing) — tests this branch does not touch, on a suite that has never run in CI - tool-runtime's glob tests fail on Windows (walk-root derivation handles separators differently) — this branch does not touch glob at all Neither belongs to a performance change, so run what is green rather than either turning CI red or dropping the coverage: file watch on Linux and Windows (the platforms whose watch registration this branch alters), and the search module where the grep changes live. Both deserve their own fix. * ci: quote the search test filter so the workflow parses search:: at the end of an unquoted YAML scalar reads as a nested mapping, which made the whole workflow file invalid — GitHub failed the run at startup with no jobs at all. --------- Co-authored-by: bowen628 <bowen628@noreply.gitcode.com> | 1 个月前 | |
docs(readme): lead with the product, not the positioning (#2027) The README opened with abstract positioning and put the download link 87 lines down, below three benchmark charts. First-time visitors had to scroll past the concept art to find out what BitFun is or how to get it. - Lead with one concrete sentence, the app screenshot, and a download link - Move Install directly under the fold; keep source build alongside it - Condense the metrics section and keep the single-run caveat as a callout - Move roadmap positioning and the concept diagram below the fold - Add download/star badges and Discussions links for social proof and entry - Add png/og-image.png (1280x640) for the repo's social preview, which is currently unset — every shared link renders as GitHub's default grey card - Add scripts/record-demo.sh to record the demo GIF the README still needs Applies the same structure to README.zh-CN.md. | 1 个月前 | |
feat(release): add beta packaging channel | 1 个月前 | |
fix(release): harden beta channel publishing | 1 个月前 | |
chore(web): add bundle analysis guardrails Add repeatable Web UI bundle-size and main-entry static graph reporters for the staged startup optimization work. The graph reporter supports dependency reachability and direct-import assertions, so future changes can verify that optional runtimes stay out of the startup path without changing Vite warning thresholds. | 4 个月前 | |
chore(web): add bundle analysis guardrails Add repeatable Web UI bundle-size and main-entry static graph reporters for the staged startup optimization work. The graph reporter supports dependency reachability and direct-import assertions, so future changes can verify that optional runtimes stay out of the startup path without changing Vite warning thresholds. | 4 个月前 | |
fix(release): drop --offline from the workspace lockfile sync The lockfile sync added in #2422 passed --offline, which cannot work on a CI runner: resolving the workspace walks every source, and the tauri git dependency has no checkout in a cold cargo home yet. error: failed to load source for dependency tauri-runtime Caused by: can't checkout from 'https://github.com/tauri-apps/tauri.git': you are in the offline mode (--offline) The flag survived local review because a warm cargo home already holds that checkout. Verified this time against a pristine CARGO_HOME, which reproduces the CI failure with --offline and succeeds without it in 26s, still touching only the 43 workspace member versions and no third-party dependency. Co-Authored-By: Claude <noreply@anthropic.com> | 1 个月前 | |
fix(release): accept raw updater public keys | 1 个月前 | |
fix(release): reject duplicate asset names before upload | 1 个月前 | |
fix(release): reject duplicate asset names before upload | 1 个月前 | |
feat(cli): make bitfun the cross-platform primary command | 2 个月前 | |
feat(cli): make bitfun the cross-platform primary command | 2 个月前 | |
refactor(theme): reduce specialized palette drift | 2 个月前 | |
refactor(theme): derive CLI truecolor fallbacks from presets | 2 个月前 | |
refactor(theme): compress installer and utility contracts | 2 个月前 | |
test(appearance): enforce contracts and add end-to-end coverage | 1 个月前 | |
refactor(theme): retire low-external background contracts | 2 个月前 | |
test(appearance): enforce contracts and add end-to-end coverage | 1 个月前 | |
test(appearance): enforce contracts and add end-to-end coverage | 1 个月前 | |
test(appearance): enforce contracts and add end-to-end coverage | 1 个月前 | |
feat(ai): add GLM and DeepSeek reasoning support - add trusted OpenBitFun reasoning bindings and an OpenAI-compatible endpoint - lower GLM-5.2 and DeepSeek V4 presets for Anthropic and Chat Completions APIs - extend models.dev projections and adapter fallbacks with toggle and effort support - localize OpenBitFun endpoint choices and update the Installer i18n audit proof | 1 个月前 | |
test(appearance): enforce contracts and add end-to-end coverage | 1 个月前 | |
perf: multi-dimension optimization pass (build, runtime, UI fluency, startup & bundle size) (#1778) * perf(build): speed up dev and release build pipeline - Run web type-check and vite build in parallel (scripts/build-web-parallel.mjs); enable incremental tsc for web-ui and mobile-web; drop duplicate type-check in desktop packaging CI - Trim dev profile debuginfo to line-tables-only and inject CARGO_PROFILE_DEV_CODEGEN_UNITS=256 into tauri dev (matching preview path) - Switch release profile to thin LTO and panic=abort (packaging regression recommended); remove per-platform LTO override in desktop-package.yml - Skip mobile-web rebuild when inputs are unchanged (mtime short-circuit, --force escape hatch) - Unify image crate to workspace 0.25 (was pinned 0.24 in desktop), migrate computer_use call sites and bridge screenshots-crate buffers at the boundary - Remove forced 100ms polling watcher in vite dev (VITE_USE_POLLING opt-in) - Make build.rs codegen deterministic (sorted keys) in core and cli - Parallelize beforeBuildCommand (web + mobile-web) and dev.cjs prepare steps - Prune unused Monaco NLS language packs (keep en/zh-cn/zh-tw), with verify-monaco-assets guard * perf(runtime): cut hot-path allocations, blocking IO and redundant syscalls - Emit backend->frontend events without unconditional payload deep-copies: peer fanout guard now runs before clone/to_value (global + terminal emitters) - Wrap directory listing in spawn_blocking (aligning with grep/glob tools), drop per-entry re-stat, preallocate results - LSP: take diagnostics by value instead of cloning, share cached diagnostics via Arc, move diagnostics cache to its own lock (no read-lock across await) - Session persistence: sanitize messages copy-on-write, serialize turn snapshots compact instead of pretty - File tree scan: stat once per entry (sort comparator is now syscall-free), reuse metadata for permissions, canonicalize via spawn_blocking, preallocate - Terminal transcript: keep files open with BufWriter and flush on a timer / rotation / close instead of open+write+flush per chunk - ACP tool-call tracker: share raw_input via Arc, removing repeated deep copies - Search: match before allocating per line, drop redundant is_file stats, return sink results without split/join round-trip, mem::take result buffers - File watcher: replace per-event block_on with sync path-table snapshot, register watches incrementally instead of rebuilding the watcher - PTY output: zero-copy UTF-8 conversion, Arc<str> tap fan-out, byte ring buffer for head/tail capture - Statically cache front-matter regex; evict per-path persistence locks (Weak) * perf(startup): parallelize backend init, dedupe Monaco, shrink assets - Run independent startup steps (i18n, AI client factory, log level) with tokio::join! after config init; bound the workspace bootstrap snapshot block_on with a 4s timeout falling back to the frontend init command - Stop bundling a second ESM copy of Monaco into the entry chunk: all monaco-editor value imports become type imports, runtime access goes through the AMD loader singleton (new monacoRuntime accessor). Entry chunk 5.44 MB -> 2.14 MB (-61%) - Replace three static Noto Sans SC weights (12.7 MB) with the fontsource variable font (4.6 MB) - Recompress oversized PNGs (logo, panda art, pet spritesheet) preserving alpha and dimensions (-2.85 MB) * perf(ui): keep streaming and interactions off the re-render hot path - Split FlowChatContext into stable (callbacks + scalar ids) and volatile contexts; stop depending on the whole activeSession object so streaming flushes no longer re-render every visible message past React.memo - Stabilize Markdown renderer props (useCallback) so completed messages skip remark re-parsing during streaming - Nav divider drag writes --nav-width directly with rAF batching; state commits on mouseup; unmount cleanup for window listeners - Replace per-message window resize listeners with a shared ResizeObserver - Desktop pet: typewriter moves to rAF with ref targets (no interval churn), 120ms cursor polling pauses when hidden/idle and caches rects - Fine-grained zustand selectors for canvas store consumers and message edit state (editingTurnId gating) - rAF-throttle scroll handlers (file explorer, insights, explore groups) and Tooltip scroll tracking (passive, merged state) - EventBus history becomes a ring buffer; payload references only kept in dev - Fix listener leaks/races: GitStateManager dispose, PeerHostInvokeBridge and useWindowControls await-races, WorkspaceAPI abort listener, App.tsx disposed flags, tool-execution-service unlisten tracking - Cap second-tier session list expansion with incremental loading - Narrow transition properties in resizer/session styles (no layout-property hover animations) * docs(performance): add multi-dimension performance review reports Four review reports (compile/build, runtime, UI fluency, startup & bundle size) backing the optimizations in this branch, including the findings that were intentionally deferred as follow-ups. * fix(build): repair image 0.25 migration in test code, drop panic=abort The JpegEncoder in the computer_use integration test still used the image 0.24 by-value encode signature, breaking cargo test -p bitfun-desktop (CI Rust Build Check) even though cargo check on the lib target passed. Also revert panic = "abort" from the release profile: browser_get_url and the relay client's TLS setup deliberately use catch_unwind to contain known third-party panics, and aborting would convert those recoverable errors into process crashes. Thin LTO is kept. * fix(runtime): repair regressions found reviewing the optimization pass - file_watch: re-registering an existing path was a no-op after the switch to incremental watch registration. ensure_watch_roots marks a vanished root inactive without calling unwatch_path, so when the directory reappeared the watch was never restored and that root silently stopped reporting changes (the old code rebuilt the whole watcher every time, which hid this). Now re-registration always unwatches before watching again; covered by a new file_watch contract test. - transcript: buffering moved structured markers (command, cwd, exit code, resume/finish) off the immediate-write path, so a crash or force-quit could lose the anchors agents grep for. Markers now flush immediately (carrying any buffered output with them) while plain output keeps the buffered write. - grep: returning sink results as one entry per match changed head_limit and offset from physical lines to match blocks in multiline mode. Entries are split again only when they actually contain newlines. * fix(ui): repair regressions found reviewing the optimization pass - UserMessageItem: the shared ResizeObserver captured the content node at effect time, while the window listener it replaced re-read the ref on every event. contentRef is attached inside conditional branches, so leaving edit mode or a turn failing left the observer bound to a detached node — the overflow/expand affordance froze and the node leaked. Re-observe when those branches change. - Desktop pet: the new getBoundingClientRect cache was only invalidated on size/overlay/task changes, but typewriter output grows bubbles and shifts the ones below, so hover hit-testing used stale rects for a whole streaming task. The cache epoch now also advances on typed-output flush. - Nav drag: a drop landing between animation frames left the DOM at the last painted width because React only rewrites the CSS variable when the committed width actually changes. The final width is now applied synchronously on cleanup, while the transition is still suppressed. - SessionScene: narrowing the transition list dropped box-shadow, which those resizer handles animate on hover — restored. - sharedResizeObserver: one throwing subscriber aborted the entry batch and killed resize handling for every observed element (a failure mode introduced by sharing the observer). Each callback is now isolated. - EventBus: the dev gate used process.env.NODE_ENV, which never resolves in the Vite browser build, so payloads were dropped even in dev, contrary to the documented behavior. Use import.meta.env.DEV. - Add monacoRuntime tests asserting the lazy proxy fails diagnosably when the runtime has not been injected yet. * docs(build): document the new build escape hatches; keep piped output intact The optimization pass traded some flexibility for speed without saying so anywhere a contributor would look. Document CARGO_PROFILE_DEV_DEBUG=2 (the dev profile now ships line-tables-only), BITFUN_MOBILE_WEB_FORCE_BUILD=1 / --force (mobile-web builds are skipped when its dist is up to date) and VITE_USE_POLLING=1 (native watch events are the default again), plus a note that build:web now interleaves prefixed type-check and bundler output. The two parallel build wrappers also ended with process.exit(), which drops whatever is still queued on stdout when it is a pipe — as it is under CI. Set process.exitCode instead and let the process end on its own. * test(review): harden second-review findings - grep: add a multiline + head_limit test pinning pagination to physical lines (the property the earlier fix restored) - sharedResizeObserver: report subscriber callback errors instead of swallowing them silently - vite: when the project sits on a UNC share or WSL mount during dev, print a one-line hint about VITE_USE_POLLING=1 — users upgrading from the polling-based watcher would otherwise silently lose HMR there * chore(review): fix stale comments, drop dead API, gate new tests in CI Final read-through of the whole diff: - workspace_manager: the comment justified the dedicated cache handle by contention with "start_server's write lock", but nothing in the repo ever takes that lock for writing. Describe what the handle actually avoids. - markdown: front_matter_regex() was introduced with no callers (agent-runtime cannot depend on services-core and keeps its own static), so use the static directly and drop the exported wrapper. - dev.cjs / prune-monaco-nls.cjs: comments overstated what they do — the dev codegen-units override only matters with CARGO_INCREMENTAL=0, and the 1.4 MB figure covers the seven pruned NLS packs, not all nine. - fonts README still described the three deleted static weights as the directory's contents; rewrite it for the variable subset build. - CI: the file watch contract suite sits behind a non-default feature and neither it nor tool-runtime were in any cargo test step, so the regression guards added by this PR never ran. Add both to the OS matrix, matching the existing rationale for platform-sensitive contract suites. Also address the frontend read-through: move a render-phase ref write into the layout effect that already batches with it, use the repo's logger instead of a bare console.error, and assert repo-wide that monaco-editor is only ever imported as a type (the guard that keeps the 3.4 MB ESM copy out of the entry chunk). * ci: scope the new Rust test steps to green platform combinations Enabling these suites surfaced failures that predate this branch: - the file watch contracts fail on macOS (debounce and atomic-rename contracts time out under FSEvents coalescing) — tests this branch does not touch, on a suite that has never run in CI - tool-runtime's glob tests fail on Windows (walk-root derivation handles separators differently) — this branch does not touch glob at all Neither belongs to a performance change, so run what is green rather than either turning CI red or dropping the coverage: file watch on Linux and Windows (the platforms whose watch registration this branch alters), and the search module where the grep changes live. Both deserve their own fix. * ci: quote the search test filter so the workflow parses search:: at the end of an unquoted YAML scalar reads as a nested mapping, which made the whole workflow file invalid — GitHub failed the run at startup with no jobs at all. --------- Co-authored-by: bowen628 <bowen628@noreply.gitcode.com> | 1 个月前 | |
fix(release): publish versioned manual installer metadata | 1 个月前 | |
fix(release): publish versioned manual installer metadata | 1 个月前 | |
fix(web-ui): support markdown on older WebKit | 1 个月前 | |
fix(web-ui): support markdown on older WebKit | 1 个月前 | |
feat(release): add beta packaging channel | 1 个月前 | |
fix(release): harden beta channel publishing | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 1 个月前 | ||
| 27 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 30 天前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 4 个月前 | ||
| 7 个月前 | ||
| 5 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 28 天前 | ||
| 1 个月前 | ||
| 5 个月前 | ||
| 1 个月前 | ||
| 19 天前 | ||
| 19 天前 | ||
| 4 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 4 个月前 | ||
| 4 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 |