Skip to content

🐛 fix(agent-doc): default new files to .md and preserve IME composition#15427

Merged
Innei merged 5 commits into
canaryfrom
fix/agent-doc-default-md-ext-ime
Jun 3, 2026
Merged

🐛 fix(agent-doc): default new files to .md and preserve IME composition#15427
Innei merged 5 commits into
canaryfrom
fix/agent-doc-default-md-ext-ime

Conversation

@Innei

@Innei Innei commented Jun 3, 2026

Copy link
Copy Markdown
Member

💻 Change Type

  • 🐛 fix

🔗 Related Issue

🔀 Description of Change

Two small UX fixes for the agent document explorer's inline file creation:

  1. Default .md extension on new documents. useDocumentTreeOps.createDocument now appends .md to the picked filename (e.g. Untitled document.md, with the numeric dedup suffix inserted before the extension as Untitled document 2.md). At the tree root the client-picked filename is forwarded as the title to agentDocumentService.createDocument so the server keeps the .md suffix end-to-end.
  2. Pre-select the stem, not the extension. After startRenaming, we reach into the file-tree-container shadow DOM and call setSelectionRange(0, lastDotIndex) on input[data-item-rename-input] so the user can type a new name without overwriting .md. Dotfiles and extension-less names fall through to pierre/trees' default full-selection.

⚠️ Known Limitation — IME composition (not addressed in this PR)

@pierre/trees' inline rename input lives in a shadow root and its handleTreeKeyDown commits the rename on every Enter keydown without checking event.isComposing / keyCode === 229 (node_modules/@pierre/trees/dist/render/FileTreeView.js:1110-1118). When a Chinese-pinyin / Japanese / Korean candidate is confirmed via Enter, the rename commits the half-formed input instead of the intended character.

We explored intercepting from outside the shadow boundary (React onKeyDownCapture and a native addEventListener('keydown', …, true) on the host with composedPath() scoping). It works for the common path but fails on edge cases where the IME emits Enter keydown with isComposing: false right after compositionend in the same task — there is no reliable purely-external fix. The IME guard has been reverted in this PR; the proper fix needs to land in @pierre/trees.

Upstream issue filed: pierrecomputer/pierre#773 — we'll follow up here once it's released.

🧪 How to Test

  • Tested locally
  • Added/updated tests
  • No tests needed

Steps:

  1. Open an agent's working panel → documents explorer.
  2. Click the "new document" toolbar action — the optimistic row should read Untitled document.md with only Untitled document selected in the rename input.
  3. Press Enter without typing — file is saved as Untitled document.md.
  4. Repeat in the same folder — second file should be Untitled document 2.md.

📸 Screenshots / Videos

Before After
New file had no extension; rename selected the whole name. New file is Untitled document.md with stem-only selection.

📝 Additional Information

No schema changes, no migrations, no API surface changes. The shadow-DOM querySelector is scoped to the explorer container's file-tree-container host, so it can't reach unrelated pierre trees on the page.

@vercel

vercel Bot commented Jun 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
lobehub Ready Ready Preview, Comment Jun 3, 2026 3:30pm

Request Review

@dosubot dosubot Bot added size:M This PR changes 30-99 lines, ignoring generated files. feature:editor something links lobehub editor / rich content text / markdown render labels Jun 3, 2026

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We've reviewed this pull request using the Sourcery rules engine

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bb5e9790d4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

agentId,
content: '',
title: baseName,
title: pendingFilename,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve .md when root create dedupes

When two root-level creates race or the local list is stale, both clients can pass the same pendingFilename here. The root path goes through agentDocumentService.createDocument, and checked createWithUniqueFilename in src/server/services/agentDocuments/index.ts: its collision fallback appends -2 to the entire filename (${baseFilename}-${suffix}), so Untitled document.md becomes Untitled document.md-2 instead of keeping the markdown extension. This means the new default .md guarantee still fails for collided root documents; use the path writer or server-side suffixing that inserts before the extension.

Useful? React with 👍 / 👎.

@codecov

codecov Bot commented Jun 3, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 34.21053% with 25 lines in your changes missing coverage. Please review.
✅ Project coverage is 65.75%. Comparing base (2fb0970) to head (5e32495).

Additional details and impacted files
@@            Coverage Diff             @@
##           canary   #15427      +/-   ##
==========================================
- Coverage   65.76%   65.75%   -0.01%     
==========================================
  Files        2762     2762              
  Lines      256076   256104      +28     
  Branches    25563    32204    +6641     
==========================================
+ Hits       168400   168408       +8     
- Misses      87557    87577      +20     
  Partials      119      119              
