The resources/database/drizzle SQL files and meta snapshots are v1-era CherryClaw agents-db migrations with no runtime consumer — the active v2 migrations live in migrations/sqlite-drizzle and are loaded from app.database.migrations. Delete the directory and clean up the now-dangling references: three source comments in AgentsDbMappings.ts that cited the deleted SQL files as the v1 column-type source (the epoch-ms notes are kept inline), and a stale doc row in cherryclaw/scheduler.md pointing to a migration file that no longer exists.
### What this PR does
**Before this PR**, Cherry Studio managed external CLI binaries through
five uncoordinated mechanisms — each requiring its own download script,
IPC channel, and on-disk layout:
| Mechanism | Where it lived | How it worked |
|---|---|---|
| rtk extraction | `src/main/utils/rtk.ts` + `AgentBootstrapService` |
Copies bundled binary to `~/.cherrystudio/bin/` |
| OpenClaw installer | `resources/scripts/install-openclaw.js` |
Downloads from GitHub/mirror with custom extraction |
| CodeCliService | `src/main/services/CodeCliService.ts` | `bun install
-g` to `~/.cherrystudio/install/global/` |
| ripgrep | `node_modules/@anthropic-ai/claude-agent-sdk/vendor/` |
Vendored, hardcoded path in `FileStorage` |
| (old) MiseService | `src/main/services/MiseService.ts` | Bundled mise
+ `mise use -g` |
**After this PR**, a single `BinaryManager` lifecycle service owns all
third-party CLI binary acquisition. It wraps
[mise](https://mise.jdx.dev) as the only acquisition backend (no custom
`BinaryBackend` interface — mise's polyglot grammar already covers
`npm:`, `pipx:`, `github:`, registry entries). Tools install into an
isolated environment under `~/.cherrystudio/mise/` so user-level mise
installs are never touched. `uv`, `bun`, `rg`, and mise itself ship
bundled at build time for instant first-run availability; everything
else flows through mise on demand.
<img width=\"1304\" height=\"714\" alt=\"BinaryManager settings UI\"
src=\"https://github.com/user-attachments/assets/7a4b78ab-5aa2-4e97-9ab7-134b20a4d78d\"
/>
<img width=\"1165\" height=\"748\" alt=\"Three-state managed vs bundled
vs not-installed\"
src=\"https://github.com/user-attachments/assets/a0dcfb7d-8bc3-4acd-b563-0fc04d99e252\"
/>
<img width=\"523\" height=\"328\" alt=\"Custom tool dialog\"
src=\"https://github.com/user-attachments/assets/90c3ee95-7f2a-4daf-a334-f20de6ff5ca2\"
/>
Fixes#15183. Addresses #15370.
### Why we need it and why it was done in this way
Adding a new managed CLI tool should be a one-line preset entry — not 4+
files of bespoke download/extract/IPC code. mise is a mature polyglot
tool manager that already speaks the backends Cherry needs.
**Tradeoffs made:**
- **mise bundled at build time** (~15 MB per platform) rather than
downloaded at first run — faster first-run UX, no chicken-and-egg on a
fresh install.
- **Fully isolated mise environment** (\`HOME\`/\`XDG_*\`/\`MISE_*\` all
relocated under \`feature.binaries.data\`) — Cherry never reads or
writes the user's own \`~/.config/mise/\` or \`~/.local/share/mise/\`.
- **No custom \`BinaryBackend\` interface.** mise's grammar (\`npm:\`,
\`pipx:\`, \`github:\`, registry) is already polyglot; wrapping it would
be a shallow seam that re-implements what mise owns. Removing this
abstraction makes consumers simpler (deletion test passes).
- **Auth-token policy: opt-in only.** Ambient \`GITHUB_TOKEN\` /
\`GH_TOKEN\` are not forwarded into mise's process env. Users who hit
GitHub's unauthenticated 60 req/hr API limit can set
\`CHERRY_GITHUB_TOKEN\` to raise it to 5000 req/hr without consenting to
share their general shell token.
- **China mirror auto-detection.** \`isUserInChina()\` toggles
\`NPM_CONFIG_REGISTRY=registry.npmmirror.com\` +
\`PIP_INDEX_URL=pypi.tuna.tsinghua.edu.cn\` for every npm/pipx backend
transparently.
**Alternatives considered:**
- *Keep per-tool install scripts.* Doesn't scale — each new tool is 4+
files of duplicated logic.
- *Use mise from user's \`PATH\`.* Would depend on user having mise
installed and could conflict with their config.
- *Custom \`BinaryBackend\` abstraction.* Shallow wrapper over mise's
grammar; no second backend in sight; deletion test passes.
**Scope (what's in / what's out):**
- **In:** uv, bun, ripgrep, claude-code, openclaw, gh, opencode,
gemini-cli, lark, kimi-cli, qwen-code, iflow-cli, github-copilot-cli —
anything mise can install as a single relocatable binary.
- **Out:** \`OvmsManager\` (multi-file server provisioning, hardware
detection, generated config); Tesseract OCR data (not a binary; lives
with \`OvOcrService\`).
### Breaking changes
None at the user-facing layer. v2 data is throwaway per CLAUDE.md, so
the preference-key rename (\`feature.mise.*\` → \`feature.binaries.*\`)
intentionally ships without a migrator.
### Special notes for your reviewer
**Architecture & docs**
- \`docs/references/binary-manager/README.md\` — scope criterion,
persisted/contract surface, bundled-vs-mise state contract, China mirror
behavior, \`CHERRY_GITHUB_TOKEN\` opt-in, adding a new managed binary.
- \`CLAUDE.md\` adds a \`**MUST READ**\` link next to Lifecycle / Window
Manager / Data / Paths.
- The mise-shim-wins-over-\`cherry.bin\` precedence rule is documented
in the README's "State contract" section.
**Code orientation**
- \`src/main/services/BinaryManager.ts\` — the lifecycle service. Wraps
mise via \`runMise()\`; isolated env in \`buildIsolatedEnv()\`; bundled
extraction with atomic tmp+rename; per-tool try/catch so a single
failure can't abort init; \`isManagedBinaryReady()\` verifies the
resolved file is executable (not just that mise thinks it's installed).
- \`packages/shared/data/presets/binary-tools.ts\` —
\`PREDEFINED_BINARY_TOOLS\` registry; \`tool\` field is a mise spec.
-
\`src/renderer/src/pages/settings/McpSettings/EnvironmentDependencies.tsx\`
— three-state UI (\`managed\` / \`bundled\` / \`not-installed\`) backed
by \`Binary_GetState\` + \`Binary_ProbeBundled\`.
- \`scripts/download-binaries.js\` — build-time downloader for mise / uv
/ bun / rg (HTTPS + sha256-verified, archive-aware extraction).
**Migration**
- \`OpenClawService.install()\` is now two lines delegating to
\`BinaryManager\` — \`install-openclaw.js\` is gone.
- \`CodeCliService\` no longer uses \`bun install -g\`; the
\`BUN_INSTALL\` / \`~/.cherrystudio/install/global/\` path is removed.
- \`FileStorage.getRipgrepBinaryPath()\` now resolves via
\`getBinaryPath('rg')\`; the vendored SDK rg is no longer used.
- \`extractRtkBinaries\` + the \`AgentBootstrapService\` call are
deleted. \`rtkRewrite()\` degrades gracefully when rtk is absent;
\`rtkAvailable\` caches with a 60s TTL so install-via-mise takes effect
without restart.
**Multi-round review**
Two adversarial review rounds against this branch (Bug Hunter / Security
/ Architecture / Correctness) ran during development; both rounds'
High-severity findings are addressed in commits \`70afde6af\` and
\`1d864439d\`. R3 known follow-ups (architecture duplications in
\`CodeCliService\`'s switch statements, etc.) are tracked as Medium and
intentionally deferred.
### Checklist
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: Write code that humans can understand and Keep it simple
- [x] Refactor: Leaves binary acquisition meaningfully cleaner than
before (five mechanisms → one)
- [x] Upgrade: v2 data is throwaway; no migrator needed and the absence
is intentional
- [x] Documentation: \`docs/references/binary-manager/README.md\` +
\`CLAUDE.md\` Architecture section
- [x] Self-review: Two multi-perspective review rounds against the
branch; all Highs addressed
### Release note
\`\`\`release-note
NONE
\`\`\`
---------
Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Signed-off-by: Vaayne Liu <vaayne@macos.shared>
Co-authored-by: fullex <106392080+0xfullex@users.noreply.github.com>
### What this PR does
Before this PR:
Cherry Assistant's
`resources/builtin-agents/cherry-assistant/agent.json` had no
`configuration.avatar` field. The Agent rendering path falls back to a
generic `⭐️` when no avatar is set (see
`src/renderer/src/pages/settings/AgentSettings/components/NameSetting.tsx:27`
and `shared.tsx:98`), so users saw an off-brand star icon for the
built-in Cherry Assistant.
After this PR:
Sets `configuration.avatar` to `🍒` in `cherry-assistant/agent.json`,
matching Cherry Studio's brand. The value is consumed by the existing
`agent?.configuration?.avatar || '⭐️'` fallback, so no renderer changes
are needed.
Partially addresses #14253.
### Why we need it and why it was done in this way
`#14253` reports that both built-in agents ship with the wrong icons:
1. **Cherry Assistant** — should be `🍒`, currently renders as `⭐️` (user
called it 🌟 in the issue).
2. **Cherry Claw** — should be a custom lobster/claw SVG/PNG asset,
currently renders as `🦞` (hard-coded in `AgentService.ts:327`).
This PR only addresses (1) because it is a pure data change (one JSON
field). Fixing (2) requires shipping a design-delivered raster/vector
asset and changing the avatar rendering path to support non-emoji
avatars; that is out of scope for a `main`-branch hotfix and will be
handled in a separate PR once the asset is provided.
The following tradeoffs were made:
- Chose the same emoji delivery mechanism (`configuration.avatar`) used
by `Cherry Claw`, instead of introducing an image asset, to keep the
change minimal and consistent with existing built-in agent conventions.
The following alternatives were considered:
- Bundling both Cherry Assistant and Cherry Claw fixes in one PR.
Rejected because the Claw fix needs a new design asset and an
avatar-rendering change.
Links to places where the discussion took place: N/A
### Breaking changes
None. JSON schema is unchanged; `avatar` is an existing optional field
already consumed by the renderer.
### Special notes for your reviewer
- After merge, only new installations will pick up the avatar. Existing
users who already have the seeded Cherry Assistant agent will need
either a reset or a one-time migration to see the new avatar. This
matches how `Cherry Claw`'s avatar is delivered (hard-coded at seed
time, no migration), so no new upgrade-path code is introduced here.
- Cherry Claw's `🦞` → custom lobster asset is intentionally not fixed in
this PR.
### Checklist
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: [Write code that humans can
understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
- [x] Refactor: You have [left the code cleaner than you found it (Boy
Scout
Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
- [x] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [x] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required. Check this only
when the PR introduces or changes a user-facing feature or behavior.
- [x] Self-review: I have reviewed my own code (e.g., via
[`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
or GitHub UI) before requesting review from others
### Release note
```release-note
fix: Cherry Assistant built-in agent now displays the 🍒 avatar instead of the generic ⭐️ fallback
```
Signed-off-by: suyao <sy20010504@gmail.com>
### What this PR does
Before this PR:
Skills were enabled/disabled globally — toggling a skill affected all
agents. Symlinks were created in a global `.claude/skills/` directory.
Backup restore from another machine could cause EACCES errors when
workspace paths referenced non-existent directories.
After this PR:
Each agent has its own set of enabled skills tracked via the
`agent_skills` join table. Symlinks are created per-agent at
`{workspace}/.claude/skills/`. Workspace paths are validated before
symlink operations, preventing EACCES on restored backups.
### Why we need it and why it was done in this way
The following tradeoffs were made:
- Added a new `agent_skills` join table rather than modifying the
existing `skills` table, to cleanly separate per-agent state from the
global skill library
- A data migration seeds `agent_skills` from the legacy
`skills.is_enabled` column so existing users keep their enabled skills
after upgrading
- The legacy `is_enabled` column is kept for schema compatibility but no
longer read or written
The following alternatives were considered:
- Storing per-agent skill config in the `agents` table JSON blob —
rejected because a normalized join table is cleaner for queries and FK
cascade deletes
### Breaking changes
None. The data migration transparently upgrades existing skill
enablement state to the per-agent model.
### Special notes for your reviewer
- The `agent_skills` schema migration is `0006_famous_fallen_one.sql`
- The data migration (`migrateSkillsPerAgent.ts`) is idempotent and
handles fresh DBs gracefully
- Workspace path validation (`directoryExists` check) in
`getAgentWorkspace` and `enableForAllAgents` prevents EACCES when
`accessible_paths` contains paths from another machine (backup restore
scenario)
- Minor React perf optimizations in `SkillsSettings.tsx`: parallelized
batch uninstall, removed unnecessary `useMemo`, lazy `useState`
initializers
### Checklist
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: [Write code that humans can
understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
- [x] Refactor: You have [left the code cleaner than you found it (Boy
Scout
Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
- [ ] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required. Check this only
when the PR introduces or changes a user-facing feature or behavior.
- [ ] Self-review: I have reviewed my own code (e.g., via
[`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
or GitHub UI) before requesting review from others
### Release note
```release-note
NONE
```
---------
Signed-off-by: suyao <sy20010504@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: 亢奋猫 <kangfenmao@qq.com>
### What this PR does
Before this PR:
- Inside agent chat, the `skill-creator` skill could not actually
persist a new skill. The agent would write `SKILL.md` files to disk, but
the global skill DB row and `.claude/skills/` symlink were never
created, so authored skills silently failed to take effect.
- `SkillInstaller.install` was destructive when source and destination
resolved to the same path: the backup-and-rename step moved the source
out from under the subsequent copy, leaving no way to install from an
in-place source.
- Agents in the sidebar showed an unexplained purple `SOUL` badge next
to their name when Soul Mode was on, crowding out the agent name and
using internal jargon users could not understand.
After this PR:
- The claw MCP `skills` tool gains two new actions:
- `init name=<name>` — creates / resolves the absolute target directory
under the global Skills storage root and returns it to the agent.
- `register name=<name>` — registers the in-place directory through the
existing `installFromDirectory` pipeline and toggles the skill on for
the current session.
- `installSkill` (marketplace install) now also auto-toggles the skill
on, so an agent-driven install from chat is immediately usable without a
UI roundtrip.
- `SkillInstaller.install` short-circuits when src and dest resolve to
the same path.
- `SkillService.installSkillDir` detects in-place input under the Skills
root and preserves the existing basename as the folder name, avoiding
sanitize drift between caller-chosen names and `parseSkillMetadata`'s
derived filename.
- New public `SkillService.getSkillDirectory(name)` helper exposes the
resolved path so callers don't duplicate sanitize logic.
- `resources/skills/skill-creator/SKILL.md` gains a "Cherry Studio
workflow" preamble that overrides the Claude Code / Claude.ai packaging
steps and instructs the agent to use init/register. The original
sections are kept as-is.
- The `SOUL` badge is removed from the agent sidebar item along with the
now-dead `SoulTag` styled component and unused `isSoulModeEnabled`
import in `AgentItem.tsx`. The Soul Mode toggle and underlying feature
are unchanged — the toggle still lives in agent settings.
- `claw.test.ts`'s `skillService` mock is extended with `toggle` /
`installFromDirectory` / `getSkillDirectory` so the new install / init /
register actions have a working stub (fixes the CI failure on the first
push of this branch).
Fixes #
### Why we need it and why it was done in this way
The skill-creator skill is meant to let users author custom skills
directly from agent chat, but with no integration into `SkillService`
the result was always a silent failure — a `SKILL.md` sitting in some
directory that no part of the system knew about. Users saw the agent
confidently report "skill created" while the global skill list remained
empty. This is the fix for that broken end-to-end flow.
The SOUL badge removal is bundled into this hotfix because it landed on
the same review cycle and is a strict UI cleanup — reported as P0 by
Kenny / 郑克 with the same root cause as the rest of this PR's framing:
Soul Mode internals leaking into the user-facing surface.
The following tradeoffs were made:
- Extended the existing `skills` MCP tool with two additive actions
instead of introducing a new tool, keeping the agent's tool surface
small.
- Reused `installFromDirectory` rather than adding a parallel "register
in place" code path. This required two small robustness fixes
(src===dest no-op + in-place folder name detection) but keeps a single
install entry point.
- The skill is auto-enabled on register (and on marketplace install); an
agent-authored or agent-installed skill that requires a manual UI toggle
would surprise users who just told the agent "create / install a skill
for X".
- Just delete the SOUL badge instead of trying to make it discoverable
(tooltip / icon-only / rename). The badge was not pulling its weight in
the list item, and the settings panel is the right place for users to
learn about Soul Mode.
The following alternatives were considered:
- A new `registerInPlace` method on `SkillService` bypassing
`installer.install` entirely. Rejected to avoid duplicating insert/link
logic.
- A staging directory under `app.getPath('temp')` copied into the Skills
root on register. Rejected because it forces an extra copy and breaks
live iteration: with in-place files, the `.claude/skills/<name>/`
symlink reflects edits immediately, so no second `register` is needed
for runtime effect.
- A file watcher / per-turn reconciliation that auto-discovers
`SKILL.md` files in the agent workspace. Rejected as too magical for a
first cut; can revisit later.
- For the badge: keep but rename / translate. Rejected — the underlying
problem is that "Soul Mode" itself is internal-facing terminology, so
renaming the badge would only move the comprehension issue.
Links to places where the discussion took place: N/A
### Breaking changes
None. The new tool actions are additive and existing `search` /
`install` / `remove` / `list` behavior is unchanged. The
`SkillInstaller.install` short-circuit only fires when src and dest
resolve to the exact same path, which previously raised — strictly more
permissive than before. The badge removal is UI-only and the Soul Mode
feature is untouched.
### Special notes for your reviewer
- Functionally most of this PR fixes a silent failure ("agent-authored
skills don't take effect"), but it also introduces new MCP tool actions,
so the underlying commits have a mix of `feat:` and `fix:` prefixes. The
PR title uses `fix:` since it lands on a hotfix branch.
- The skill-creator SKILL.md change only **adds** a "Cherry Studio
workflow" preamble at the top; nothing else is removed, so upstream
changes to the rest of the file still merge cleanly.
- The SOUL badge removal commit was originally on a separate branch / PR
(#14185, now closed) and is cherry-picked into this branch so it can
ship in the same review cycle.
- The CI fix commit (`test(skills): add toggle mock to claw test ...`)
is here because the first push hit `skillService.toggle is not a
function` — the `installSkill` change calls toggle but the existing mock
didn't expose it.
- Manual testing: end-to-end verified by the author — agent runs `skills
init` → writes SKILL.md and supporting files → calls `skills register` →
the new skill appears in the global skill list and is enabled for the
session. Sidebar verified to no longer show the SOUL badge after the
cherry-pick.
### Checklist
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: Write code that humans can understand and Keep it simple
- [x] Refactor: Boy Scout Rule applied — `SkillInstaller.install` is now
safer for any in-place caller, and AgentItem dropped the now-dead
`SoulTag` component along with the unused import
- [x] Upgrade: No upgrade impact (additive, no schema migration)
- [x] Documentation: skill-creator SKILL.md preamble updated; no
external docs change required
- [x] Self-review: Reviewed via local diff before pushing
### Release note
```release-note
fix(skills): agents in Soul Mode can now author new skills end-to-end from agent chat. The `skills` tool gains `init` / `register` actions, marketplace install auto-enables, and the skill-creator skill persists to the global skill list. UI cleanup: the unexplained SOUL badge next to agent names in the sidebar is removed; Soul Mode itself is unchanged and still toggleable from agent settings.
fix(agents): the skills and memory MCP tools are now available to every agent (not just Soul-Mode agents), with cross-session FACT.md recall, auto-approved permissions, and `skills list` exposing on-disk paths so the agent can patch installed skills in place via Read/Edit. Skill management (search/install/list/remove/init/register) and persistent workspace memory work in regular chat agents the same way they did in Soul Mode.
```
---------
Signed-off-by: suyao <sy20010504@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
### What this PR does
Before this PR:
Cherry Studio only supports `claude-code` as an agent type. Agents have
no autonomous scheduling, no IM channel integration, and no
soul/personality system.
After this PR:
Introduces **CherryClaw** — a new autonomous agent type with:
- **Soul-driven personality**: Markdown-based soul files with
mtime-cached reading
- **Task-based scheduler**: Poll-loop scheduler with drift-resistant
interval computation, tasks as first-class DB entities
(nanoclaw-inspired)
- **Internal claw MCP server**: `cron` tool (add/list/remove)
auto-injected into CherryClaw sessions for autonomous task management
- **Channel abstraction layer**: Pluggable adapter pattern with Telegram
as the first implementation (grammY, long polling, streaming drafts,
typing indicators)
- **Headless message persistence**: Channel and scheduler messages now
persist to the agent SQLite DB
- **Basic sandbox mode**: PreToolUse hook path enforcement + OS-level
sandbox toggle
- **Full UI**: Agent creation modal with type selector, settings tabs
(soul, tasks, channels, advanced), task management CRUD, channel catalog
with inline config
- **53 unit tests** across 8 test files covering all new services
<!-- Fixes # -->
### Why we need it and why it was done in this way
CherryClaw enables Cherry Studio agents to operate autonomously —
executing scheduled tasks and responding to IM messages without user
interaction. This is the foundation for "always-on" AI assistants.
The following tradeoffs were made:
- **Poll-loop scheduler over timer-based**: DB is the source of truth;
no timer state to restore on restart. Simpler, more robust at the cost
of up to 60s latency.
- **AgentServiceRegistry pattern**: Replaced hardcoded
`ClaudeCodeService` in `SessionMessageService` with a registry mapping
`AgentType` → service. Extensible for future agent types.
- **Internal MCP server for cron**: Rather than extending the SDK's tool
system, the `cron` tool is served as a standard MCP server at
`/v1/claw/:agentId/claw-mcp`. This lets the agent discover and use it
naturally.
- **Channel abstraction over direct Telegram integration**:
`ChannelAdapter` + factory registration enables future Discord/Slack
adapters without touching core routing logic.
- **Basic sandbox (not security boundary)**: PreToolUse hook + OS
sandbox provides best-effort restriction for well-behaved agents. Known
bypass vectors documented; hardening deferred.
The following alternatives were considered:
- cron-based OS scheduling (rejected: harder to manage lifecycle, no DB
integration)
- Direct Telegram bot API calls (rejected: grammY provides typed API,
connection management, and middleware)
- Modifying SDK builtin tools (rejected: internal MCP server is cleaner
separation)
### Breaking changes
None. This is a new agent type (`cherry-claw`) alongside the existing
`claude-code` type. No existing behavior is modified.
### Special notes for your reviewer
- **New DB migration**: `0003_wise_meltdown.sql` adds `scheduled_tasks`
and `task_run_logs` tables (agents DB only, not IndexedDB)
- **New dependencies**: `cron-parser` ^5.5.0, `grammy` ^1.41
- **Placeholder avatar**: `cherry-claw.png` is currently a copy of
`claude.png` — needs a proper distinct image
- **74 files changed, ~7400 lines added** — large PR, recommend
reviewing by phase (type system → backend services → MCP → channels → UI
→ tests)
- **Sandbox is basic only**: The PreToolUse path checking has known
bypasses (relative paths, variable expansion). Documented in handoff.md.
Hardening is follow-up work.
- The `handoff.md` file in the repo root contains full architectural
context and decisions
### Checklist
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: [Write code that humans can
understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
- [x] Refactor: You have [left the code cleaner than you found it (Boy
Scout
Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
- [ ] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required. Check this only
when the PR introduces or changes a user-facing feature or behavior.
- [ ] Self-review: I have reviewed my own code (e.g., via
[`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
or GitHub UI) before requesting review from others
### Release note
```release-note
New CherryClaw agent type: autonomous agents with soul-driven personality, task-based scheduling (cron/interval/one-time), internal cron MCP tool for self-managed tasks, Telegram channel integration with streaming responses, and basic sandbox mode for filesystem restriction.
```
---------
Signed-off-by: Vaayne <liu.vaayne@gmail.com>
Signed-off-by: suyao <sy20010504@gmail.com>
Signed-off-by: Siin Xu <31815270+SiinXu@users.noreply.github.com>
Signed-off-by: zhangjiadi225 <625013594@qq.com>
Signed-off-by: greycheng255 <greycheng255@gmail.com>
Co-authored-by: kangfenmao <kangfenmao@qq.com>
Co-authored-by: suyao <sy20010504@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Siin Xu <31815270+SiinXu@users.noreply.github.com>
Co-authored-by: fullex <106392080+0xfullex@users.noreply.github.com>
Co-authored-by: zhangjiadi225 <625013594@qq.com>
## Summary
- When GitHub is inaccessible, the openclaw installation script now
automatically falls back to GitCode mirror instead of failing with error
code 103
- Added `downloadWithFallback` function that tries GitHub first, then
GitCode mirror
- If `OPENCLAW_USE_MIRROR=1` is set, the order is reversed (GitCode
first, then GitHub)
## Test plan
- [ ] Test installation with GitHub accessible
- [ ] Test installation with GitHub blocked (should fallback to GitCode
mirror)
- [ ] Test installation with `OPENCLAW_USE_MIRROR=1` environment
variable
Signed-off-by: kangfenmao <kangfenmao@qq.com>
### What this PR does
Before this PR:
Agents and sessions in the sidebar are listed in fixed order with no way
to manually reorder them.
After this PR:
Both agents and sessions can be reordered via drag-and-drop. The order
is persisted to the SQLite database via a new `sort_order` column, and
new items are automatically placed at the top of the list. Session
sorting is scoped per-agent (each agent's sessions are independently
sortable).
### Why we need it and why it was done in this way
The following tradeoffs were made:
- Used `sort_order` integer column in SQLite (backend persistence)
rather than Redux/localStorage, because agents/sessions data lives in
the backend DB — consistent with the existing architecture.
- New agents/sessions get `sort_order = 0` and all existing items are
shifted up by 1, matching the assistant list behavior where new items
appear at the top.
- Reused `DraggableList` component for agents and `DraggableVirtualList`
for sessions (both using `@hello-pangea/dnd`) for consistency with
existing drag-and-drop patterns.
- Added dedicated `PUT /v1/agents/reorder` and `PUT
/v1/agents/{agentId}/sessions/reorder` endpoints rather than updating
sort_order through individual PATCH calls, to ensure atomic reorder
operations.
The following alternatives were considered:
- Storing order in Redux/localStorage — rejected because agents/sessions
are fetched from the backend SQLite DB via HTTP API, so the order would
diverge.
- Using `@dnd-kit/sortable` instead of `@hello-pangea/dnd` — rejected to
maintain consistency with existing components.
### Breaking changes
None. The new `sort_order` column defaults to `0` for all existing
agents and sessions, so they will share the same sort order initially
and fall back to `created_at DESC` as tie-breaker.
### Special notes for your reviewer
**Database migration:**
- `0003_slippery_wild_pack.sql` adds `sort_order INTEGER NOT NULL
DEFAULT 0` to both `agents` and `sessions` tables
- Schema defines indexes (`idx_agents_sort_order`,
`idx_sessions_sort_order`) for query performance
- Existing rows get `sort_order = 0` by default; the first reorder
operation will assign proper values
**API changes:**
- `PUT /v1/agents/reorder` — accepts `{ ordered_ids: string[] }` to
reorder agents
- `PUT /v1/agents/{agentId}/sessions/reorder` — accepts `{ ordered_ids:
string[] }` to reorder sessions (scoped to agent)
- `GET /v1/agents` — default sort changed to `sort_order ASC, created_at
DESC`
- `GET /v1/agents/{agentId}/sessions` — default sort changed to
`sort_order ASC, created_at DESC`
**Frontend:**
- `useAgents` hook exposes `reorderAgents()` with optimistic SWR cache
update
- `useSessions` hook exposes `reorderSessions()` with optimistic
SWRInfinite cache update (preserves real total for pagination)
- `AgentSidePanel` uses `DraggableList` for agent drag-and-drop
- `Sessions` component swapped from `DynamicVirtualList` to
`DraggableVirtualList` for session drag-and-drop
**Atomicity:**
- `createSession` wraps sort_order shift + insert in a transaction
- `reorderAgents` and `reorderSessions` both use transactions
### Checklist
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: Write code that humans can understand and Keep it simple
- [x] Refactor: You have left the code cleaner than you found it (Boy
Scout Rule)
- [x] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: A user-guide update was considered and is present
(link) or not required. Check this only when the PR introduces or
changes a user-facing feature or behavior.
- [x] Self-review: I have reviewed my own code before requesting review
from others
### Release note
```release-note
Added drag-and-drop manual sorting for agent and session lists in the sidebar panel.
```
---------
Signed-off-by: icarus <eurfelux@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: kangfenmao <kangfenmao@qq.com>
### What this PR does
Refactors OpenClaw installation to use direct binary downloads instead
of npm, adds auto update detection, and delegates gateway lifecycle to
OS service manager CLI commands.
**Binary download install (replaces npm install):**
- Download pre-built binaries from GitHub releases (or gitcode.com
mirror for China users)
- Install to `~/.cherrystudio/bin/` — no npm/Node.js dependency required
- Uninstall by simply deleting the binary file
- Detect old npm-installed versions and prompt migration
**Auto update check:**
- Automatically check for updates via `openclaw update status` when
entering the OpenClaw page
- Show info alert with version details when an update is available
- Perform update via `openclaw update` command (stops gateway first if
running)
- Version parsing extracted to `services/utils/openClawParsers.ts` with
inline snapshot tests
**Gateway lifecycle refactor:**
- Gateway lifecycle delegated to OS service manager via `openclaw
gateway` CLI commands
- Removes in-process `ChildProcess` management, `node:net` Socket
probing, and `killProcess` helper
- Health checks use `openclaw gateway health` CLI command
- `getStatus` is now async and probes health to detect
externally-started gateways
- Return type unified to discriminated union `OperationResult`
**Windows-specific handling:**
- Skip `gateway install/uninstall` (scheduled task integration has
upstream bugs)
- Gateway started via `openclaw gateway start --force`
- Port conflict detection before startup with clear error messages
**UI improvements:**
- Auto update alert with "Reinstall" button when new version detected
- Copy button on install/uninstall log container and error alerts
### Why we need it and why it was done in this way
- Binary download is faster, more reliable, and removes the npm/Node.js
dependency for end users
- `openclaw update` leverages the tool's built-in update mechanism
rather than re-downloading
- Delegating to OS service management (launchd/systemd) is more robust —
the gateway survives app restarts
- Version parsers are pure functions with snapshot tests to prevent
regressions
### Breaking changes
None. Internal refactoring only — no user-facing API changes.
### Special notes for your reviewer
- New IPC channels: `OpenClaw_CheckUpdate`, `OpenClaw_PerformUpdate`
- New file: `src/main/services/utils/openClawParsers.ts` (pure parsing
functions)
- New test: `src/main/services/__tests__/OpenClawService.test.ts` (16
snapshot tests)
- i18n: added `openclaw.update.*` and
`openclaw.quick_actions.check_update` keys (all locales synced)
- Windows: no service registration, gateway started with `--force`, port
checked before startup
- macOS/Linux: full service lifecycle via CLI commands
### Checklist
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: [Write code that humans can
understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
- [x] Refactor: You have [left the code cleaner than you found it (Boy
Scout
Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
- [ ] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required.
- [x] Self-review: I have reviewed my own code before requesting review
from others
### Release note
```release-note
feat(openclaw): switch to binary download install and add auto update check
fix(openclaw): gateway start or stop exception
```
---------
Co-authored-by: suyao <sy20010504@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
### What this PR does
Refactors OpenClaw installation to use direct binary downloads instead
of npm, adds auto update detection, and delegates gateway lifecycle to
OS service manager CLI commands.
**Binary download install (replaces npm install):**
- Download pre-built binaries from GitHub releases (or gitcode.com
mirror for China users)
- Install to `~/.cherrystudio/bin/` — no npm/Node.js dependency required
- Uninstall by simply deleting the binary file
- Detect old npm-installed versions and prompt migration
**Auto update check:**
- Automatically check for updates via `openclaw update status` when
entering the OpenClaw page
- Show info alert with version details when an update is available
- Perform update via `openclaw update` command (stops gateway first if
running)
- Version parsing extracted to `services/utils/openClawParsers.ts` with
inline snapshot tests
**Gateway lifecycle refactor:**
- Gateway lifecycle delegated to OS service manager via `openclaw
gateway` CLI commands
- Removes in-process `ChildProcess` management, `node:net` Socket
probing, and `killProcess` helper
- Health checks use `openclaw gateway health` CLI command
- `getStatus` is now async and probes health to detect
externally-started gateways
- Return type unified to discriminated union `OperationResult`
**Windows-specific handling:**
- Skip `gateway install/uninstall` (scheduled task integration has
upstream bugs)
- Gateway started via `openclaw gateway start --force`
- Port conflict detection before startup with clear error messages
**UI improvements:**
- Auto update alert with "Reinstall" button when new version detected
- Copy button on install/uninstall log container and error alerts
### Why we need it and why it was done in this way
- Binary download is faster, more reliable, and removes the npm/Node.js
dependency for end users
- `openclaw update` leverages the tool's built-in update mechanism
rather than re-downloading
- Delegating to OS service management (launchd/systemd) is more robust —
the gateway survives app restarts
- Version parsers are pure functions with snapshot tests to prevent
regressions
### Breaking changes
None. Internal refactoring only — no user-facing API changes.
### Special notes for your reviewer
- New IPC channels: `OpenClaw_CheckUpdate`, `OpenClaw_PerformUpdate`
- New file: `src/main/services/utils/openClawParsers.ts` (pure parsing
functions)
- New test: `src/main/services/__tests__/OpenClawService.test.ts` (16
snapshot tests)
- i18n: added `openclaw.update.*` and
`openclaw.quick_actions.check_update` keys (all locales synced)
- Windows: no service registration, gateway started with `--force`, port
checked before startup
- macOS/Linux: full service lifecycle via CLI commands
### Checklist
- [x] PR: The PR description is expressive enough and will help future
contributors
- [x] Code: [Write code that humans can
understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
- [x] Refactor: You have [left the code cleaner than you found it (Boy
Scout
Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
- [ ] Upgrade: Impact of this change on upgrade flows was considered and
addressed if required
- [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
was considered and is present (link) or not required.
- [x] Self-review: I have reviewed my own code before requesting review
from others
### Release note
```release-note
feat(openclaw): switch to binary download install and add auto update check
fix(openclaw): gateway start or stop exception
```
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: kangfenmao <kangfenmao@qq.com>
* Refactor inputbar system with configurable scope-based architecture
- **Implement scope-based configuration** for chat, agent sessions, and mini-window with feature toggles
- **Add tool registry system** with dependency injection for modular inputbar tools
- **Create shared state management** via InputbarToolsProvider for consistent state handling
- **Migrate existing tools** to registry-based definitions with proper scope filtering
The changes introduce a flexible inputbar architecture that supports different use cases through scope-based configuration while maintaining feature parity and improving code organization.
* Remove unused import and refactor tool rendering
- Delete obsolete '@renderer/pages/home/Inputbar/tools' import from Inputbar.tsx
- Extract ToolButton component to render tools outside useMemo dependency cycle
- Store tool definitions in config for deferred rendering with current context
- Fix potential stale closure issues in tool rendering by rebuilding context on each render
* Wrap ToolButton in React.memo and optimize quick panel menu updates
- Memoize ToolButton component to prevent unnecessary re-renders when tool key remains unchanged
- Replace direct menu state updates with version-based triggering to batch registry changes
- Add useEffect to consolidate menu updates and reduce redundant flat operations
* chore style
* refactor(InputbarToolsProvider): simplify quick panel menu update logic
* Improve QuickPanel behavior and input handling
- Default select first item when panel symbol changes to enhance user experience
- Add Tab key support for selecting template variables in input field
- Refactor QuickPanel trigger logic with better symbol tracking and boundary checks
- Fix typo in translation key for model selection menu item
* Refactor import statements to use type-only imports
- Convert inline type imports to explicit type imports in Inputbar.tsx and types.ts
- Replace combined type/value imports with separate type imports in InputbarToolsProvider and tools
- Remove unnecessary menu version state and effect in InputbarToolsProvider
* Refactor InputbarTools context to separate state and dispatch concerns
- Split single context into separate state and dispatch contexts to optimize re-renders
- Introduce derived state for `couldMentionNotVisionModel` based on file types
- Encapsulate Quick Panel API in stable object with memoized functions
- Add internal dispatch context for Inputbar-specific state setters
* Refactor Inputbar to use split context hooks and optimize QuickPanel
- Replace monolithic `useInputbarTools` with separate state, dispatch, and internal dispatch hooks
- Move text state from context to local component state in InputbarInner
- Optimize QuickPanel trigger registration to use ref pattern, avoiding frequent re-registrations
* Refactor QuickPanel API to separate concerns between tools and inputbar
- Split QuickPanel API into `toolsRegistry` for tool registration and `triggers` for inputbar triggering
- Remove unused QuickPanel state variables and clean up dependencies
- Update tool context to use new API structure with proper type safety
* Optimize the state management of QuickPanel and Inputbar, add text update functionality, and improve the tool registration logic.
* chore
* Add reusable React hooks and InputbarCore component for chat input
- Create `useInputText`, `useKeyboardHandler`, and `useTextareaResize` hooks for text management, keyboard shortcuts, and auto-resizing
- Implement `InputbarCore` component with modular toolbar sections, drag-drop support, and textarea customization
- Add `useFileDragDrop` and `usePasteHandler` hooks for file uploads and paste handling with type filtering
* Refactor Inputbar to use custom hooks for text and textarea management
- Replace manual text state with useInputText hook for text management and empty state
- Replace textarea resize logic with useTextareaResize hook for automatic height adjustment
- Add comprehensive refactoring documentation with usage examples and guidelines
* Refactor inputbar drag-drop and paste handling into custom hooks
- Extract paste handling logic into usePasteHandler hook
- Extract drag-drop file handling into useFileDragDrop hook
- Remove inline drag-drop state and handlers, use hook interfaces
- Clean up dependencies and callback optimizations
* Refactor Inputbar component to use InputbarCore composition
- Extract complex UI logic into InputbarCore component for better separation of concerns
- Remove intermediate wrapper component and action ref forwarding pattern
- Consolidate focus/blur handlers and simplify component structure
* Refactor Inputbar to expose actions via ref for external control
- Extract action handlers into ProviderActionHandlers interface and expose via ref
- Split component into Inputbar wrapper and InputbarInner implementation
- Update useEffect to sync inner component actions with ref for external access
* feat: inputbar core
* refactor: Update QuickPanel integration across various tools
* refactor: migrate to antd
* chore: format
* fix: clean code
* clean code
* fix i18n
* fix: i18n
* relative path
* model type
* 🤖 Weekly Automated Update: Nov 09, 2025 (#11209)
feat(bot): Weekly automated script run
Co-authored-by: DeJeune <67425183+DeJeune@users.noreply.github.com>
Co-authored-by: SuYao <sy20010504@gmail.com>
* format
* fix
* fix: format
* use ripgrep
* update with input
* add common filters
* fix build issue
* format
* fix error
* smooth change
* adjust
* support listing dir
* keep list files when focus and blur
* support draft save
* Optimize the rendering logic of session messages and input bars, and simplify conditional judgments.
* Upgrade to agentId
* format
* 🐛 fix: force quick triggers for agent sessions
* revert
* fix migrate
* fix: filter
* fix: trigger
* chore packages
* feat: 添加过滤和排序功能,支持自定义函数
* fix cursor bug
* fix format
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: beyondkmp <beyondkmp@gmail.com>
Co-authored-by: kangfenmao <kangfenmao@qq.com>
* ♻️ refactor: remove unused resources/js directory and references
Remove legacy resources/js directory (bridge.js and utils.js) that was left over after minapp.html removal in commit 461458e5e. Also update .oxlintrc.json to remove the unused resources/js/** file pattern.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* ♻️ refactor: remove additional unused files
- Remove duplicate ipService.js (superseded by TypeScript version in src/main/utils/)
- Remove unused components.json (shadcn config with non-existent target directory)
- Remove unused context-menu.tsx component (no imports found)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* chore: update bun and uv versions
- Update bun from 1.2.17 to 1.3.1
- Update uv from 0.7.13 to 0.9.5
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: update UV installer to support tar.gz format
- Update UV package mappings from .zip to .tar.gz for macOS and Linux
- Add RISCV64 Linux platform support
- Implement dual extraction logic:
- tar.gz extraction for macOS/Linux using tar command
- zip extraction for Windows using StreamZip
- Flatten directory structure during extraction
- Maintain executable permissions on Unix-like systems
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🐛 fix: correct error handling in UV installer
Remove ineffective error code 102 return from nested function.
Chmod errors now properly propagate to outer try-catch block.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* feat: update and download ovms to 2025.3 official release from official site.
Signed-off-by: Kejiang Ma <kj.ma@intel.com>
* fix UI text
Signed-off-by: Kejiang Ma <kj.ma@intel.com>
---------
Signed-off-by: Kejiang Ma <kj.ma@intel.com>
* add new provider: OVMS(openvino model server)
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
* remove useless comments
* add note: support windows only
* fix eslint error; add migrate for ovms provider
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
* fix ci error after rebase
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
* modifications base on reviewers' comments
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
* show intel-ovms provider only on windows and intel cpu
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
* complete i18n for intel ovms
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
* update ovms 2025.3; apply patch for model qwen3-8b on local
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
* fix lint issues
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
* fix issues for format, type checking
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
* remove test code
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
* fix issues after rebase
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
---------
Signed-off-by: Ma, Kejiang <kj.ma@intel.com>
- Introduced new HTML files for the privacy policy in English and Chinese.
- Implemented a PrivacyPopup component to display the privacy policy within the application.
- The popup dynamically loads the appropriate language based on user settings and includes options to accept or decline the policy.
* feat: add code tools
* feat(CodeToolsService): add CLI executable management and installation check
- Introduced methods to determine the CLI executable name based on the tool.
- Added functionality to check if a package is installed and create the necessary bin directory if it doesn't exist.
- Enhanced the run method to handle installation and execution of CLI tools based on their installation status.
- Updated terminal command handling for different operating systems with improved comments and error messages.
* feat(ipService): implement IP address country detection and npm registry URL selection
- Added a new module for IP address country detection using the ipinfo.io API.
- Implemented functions to check if the user is in China and to return the appropriate npm registry URL based on the user's location.
- Updated AppUpdater and CodeToolsService to utilize the new ipService functions for improved user experience based on geographical location.
- Enhanced error handling and logging for better debugging and user feedback.
* feat: remember cli model
* feat(CodeToolsService): update options for auto-update functionality
- Refactored the options parameter in CodeToolsService to replace checkUpdate and forceUpdate with autoUpdateToLatest.
- Updated logic to handle automatic updates when the CLI tool is already installed.
- Modified related UI components to reflect the new auto-update option.
- Added corresponding translations for the new feature in multiple languages.
* feat(CodeToolsService): enhance CLI tool launch with debugging support
- Added detailed logging for CLI tool launch process, including environment variables and options.
- Implemented a temporary batch file for Windows to facilitate debugging and command execution.
- Improved error handling and cleanup for the temporary batch file after execution.
- Updated terminal command handling to use the new batch file for safer execution.
* refactor(CodeToolsService): simplify command execution output
- Removed display of environment variable settings during command execution in the CLI tool.
- Updated comments for clarity on the command execution process.
* feat(CodePage): add model filtering logic for provider selection
- Introduced a modelPredicate function to filter out embedding, rerank, and text-to-image models from the available providers.
- Updated the ModelSelector component to utilize the new predicate for improved model selection experience.
* refactor(CodeToolsService): improve logging and cleanup for CLI tool execution
- Updated logging to display only the keys of environment variables during CLI tool launch for better clarity.
- Introduced a variable to store the path of the temporary batch file for Windows.
- Enhanced cleanup logic to remove the temporary batch file after execution, improving resource management.
* feat(Router): replace CodePage with CodeToolsPage and add new page for code tools
- Updated Router to import and route to the new CodeToolsPage instead of the old CodePage.
- Introduced CodeToolsPage component, which provides a user interface for selecting CLI tools and models, managing directories, and launching code tools with enhanced functionality.
* refactor(CodeToolsService): improve temporary file management and cleanup
- Removed unused variable for Windows batch file path.
- Added a cleanup task to delete the temporary batch file after 10 seconds to enhance resource management.
- Updated logging to ensure clarity during the execution of CLI tools.
* refactor(CodeToolsService): streamline environment variable handling for CLI tool execution
- Introduced a utility function to remove proxy-related environment variables before launching terminal processes.
- Updated logging to display only the relevant environment variable keys, enhancing clarity during execution.
* refactor(MCPService, CodeToolsService): unify proxy environment variable handling
- Replaced custom proxy removal logic with a shared utility function `removeEnvProxy` to streamline environment variable management across services.
- Updated logging to reflect changes in environment variable handling during CLI tool execution.
* feat: add OpenAI o3 model support with enhanced tool calling
- Add o3 and o3-mini model definitions with reasoning effort support
- Implement o3-compatible strict schema validation for MCP tools
- Add comprehensive o3 schema processing with DRY improvements
- Extract reusable schema processing functions for maintainability
- Add 15+ test cases validating o3 strict mode requirements
- Fix schema composition keyword handling with loop-based approach
- Ensure ALL object schemas have complete required arrays for o3
- Support tool calling with proper o3 schema transformations
This enables OpenAI o3 models to work properly with MCP tool calling
while improving code organization and test coverage.
Signed-off-by: Luke Galea <luke@ideaforge.org>
* Remove redundant reference in HtmlArtifactsPopup.tsx
* refactor: move filterProperties to mcp-schema, fix tests
---------
Signed-off-by: Luke Galea <luke@ideaforge.org>
Co-authored-by: one <wangan.cs@gmail.com>
Co-authored-by: suyao <sy20010504@gmail.com>
* fix[AgentsPage]: fix using name deduplication leads to the loss of agents with the same name
* fix[agents-zh]: fix id 499 the problem of markdown display
* fix[agent]: agent search adds descriptive text search
* chore(package): add node-stream-zip for zip file extraction in install-bun script
* refactor(install-uv): replace AdmZip with node-stream-zip for improved zip file extraction
* fix(install-uv): ensure correct extraction of uv binary for Unix/Linux/macOS
* refactor(install-uv): remove redundant file handling and cleanup for Unix/Linux/macOS installation
* fix(install-uv): update tar extraction command to strip leading components for Unix/Linux/macOS
* fix(install-uv): clarify comment for zip file extraction on Windows
* fix(install-bun): correct extraction directory for bun binary
* fix(install-bun, install-uv): update default versions and improve zip extraction process
* fix(install-bun): remove redundant cleanup of source directory after bun installation
- Included package mappings for 'win32-arm64' and 'win32-arm64-baseline' to the BUN_PACKAGES object in install-bun.js, enhancing compatibility with ARM64 devices on Windows.
- Revised the licensing agreement to introduce a User-Segmented Dual Licensing model, detailing conditions for individual and organizational use.
- Enhanced UI components to display a specific empty state image in various popups and pages.
- Adjusted styles in MiniAppIconsManager and MiniAppSettings for improved layout and appearance.
- Updated default web search provider to 'local-bing' and modified font size in ProviderOAuth description for better readability.
- Changed window style setting from 'transparent' to 'opaque' for a more consistent user experience.