resolveMainHash walked the full source graph on every dev config load and
failed whenever root node_modules drifted from the Desktop lockfile. The
runtime already disables renderer OTA when MAIN_HASH is empty, so dev builds
now resolve to an empty hash unless MAIN_HASH is set explicitly.
Claude-Session: https://claude.ai/code/session_01DjXmqHj7t17UfwNuXMjfn3
* 🐛 fix(desktop): pin bundled npm deps through the Desktop lockfile
The main hash accepted any npm module that happened to resolve inside apps/desktop/node_modules, so a module linked from outside the frozen install (or from a stale store entry) could enter the renderer OTA hash without the lockfile ever pinning it.
Resolve each bundled module to its package name@version and require apps/desktop/pnpm-lock.yaml to pin it, keeping the file:/link:/git/tarball escape hatch for specifiers that pin by resolution instead of version.
partial-json is imported by packages/utils and packages/context-engine but was never declared, so the Desktop lockfile could not pin it: declare it in both packages and record it in apps/desktop/pnpm-lock.yaml.
* 🔊 chore(desktop): name the changed bundles before a dev restart
The dev orchestrator logged only that a main/preload bundle changed, which cannot distinguish the debounced restart from an unrelated vite rebuild. Collect every file reported by the watcher during the debounce window and print it with its event type, size and mtime.
* 📝 docs(acceptance): publish the round from the session's own observations
A delivery verified on the real product earlier in the session still had to re-run the plan and checker stage to obtain a published round. Document that those observations and artifacts are the evidence: write plan[] and cases[] from them, disclose anything never captured, and ingest.
* 🐛 fix(desktop): derive renderer OTA compatibility from source inputs
* 🐛 fix(desktop): set up Node before validating S3 releases
* 🐛 fix(desktop): report OTA decisions and preserve diagnostics
- server: emit X-Auth-Failure (jwt_expired / jwt_signature / user_inactive / no_token ...) next to X-Auth-Required on session UNAUTHORIZED responses
- desktop: log every 401/403 through the backend proxy at info level with hadToken, authRequired, authFailure and locally decoded JWT claims (sub / exp / expiredBy)
- desktop: add scripts/analyzeAuthLog.mjs (bun run log:auth) that turns a user's main.log into verdict codes with next steps
Claude-Session: https://claude.ai/code/session_01XjdtgxABquDMKeLZxu8q64
* 🐛 fix(desktop): hash renderer OTA main bundles
* 🐛 fix(desktop): hash externalized runtime modules in mainHash
Externalized main-process modules (electron-log, font-list, native addons
and their dependency trees) never reach the emitted bundles, so a renderer
OTA patch could be gated against an installed binary whose external runtime
module had changed.
Each platform now contributes an `externals` digest: name@version for
registry packages, plus full source content for workspace packages whose
version never bumps.
Claude-Session: https://claude.ai/code/session_01HNtnp2V5PrHc6tgrjwLRwN
* ♻️ refactor(desktop): unify update notification info
* test: avoid building main hash bundles in unit test
* ✨ feat(desktop): gzip renderer OTA CAS and keep r0 plus last-2 deltas
Tree-diff with zstd --patch-from instead of re-downloading the full renderer,
gzip the original CAS objects, and generate deltas from the packaged r0 tree
plus the two most recent patch versions.
* ♻️ refactor(desktop): simplify renderer OTA lineage
* 🐛 fix(ci): publish renderer base after r0
* ✨ feat(desktop): renderer OTA hot update without app restart
* 🐛 fix(desktop): address renderer OTA review findings
- compute mainHash only from committed files and include src/common
- inject UPDATE_SERVER_URL into beta builds so OTA is enabled
- validate all MPA entry htmls at staging, not just index.html
- use async fs for renderer tree hashing/staging off the main event loop
* ♻️ refactor(desktop): validate renderer OTA manifest with zod + zod-compiler
* 🐛 fix(desktop): pin renderer OTA build lineage
* 🐛 fix(desktop): isolate renderer OTA lineages
* 📝 docs(agent-browser): slim builtin skill content to a discovery stub
Drop the 2511-line inlined upstream reference (synced from v0.27.3) and
replace it with a 22-line stub: core loop, LobeHub-bundled note, and a
pointer to `agent-browser --help` / `skills get` for everything else.
Modern agents discover unfamiliar CLIs from `--help` better than they
parse a one-shot dump that drifts with every upstream release. Saves
~89 KB of system-prompt overhead per session.
Also bumps the description version pin to v0.31.1 to match the binary
the BinaryManager now installs.
* ♻️ refactor(desktop): replace ToolDetectorManager with BinaryManager + lazy install
The old `ToolDetectorManager` only knew how to ask "is this tool on PATH?".
Bundled binaries (today: agent-browser) were downloaded at build time by
`scripts/download-agent-browser.mjs`, baked into the installer, and pinned
to whatever version was current when the release was cut. Result:
v0.24.0 stayed in production while upstream moved to v0.31.1, and the
build-time download added ~10 MB to every install regardless of whether
the user touches the feature.
This unifies detection and install/upgrade into one `BinaryManager`:
- `BinarySpec.manage` describes how to install/upgrade a binary (release
URL fn, pinned or GitHub-latest version, post-install steps, macOS
Gatekeeper handling).
- `manager.ensure(name)` resolves to an absolute path — system PATH wins
when present, otherwise the managed cache wins, otherwise it downloads.
- `manager.install / upgrade` write into `userData/bin/<name>/<version>/`
with an `.installed` marker. Concurrent ensure() calls de-dupe through
an in-flight map.
- macOS quarantine is stripped on downloaded artifacts so ad-hoc-signed
Rust binaries actually exec instead of dying with SIGKILL.
- `manager.augmentPath()` re-adds installed managed dirs to PATH on
bootstrap so child agent processes can resolve the binary.
Migrates agent-browser onto this lifecycle:
- Spec carries `manage: { pinnedVersion: '0.31.1', release, postInstall:
[['install']], githubRepo: 'vercel-labs/agent-browser' }`.
- `electron-builder` no longer downloads the binary in `beforePack`,
`scripts/download-agent-browser.mjs` and the `download:agent-browser`
npm script are gone, and the per-version `apps/desktop/resources/bin/`
bundle drops out of the installer.
- App startup kicks off `binaryManager.ensure('agent-browser')` in the
background — first launch pulls v0.31.1 + Chrome via `agent-browser
install`; later launches short-circuit on the managed cache.
Companion rename (no behavior change): `ToolDetectorManager →
BinaryManager`, `IToolDetector → BinarySpec`, `ToolStatus → BinaryStatus`,
`toolDetectors/ → binaries/`, `ToolDetectorCtr → BinaryCtr` (IPC group
`toolDetector → binary`), renderer `toolDetectorService →
binaryService`. The `local-file-shell` `ToolDetector` contract is
preserved by name so the existing `getBestTool` injection keeps working.
End-to-end verified in dev Electron:
- system agent-browser on PATH → ensure returns the system path, no
download
- system agent-browser hidden → ensure downloads v0.31.1 (10.4 MB) to
`userData/bin/agent-browser/0.31.1/`, strips quarantine, runs
`agent-browser install` to pull Chrome, appends to PATH
- restart → augmentPath() picks up the cached install, no re-download
* 🐛 fix(spa): rename ToolStatus to BinaryStatus after ipc refactor
* 🐛 fix(desktop): ensure resources/bin exists before copying CLI bundle
The removal of download-agent-browser.mjs took with it the implicit
mkdir that created resources/bin/. On a fresh CI checkout the directory
no longer exists, so copyFile(cliSrc, cliDest) throws ENOENT.
* feat: add screen capture functionality with overlay support
- Implemented ScreenCaptureManager to handle screen capture sessions.
- Added ScreenCaptureCtr for IPC methods related to screen capture.
- Created overlay.html and ScreenCaptureOverlay component for user interaction.
- Integrated window enumeration and capture logic using node-screenshots and get-windows.
- Updated menu options to include screen capture actions.
- Enhanced RendererUrlManager to support overlay routing.
- Introduced drag selection for capturing specific screen areas.
- Added necessary types and events for screen capture in electron-client-ipc.
Signed-off-by: Innei <tukon479@gmail.com>
* ✨ feat(desktop): refine screen capture overlay flow
* ✨ feat(desktop): refine screen capture overlay flow
* ⚡ feat(desktop): optimize screen capture overlay flow
* Delete apps/desktop/mockup/screen-capture-overlay.html
* ✨ feat(desktop): open mini toolbar via double Option
* 🐛 fix(desktop): separate quick composer hotkey
* 💄 fix(desktop): remove stale quick composer accelerator
* 🐛 fix(desktop): stabilize double option monitor
* 🐛 fix(desktop): read hardware option key state
* 🐛 fix(desktop): standardize path imports and improve error handling
- Replaced `join` imports with `path` imports for consistency across files.
- Enhanced error handling in various modules to include error causes for better debugging.
- Updated test files to reflect changes in variable naming and mock implementations.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔥 chore(hotkey): drop orphan renderer quickComposer i18n entries
The `quickComposer` hotkey is registered only on the Electron side
(DESKTOP_GLOBAL_SHORTCUT_DEFAULTS + BrowserWindowsCtr.openQuickComposer);
the renderer never referenced these i18n keys, so the entries were dead.
`desktop.quickComposer` covers the app-level trigger.
* ⚡️ perf(screen-capture): parallelize overlay upload with route navigation
Overlay submit used to await screenshot upload before router.push,
blocking the main window for several seconds when the user was on an
unrelated page (e.g. /settings). Now we navigate immediately and run
upload in a background IIFE; MessageFromUrl waits on a new
`uploadStatus` field before calling sendMessage, so the chat page
mount and the upload proceed in parallel.
- Add `uploadStatus: 'uploading' | 'ready' | 'failed'` to
PendingOverlayDispatch; canConsumePendingOverlayDispatch blocks
while `'uploading'`.
- Store gains `markDispatchUploadComplete`; on failure it clears
screenshotFileNames so the prompt still delivers.
- Dispatcher drops stale prev search params on push to prevent
MessageFromUrl's message-param effect from double-firing.
* ⚡️ perf(screen-capture): pre-upload captures in overlay preview + per-thumbnail status
Move uploads from post-submit to preview time, bypassing dataUrl round-trips:
- Main process assigns captureId at preview time and ships the PNG bytes
as ArrayBuffer to the main renderer via `overlayUploadRequest`.
- Main renderer uploads through a dedicated pool (uploadWithProgress,
no chatUploadFileList pollution); reports status back to the overlay
through `overlayCaptureUploadStatus`.
- Overlay thumbnails render a spinner / error badge based on status;
the send button stays grey until every capture resolves to `ready`.
- Submit now carries only captureIds; MessageFromUrl awaits the pool
promises before sendMessage, removing the second upload pass.
- Carry overlay-selected modelId/provider into the agent config so the
first message actually uses the user-chosen model (fixes the bug where
switching the model on the overlay had no effect).
* update
* ✨ feat(popup): add Quick Chat tray entry backed by Inbox agent
Tray menu now exposes a "Quick Chat" action that opens (or focuses)
a single-instance popup window at `/popup/agent/inbox`. Each fresh
open starts with no active topic; the first message creates one
through the normal agent flow.
- New `PopupAgentQuickPage` resolves the inbox slug via
`builtinAgentSelectors.inboxAgentId` so `activeAgentId` points at
the real entity in `agentMap` (fixes the stuck-loading / skeleton
state from using the literal `'inbox'` slug).
- `BrowserManager.openQuickChatPopup` wraps
`createMultiInstanceWindow` with a fixed `topicPopup_quick_inbox`
uniqueId so repeat clicks focus rather than spawn.
- Wire the action into macOS / Windows / Linux tray menus and add
the `tray.quickChat` i18n key.
* Add quick chat shortcut and desktop hotkey support
* ✨ feat(screen-capture): enhance window enumeration with scale factor support
- Updated `enumerateWindows` to accept an optional `displayScaleFactor` parameter for improved window geometry normalization on high-DPI displays.
- Refactored `normalizeWindowBounds` to handle scaling based on the provided scale factor, ensuring accurate window dimensions across different platforms.
- Adjusted tests in `WindowSourceService.test.ts` to validate the new scaling behavior for both Windows and macOS environments.
- Minor adjustments in `ScreenCaptureManager` to accommodate the updated window enumeration logic.
---------
Signed-off-by: Innei <tukon479@gmail.com>
* 🐛 fix(desktop): update bundled agent-browser to v0.20.1 and align native-mode docs
Upgrade desktop bundled agent-browser to 0.20.1 and remove obsolete AGENT_BROWSER_NATIVE runtime override since native mode is now default. Update builtin agent-browser skill descriptions to reflect the new default behavior.
Made-with: Cursor
* ✨ feat: enable agent-browser skill on Windows desktop
Made-with: Cursor
* 🔧 refactor: remove isWindows from ToolAvailabilityContext interface
Updated the ToolAvailabilityContext interface to remove the isWindows property, simplifying the context checks in the isBuiltinSkillAvailableInCurrentEnv function.
Signed-off-by: Innei <tukon479@gmail.com>
---------
Signed-off-by: Innei <tukon479@gmail.com>
* ✨ feat(tool-detectors): add browser automation support and refactor tool detector categories
- Introduced browser automation detectors to the tool detector manager.
- Updated tool categories to include 'browser-automation'.
- Refactored imports to use type imports where applicable for better clarity.
- Cleaned up unnecessary comments in tool filters.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 chore: add browser automation tool detection UI
* 🔧 chore: update react-scan version and enhance agent-browser documentation
- Updated `react-scan` dependency from version 0.4.3 to 0.5.3 in package.json.
- Improved documentation in `content.ts` for the agent-browser, clarifying command usage and workflows.
- Added development mode flag `__DEV__` in sharedRendererConfig for better environment handling.
- Integrated `scan` functionality in `initialize.ts` to enable scanning in development mode.
- Updated global type definitions to include `__DEV__` constant for clarity.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 chore(builtin-skills): add dependency and refactor skill filtering logic
- Added `@lobechat/const` as a dependency in package.json.
- Introduced a new function `shouldEnableBuiltinSkill` to determine if a skill should be enabled based on the environment.
- Refactored the `builtinSkills` export to filter skills using the new logic.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 chore(builtin-skills): refactor skill management and add filtering logic
- Removed unnecessary dependency from package.json.
- Simplified skill filtering logic by introducing `filterBuiltinSkills` and `shouldEnableBuiltinSkill` functions.
- Updated various components to utilize the new filtering logic for managing builtin skills based on the environment.
Signed-off-by: Innei <tukon479@gmail.com>
* ✨ feat(builtin-skills): introduce new skill APIs and refactor manifest structure
- Added new APIs for skill management: `runSkillApi`, `readReferenceApi`, and `exportFileApi` to enhance functionality.
- Created a base manifest file (`manifest.base.ts`) to centralize API definitions.
- Updated the desktop manifest (`manifest.desktop.ts`) to utilize the new base APIs.
- Refactored existing manifest to streamline API integration and improve maintainability.
- Introduced a detailed system prompt for better user guidance on skill usage.
Signed-off-by: Innei <tukon479@gmail.com>
* ✨ feat: desktop skill runtime, skill store inspectors, and tool UI updates
Made-with: Cursor
* ✨ feat: enhance skill import functionality and testing
- Updated `importFromUrl` method in `SkillImporter` to accept additional options for identifier and source.
- Modified `importFromMarket` in `agentSkillsRouter` to utilize the new options for better tracking of skill imports.
- Added integration tests to ensure stable behavior when re-importing skills from the market, verifying that identifiers remain consistent across imports.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 chore: update .gitignore and package.json dependencies
- Added 'bin' to .gitignore to exclude binary files from version control.
- Included 'fflate' as a new dependency in package.json to support file compression in the application.
- Updated writeFile method in LocalFileCtr to handle file content as Uint8Array for improved type safety.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 chore: update package.json dependencies
- Removed 'fflate' from dependencies and added it to devDependencies for better organization.
- Ensured proper formatting by adding a newline at the end of the file.
Signed-off-by: Innei <tukon479@gmail.com>
* ✨ feat: add agent-browser download script and integrate binary handling
- Introduced a new script to download the `agent-browser` binary, ensuring it is available for the application.
- Updated `electron-builder.mjs` to include the binary in the build process.
- Modified `dir.ts` to define the binary directory path based on the packaging state.
- Enhanced the `App` class to set environment variables for the agent-browser integration.
Signed-off-by: Innei <tukon479@gmail.com>
* ✨ feat: add DevTools toggle to Linux and Windows menus
- Introduced a new menu item for toggling DevTools with the F12 accelerator key in both Linux and Windows menu implementations.
- Added a separator for better organization of the view submenu items.
Signed-off-by: Innei <tukon479@gmail.com>
* ✨ feat: integrate agent-browser binary download into build process
- Added functionality to download the `agent-browser` binary during the build process in `electron-builder.mjs`.
- Enhanced the download script with detailed logging for better visibility of the download status and errors.
- Updated the `App` class to log the binary directory path for improved debugging.
- Reintroduced the `AuthRequiredModal` in the layout for desktop users.
Signed-off-by: Innei <tukon479@gmail.com>
* fix: mock binary directory path in tests
- Added a mock for the binary directory path in the App tests to facilitate testing of the agent-browser integration.
- This change enhances the test environment by providing a consistent path for the binary during test execution.
Signed-off-by: Innei <tukon479@gmail.com>
* 🐛 fix: improve authorization notification handling
- Updated the `notifyAuthorizationRequired` method to implement trailing-edge debounce, ensuring that rapid 401 responses are coalesced and the IPC event is sent after the burst settles.
- Refactored the notification logic to enhance clarity and maintainability.
✨ feat: add desktop onboarding redirect
- Introduced a `useEffect` hook in `StoreInitialization` to redirect users to the `/desktop-onboarding` page if onboarding is not completed, ensuring a smoother user experience on fresh installs.
Signed-off-by: Innei <tukon479@gmail.com>
* 🐛 fix(desktop): hide Agent Browser skill on Windows
Made-with: Cursor
* 🔧 chore: update memory limits for build processes
- Increased the `NODE_OPTIONS` memory limit for both `build:next` and `build:spa` scripts from 6144 to 7168, optimizing build performance and resource management.
Signed-off-by: Innei <tukon479@gmail.com>
---------
Signed-off-by: Innei <tukon479@gmail.com>
* ✨ feat(desktop): add update channel settings for desktop app
* 🔧 chore(desktop): update test scripts for multi-channel update flow
- Support stable/nightly/canary channel structure in generate-manifest.sh
- Add --all-channels flag for generating manifests across all channels
- Dual-mode run-test.sh: packaged (full updater) and --dev (UI only)
- Fix package:mac:local to skip signing for local builds
- Document Squirrel.Mac signature validation limitation
* 🔧 chore(desktop): update local app update configuration
- Change provider from GitHub to Generic for local testing.
- Update local server URL and cache directory settings.
- Revise comments for clarity on usage and configuration.
Signed-off-by: Innei <tukon479@gmail.com>
* 🐛 fix(desktop): fix update channel switch race condition and downgrade flag
- P1: Use generation counter to discard stale check results when channel
is switched mid-flight. Pending recheck is scheduled after current check
completes instead of forcing concurrent checks.
- P2: Explicitly reset allowDowngrade=false on non-downgrade transitions
to prevent stale downgrade permission from persisting.
- Fix GitHub fallback repo name (lobe-chat -> lobehub).
* 🔧 chore(settings): remove dynamic import for Beta component from componentMap
- Eliminated the dynamic import for the Beta settings tab, streamlining the component map.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 chore(settings): simplify UpdateChannel component structure
- Refactored the UpdateChannel component to streamline the Select component usage by removing unnecessary nested children.
Signed-off-by: Innei <tukon479@gmail.com>
* update
* 🐛 fix(desktop): strip channel suffix from UPDATE_SERVER_URL before appending channel
The UPDATE_SERVER_URL secret may already contain a channel path (e.g., /stable).
Previously, the code unconditionally appended /{channel}, resulting in double
paths like /stable/stable/stable-mac.yml.
Now both electron-builder.mjs and UpdaterManager strip any trailing channel
suffix before re-appending the correct channel, supporting both legacy URLs
(with channel) and clean base URLs.
* update
* update
* redesign ui
- Added `getUpdaterState` method to `UpdaterManager` for retrieving current update status.
- Introduced `UpdaterState` type to encapsulate update progress, stage, and error messages.
- Updated UI components to reflect update states, including checking, downloading, and latest version notifications.
- Enhanced menu items for macOS and Windows to display appropriate update statuses.
- Localized new update messages in English and Chinese.
This improves user experience by providing real-time feedback during the update process.
Signed-off-by: Innei <tukon479@gmail.com>
* Enhance UpdaterManager tests and mock implementations
- Updated tests for UpdaterManager to reflect changes in broadcasting update states, including 'checking', 'downloading', and 'error' stages.
- Modified mock implementations in macOS and Windows test files to include `getUpdaterState` and `installNow` methods for better state management.
- Improved test coverage for update availability and download processes.
These changes ensure more accurate testing of the update flow and enhance the overall reliability of the UpdaterManager functionality.
Signed-off-by: Innei <tukon479@gmail.com>
---------
Signed-off-by: Innei <tukon479@gmail.com>
* v2 init
* chore: update eslint suppressions and package dependencies
- Removed several eslint suppressions related to array sorting and reversing from eslint-suppressions.json to clean up the configuration.
- Updated @lobehub/lint package version from 2.0.0-beta.6 to 2.0.0-beta.7 in package.json for improvements and bug fixes.
- Made minor formatting adjustments in vitest.config.mts and various SKILL.md files for better readability and consistency.
Signed-off-by: Innei <tukon479@gmail.com>
* fix: clean up import statements and formatting
- Removed unnecessary whitespace in replaceComponentImports.ts for improved readability.
- Standardized import statements in contextEngineering.ts and createAgentExecutors.ts by adding missing spaces for consistency.
Signed-off-by: Innei <tukon479@gmail.com>
* chore: update eslint suppressions and clean up code formatting
* 🐛 fix: use vi.hoisted for mock variable initialization
Fix TDZ error in persona service test by using vi.hoisted() to ensure
mock variables are available when vi.mock factory runs.
---------
Signed-off-by: Innei <tukon479@gmail.com>
* 🐛 fix(desktop): add auth required modal and improve error handling
- Add AuthRequiredModal component to handle authentication expiration
- Improve backend proxy protocol error handling for auth errors
- Add updater manager authentication header support
- Add i18n strings for auth error messages
* 🔧 fix(desktop): update UpdaterManager to leave channel unset for GitHub prerelease matching
- Modify UpdaterManager to leave the channel unset, allowing GitHub to use version tags for prerelease matching.
- Update logging to reflect the new behavior when the channel is unset or kept as is.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 fix(desktop): clarify UpdaterManager behavior for GitHub provider
- Update comments and logging in UpdaterManager to clarify that the channel is left unset for beta/nightly, allowing GitHub to use version tags for prerelease matching.
- Ensure logging accurately reflects the new behavior when the channel is unset.
Signed-off-by: Innei <tukon479@gmail.com>
* ✨ feat(desktop): add desktop build channel script and update documentation
- Introduced a new script for building desktop applications for specific release channels (stable, beta, nightly).
- Updated package.json to include a new npm command for the build channel.
- Enhanced README documentation to guide users on simulating CI channel builds and retaining changes.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 fix(desktop): streamline NODE_ENV usage in logger and config
- Removed redundant process.env.NODE_ENV definition from electron.vite.config.ts.
- Simplified logger implementation by directly using process.env.NODE_ENV for environment checks.
- Improved readability and maintainability of logging behavior based on the environment.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 fix(desktop): enhance logging configuration to support debug mode
- Updated logger configuration to allow for debug level logging when DEBUG environment variable is set.
- Simplified the logic for console logging levels based on the environment, improving clarity and maintainability.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 fix(desktop): enhance version generation and logging in UpdaterManager
- Updated version generation logic in manual-build-desktop.yml to handle channel suffixes more effectively.
- Added inferredChannel logging in UpdaterManager to improve clarity on the current update channel being used.
Signed-off-by: Innei <tukon479@gmail.com>
* 🔧 fix(desktop): update localization files and set default entry locale to English
- Changed default entry locale from Chinese (zh-CN) to English (en) in .i18nrc.js.
- Added full disk access messages in multiple languages (Arabic, Bulgarian, German, Spanish, French, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Russian, Turkish, Vietnamese, Traditional Chinese).
- Enhanced menu localization with new settings and permissions options across various languages.
Signed-off-by: Innei <tukon479@gmail.com>
---------
Signed-off-by: Innei <tukon479@gmail.com>
* chore: stable updater
* ✨ feat: add local update testing scripts and configuration
- Introduced scripts for local update testing, including setup, server management, and manifest generation.
- Added `dev-app-update.local.yml` for local server configuration.
- Implemented `generate-manifest.sh` to create update manifests.
- Created `run-test.sh` for streamlined testing process.
- Updated `README.md` with instructions for local testing setup and usage.
- Enhanced `UpdaterManager` to allow forced use of dev update configuration in packaged apps.
Signed-off-by: Innei <tukon479@gmail.com>
* 🐛 fix(desktop): update UpdaterManager test mocks for new exports
Add missing mock exports for @/modules/updater/configs:
- isStableChannel
- githubConfig
- UPDATE_SERVER_URL
Add mock for @/env with getDesktopEnv
Add setFeedURL method to autoUpdater mock
* ✨ feat: add Conductor setup scripts and configuration
* ✨ feat: enhance update modal functionality and refactor modal hooks
- Added `useUpdateModal` for managing update modal state and behavior.
- Refactored `UpdateModal` to utilize new modal management approach.
- Improved `useWatchBroadcast` integration for handling update events.
- Removed deprecated `createModalHooks` and related components from `FunctionModal`.
- Updated `AddFilesToKnowledgeBase` and `CreateNew` modals to use new modal context for closing behavior.
This refactor streamlines modal management and enhances the user experience during update processes.
Signed-off-by: Innei <tukon479@gmail.com>
* update flow (#11513)
* ci: simplify desktop release workflow and add renderer tarball
* 👷 ci: fix s3 upload credentials for desktop release
* 🐛 fix(ci): use compact jq output for GitHub Actions matrix
Add -c flag to jq commands to produce single-line JSON output,
fixing "Invalid format" error when setting GITHUB_OUTPUT.
* 🐛 fix(ci): add administration permission to detect self-hosted runner
The /actions/runners API requires administration:read permission
to list repository runners.
* 🔧 refactor(ci): use workflow input for self-hosted runner selection
Replace API-based runner detection with workflow input parameter since
GITHUB_TOKEN lacks permission to call /actions/runners API.
- Add `use_self_hosted_mac` input (default: true)
- Release events always use self-hosted runner
- Manual dispatch can toggle via input
* feat(updater): add stable channel support with fallback mechanism
- Configure electron-builder to generate stable-mac.yml for stable channel
- Update CI workflow to handle both stable and latest manifest files
- Implement fallback to GitHub provider when primary S3 provider fails
- Reset to primary provider after successful update check
* 🐛 fix(updater): remove invalid channel config from electron-builder
- Remove unsupported 'channel' property from electron-builder config
- Create stable*.yml files from latest*.yml in workflow instead
- This ensures electron-updater finds correct manifest for stable channel
* 🐛 fix(updater): use correct channel based on provider type
- S3 provider: channel='stable' → looks for stable-mac.yml
- GitHub provider: channel='latest' → looks for latest-mac.yml
This fixes the 404 error when falling back to GitHub releases,
which only have latest-mac.yml files.
* refactor(env): remove unused OFFICIAL_CLOUD_SERVER and update env defaults
Update environment variable handling by removing unused OFFICIAL_CLOUD_SERVER and setting defaults for UPDATE_CHANNEL and UPDATE_SERVER_URL from process.env during build stage.
* 🐛 fix(ci): add version prefix to stable manifest URLs for S3
S3 directory structure: stable/{version}/xxx.dmg
So stable-mac.yml URLs need version prefix:
url: LobeHub-2.1.0-arm64.dmg → url: 2.1.1/LobeHub-2.1.0-arm64.dmg
* ✨ feat(ci): add renderer tar manifest for integrity verification
Creates stable-renderer.yml with SHA512 checksum for lobehub-renderer.tar.gz
This allows the desktop app to verify renderer tarball integrity before extraction.
* 🐛 fix(ci): fix YAML syntax error in renderer manifest generation
* ✨ feat(ci): archive manifest files in version directory
* refactor(ci): update desktop release workflows to streamline build process
- Removed unnecessary dependencies in the build job for the desktop beta workflow.
- Introduced a new gate job to conditionally proceed with publishing based on the success of previous jobs.
- Updated macOS file merging to depend on the new gate job instead of the build job.
- Simplified macOS runner selection logic in the stable workflow by using GitHub-hosted runners exclusively.
Signed-off-by: Innei <tukon479@gmail.com>
* refactor(electron): reorganize titlebar components and update imports
- Moved titlebar components to a new directory structure for better organization.
- Updated import paths for `SimpleTitleBar`, `TitleBar`, and related constants.
- Introduced new components for connection management and navigation within the titlebar.
- Added constants for title bar height to maintain consistency across components.
This refactor enhances the maintainability of the titlebar code and improves the overall structure of the Electron application.
Signed-off-by: Innei <tukon479@gmail.com>
* feat(ci): add release notes handling to desktop stable workflow
- Enhanced the desktop stable release workflow to include release notes.
- Updated output variables to capture release notes from the GitHub event.
- Adjusted environment variables in subsequent jobs to utilize the new release notes data.
This addition improves the clarity and documentation of releases by ensuring that release notes are included in the workflow process.
Signed-off-by: Innei <tukon479@gmail.com>
* 🐛 fix: call onClose after knowledge base modal closes
* 🧪 test: fix UpdaterManager update channel mocks
---------
Signed-off-by: Innei <tukon479@gmail.com>
* add desktop
fix build
update release desktop ci
improve desktop build for pr workflow
update desktop build workflow
test auto updater
fix
fix release nightly channel
support shortcut framework
improve nightly version rule
add zip release
only add mac publish
fix static file relative issue
support delete files
fix lint
enable asar
add setting open in editor in menu
add electron store framework and locale update flow
fix default searchFCModel
refactor the electron server ipc to stable mode
improve electron dev workflow
improve electron build workflow
make qwen2.5b default
improve comment workflow
fix types
refactor code
improve window size of settings/provider
路由拦截器v3.5
fix RouteIntercept issue
improve log
use productName in package.json
update
add pin list for feature flag
update
sure settings update
make ollama as default provider in desktop
fix desktop close page issue
fix desktop default variants
improve to reduce bundle
improve to reduce bundle again
improve set desktop version workflow
add nightly icons
add prebuild scripts to reduce package size
add to test prebuild
fix workflow
try to add sign and notarize for mac in workflow
try to add sign and notarize
add i18n for menu and main
update menu i18n
add i18n framework
add menu implement and setting
improve layout design for desktop
update Author
fix failed register protocol
fix prod building
fix tests
fix open error of mac and windows
improve lint
update pr comment
add service framework
add fileSearchService
improve
fix release workflow
add header
improve pr workflow fetch
improve client fetch
add linux upload workflow
improve workflow and implement
fix build electron in ci
build the desktop framework
fix build electron in ci
update tsconfig
fix desktop build workflow
finish desktop build workflow
fix workflow build steps
update workflow
test release workflow
refactor
update
update
improve loading state
refactor the 404 error
* 重构存储路径,统一到一个 lobehub-storage 下,方便未来用户自定义存储路径
* fix lint
* update
* try to fix windows open issue
* rename
* fix storage
* refactor the remote server sync
* refactor the request method
* 完成服务端同步实现逻辑
* fix lint
* save size
* refactor to make sure different instance of ipc channel
* clean log
* fix refresh
* fix tools calling
* fix auth callback issue
* update workflow
* add window ico
* push
* update
* add beta release
* fix update issue
* 完成官方实例链接
* fix
* fix stdio