Flag Coverage Δ
app 61.58% <34.21%> (-0.01%) ⬇️
database 92.49% <ø> (ø)
packages/file-loaders 87.89% <ø> (ø)
packages/model-runtime 84.51% <ø> (ø)
packages/prompts 72.49% <ø> (ø)
packages/web-crawler 88.08% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
Store 68.44% <ø> (ø)
Services 54.58% <ø> (ø)
Server 71.89% <100.00%> (-0.01%) ⬇️
Libs 57.01% <ø> (ø)
Utils 81.44% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@dosubot dosubot Bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:M This PR changes 30-99 lines, ignoring generated files. labels Jun 3, 2026
@dosubot dosubot Bot added size:M This PR changes 30-99 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Jun 3, 2026
Innei added 5 commits June 3, 2026 23:22
- Append `.md` to newly-created agent documents; pre-select only the stem
  in the inline rename input so the extension stays intact.
- Wire `useIMECompositionEvent` on the explorer container so Enter pressed
  during IME composition (e.g. Chinese pinyin) no longer commits the
  half-formed name through pierre/trees' shadow-DOM input.
React `onKeyDownCapture` can lose to pierre/trees' bubble handler in some
event ordering edge cases, and the original guard missed IMEs that report
`keyCode === 229` or fire Enter just after compositionend in the same task.

- Bind a native `keydown` capture listener on the container so we can
  inspect `composedPath()` and confirm the keydown originated inside the
  shadow-DOM rename input.
- Extend the IME guard with an `imeSessionRef` that stays true through one
  extra microtask after compositionend.
- Drop the React `onKeyDownCapture` prop in favour of the native listener.
The inline rename input lives in pierre/trees' shadow DOM and we can't
reliably suppress its IME-composing Enter commit from the outside. Roll
back the local hack and track the issue upstream instead. The default
`.md` extension and stem-only selection on rename stay in place.
Existing files entering inline rename (right-click → Rename, or F2) now
narrow the selection to the stem after pierre/trees' `input.select()`,
matching the new-file flow so the user never has to retype `.md`.
@Innei Innei force-pushed the fix/agent-doc-default-md-ext-ime branch from 9f27b21 to 5e32495 Compare June 3, 2026 15:24
@Innei Innei merged commit 2a4b6e4 into canary Jun 3, 2026
33 of 35 checks passed
@Innei Innei deleted the fix/agent-doc-default-md-ext-ime branch June 3, 2026 15:54
@arvinxx arvinxx mentioned this pull request Jun 3, 2026
arvinxx added a commit that referenced this pull request Jun 4, 2026
# 🚀 LobeHub Release (20260604)

**Release Date:** June 4, 2026  
**Since v2.2.1:** 88 merged PRs · 11 contributors

> This week brings Execution Devices out of the lab — run agents and
Claude Code on any configured local or remote machine — alongside Claude
Opus 4.8, token-usage analytics, and Page sharing.

---

## ✨ Highlights

- **Execution Devices** — Pick where an agent runs. Desktop and CLI
devices auto-register with a stable machine ID, route through the
gateway by channel, and surface a device switcher in the chat input. Run
remote Claude Code on a configured device, with a recent-directory
picker you can drag to reorder. (#15300, #15315, #15322, #15343, #15351,
#15371)
- **Claude Opus 4.8** — Day-one support for Anthropic's latest model.
(#15314)
- **Token-usage analytics** — A new token-usage mode on the activity
heatmap, backed by a denormalized topic usage/cost rollup so totals stay
accurate without recomputing from messages. (#15365, #15417, #15425)
- **Page sharing** — Share a Page through a dedicated document share
flow, plus new Workspace and Agent share tables. (#15309, #15439)
- **Self-iteration agents** — Agent Signal's execAgent migration lands a
server-runtime bridge, async memory writer, and a registered
self-iteration tool package, with a CLI trigger command for testing.
(#15360, #15364, #15392)
- **Knowledge search** — BM25 search now extends to file-backed
documents, and the portal ships an editable CodeMirror viewer for local
files with document highlighting. (#15247, #15298)

---

## 🏗️ Core Agent & Architecture

### Agent Signal & Runtime

- **execAgent migration** — Server-runtime bridge, completion
projection, async memory writer, and removal of the legacy
`executeSelfIteration` path. (#15392)
- Registered the self-iteration builtin tool package and restored the
three mode-specific self-iteration agent slugs. (#15202, #15364)
- Added a CLI trigger command with a golden-snapshot fixture for Agent
Signal. (#15360)
- **Skill priority** — Agent Builder now emits a skill-priority
instruction with matching server runtime. (#15409)
- Retry empty LLM completions instead of silently finishing the turn.
(#15355)
- Classify topic/agent/session foreign-key violations as
`ConversationParentMissing` for clearer recovery. (#15408)
- Persist canonical nested usage/performance on assistant messages, and
re-link orphan tool messages at the raw bucket write boundary. (#15359,
#15438)
- Guard `createAgent` against LLM double-encoded array fields. (#15381)

---

## 🖥️ Execution Devices & Gateway

- Auto-register desktop and CLI devices with a stable machine ID, and
add the `@lobechat/device-identity` package. (#15300, #15321)
- New Devices settings page behind the Execution Device Switcher lab,
with a device switcher shown for all agents in the chat input. (#15315,
#15371)
- `connectionId` + channel routing across the gateway client and device
list; preset the local device on the first LLM request for the 本机
target. (#15322, #15435)
- Run remote Claude Code on a configured device, with drag-to-reorder
recent-directory management and client renders for device tool results.
(#15343, #15351, #15437)
- Preserve content and state across gateway tool calls, and prevent
duplicate streaming from stale reconnects. (#15114, #15354)

---

## 🖥️ CLI & Desktop

- Preserve content/state for connect local file and shell tools; render
the `runCommand` tool result card. (#15441, #15442)
- New `lh topic view` command; CLI now auto-registers its device on
login, matching desktop. (#15340, #15377)
- Resolve CLI tools from the shell `PATH`, and clarify local command
session handling. (#15368, #15389)
- Relocate visual-ref helpers to `@lobechat/const` to fix a renderer
crash; upload `.blockmap` files to S3 for differential updates. (#15326,
#15369)
- Fix a market OAuth expiry that triggered the wrong re-login modal, and
kill dev child processes on parent shutdown. (#15246, #15290)

---

## 🗂️ Pages, Library & Knowledge

- Document share flow with business slot stubs, plus Workspace and Agent
share tables. (#15309, #15439)
- Export Agent profiles as Markdown, preserving an empty agent prompt on
export. (#15312, #15316)
- Editable CodeMirror viewer for local files with document highlighting;
BM25 search extended to file-backed documents. (#15247, #15298)
- Default new Agent-doc files to `.md` and preserve IME composition;
refresh folder data on slug switch and dedupe breadcrumb fetches.
(#15335, #15427)

---

## 💬 Chat & User Experience

- Group-by-status mode for the Topic sidebar; dropped the legacy
session→agentId compatibility path from Topic queries. (#15366, #15378)
- Restore editor focus after the file picker closes, and close the skill
dropdown before navigating to settings. (#15391, #15394)
- Strip markdown tokens from fallback Topic titles; keep an open
ActionBar popup when hovering another message. (#15303, #15372)
- Stabilize home starter loading and stop transliterating model names in
the home starter; show artifact source while streaming. (#15310, #15324,
#15386)
- Group the sidebar spacer with recents and agents. (#15373)

---

## 📊 Analytics, Tasks & Notifications

- Token-usage mode on the activity heatmap, backed by a denormalized
topic usage/cost rollup. (#15365, #15417, #15425)
- Push: new `PushChannel`, receipt cron, and `pushToken` tRPC API.
(#15233)
- Tasks now support file and image attachments. (#15141)

---

## 🧩 Models & Providers

- Support Claude Opus 4.8 and configurable model routing with starters.
(#15314, #15384)
- MiniMax M3: new model entry and an Anthropic video runtime. (#15380,
#15403)
- Add `intern-s2-preview` with `thinking_mode`, and `step-3.7-flash`
support. (#15308, #15317)
- Block disabling the official provider; fix default provider setup in
business mode. (#15379, #15382)

---

## 🎨 UI & Modals

- Migrate modals to `@lobehub/ui/base-ui` (LOBE-9711 + eval batch),
including the create-custom-model and feedback/changelog modals.
(#15401, #15416)
- Restructure confirmModal title and content across deletion flows;
polish the service-model form and migrate its Switch to base-ui.
(#15426, #15440)
- Wrap the BlueBubbles bridge config into a connection card; update
`@lobehub/ui` to v5.15.5. (#15325, #15342)

---

## 🔒 Reliability

- Replace hardcoded `session_context` values with template variables in
credentials. (#15352)
- Point `CHANGELOG_URL` to `/changelog`. (#15428)

---

## 👥 Contributors

Huge thanks to **11 contributors** who shipped **88 merged PRs** this
cycle.

@hezhijie0327 · @qybaihe · @sxjeru · @arvinxx · @Innei · @tjx666 ·
@lijian · @sudongyuer · @cy948 · @rivertwilight · @AmAzing129

Plus @lobehubbot and renovate[bot] for maintenance.

---

**Full Changelog**: v2.2.1...release/weekly-20260604
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature:editor something links lobehub editor / rich content text / markdown render size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant