Skip to content

fix(webchat): respect user scroll position during streaming and refresh#7226

Closed
marcomarandiz wants to merge 0 commit intoopenclaw:mainfrom
marcomarandiz:fix/webchat-scroll-position
Closed

fix(webchat): respect user scroll position during streaming and refresh#7226
marcomarandiz wants to merge 0 commit intoopenclaw:mainfrom
marcomarandiz:fix/webchat-scroll-position

Conversation

@marcomarandiz
Copy link

@marcomarandiz marcomarandiz commented Feb 2, 2026

Fixes #7225

Changes

Problem

When scrolled up in WebChat reading history, new messages (including streaming chunks) force-scroll to the bottom, making it impossible to read older messages during active conversations.

Root Causes

  1. distanceFromBottom < 200 threshold too tight
  2. refreshChat() calls scheduleChatScroll(host, true) ignoring user position
  3. Streaming chunks retrigger scroll rapidly

Fix

  • Increased threshold from 200px → 450px (extracted to NEAR_BOTTOM_THRESHOLD constant)
  • force respects user position — only overrides on initial load (!chatHasAutoScrolled), not during active use
  • refreshChat() no longer force-scrolls
  • Added chatNewMessagesBelow flag — tracks when content arrives while user is scrolled up (ready for a "↓ new messages" indicator in future)
  • handleChatScroll uses new threshold and clears the flag when user scrolls back to bottom
  • resetChatScroll also resets new flag for clean session switches

Files Changed

  • ui/src/ui/app-scroll.ts — core scroll logic
  • ui/src/ui/app-scroll.test.ts13 new tests (all passing)
  • ui/src/ui/app-chat.ts — removed force-scroll from refreshChat
  • ui/src/ui/app.ts — added chatNewMessagesBelow property

Tests

13 new tests covering:

  • Near-bottom detection with new threshold
  • Force-scroll respects user position after initial load
  • Streaming chunks don't override scroll position
  • chatNewMessagesBelow flag behavior
  • Reset behavior for session switches

Greptile Overview

Greptile Summary

This PR updates WebChat’s scroll-sticking logic to better respect the user’s scroll position during streaming and refresh. It introduces a NEAR_BOTTOM_THRESHOLD (450px), changes scheduleChatScroll(force) to only force-scroll on initial load (!chatHasAutoScrolled), stops refreshChat() from forcing a scroll, and adds a chatNewMessagesBelow flag that’s set when content arrives while the user is scrolled up and cleared when they return near the bottom.

The changes fit into the existing app-scroll.ts helpers used by OpenClawApp/app-chat.ts to coordinate scroll behavior across Lit renders (via updateComplete + requestAnimationFrame), with a new Vitest suite covering the updated behaviors.

Confidence Score: 4/5

  • This PR is likely safe to merge; changes are localized and well-covered by new unit tests.
  • Scroll behavior changes are narrowly scoped to app-scroll.ts/app-chat.ts with explicit state flags and threshold extraction, and the new tests exercise the main behaviors (no forced scrolling while scrolled up, initial-load force behavior, reset behavior). Remaining concerns are minor: a small timing inconsistency (retryDelay based on force vs effectiveForce) and whether chatNewMessagesBelow is intended to be reactive in Lit.
  • ui/src/ui/app-scroll.ts and ui/src/ui/app.ts

(2/5) Greptile learns from your feedback when you react with thumbs up/down!

Context used:

  • Context from dashboard - CLAUDE.md (source)
  • Context from dashboard - AGENTS.md (source)

@openclaw-barnacle openclaw-barnacle bot added the app: web-ui App: web-ui label Feb 2, 2026
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

3 files reviewed, 3 comments

Edit Code Review Agent Settings | Greptile

host.chatHasAutoScrolled = true;
}
target.scrollTop = target.scrollHeight;
host.chatUserNearBottom = true;
host.chatNewMessagesBelow = false;
const retryDelay = force ? 150 : 120;
Copy link
Contributor

Choose a reason for hiding this comment

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

[P1] retryDelay still uses the original force flag, not effectiveForce, so scheduleChatScroll(host, true) after initial auto-scroll will wait 150ms even though it no longer behaves as a forced scroll (effectiveForce is false). This can make follow-up scroll attempts feel laggier than normal during streaming/refresh when callers pass force=true but the user has scrolled up.

Also appears at ui/src/ui/app-scroll.ts:67 (this line).

Prompt To Fix With AI
This is a comment left during a code review.
Path: ui/src/ui/app-scroll.ts
Line: 67:67

Comment:
[P1] `retryDelay` still uses the original `force` flag, not `effectiveForce`, so `scheduleChatScroll(host, true)` after initial auto-scroll will wait 150ms even though it no longer behaves as a forced scroll (`effectiveForce` is false). This can make follow-up scroll attempts feel laggier than normal during streaming/refresh when callers pass `force=true` but the user has scrolled up.

Also appears at ui/src/ui/app-scroll.ts:67 (this line).

How can I resolve this? If you propose a fix, please make it concise.

Copy link
Author

Choose a reason for hiding this comment

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

Good catch — fixed in fdbf307. retryDelay now uses effectiveForce instead of force.

Comment on lines +9 to +20
function createScrollHost(overrides: {
scrollHeight?: number;
scrollTop?: number;
clientHeight?: number;
overflowY?: string;
}) {
const {
scrollHeight = 2000,
scrollTop = 1500,
clientHeight = 500,
overflowY = "auto",
} = overrides;
Copy link
Contributor

Choose a reason for hiding this comment

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

[P1] createScrollHost requires an overrides argument, but all call sites pass {}; this makes tests noisier and easy to break when adding new cases. Consider defaulting overrides = {} (and moving the getComputedStyle spy into beforeEach) so a bare createScrollHost() works and you avoid repeatedly re-spying window.getComputedStyle per host instance.

Affected call sites include ui/src/ui/app-scroll.test.ts:63, :71, :79, :87, :95, :123, :138, :154, :172, :188, :264.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Prompt To Fix With AI
This is a comment left during a code review.
Path: ui/src/ui/app-scroll.test.ts
Line: 9:20

Comment:
[P1] `createScrollHost` requires an `overrides` argument, but all call sites pass `{}`; this makes tests noisier and easy to break when adding new cases. Consider defaulting `overrides = {}` (and moving the `getComputedStyle` spy into `beforeEach`) so a bare `createScrollHost()` works and you avoid repeatedly re-spying `window.getComputedStyle` per host instance.

Affected call sites include ui/src/ui/app-scroll.test.ts:63, :71, :79, :87, :95, :123, :138, :154, :172, :188, :264.

<sub>Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!</sub>

How can I resolve this? If you propose a fix, please make it concise.

Copy link
Author

Choose a reason for hiding this comment

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

Done — overrides now defaults to {} so bare createScrollHost() works. Existing call sites still pass overrides where needed.

ui/src/ui/app.ts Outdated
Comment on lines +253 to +255
private chatHasAutoScrolled = false;
private chatUserNearBottom = true;
chatNewMessagesBelow = false;
Copy link
Contributor

Choose a reason for hiding this comment

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

[P2] chatNewMessagesBelow is the only chat-scroll field that’s not private/@state() here. If it’s meant to drive rendering, it likely should be @state() (or at least match the visibility pattern of the other scroll fields) so it reliably triggers UI updates when toggled in scheduleChatScroll/handleChatScroll.

If it’s intentionally public and not reactive yet, it may not update any future “new messages” indicator until something else causes a re-render.

Prompt To Fix With AI
This is a comment left during a code review.
Path: ui/src/ui/app.ts
Line: 253:255

Comment:
[P2] `chatNewMessagesBelow` is the only chat-scroll field that’s not `private`/`@state()` here. If it’s meant to drive rendering, it likely should be `@state()` (or at least match the visibility pattern of the other scroll fields) so it reliably triggers UI updates when toggled in `scheduleChatScroll`/`handleChatScroll`.

If it’s intentionally public and not reactive yet, it may not update any future “new messages” indicator until something else causes a re-render.

How can I resolve this? If you propose a fix, please make it concise.

Copy link
Author

Choose a reason for hiding this comment

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

Fixed — chatNewMessagesBelow is now @state() so it triggers re-renders for any future "new messages" indicator.

@shakkernerd shakkernerd self-assigned this Feb 2, 2026
@shakkernerd shakkernerd requested review from shakkernerd and removed request for shakkernerd February 2, 2026 16:13
shakkernerd added a commit that referenced this pull request Feb 2, 2026
@shakkernerd shakkernerd closed this Feb 2, 2026
@shakkernerd shakkernerd force-pushed the fix/webchat-scroll-position branch from fdbf307 to 777756e Compare February 2, 2026 16:31
@shakkernerd
Copy link
Member

Landed via manual merge to main.

Thanks @marcomarandiz for the contribution!

joeykrug pushed a commit to joeykrug/openclaw that referenced this pull request Feb 3, 2026
dbachelder pushed a commit to dbachelder/openclaw that referenced this pull request Feb 3, 2026
cjiewong pushed a commit to cjiewong/moltbot that referenced this pull request Feb 3, 2026
rishitank added a commit to TanksterAI/openclaw that referenced this pull request Feb 3, 2026
* fix: align tool execute parameter order

* Docs: expand ClawHub overview

* fix: align tool definition adapter

* fix: normalize tool execute args

* docs: fold 2026.2.2 into 2026.2.1

* fix: handle legacy tool execute signatures

* fix: satisfy tool adapter lint

* docs: update 2026.2.1 changelog

* docs: update appcast for 2026.2.1

* fix: guard remote media fetches with SSRF checks

* style: format fetch guard signatures

* fix(docker): add gateway subcommand and cloud-compatible flags

The Dockerfile CMD runs without arguments, causing the CLI to print
help and exit with code 1. This breaks deployment on container
platforms (Render, Railway, Fly.io, etc.) that rely on the CMD.

Changes:
- Add `gateway` subcommand to start the server
- Add `--allow-unconfigured` to allow startup without config file
- Add `--bind lan` to bind to 0.0.0.0 instead of localhost
  (required for container health checks)

Fixes openclaw#5685

* fix(docker): remove --bind lan from default CMD to work out of the box

Addresses review feedback: --bind lan requires auth token, so default
CMD should bind to loopback only.

For container platforms needing LAN binding for health checks:
1. Set OPENCLAW_GATEWAY_TOKEN env var
2. Override CMD: ["node","dist/index.js","gateway","--allow-unconfigured","--bind","lan"]

* docs: note docker allow-unconfigured behavior

* fix: start gateway in docker CMD (openclaw#6635) (thanks @kaizen403)

* test: cover SSRF blocking for attachment URLs

* fix: polish docker setup flow

* chore: We have a sleep at home. The sleep at home:

* fix(update): harden global updates

* chore: fix broken test.

* fix: expand SSRF guard coverage

* fix: stabilize docker e2e flows

* fix(telegram): handle Grammy HttpError network failures (openclaw#3815) (openclaw#7195)

* fix(telegram): handle Grammy HttpError network failures (openclaw#3815)

Grammy wraps fetch errors in an .error property (not .cause). Added .error
traversal to collectErrorCandidates in network-errors.ts.

Registered scoped unhandled rejection handler in monitorTelegramProvider
to catch network errors that escape the polling loop (e.g., from setMyCommands
during bot setup). Handler is unregistered when the provider stops.

* fix(telegram): address review feedback for Grammy HttpError handling

- Gate .error traversal on HttpError name to avoid widening search graph
- Use runtime logger instead of console.warn for consistency
- Add isGrammyHttpError check to scope unhandled rejection handler
- Consolidate isNetworkRelatedError into isRecoverableTelegramNetworkError
- Add 'timeout' to recoverable message snippets for full coverage

* CI: label maintainer issues

* Docs i18n: harden doc-mode pipeline

* Docs: add zh-CN translations

* Docs: fix zh-CN template time wording

What: replace <2/<30 text in zh-CN AGENTS template with safe wording
Why: avoid MDX parse errors during docs build
Tests: not run (doc text change)

* docs: add changelog for zh-CN translations (openclaw#6619) (thanks @joshp123)

* Docs: fix zh-CN ClawHub link

What: wrap clawhub.com in an explicit URL link in zh-CN skills doc
Why: avoid Mintlify broken-link parser treating trailing punctuation as part of the URL
Tests: not run (doc text change)

* Docs: use explicit ClawHub markdown link

What: switch clawhub.com reference to explicit Markdown link syntax
Why: MDX parser rejects angle-bracket autolinks
Tests: not run (doc text change)

* Docs i18n: tune zh-CN prompt + glossary

What: enforce zh-CN tone (你/你的), Skills/local loopback/Tailscale terms, Gateway网关
Why: keep future translation output consistent with issue feedback
Tests: not run (prompt/glossary change)

* Docs: normalize zh-CN terminology + tone

What: switch to 你/你的 tone; standardize Skills/Gateway网关/local loopback/私信 wording
Why: align zh-CN docs with issue 6995 feedback + idiomatic tech style
Tests: pnpm docs:build

* Tests: stub SSRF DNS pinning (openclaw#6619) (thanks @joshp123)

* fix(webchat): respect user scroll position during streaming and refresh

- Increase near-bottom threshold from 200px to 450px so one long message
  doesn't falsely register as 'near bottom'
- Make force=true only override on initial load (chatHasAutoScrolled=false),
  not on subsequent refreshChat() calls
- refreshChat() no longer passes force=true to scheduleChatScroll
- Add chatNewMessagesBelow flag for future 'scroll to bottom' button UI
- Clear chatNewMessagesBelow when user scrolls back to bottom
- Add 13 unit tests covering threshold, force behavior, streaming, and reset

* fix: address review feedback — retryDelay uses effectiveForce, default overrides param, @State() on chatNewMessagesBelow

* Docs: expand zh-Hans nav and fix assets

* Docs: expand zh-Hans nav (openclaw#7242) (thanks @joshp123)

* fix(ui): add core state and logic for scroll control

* feat(ui): add new messages indicator button

* docs: update changelog for PR openclaw#7226

* chore: fix formatting and CI

* iOS: wire node services and tests

* iOS: stabilize talk mode tests

* Gateway: fix node invoke receive loop

* Gateway: wait for snapshot before connect

* Agents: add nodes invoke action

* iOS: fix node notify and identity

* iOS: streamline notify timeouts

* iOS: add write commands for contacts/calendar/reminders

* iOS: add push-to-talk node commands

* iOS: pause voice wake during PTT

* iOS: add PTT once/cancel

* Gateway: add PTT chat + nodes CLI

* iOS: wire node commands and incremental TTS

* iOS: update onboarding and gateway UI

* Core: update shared gateway models

* iOS: improve gateway auto-connect and voice permissions

* Docs: add zh-CN landing notice + AI image

* Docs: add zh-CN landing note (openclaw#7303) (thanks @joshp123)

* Docs: expand zh-CN landing note

* Revert "iOS: wire node services and tests"

This reverts commit 7b0a0f3.

* Revert "Core: update shared gateway models"

This reverts commit 37eaca7.

* fix: resolve check errors in nodes-tool and commands-ptt

* feat(config): default thinking for sessions_spawn subagents (openclaw#7372)

* feat(config): add subagent default thinking

* fix: accept config subagents.thinking + stabilize test mocks (openclaw#7372) (thanks @tyler6204)

* fix: use findLast instead of clearAllMocks in test (openclaw#7372)

* fix: correct test assertions for tool result structure (openclaw#7372)

* fix: remove unnecessary type assertion after rebase

* fix: validate AbortSignal instances before calling AbortSignal.any()

Fixes openclaw#7269

* refactor: use structural typing instead of instanceof for AbortSignal check

Address P1 review feedback from Greptile: instanceof AbortSignal may be
unreliable across different realms (VM, iframe, etc.) where the AbortSignal
constructor may differ. Use structural typing (checking for aborted property
and addEventListener method) for more robust cross-realm compatibility.

* fix: validate AbortSignal instances before calling AbortSignal.any() (openclaw#7277) (thanks @Elarwei001)

* fix(tools): ensure file_path alias passes validation in read/write tools (openclaw#7451)

Co-authored-by: lotusfall <lotusfall@outlook.com>

* feat: add Tankster AI customizations for Coolify deployment

- Add Dockerfile.tankster with pre-installed packages (clawdhub, auggie, summarize, gifgrep)
- Add docker-compose.coolify.yml for Coolify GitHub sync deployment
- Add install-tankster-extras.sh script for additional package installation
- Include system packages: jq, ripgrep, ffmpeg, tmux, bash, golang-go, python3
- Configure Augment credentials mount and coolify network integration

* fix: use external volumes for data persistence

- Mark openclaw-data and openclaw-workspace as external volumes
- Volumes are pre-created with migrated data from legacy Moltbot setup

* feat: rename docker-compose.coolify.yml to docker-compose.yaml for Coolify

- Coolify expects docker-compose.yaml at the root
- This overrides the upstream docker-compose.yml for our deployment

* fix: use Node 25 and Go 1.22 for gifgrep compatibility

- Upgrade base image from node:22-bookworm to node:25-bookworm
- Install Go 1.22 from official tarball instead of Debian's golang-go
- gifgrep requires Go 1.21+ for toolchain directive support

* fix: install corepack globally before enabling (Node 25 compat)

Node 25 no longer bundles corepack by default, so we need to
install it via npm first before running corepack enable.

* fix: use --force flag for corepack install (fix yarnpkg symlink conflict)

* chore: add CodeRabbit, CODEOWNERS, PR template; update issue templates

- Add .coderabbit.yaml with OpenClaw-themed review personality
- Add .github/CODEOWNERS to auto-assign @rishitank as reviewer
- Add .github/PULL_REQUEST_TEMPLATE.md following project standards
- Update issue templates: Clawdbot → OpenClaw references
- Disable blank issues, add documentation links

* ci: add security, release, and auto-merge workflows

- Add .github/workflows/security.yml with CodeQL, dependency review, npm audit
- Add .github/workflows/release.yml with release-please automation
- Add .github/workflows/auto-merge.yml for automatic PR merging
- Add release-please-config.json and .release-please-manifest.json
- Update dependabot.yml: MoltbotKit → OpenClawKit, add Docker ecosystem

* fix: make CI workflows resilient for fork environment

- security.yml: Add continue-on-error for dependency review (requires dependency graph)
- auto-merge.yml: Check if PAT_AUTO_MERGE secret exists before attempting merge
- labeler.yml: Only run in upstream openclaw/openclaw repo (requires GH_APP_PRIVATE_KEY)

* style: fix swiftformat violations in macOS app

Auto-formatted with swiftformat 0.59.1 to fix:
- sortImports: alphabetical import ordering
- indent: proper indentation
- trailingSpace: remove trailing whitespace
- redundantProperty: simplify property definitions
- docComments: use doc comments for API declarations
- wrapPropertyBodies: multi-line property bodies
- redundantViewBuilder: remove unnecessary @ViewBuilder

* fix: shorten tone_instructions to comply with 250 char limit

CodeRabbit requires tone_instructions to be at most 250 characters.
Condensed the crab personality while keeping the essential wit.

* perf: skip duplicate CI runs on feature branch pushes

Add condition to skip workflow runs triggered by push events on
non-main branches. This prevents duplicate runs when pushing to
a PR branch (which triggers both push and pull_request events).

Jobs now only run when:
- Event is pull_request (any branch), OR
- Event is push AND branch is main

This halves the number of CI jobs for PR workflows.

* fix: remove useless variable initialization in fetchRemoteMedia

The finalUrl variable was initialized to url but immediately overwritten
by result.finalUrl in the try block. If the try block throws, we exit
immediately, so the initial value was never used.

This fixes a CodeQL warning about useless assignment.

* fix: address CodeRabbit review comments

- Update .coderabbit.yaml tone to Darth Vader (matching auggie-openai-proxy)
- Remove trailing blank line from .coderabbit.yaml
- Add docker-compose*.yml pattern to CODEOWNERS
- Use GraphQL auto-merge API in release.yml (respects branch protection)
- Parameterize AUGMENT_CREDENTIALS_PATH in docker-compose.yaml
- Fix curl|sh security issues in Dockerfile.tankster and install script
- Change npm to pnpm in Dockerfile.tankster and install-tankster-extras.sh
- Fix .ts to .js import extension in bash-tools test file

* chore(deps): update dependencies to latest versions

- @aws-sdk/client-bedrock: 3.980.0 → 3.981.0
- @mariozechner/pi-agent-core: 0.51.0 → 0.51.1
- @mariozechner/pi-ai: 0.51.0 → 0.51.1
- @mariozechner/pi-coding-agent: 0.51.0 → 0.51.1
- @mariozechner/pi-tui: 0.51.0 → 0.51.1
- @sinclair/typebox: 0.34.47 → 0.34.48 (with pnpm override)
- @typescript/native-preview: 7.0.0-dev.20260201.1 → 7.0.0-dev.20260202.1
- oxfmt: 0.27.0 → 0.28.0
- oxlint: 1.42.0 → 1.43.0

The typebox upgrade required updating the pnpm override to force all
packages to use the same version, avoiding unique symbol conflicts.

* fix: make Labeler and Auto-Merge workflows resilient in forks

- Add 'if: github.repository == openclaw/openclaw' to label-issues job
  (was missing, causing secret access failures in forks)
- Simplify Auto-Merge workflow with continue-on-error for missing PAT
  (the previous bash secret check didn't work as intended)

* style: apply formatting cleanup

- Remove trailing blank lines from various files
- Normalize quote styles in YAML files
- Minor CSS whitespace cleanup in resizable-divider.ts

* feat: migrate from tsx to Node 25 native TypeScript support

Node 25 has native TypeScript support enabled by default, eliminating
the need for tsx as a TypeScript loader.

Changes:
- Remove tsx from devDependencies
- Update all 'node --import tsx' commands to just 'node'
- Update Dockerfile from node:22 to node:25
- Update CI workflows to use Node 25.x
- Update README to reflect native TS support

This simplifies the build process and removes a dependency.

* chore: use .nvmrc for Node version consistency

Created .nvmrc with Node 25 and updated all GitHub Actions workflows
to use node-version-file instead of hardcoded node-version values.

This ensures a single source of truth for the Node.js version across
local development (via nvm) and CI/CD pipelines.

* refactor: rename docker-compose.yaml to docker-compose.tankster.yaml

Renamed the Tankster-specific Docker Compose file to distinguish it from
the upstream generic docker-compose.yml:

- docker-compose.yml: Upstream/generic OpenClaw deployment (uses pre-built image)
- docker-compose.tankster.yaml: Tankster AI deployment (builds from Dockerfile.tankster,
  includes Coolify config, additional env vars for Telegram/Slack/Discord/Augment)

Also updated Coolify application settings to use the new compose file location.

* fix: remove remaining tsx references for Node 25 native TS support

- Remove --import tsx from gateway.sigterm.test.ts (Node 25 runs .ts natively)
- Remove tsx binary check from doctor-install.ts (no longer needed)

* fix: correct .nvmrc path in formal-conformance workflow

The workflow checks out openclaw to a subdirectory, so the path
needs to be openclaw/.nvmrc instead of .nvmrc

* fix: add --experimental-transform-types for Node 25 child process

Node 25's native TypeScript support with --experimental-strip-types
only strips types but doesn't rewrite .js imports to .ts. The child
process spawned by the test needs --experimental-transform-types to
handle the .js extension imports in the codebase.

* refactor: convert scripts to ES6 TypeScript with arrow functions

- Convert all 5 scripts from .js to .ts with full type annotations
- Replace ES5 function declarations with ES6 arrow functions
- Use extensionless imports for consistency
- Add proper TypeScript interfaces for all complex types
- Update package.json references from .js to .ts
- Update test file imports to use extensionless paths
- Update pre-commit hook to reference .ts file

* fix: add .ts extension to setup-git-hooks import in postinstall

Node.js native TypeScript support requires explicit .ts extensions
for imports when using --experimental-strip-types.

* Revert "fix: add .ts extension to setup-git-hooks import in postinstall"

This reverts commit e1ced92.

* fix: use jiti to run postinstall script for extensionless TypeScript imports

jiti provides runtime TypeScript support with proper module resolution
for extensionless imports, which node's native TypeScript support
(--experimental-strip-types) doesn't handle without additional flags.

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Rishi Vhavle <134706404+kaizen403@users.noreply.github.com>
Co-authored-by: Ayaan Zaidi <zaidi@uplause.io>
Co-authored-by: cpojer <christoph.pojer@gmail.com>
Co-authored-by: Christian Klotz <hello@christianklotz.co.uk>
Co-authored-by: Shadow <shadow@clawd.bot>
Co-authored-by: Josh Palmer <joshp123@users.noreply.github.com>
Co-authored-by: CLAWDINATOR Bot <clawdinator[bot]@users.noreply.github.com>
Co-authored-by: Marco Marandiz <admin-marco@Mac.lan>
Co-authored-by: Shakker <shakkerdroid@gmail.com>
Co-authored-by: Mariano Belinky <mariano@mb-server-643.local>
Co-authored-by: Mariano Belinky <mbelinky@gmail.com>
Co-authored-by: Tyler Yust <64381258+tyler6204@users.noreply.github.com>
Co-authored-by: Elarwei <elarweis@gmail.com>
Co-authored-by: bqcfjwhz85-arch <bqcfjwhz85@privaterelay.appleid.com>
Co-authored-by: lotusfall <lotusfall@outlook.com>
HashWarlock pushed a commit to HashWarlock/openclaw that referenced this pull request Feb 4, 2026
CompassHXM added a commit to CompassHXM/clawdbot that referenced this pull request Feb 5, 2026
* docs: note docker allow-unconfigured behavior

* fix: start gateway in docker CMD (#6635) (thanks @kaizen403)

* test: cover SSRF blocking for attachment URLs

* fix: polish docker setup flow

* chore: We have a sleep at home. The sleep at home:

* fix(update): harden global updates

* chore: fix broken test.

* fix: expand SSRF guard coverage

* fix: stabilize docker e2e flows

* fix(telegram): handle Grammy HttpError network failures (#3815) (#7195)

* fix(telegram): handle Grammy HttpError network failures (#3815)

Grammy wraps fetch errors in an .error property (not .cause). Added .error
traversal to collectErrorCandidates in network-errors.ts.

Registered scoped unhandled rejection handler in monitorTelegramProvider
to catch network errors that escape the polling loop (e.g., from setMyCommands
during bot setup). Handler is unregistered when the provider stops.

* fix(telegram): address review feedback for Grammy HttpError handling

- Gate .error traversal on HttpError name to avoid widening search graph
- Use runtime logger instead of console.warn for consistency
- Add isGrammyHttpError check to scope unhandled rejection handler
- Consolidate isNetworkRelatedError into isRecoverableTelegramNetworkError
- Add 'timeout' to recoverable message snippets for full coverage

* CI: label maintainer issues

* Docs i18n: harden doc-mode pipeline

* Docs: add zh-CN translations

* Docs: fix zh-CN template time wording

What: replace <2/<30 text in zh-CN AGENTS template with safe wording
Why: avoid MDX parse errors during docs build
Tests: not run (doc text change)

* docs: add changelog for zh-CN translations (#6619) (thanks @joshp123)

* Docs: fix zh-CN ClawHub link

What: wrap clawhub.com in an explicit URL link in zh-CN skills doc
Why: avoid Mintlify broken-link parser treating trailing punctuation as part of the URL
Tests: not run (doc text change)

* Docs: use explicit ClawHub markdown link

What: switch clawhub.com reference to explicit Markdown link syntax
Why: MDX parser rejects angle-bracket autolinks
Tests: not run (doc text change)

* Docs i18n: tune zh-CN prompt + glossary

What: enforce zh-CN tone (你/你的), Skills/local loopback/Tailscale terms, Gateway网关
Why: keep future translation output consistent with issue feedback
Tests: not run (prompt/glossary change)

* Docs: normalize zh-CN terminology + tone

What: switch to 你/你的 tone; standardize Skills/Gateway网关/local loopback/私信 wording
Why: align zh-CN docs with issue 6995 feedback + idiomatic tech style
Tests: pnpm docs:build

* Tests: stub SSRF DNS pinning (#6619) (thanks @joshp123)

* fix(webchat): respect user scroll position during streaming and refresh

- Increase near-bottom threshold from 200px to 450px so one long message
  doesn't falsely register as 'near bottom'
- Make force=true only override on initial load (chatHasAutoScrolled=false),
  not on subsequent refreshChat() calls
- refreshChat() no longer passes force=true to scheduleChatScroll
- Add chatNewMessagesBelow flag for future 'scroll to bottom' button UI
- Clear chatNewMessagesBelow when user scrolls back to bottom
- Add 13 unit tests covering threshold, force behavior, streaming, and reset

* fix: address review feedback — retryDelay uses effectiveForce, default overrides param, @state() on chatNewMessagesBelow

* Docs: expand zh-Hans nav and fix assets

* Docs: expand zh-Hans nav (#7242) (thanks @joshp123)

* fix(ui): add core state and logic for scroll control

* feat(ui): add new messages indicator button

* docs: update changelog for PR #7226

* chore: fix formatting and CI

* iOS: wire node services and tests

* iOS: stabilize talk mode tests

* Gateway: fix node invoke receive loop

* Gateway: wait for snapshot before connect

* Agents: add nodes invoke action

* iOS: fix node notify and identity

* iOS: streamline notify timeouts

* iOS: add write commands for contacts/calendar/reminders

* iOS: add push-to-talk node commands

* iOS: pause voice wake during PTT

* iOS: add PTT once/cancel

* Gateway: add PTT chat + nodes CLI

* iOS: wire node commands and incremental TTS

* iOS: update onboarding and gateway UI

* Core: update shared gateway models

* iOS: improve gateway auto-connect and voice permissions

* Docs: add zh-CN landing notice + AI image

* Docs: add zh-CN landing note (#7303) (thanks @joshp123)

* Docs: expand zh-CN landing note

* Revert "iOS: wire node services and tests"

This reverts commit 7b0a0f3dace575c33dafb61d4a13cdef4dd0d64e.

* Revert "Core: update shared gateway models"

This reverts commit 37eaca719a68aa1ad9dcbfe83c8a20e88bb6951a.

* fix: resolve check errors in nodes-tool and commands-ptt

* feat(config): default thinking for sessions_spawn subagents (#7372)

* feat(config): add subagent default thinking

* fix: accept config subagents.thinking + stabilize test mocks (#7372) (thanks @tyler6204)

* fix: use findLast instead of clearAllMocks in test (#7372)

* fix: correct test assertions for tool result structure (#7372)

* fix: remove unnecessary type assertion after rebase

* fix: validate AbortSignal instances before calling AbortSignal.any()

Fixes #7269

* refactor: use structural typing instead of instanceof for AbortSignal check

Address P1 review feedback from Greptile: instanceof AbortSignal may be
unreliable across different realms (VM, iframe, etc.) where the AbortSignal
constructor may differ. Use structural typing (checking for aborted property
and addEventListener method) for more robust cross-realm compatibility.

* fix: validate AbortSignal instances before calling AbortSignal.any() (#7277) (thanks @Elarwei001)

* fix(tools): ensure file_path alias passes validation in read/write tools (#7451)

Co-authored-by: lotusfall <lotusfall@outlook.com>

* fix: skip audio files from text extraction to prevent binary processing (#7475)

* fix: skip audio files from text extraction early

Audio files should not be processed through extractFileBlocks for text
extraction - they are handled by the dedicated audio transcription
capability (STT).

Previously, audio files were only skipped if they didn't "look like text"
(looksLikeUtf8Text check). This caused issues where some audio binary
data (e.g., long Telegram voice messages) could accidentally pass the
heuristic check and get processed as text content.

This fix:
1. Adds audio to the early skip alongside image/video (more efficient)
2. Removes the redundant secondary check that had the flawed condition

Fixes audio binary being incorrectly processed as text in Telegram and
other platforms.

* Media: skip binary media in file extraction (#7475) (thanks @AlexZhangji)

---------

Co-authored-by: Shakker <shakkerdroid@gmail.com>

* fix(telegram): recover from grammY "timed out" long-poll errors (#7239)

grammY getUpdates returns "Request to getUpdates timed out after 500 seconds"
but RECOVERABLE_MESSAGE_SNIPPETS only had "timeout". Since
"timed out".includes("timeout") === false, the error was not classified as
recoverable, causing the polling loop to exit permanently.

Add "timed out" to RECOVERABLE_MESSAGE_SNIPPETS so the polling loop retries
instead of dying silently.

Fixes #7239
Fixes #7255

* fix(telegram): recover from grammY long-poll timeouts (#7466) (thanks @macmimi23)

* Docs: fix compatibility shim note

* Agent: repair malformed tool calls and session files

* Changelog: note tool call repair

* Agents: fix lint in tool-call sanitizers

* Agents: harden session file repair

* Agents: flush pending tool results on drop

* Docs: simplify transcript hygiene scope

* fix: repair malformed tool calls and session transcripts (#7473) (thanks @justinhuangcode)

* chore: Update deps.

* fix(slack): fail closed on slash command channel type lookup

* fix: harden exec allowlist parsing

* fix(gateway): require shared auth before device bypass

* style(ui): format resizable divider

* chore: Fix CI.

* Docs: clarify whats new FAQ heading (#7394)

* feat(ui): add Agents dashboard

* Security: new openclaw-system-admin skill + bootstrap audit

* Security: rename openclaw-system-admin skill to healthcheck

* Security: remove openclaw-system-admin skill path

* Security: refine healthcheck workflow

* Security: healthcheck skill (#7641) (thanks @Takhoffman)

* chore: fix CI

* chore: fix formatting

* Security: tune bootstrap healthcheck prompt + healthcheck wording

* chore: fix formatting

* CLI: restore terminal state on exit

* Onboarding: keep TUI flow exclusive

* fix: error handling in restore failure reporting

* feat (memory): Implement new (opt-in) QMD memory backend

* Make memory more resilient to failure

* Add more tests; make fall back more resilient and visible

* Fix build errors

* fix(qmd): use XDG dirs for qmd home; drop ollama docs

* fix(memory-qmd): write XDG index.yml + legacy compat

* fix(memory-qmd): create collections via qmd CLI (no YAML)

* Add how to trigger model downloads for qmd in documentation

* fix(memory/qmd): throttle embed + citations auto + restore --force

* Tests: use OPENCLAW_STATE_DIR in qmd manager

* Docs: align QMD state dir with OpenClaw

* Memory: parse quoted qmd command

* Memory: fix QMD scope channel parsing

* Memory: harden QMD memory_get path checks

* Memory: clamp QMD citations to injected budget

* Tests: cover QMD scope, reads, and citation clamp

* QMD: use OpenClaw config types

* Fix build regressions after merge

* Lint: add braces for single-line ifs

* fix: make QMD cache key deterministic

* fix: derive citations chat type via session parser

* chore: apply formatter

* chore: restore OpenClaw branding

* chore: fix lint warnings

* chore: oxfmt

* fix: restore session_status and CLI examples

* chore: oxfmt

* fix: restore safety + session_status hints

* chore: oxfmt

* fix: changelog entry for QMD memory (#3160) (thanks @vignesh07)

* docs: finish renaming memory state dir references

* CLI: cache shell completion scripts

* Install: cache completion scripts on install/update

* Onboarding: drop completion prompt

* chore: update changelog for completion caching

* chore: Migrate to tsdown, speed up JS bundling by ~10x (thanks @hyf0).

The previous migration to tsdown was reverted because it caused a ~20x slowdown when running OpenClaw from the repo. @hyf0 investigated and found that simply renaming the `dist` folder also caused the same slowdown. It turns out the Plugin script loader has a bunch of voodoo vibe logic to determine if it should load files from source and compile them, or if it should load them from dist. When building with tsdown, the filesystem layout is different (bundled), and so some files weren't in the right location, and the Plugin script loader decided to compile source files from scratch using Jiti.

The new implementation uses tsdown to embed `NODE_ENV: 'production'`, which we now use to determine if we are running OpenClaw from a "production environmen" (ie. from dist). This removes the slop in favor of a deterministic toggle, and doesn't rely on directory names or similar.

There is some code reaching into `dist` to load specific modules, primarily in the voice-call extension, which I simplified into loading an "officially" exported `extensionAPI.js` file. With tsdown, entry points need to be explicitly configured, so we should be able to avoid sloppy code reaching into internals from now on. This might break some existing users, but if it does, it's because they were using "private" APIs.

* fix: CI: We no longer need to test the tsc build with Bun, we are always using `tsdown` to build now.

* fix: Remove `tsconfig.oxlint.json` AGAIN.

* feat: remove slop.

* chore: clean up git hooks and actually install them again.

* fix: Fix Mac app build step.

* chore: Fix all TypeScript errors in `ui`.

* chore: Switch to `NodeNext` for `module`/`moduleResolution` in `ui`.

* chore: Merge tsconfigs, typecheck `ui` as part of `pnpm tsgo` locally and on CI.

* Skills: refine healthcheck guidance

* fix(voice-call): harden inbound policy

* fix(matrix): harden allowlists

* fix: harden Windows exec allowlist

* docs: Update information architecture for OpenClaw docs (#7622)

* docs: restructure navigation into 5 tabs for better IA

* dedupe redirects

* use 8 tabs

* add missing /index extensions

* update zh navigation

* remove `default: true` and rearrange languages

* add missing redirects

* format:fix

* docs: update IA tabs + restore /images redirect (#7622) (thanks @ethanpalm)

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>

* fix: restore OpenClaw docs/source links in system prompt

* chore: prepare 2026.2.2 release

* fix(ui): fix web UI after tsdown migration and typing changes

* fix(skills): warn when bundled dir missing

* fix(ui): refresh agent files after external edits

* fix(ui): note agent file refresh in changelog

* Docs: refresh zh-CN translations + i18n guidance

What:
- update zh-CN glossary, translation prompt, and TM
- regenerate zh-CN docs and apply targeted fixes
- add zh-CN AGENTS guidance for translation pipeline

Why:
- address zh-CN terminology and spacing feedback from #6995

Tests:
- pnpm build && pnpm check && pnpm test

* Docs: update zh-CN translations and pipeline

What:
- update zh-CN glossary, TM, and translator prompt
- regenerate zh-CN docs and apply targeted fixes
- add zh-CN AGENTS pipeline guidance

Why:
- address terminology/spacing feedback from #6995

Tests:
- pnpm build && pnpm check && pnpm test

* Docs(zh-CN): add AGENTS translation workflow

* Channels: add Feishu/Lark support

* Channels: finish Feishu/Lark integration

* fix: harden control ui framing + ws origin

* fix(approvals): gate /approve by gateway scopes

* test: add /approve gateway scope coverage (#1) (thanks @mitsuhiko)

* test: reset /approve mock per test (#1) (thanks @mitsuhiko)

* chore: prep 2026.2.2 docs/release checks

* chore: update appcast for 2026.2.2

* chore: add mac dSYM zip to release artifacts

* fix: use build-info for version fallback

* Docs: guard zh-CN i18n workflow

What:
- document zh-CN docs pipeline and generated-doc guardrails
- note Discord escalation when the pipeline drags

Why:
- prevent accidental edits to generated translations

Tests:
- pnpm build
- pnpm check
- pnpm test

Co-authored-by: Josh Palmer <joshpalmer123@gmail.com>

* chore: bump version to 2026.2.2-1

* fix: improve build-info resolution for commit/version

* Docs: drop healthcheck from bootstrap

* fix(update): honor update.channel for update.run

* fix: enforce Nextcloud Talk allowlist by user id

* feat: add configurable web_fetch maxChars cap

* fix(matrix): require unique allowlist matches in wizard

* fix: add legacy daemon-cli shim for updates

* iMessage: promote BlueBubbles and refresh docs/skills (#8415)

* feat: Make BlueBubbles the primary iMessage integration

- Remove old imsg skill (skills/imsg/SKILL.md)
- Create new BlueBubbles skill (skills/bluebubbles/SKILL.md) with message tool examples
- Add keep-alive script documentation for VM/headless setups to docs/channels/bluebubbles.md
  - AppleScript that pokes Messages.app every 5 minutes
  - LaunchAgent configuration for automatic execution
  - Prevents Messages.app from going idle in VM environments
- Update all documentation to prioritize BlueBubbles over legacy imsg:
  - Mark imsg channel as legacy throughout docs
  - Update README.md channel lists
  - Update wizard, hubs, pairing, and index docs
  - Update FAQ to recommend BlueBubbles for iMessage
  - Update RPC docs to note imsg as legacy pattern
  - Update Chinese documentation (zh-CN)
- Replace imsg examples with generic macOS skill examples where appropriate

BlueBubbles is now the recommended first-class iMessage integration,
with the legacy imsg integration marked for potential future removal.

* refactor: Update import paths and improve code formatting

- Adjusted import paths in session-status-tool.ts, whatsapp-heartbeat.ts, and heartbeat-runner.ts for consistency.
- Reformatted code for better readability by aligning and grouping related imports and function parameters.
- Enhanced error messages and conditional checks for clarity in heartbeat-runner.ts.

* skills: restore imsg skill and align bluebubbles skill

* docs: update FAQ for clarity and formatting

- Adjusted the formatting of the FAQ section to ensure consistent bullet point alignment.
- No content changes were made, only formatting improvements for better readability.

* style: oxfmt touched files

* fix: preserve BlueBubbles developer reference (#8415) (thanks @tyler6204)

* refactor: remove unnecessary blank line in policy test file

* chore: bump version to 2026.2.3

* feat: add new messages indicator style for chat interface

- Introduced a floating pill element above the compose area to indicate new messages.
- Styled the indicator with hover effects and responsive design for better user interaction.

* Telegram: add inline button model selection for /models and /model commands

* Telegram: fix model button review issues

- Add currentModel to callback handler for checkmark display
- Add 64-byte callback_data limit protection (skip long model IDs)
- Add tests for large model lists and callback_data limits

* fix: honor telegram model overrides in buttons (#8193) (thanks @gildo)

* chore: update changelog for #8193 (thanks @gildo)

* feat(discord): add set-presence action for bot activity and status

Bridge the agent tools layer to the Discord gateway WebSocket via a new
gateway registry, allowing agents to set the bot's activity and online
status. Supports playing, streaming, listening, watching, custom, and
competing activity types. Custom type uses activityState as the sidebar
text; other types show activityName in the sidebar and activityState in
the flyout. Opt-in via channels.discord.actions.presence (default false).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Address PR feedback

* Make openclaw consistent in this file (#8533)

Co-authored-by: stephenchen2025 <schenjobs@gmail.com>

* style: update chat new-messages button

* feat: add support for Moonshot API key for China endpoint

* fix: keep Moonshot CN base URL in onboarding (#7180) (thanks @waynelwz)

* docs(skills): split tmux send-keys for TUI (#7737)

* docs(skills): split tmux send-keys for TUI

* docs(skills): soften TUI send-keys wording

---------

Co-authored-by: wangnov <1694546283@qq.com>

* docs: note tmux send-keys TUI guidance (#7737) (thanks @Wangnov)

* fix(control-ui): resolve header logo when gateway.controlUi.basePath is set (#7178)

* fix(control-ui): resolve header logo when gateway.controlUi.basePath is set

* refactor(control-ui): header logo under basePath; normalize logo URL with normalizeBasePath

* docs: add changelog for #7178 (thanks @Yeom-JinHo)

* docs: document secure DM mode preset (#7872)

* docs: document secure DM mode preset

* fix: resolve merge conflict in resizable-divider

* fix(security): separate untrusted channel metadata from system prompt (thanks @KonstantinMirin)

* docs: update Feishu plugin docs

* feat: Add Docs Chat Widget with RAG-powered Q&A (#7908)

* feat: add docs chat prototype and related scripts

- Introduced a minimal documentation chatbot that builds a search index from markdown files and serves responses via an API.
- Added scripts for building the index and serving the chat API.
- Updated package.json with new commands for chat index building and serving.
- Created a new Vercel configuration file for deployment.
- Added a README for the docs chat prototype detailing usage and integration.

* feat: enhance docs chat with vector-based RAG pipeline

- Added vector index building and serving capabilities to the docs chat.
- Introduced new scripts for generating embeddings and serving the chat API using vector search.
- Updated package.json with new commands for vector index operations.
- Enhanced README with instructions for the new RAG pipeline and legacy keyword pipeline.
- Removed outdated Vercel configuration file.

* feat: enhance chat widget with markdown rendering and style updates

- Integrated dynamic loading of markdown rendering for chat responses.
- Implemented a fallback for markdown rendering to ensure consistent display.
- Updated CSS variables for improved theming and visual consistency.
- Enhanced chat bubble and input styles for better user experience.
- Added new styles for markdown content in chat bubbles, including code blocks and lists.

* feat: add copy buttons to chat widget for enhanced user interaction

- Implemented copy buttons for chat responses and code blocks in the chat widget.
- Updated CSS styles for improved visibility and interaction of copy buttons.
- Adjusted textarea height for better user experience.
- Enhanced functionality to allow users to easily copy text from chat bubbles and code snippets.

* feat: update chat widget styles for improved user experience

- Changed accent color for better visibility.
- Enhanced preformatted text styles for code blocks, including padding and word wrapping.
- Adjusted positioning and styles of copy buttons for chat responses and code snippets.
- Improved hover effects for copy buttons to enhance interactivity.

* feat: enhance chat widget styles for better responsiveness and scrollbar design

- Updated chat panel dimensions for improved adaptability on various screen sizes.
- Added custom scrollbar styles for better aesthetics and usability.
- Adjusted chat bubble styles for enhanced visibility and interaction.
- Improved layout for expanded chat widget on smaller screens.

* feat: refine chat widget code block styles and copy button functionality

- Adjusted padding and margin for preformatted text in chat responses for better visual consistency.
- Introduced a compact style for single-line code blocks to enhance layout.
- Updated copy button logic to skip short code blocks, improving user experience when copying code snippets.

* feat: add resize handle functionality to chat widget for adjustable panel width

- Implemented a draggable resize handle for the chat widget's sidebar, allowing users to adjust the panel width.
- Added CSS styles for the resize handle, including hover effects and responsive behavior.
- Integrated drag-to-resize logic to maintain user-set width across interactions.
- Ensured the panel resets to default width when closed, enhancing user experience.

* feat: implement rate limiting and error handling in chat API

- Added rate limiting functionality to the chat API, allowing a maximum number of requests per IP within a specified time window.
- Implemented error handling for rate limit exceeded responses, including appropriate headers and retry instructions.
- Enhanced error handling for other API errors, providing user-friendly messages for various failure scenarios.
- Updated README to include new environment variables for rate limiting configuration.

* feat: integrate Upstash Vector for enhanced document retrieval in chat API

- Implemented Upstash Vector as a cloud-based storage solution for document chunks, replacing the local LanceDB option.
- Added auto-detection of storage mode based on environment variables for seamless integration.
- Updated the chat API to utilize the new retrieval mechanism, enhancing response accuracy and performance.
- Enhanced README with setup instructions for Upstash and updated environment variable requirements.
- Introduced new scripts and configurations for managing the vector index and API interactions.

* feat: add create-markdown-preview.js for markdown rendering

- Introduced a new script for framework-agnostic HTML rendering of markdown content.
- The script includes various parsing functions to handle different markdown elements.
- Updated the chat widget to load the vendored version of @create-markdown/preview for improved markdown rendering.

* docs: update README for Upstash Vector index setup and environment variables

- Enhanced instructions for creating a Vector index in Upstash, including detailed settings and important notes.
- Clarified environment variable requirements for both Upstash and LanceDB modes.
- Improved formatting and organization of setup steps for better readability.
- Added health check and API endpoint details for clearer usage guidance.

* feat: add TRUST_PROXY environment variable for IP address handling

- Introduced the TRUST_PROXY variable to control the trust of X-Forwarded-For headers when behind a reverse proxy.
- Updated the README to document the new environment variable and its default value.
- Enhanced the getClientIP function to conditionally trust proxy headers based on the TRUST_PROXY setting.

* feat: add ALLOWED_ORIGINS environment variable for CORS configuration

- Introduced the ALLOWED_ORIGINS variable to specify allowed origins for CORS, enhancing security and flexibility.
- Updated the README to document the new environment variable and its usage.
- Refactored CORS handling in the server code to utilize the ALLOWED_ORIGINS setting for dynamic origin control.

* fix: ensure complete markdown rendering in chat widget

- Added logic to flush any remaining buffered bytes from the decoder, ensuring that all text is rendered correctly in the assistant bubble.
- Updated the assistant bubble's innerHTML to reflect the complete markdown content after streaming completes.

* feat: enhance DocsStore with improved vector handling and similarity conversion

- Added a constant for the distance metric used in vector searches, clarifying the assumption of L2 distance.
- Updated the createTable method to ensure all chunk properties are correctly mapped during table creation.
- Improved the similarity score calculation by providing a clear explanation of the conversion from L2 distance, ensuring accurate ranking of results.

* chore: fix code formatting

* Revert "chore: fix code formatting"

This reverts commit 6721f5b0b7bf60b76c519ccadfa41742f19ecf87.

* chore: format code for improved readability

- Reformatted code in serve.ts to enhance readability by adjusting indentation and line breaks.
- Ensured consistent style for function return types and object properties throughout the file.

* feat: Update API URL selection logic in chat widget

- Enhanced the API URL configuration to prioritize explicit settings, defaulting to localhost for development and using a production URL otherwise.
- Improved clarity in the code by adding comments to explain the logic behind the API URL selection.

* chore: Update documentation structure for improved organization

- Changed the path for the "Start Here" page to "start/index" for better clarity.
- Reformatted the "Web & Interfaces" and "Help" groups to use multi-line arrays for improved readability.

* feat: Enhance markdown preview integration and improve chat widget asset loading

- Wrapped the markdown preview functionality in an IIFE to expose a global API for easier integration.
- Updated the chat widget to load the markdown preview library dynamically, checking for existing instances to avoid duplicate loads.
- Adjusted asset paths in the chat widget to ensure correct loading based on the environment (local or production).
- Added CORS headers in the Vercel configuration for improved API accessibility.

* fix: Update chat API URL to include '/api' for correct endpoint access

- Modified the chat configuration and widget files to append '/api' to the API URL, ensuring proper endpoint usage in production and local environments.

* refactor: Simplify docs-chat configuration and remove unused scripts

- Removed outdated scripts and configurations related to the docs-chat feature, including build and serve scripts, as well as the associated package.json and README files.
- Streamlined the API URL configuration in the chat widget for better clarity and maintainability.
- Updated the package.json to remove unnecessary scripts related to the now-deleted functionality.

* refactor: Update documentation structure for improved clarity

- Changed the path for the "Start Here" page from "start/index" to "index" to enhance navigation and organization within the documentation.

* chore: Remove unused dependencies from package.json and pnpm-lock.yaml

- Deleted `@lancedb/lancedb`, `@upstash/vector`, and `openai` from both package.json and pnpm-lock.yaml to streamline the project and reduce bloat.

* chore: Clean up .gitignore by removing obsolete entries

- Deleted unused entries related to the docs-chat vector database from .gitignore to maintain a cleaner configuration.

* chore: Remove deprecated chat configuration and markdown preview script

- Deleted the `create-markdown-preview.js` script and the `docs-chat-config.js` file to eliminate unused assets and streamline the project.
- Updated the `docs-chat-widget.js` to directly reference the markdown library from a CDN, enhancing maintainability.

* chore: Update markdown rendering in chat widget to use marked library

- Replaced the deprecated `create-markdown-preview` library with the `marked` library for markdown rendering.
- Adjusted the script loading mechanism to fetch `marked` from a CDN, improving performance and maintainability.
- Enhanced the markdown rendering function to ensure security by disabling HTML pass-through and opening links in new tabs.

* Delete docs/start/index.md

* fix: harden voice-call webhook verification

* fix(cron): fix timeout, add timestamp validation, enable file sync

Fixes #7667

Task 1: Fix cron operation timeouts
- Increase default gateway tool timeout from 10s to 30s
- Increase cron-specific tool timeout to 60s
- Increase CLI default timeout from 10s to 30s
- Prevents timeouts when gateway is busy with long-running jobs

Task 2: Add timestamp validation
- New validateScheduleTimestamp() function in validate-timestamp.ts
- Rejects atMs timestamps more than 1 minute in the past
- Rejects atMs timestamps more than 10 years in the future
- Applied to both cron.add and cron.update operations
- Provides helpful error messages with current time and offset

Task 3: Enable file sync for manual edits
- Track file modification time (storeFileMtimeMs) in CronServiceState
- Check file mtime in ensureLoaded() and reload if changed
- Recompute next runs after reload to maintain accuracy
- Update mtime after persist() to prevent reload loop
- Dashboard now picks up manual edits to ~/.openclaw/cron/jobs.json

* feat(cron): introduce delivery modes for isolated jobs

- Added support for new delivery modes in cron jobs: `announce`, `deliver`, and `none`.
- Updated documentation to reflect changes in delivery options and usage examples.
- Enhanced the cron job schema to include delivery configuration.
- Refactored related CLI commands and UI components to accommodate the new delivery settings.
- Improved handling of legacy delivery fields for backward compatibility.

This update allows users to choose how output from isolated jobs is delivered, enhancing flexibility in job management.

* feat(cron): default isolated jobs to announce delivery and enhance scheduling options

- Updated isolated cron jobs to default to `announce` delivery mode, improving user experience.
- Enhanced scheduling options to accept ISO 8601 timestamps for `schedule.at`, while still supporting epoch milliseconds.
- Refined documentation to clarify delivery modes and scheduling formats.
- Adjusted related CLI commands and UI components to reflect these changes, ensuring consistency across the platform.
- Improved handling of legacy delivery fields for backward compatibility.

This update streamlines the configuration of isolated jobs, making it easier for users to manage job outputs and schedules.

* feat(cron): enhance one-shot job behavior and CLI options

- Default one-shot jobs to delete after success, improving job management.
- Introduced `--keep-after-run` CLI option to allow users to retain one-shot jobs post-execution.
- Updated documentation to clarify default behaviors and new options for one-shot jobs.
- Adjusted cron job creation logic to ensure consistent handling of delete options.
- Enhanced tests to validate new behaviors and ensure reliability.

This update streamlines the handling of one-shot jobs, providing users with more control over job persistence and execution outcomes.

* feat(cron): enhance delivery modes and job configuration

- Updated isolated cron jobs to support new delivery modes: `announce` and `none`, improving output management.
- Refactored job configuration to remove legacy fields and streamline delivery settings.
- Enhanced the `CronJobEditor` UI to reflect changes in delivery options, including a new segmented control for delivery mode selection.
- Updated documentation to clarify the new delivery configurations and their implications for job execution.
- Improved tests to validate the new delivery behavior and ensure backward compatibility with legacy settings.

This update provides users with greater flexibility in managing how isolated jobs deliver their outputs, enhancing overall usability and clarity in job configurations.

* feat(cron): set default enabled state for cron jobs

- Added logic to default the `enabled` property to `true` if not explicitly set as a boolean in the cron job input.
- Updated job creation and store functions to ensure consistent handling of the `enabled` state across the application.
- Enhanced input normalization to improve job configuration reliability.

This update ensures that cron jobs are enabled by default, enhancing user experience and reducing potential misconfigurations.

* refactor(cron): update delivery instructions for isolated agent

- Revised the delivery instructions in the isolated agent's command body to clarify that summaries should be returned as plain text and will be delivered by the main agent.
- Removed the previous directive regarding messaging tools to streamline communication guidelines.

This change enhances clarity in the delivery process for isolated agent tasks.

* feat(cron): enhance delivery handling and testing for isolated jobs

- Introduced new properties for explicit message targeting and message tool disabling in the EmbeddedRunAttemptParams type.
- Updated cron job tests to validate best-effort delivery behavior and handling of delivery failures.
- Added logic to clear delivery settings when switching session targets in cron jobs.
- Improved the resolution of delivery failures and best-effort logic in the isolated agent's run function.

This update enhances the flexibility and reliability of delivery mechanisms in isolated cron jobs, ensuring better handling of message delivery scenarios.

* refactor(cron): improve delivery configuration handling in CronJobEditor and CLI

- Enhanced the delivery configuration logic in CronJobEditor to explicitly set the bestEffort property based on job settings.
- Refactored the CLI command to streamline delivery object creation, ensuring proper handling of optional fields like channel and to.
- Improved code readability and maintainability by restructuring delivery assignment logic.

This update clarifies the delivery configuration process, enhancing the reliability of job settings in both the editor and CLI.

* feat(cron): enhance legacy delivery handling in job patches

- Introduced logic to map legacy payload delivery updates onto the delivery object for `agentTurn` jobs, ensuring backward compatibility with legacy clients.
- Added tests to validate the correct application of legacy delivery settings in job patches, improving reliability in job configuration.
- Refactored delivery handling functions to streamline the merging of legacy delivery fields into the current job structure.

This update enhances the flexibility of delivery configurations, ensuring that legacy settings are properly handled in the context of new job patches.

* fix(cron): fix test failures and regenerate protocol files

- Add forceReload option to ensureLoaded to avoid stat I/O in normal
  paths while still detecting cross-service writes in the timer path
- Post isolated job summary back to main session (restores the old
  isolation.postToMainPrefix behavior via delivery model)
- Update legacy migration tests to check delivery.channel instead of
  payload.channel (normalization now moves delivery fields to top-level)
- Remove legacy deliver/channel/to/bestEffortDeliver from payload schema
- Update protocol conformance test for delivery modes
- Regenerate GatewayModels.swift (isolation -> delivery)

* UI: handle future timestamps in formatAgo

* Changelog: move cron entries to 2026.2.3

* fix: cron announce delivery path (#8540) (thanks @tyler6204)

* Telegram: use Grammy types directly, add typed Probe/Audit to plugin interface (#8403)

* Telegram: replace duplicated types with Grammy imports, add Probe/Audit generics to plugin interface

* Telegram: remove legacy forward metadata (deprecated in Bot API 7.0), simplify required-field checks

* Telegram: clean up remaining legacy references and unnecessary casts

* Telegram: keep RequestInit parameter type in proxy fetch (addresses review feedback)

* Telegram: add exhaustiveness guard to resolveForwardOrigin switch

* fix(telegram): include forward_from_chat metadata in forwarded message context (#8133)

Extract missing metadata from forwarded Telegram messages:

- Add fromChatType to TelegramForwardedContext, capturing the original
  chat type (channel/supergroup/group) from forward_from_chat.type
  and forward_origin.chat/sender_chat.type
- Add fromMessageId to capture the original message ID from channel forwards
- Read author_signature from forward_origin objects (modern API),
  preferring it over the deprecated forward_signature field
- Pass ForwardedFromChatType and ForwardedFromMessageId through to
  the inbound context payload
- Add test coverage for forward_origin channel/chat types, including
  author_signature extraction and fromChatType propagation

* fix: trim legacy signature fallback, type fromChatType as union

* fix: telegram forward metadata + cron delivery guard (#8392) (thanks @Glucksberg)

* fix(imessage): unify timeout configuration with configurable probeTimeoutMs

- Add probeTimeoutMs config option to channels.imessage
- Export DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS constant (10s) from probe.ts
- Propagate timeout config through all iMessage probe/RPC operations
- Fix hardcoded 2000ms timeouts that were too short for SSH connections

Closes: timeout issues when using SSH wrapper scripts (imsg-ssh)

* fix: address review comments

- Use optional timeoutMs parameter (undefined = use config/default)
- Extract DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS to shared constants.ts
- Import constant in client.ts instead of hardcoding
- Re-export constant from probe.ts for backwards compatibility

* fix(imessage): detect self-chat echoes to prevent infinite loops (#8680)

* fix: align proxy fetch typing

* feat: add cloudflare ai gateway provider

* fix: force reload cron store

* Revert "feat: Add Docs Chat Widget with RAG-powered Q&A (#7908)" (#8834)

This reverts commit fa4b28d7af7464b07271bfef6c028e4135548f44.

* fix(web ui): agent model selection

* Docs: landing page revamp (#8885)

* Docs: refresh landing page

* Docs: add landing page companion pages

* Docs: drop legacy Jekyll assets

* Docs: remove legacy terminal css test

* Docs: restore terminal css assets

* Docs: remove terminal css assets

* fix(app-render): handle optional model in renderApp function

* chore: replace landpr prompt with end-to-end landing workflow (#8916)

* 🤖 docs: mirror landing revamp for zh-CN

What:
- add zh-CN versions of landing revamp pages (features, quickstart, docs directory, network model, credits)
- refresh zh-CN index and hubs, plus glossary entries

Why:
- keep Chinese docs aligned with the new English landing experience
- ensure navigation surfaces the new entry points

Tests:
- pnpm build && pnpm check && pnpm test

* 🤖 docs: note zh-CN landing revamp (#8994) (thanks @joshp123)

What:
- add changelog entry for the zh-CN landing revamp docs

Why:
- record the doc update and thank the contributor

Tests:
- pnpm lint && pnpm build && pnpm test

* feat: add shell completion installation prompt to CLI update command

* feat: add shell completion test script for installation verification

* completion: export cache utilities and require cached file for installation

- Export `resolveCompletionCachePath` and `completionCacheExists` for external use
- Update `installCompletion` to require cache existence (never use slow dynamic pattern)
- Add `usesSlowDynamicCompletion` to detect old `source <(...)` patterns
- Add `getShellProfilePath` helper for consistent profile path resolution
- Update `formatCompletionSourceLine` to always use cached file

* doctor: add shell completion check module

- Add `checkShellCompletionStatus` to get profile/cache/slow-pattern status
- Add `ensureCompletionCacheExists` for silent cache regeneration
- Add `doctorShellCompletion` to check and fix completion issues:
  - Auto-upgrade old slow dynamic patterns to cached version
  - Auto-regenerate cache if profile exists but cache is missing
  - Prompt to install if no completion is configured

* doctor: integrate shell completion check into doctor command

- Import and call `doctorShellCompletion` during doctor run
- Checks/fixes completion issues before gateway health check

* update: use shared completion helpers for shell completion setup

- Replace inline completion logic with `checkShellCompletionStatus` and `ensureCompletionCacheExists`
- Auto-upgrade old slow dynamic patterns silently during update
- Auto-regenerate cache if profile exists but cache is missing
- Prompt to install if no completion is configured

* onboard: use shared completion helpers for shell completion setup

- Replace inline completion logic with `checkShellCompletionStatus` and `ensureCompletionCacheExists`
- Auto-upgrade old slow dynamic patterns silently during onboarding
- Auto-regenerate cache if profile exists but cache is missing
- Prompt to install if no completion is configured

* scripts: update test-shell-completion to use shared helpers

- Use `checkShellCompletionStatus` and `ensureCompletionCacheExists` from doctor-completion
- Display "Uses slow pattern" status in output
- Simulate doctor/update/onboard behavior for all completion scenarios
- Remove duplicated utility functions

* changelog: add shell completion auto-fix entry

* feat: per-channel responsePrefix override (#9001)

* feat: per-channel responsePrefix override

Add responsePrefix field to all channel config types and Zod schemas,
enabling per-channel and per-account outbound response prefix overrides.

Resolution cascade (most specific wins):
  L1: channels.<ch>.accounts.<id>.responsePrefix
  L2: channels.<ch>.responsePrefix
  L3: (reserved for channels.defaults)
  L4: messages.responsePrefix (existing global)

Semantics:
  - undefined -> inherit from parent level
  - empty string -> explicitly no prefix (stops cascade)
  - "auto" -> derive [identity.name] from routed agent

Changes:
  - Core logic: resolveResponsePrefix() in identity.ts accepts
    optional channel/accountId and walks the cascade
  - resolveEffectiveMessagesConfig() passes channel context through
  - Types: responsePrefix added to WhatsApp, Telegram, Discord, Slack,
    Signal, iMessage, Google Chat, MS Teams, Feishu, BlueBubbles configs
  - Zod schemas: responsePrefix added for config validation
  - All channel handlers wired: telegram, discord, slack, signal,
    imessage, line, heartbeat runner, route-reply, native commands
  - 23 new tests covering backward compat, channel/account levels,
    full cascade, auto keyword, empty string stops, unknown fallthrough

Fully backward compatible - no existing config is affected.
Fixes #8857

* fix: address CI lint + review feedback

- Replace Record<string, any> with proper typed helpers (no-explicit-any)
- Add curly braces to single-line if returns (eslint curly)
- Fix JSDoc: 'Per-channel' → 'channel/account' on shared config types
- Extract getChannelConfig() helper for type-safe dynamic key access

* fix: finish responsePrefix overrides (#9001) (thanks @mudrii)

* fix: normalize prefix wiring and types (#9001) (thanks @mudrii)

---------

Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>

* Discord: allow disabling thread starter context

* feat(heartbeat): add accountId config option for multi-agent routing (#8702)

* feat(heartbeat): add accountId config option for multi-agent routing

Add optional accountId field to heartbeat configuration, allowing
multi-agent setups to explicitly specify which Telegram account
should be used for heartbeat delivery.

Previously, heartbeat delivery would use the accountId from the
session's deliveryContext. When a session had no prior conversation
history, heartbeats would default to the first/primary account
instead of the agent's intended bot.

Changes:
- Add accountId to HeartbeatSchema (zod-schema.agent-runtime.ts)
- Use heartbeat.accountId with fallback to session accountId (targets.ts)

Backward compatible: if accountId is not specified, behavior is unchanged.

Closes #8695

* fix: improve heartbeat accountId routing (#8702) (thanks @lsh411)

* fix: harden heartbeat accountId routing (#8702) (thanks @lsh411)

* fix: expose heartbeat accountId in status (#8702) (thanks @lsh411)

* chore: format status + heartbeat tests (#8702) (thanks @lsh411)

---------

Co-authored-by: m1 16 512 <m116512@m1ui-MacBookAir-2.local>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>

* TUI/Gateway: fix pi streaming + tool routing + model display + msg updating (#8432)

* TUI/Gateway: fix pi streaming + tool routing

* Tests: clarify verbose tool output expectation

* fix: avoid seq gaps for targeted tool events (#8432) (thanks @gumadeiras)

* Telegram: remove @ts-nocheck from bot.ts, fix duplicate error handler, harden sticker caching (#9077)

* Telegram: remove @ts-nocheck from bot.ts and bot-message-dispatch.ts

- bot/types.ts: TelegramContext.me uses UserFromGetMe (Grammy) instead of manual inline type
- bot.ts: remove 6 unsafe casts (as any, as unknown, as object), use Grammy types directly
- bot.ts: remove dead message_thread_id access on reactions (not in Telegram Bot API)
- bot.ts: remove resolveThreadSessionKeys import (no longer needed for reactions)
- bot-message-dispatch.ts: replace ': any' with DispatchTelegramMessageParams type
- bot-message-dispatch.ts: add sticker.fileId guard before cache access
- bot.test.ts: update reaction tests, remove dead DM thread-reaction test

* Telegram: remove duplicate bot.catch handler (only the last one runs in Grammy)

* Telegram: remove @ts-nocheck from bot.ts, fix duplicate error handler, harden sticker caching (#9077)

* Security: Prevent gateway credential exfiltration via URL override (#9179)

* Gateway: require explicit auth for url overrides

* Gateway: scope credential blocking to non-local URLs only

Address review feedback: the previous fix blocked credential fallback for
ALL URL overrides, which was overly strict and could break workflows that
use --url to switch between loopback/tailnet without passing credentials.

Now credential fallback is only blocked for non-local URLs (public IPs,
external hostnames). Local addresses (127.0.0.1, localhost, private IPs
like 192.168.x.x, 10.x.x.x, tailnet 100.x.x.x) still get credential
fallback as before.

This maintains the security fix (preventing credential exfiltration to
attacker-controlled URLs) while preserving backward compatibility for
legitimate local URL overrides.

* Security: require explicit credentials for gateway url overrides (#8113) (thanks @victormier)

* Gateway: reuse explicit auth helper for url overrides (#8113) (thanks @victormier)

* Tests: format gateway chat test (#8113) (thanks @victormier)

* Tests: require explicit auth for gateway url overrides (#8113) (thanks @victormier)

---------

Co-authored-by: Victor Mier <victormier@gmail.com>

* Tests: restore TUI gateway env

* Security: harden sandboxed media handling (#9182)

* Message: enforce sandbox for media param

* fix: harden sandboxed media handling (#8780) (thanks @victormier)

* chore: format message action runner (#8780) (thanks @victormier)

---------

Co-authored-by: Victor Mier <victormier@gmail.com>

* Telegram: remove @ts-nocheck from bot-message.ts (#9180)

* Telegram: remove @ts-nocheck from bot-message.ts, type deps via Omit<BuildTelegramMessageContextParams>

* Telegram: widen allMedia to TelegramMediaRef[] so stickerMetadata flows through

* Telegram: remove @ts-nocheck from bot-message.ts (#9180)

* fix: cover anonymous voice allowlist callers (#8104) (thanks @victormier) (#9188)

* Security: owner-only tools + command auth hardening (#9202)

* Security: gate whatsapp_login by sender auth

* Security: treat undefined senderAuthorized as unauthorized (opt-in)

* fix: gate whatsapp_login to owner senders (#8768) (thanks @victormier)

* fix: add explicit owner allowlist for tools (#8768) (thanks @victormier)

* fix: normalize escaped newlines in send actions (#8768) (thanks @victormier)

---------

Co-authored-by: Victor Mier <victormier@gmail.com>

* Telegram: remove last @ts-nocheck from bot-handlers.ts (#9206)

* Telegram: remove @ts-nocheck from bot-handlers.ts, use Grammy types directly, deduplicate StickerMetadata

* Telegram: remove last @ts-nocheck from bot-handlers.ts (#9206)

* Message: clarify media schema + fix MEDIA newline

* fix: enforce owner allowlist for commands

* fix: infer --auth-choice from API key flags during non-interactive onboarding (#9241)

* fix: infer --auth-choice from API key flags during non-interactive onboarding

When --anthropic-api-key (or other provider key flags) is passed without
an explicit --auth-choice, the auth choice defaults to "skip", silently
discarding the API key. This means the gateway starts without credentials
and fails on every inbound message with "No API key found for provider".

Add inferAuthChoiceFromFlags() to derive the correct auth choice from
whichever provider API key flag was supplied, so credentials are persisted
to auth-profiles.json as expected.

Fixes #8481

* fix: infer auth choice from API key flags (#8484) (thanks @f-trycua)

* refactor: centralize auth choice inference flags (#8484) (thanks @f-trycua)

---------

Co-authored-by: f-trycua <f@trycua.com>

* chore: sync plugin versions to 2026.2.3

* fix(mac): resolve cron schedule formatters

* chore(mac): update appcast for 2026.2.3

* chore: update 2026.2.3 notes

---------

Co-authored-by: Ayaan Zaidi <zaidi@uplause.io>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: cpojer <christoph.pojer@gmail.com>
Co-authored-by: Christian Klotz <hello@christianklotz.co.uk>
Co-authored-by: Shadow <shadow@clawd.bot>
Co-authored-by: Josh Palmer <joshp123@users.noreply.github.com>
Co-authored-by: CLAWDINATOR Bot <clawdinator[bot]@users.noreply.github.com>
Co-authored-by: Marco Marandiz <admin-marco@Mac.lan>
Co-authored-by: Shakker <shakkerdroid@gmail.com>
Co-authored-by: Mariano Belinky <mariano@mb-server-643.local>
Co-authored-by: Mariano Belinky <mbelinky@gmail.com>
Co-authored-by: Tyler Yust <64381258+tyler6204@users.noreply.github.com>
Co-authored-by: Elarwei <elarweis@gmail.com>
Co-authored-by: bqcfjwhz85-arch <bqcfjwhz85@privaterelay.appleid.com>
Co-authored-by: lotusfall <lotusfall@outlook.com>
Co-authored-by: Ji <jizhang.work@gmail.com>
Co-authored-by: mac mimi <macmimi@macs-Mac-mini.local>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
Co-authored-by: Justin <justinhuangcode@gmail.com>
Co-authored-by: Aldo <hal@aldo.pw>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
Co-authored-by: Vignesh Natarajan <vigneshnatarajan92@gmail.com>
Co-authored-by: Benjamin Jesuiter <bjesuiter@gmail.com>
Co-authored-by: Ethan Palm <56270045+ethanpalm@users.noreply.github.com>
Co-authored-by: Armin Ronacher <armin.ronacher@active-4.com>
Co-authored-by: Josh Palmer <joshpalmer123@gmail.com>
Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
Co-authored-by: Ermenegildo Fiorito <gildo.fiorito@gmail.com>
Co-authored-by: Michelle Tilley <michelle@michelletilley.net>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Stephen Chen <bochencleveland@yahoo.com>
Co-authored-by: stephenchen2025 <schenjobs@gmail.com>
Co-authored-by: Liu Weizhan <liu48566203@gmail.com>
Co-authored-by: Wangnov <48670012+Wangnov@users.noreply.github.com>
Co-authored-by: wangnov <1694546283@qq.com>
Co-authored-by: Yeom-JinHo <81306489+Yeom-JinHo@users.noreply.github.com>
Co-authored-by: Lucas Kim <ichbinlucas211@gmail.com>
Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>
Co-authored-by: Glucksberg <markuscontasul@gmail.com>
Co-authored-by: Yudong Han <hanyd@pku.edu.cn>
Co-authored-by: Iranb <49674669+Iranb@users.noreply.github.com>
Co-authored-by: Seb Slight <sebslight@gmail.com>
Co-authored-by: mudrii <mudreac@gmail.com>
Co-authored-by: lsh411 <lsh411@gmail.com>
Co-authored-by: m1 16 512 <m116512@m1ui-MacBookAir-2.local>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com>
Co-authored-by: Victor Mier <victormier@gmail.com>
Co-authored-by: f-trycua <f@trycua.com>
Co-authored-by: Nova <nova@noreply.github.com>
bestNiu pushed a commit to bestNiu/clawdbot that referenced this pull request Feb 5, 2026
batao9 pushed a commit to batao9/openclaw that referenced this pull request Feb 7, 2026
hughdidit pushed a commit to hughdidit/DAISy-Agency that referenced this pull request Feb 8, 2026
FullStackKevinVanDriel pushed a commit to FullStackKevinVanDriel/openclaw that referenced this pull request Feb 10, 2026
FullStackKevinVanDriel pushed a commit to FullStackKevinVanDriel/openclaw that referenced this pull request Feb 10, 2026
FullStackKevinVanDriel pushed a commit to FullStackKevinVanDriel/openclaw that referenced this pull request Feb 10, 2026
FullStackKevinVanDriel pushed a commit to FullStackKevinVanDriel/openclaw that referenced this pull request Feb 10, 2026
battman21 pushed a commit to battman21/openclaw that referenced this pull request Feb 12, 2026
battman21 pushed a commit to battman21/openclaw that referenced this pull request Feb 12, 2026
heybeaux pushed a commit to heybeaux/openclaw that referenced this pull request Feb 12, 2026
jiulingyun added a commit to jiulingyun/openclaw-cn that referenced this pull request Feb 15, 2026
hughdidit added a commit to hughdidit/DAISy-Agency that referenced this pull request Mar 1, 2026
* docs: update changelog for mention patterns (#3303) (thanks @HirokiKobayashi-R)

(cherry picked from commit 16a5549ec0b64528f6513627512abafdabe41e39)

* chore: update clawtributors (add @HirokiKobayashi-R)

(cherry picked from commit 34291321b4fa2b5aea5e12e93cab2cf15cc94cb9)

* docs(changelog): rewrite 2026.1.29 notes

(cherry picked from commit 51520601210380db154393179ecdb004fd4c23e7)

# Conflicts:
#	CHANGELOG.md

* chore: update clawtributors

(cherry picked from commit c9fe062824cabdf919cfbedc1b915375b5e684d1)

* docs: move deepwiki link

(cherry picked from commit bf6ec64fd9ca20a6a7f78465e404f397d8c7863d)

# Conflicts:
#	README.md

* Add files via upload

(cherry picked from commit ddad65588f709ae7375b6292f1f27146e01f026f)

* Update README with responsive logo for dark mode

(cherry picked from commit 4de0bae45a29ddbe419325f64ee369ab00b546d3)

# Conflicts:
#	README.md

* Update logo and contributor name in docs

Replaced the static image with a responsive logo using the <picture> element for light/dark mode support. Updated contributor name from 'Clawd' to 'Molty'.

(cherry picked from commit 12e8a8410fc0be2229f2193551d1ac5f1a2a2ee6)

# Conflicts:
#	docs/index.md

* docs: reorder 2026.1.29 changelog

(cherry picked from commit 23c424899c4669caff57b18b9be3a9c2f3f13a99)

# Conflicts:
#	CHANGELOG.md

* chore: release 2026.1.29

(cherry picked from commit 62e4ad23d3f6cb11ea779df76f10b5597b784402)

# Conflicts:
#	docs/index.md
#	extensions/bluebubbles/package.json
#	extensions/copilot-proxy/package.json
#	extensions/diagnostics-otel/package.json
#	extensions/discord/package.json
#	extensions/google-antigravity-auth/package.json
#	extensions/google-gemini-cli-auth/package.json
#	extensions/googlechat/package.json
#	extensions/imessage/package.json
#	extensions/line/package.json
#	extensions/llm-task/package.json
#	extensions/lobster/package.json
#	extensions/matrix/package.json
#	extensions/mattermost/package.json
#	extensions/memory-core/package.json
#	extensions/memory-lancedb/package.json
#	extensions/msteams/package.json
#	extensions/nextcloud-talk/package.json
#	extensions/nostr/package.json
#	extensions/open-prose/package.json
#	extensions/signal/package.json
#	extensions/slack/package.json
#	extensions/telegram/package.json
#	extensions/tlon/package.json
#	extensions/twitch/package.json
#	extensions/voice-call/package.json
#	extensions/whatsapp/package.json
#	extensions/zalo/package.json
#	extensions/zalouser/package.json
#	package.json

* Update index.md

(cherry picked from commit 613724c26e831146dacc48e2dc0b92fbe9405ddd)

# Conflicts:
#	docs/index.md

* docs: move WhatsApp image below dashboard

(cherry picked from commit 87267fad4f0a84c9adbadd3fd05e3dde9437fbe9)

* docs: update lore with final form

(cherry picked from commit 6af205a13adfec1fd1eb27d2f3d3546b0b4e8f86)

# Conflicts:
#	docs/start/lore.md

* chore: remove legacy clawdhub files

(cherry picked from commit 192a6ee8700615da107fcd4c52e22a1fdbe1c117)

# Conflicts:
#	docs/tools/clawdhub.md
#	skills/clawdhub/SKILL.md

* Fix typo in agent.md from p-mono to pi-mono

(cherry picked from commit 9a1b4409680fd6a440d831e272473e58e2921c20)

# Conflicts:
#	docs/concepts/agent.md

* docs: use straight quotes for code terms in installer guide

(cherry picked from commit 23f0efbf09b1487d7e2dc06b25a22cd68cdb6aef)

# Conflicts:
#	docs/install/installer.md

* docs: fix missing apostrophes in FAQ headers

(cherry picked from commit 49a3e3795ae07d6de807cf7630e3c576a41df30b)

# Conflicts:
#	docs/help/faq.md

* docs: Internal linking of channel pages

(cherry picked from commit 9334dd8017d32cfed1acdfa331e3b7783a84c7bc)

# Conflicts:
#	docs/start/wizard.md

* docs: fix GitHub branding capitalization

(cherry picked from commit 7c96bde3b3db74dcf57bff0138eefd5d03ba1d08)

* docs: update remaining clawdbot/moltbot references to openclaw

- .pre-commit-config.yaml: update comment header
- AGENTS.md: update plugin-sdk import path and state directory paths
- skills/bluebubbles/SKILL.md: update plugin-sdk import reference
- skills/discord/SKILL.md: update example sticker name

(cherry picked from commit 0175cedf0e07b6528e2400d3d071fb36e9f9f050)

# Conflicts:
#	skills/discord/SKILL.md

* Update deployment link in railway documentation

(cherry picked from commit 2f0592dbc65b4d17166941ecc05b016afa2e77c4)

# Conflicts:
#	docs/railway.mdx

* feat(ui): refresh session list after chat commands in Web UI

(cherry picked from commit 0b7aa8cf1d2a318795ee23dc1ef10fc9873a365f)

# Conflicts:
#	ui/src/ui/app-chat.ts
#	ui/src/ui/app-gateway.ts
#	ui/src/ui/app.ts

* Fix typo from 'p-mono' to 'pi-mono' in agent.md

(cherry picked from commit 97895a02393973483e07113e9651c93dabeeeae8)

# Conflicts:
#	docs/concepts/agent.md

* docs: add pi and pi-dev documentation

(cherry picked from commit 9cb5e22861027c098e0367d3b68c9f763bbcc4f8)

* chore: add .pi folder

(cherry picked from commit 4b1956ab497379b6fcdf589f7cd87247b7df0e89)

* chore: remove changelog section from pr.md prompt

(cherry picked from commit cc366f4baa94a5baa0b1260e6cf9e31a7d1853f1)

* Add prompt injection attacks to out of scope section

(cherry picked from commit a767c584c7b6f5c110f35e263449264d3db49583)

# Conflicts:
#	SECURITY.md

* Docs: add actionable cron quick start (#5446)

* Docs: add cron quick start examples

* Docs: de-duplicate cron tool-call examples

* Docs: fix cron code block fences

(cherry picked from commit 75093ebe1cac1276dab5b5691c421df3e8f51ace)

# Conflicts:
#	docs/automation/cron-jobs.md

* Docs: fix index logo dark mode (#5474)

(cherry picked from commit 8978d166592b867f1328360d61627bdf395c1d56)

# Conflicts:
#	docs/index.md

* docs: start 2026.1.31 changelog

(cherry picked from commit 83e64c1ac9893804645148f781889b23e5bbd12b)

# Conflicts:
#	CHANGELOG.md

* docs: format cron jobs doc

(cherry picked from commit 57ea4e88972d957903c10c567f3a67797304c17e)

* fix(lobster): block arbitrary exec via lobsterPath/cwd (GHSA-4mhr-g7xj-cg8j) (#5335)

* fix(lobster): prevent arbitrary exec via lobsterPath/cwd

* fix(lobster): harden lobsterPath errors + normalize cwd sandboxing

* fix(lobster): ignore tool-provided lobsterPath; validate + use plugin config

* fix(lobster): use plugin config lobsterPath + add tests (#5335) (thanks @vignesh07)

* fix(lobster): make Windows spawn fallback handle ENOENT (#5335) (thanks @vignesh07)

---------

Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
(cherry picked from commit 1295b67057b5fc341bdd0f41d0130bc9b09470a7)

# Conflicts:
#	CHANGELOG.md
#	extensions/lobster/src/lobster-tool.test.ts
#	extensions/lobster/src/lobster-tool.ts

* Docs: add nav titles across docs (#5689)

(cherry picked from commit abcaa8c7a9f3a28b4845347acddafe6076362a9a)

# Conflicts:
#	docs/automation/webhook.md
#	docs/channels/twitch.md
#	docs/cli/dns.md
#	docs/cli/docs.md
#	docs/debug/node-issue.md
#	docs/gateway/configuration-examples.md
#	docs/help/faq.md
#	docs/index.md
#	docs/platforms/digitalocean.md
#	docs/platforms/hetzner.md
#	docs/platforms/oracle.md
#	docs/providers/github-copilot.md
#	docs/providers/openrouter.md
#	docs/providers/xiaomi.md
#	docs/start/pairing.md
#	docs/tools/clawdhub.md
#	docs/tools/index.md

* Docs: point nav groups at index pages (#5694)

(cherry picked from commit e6c38e078a9d148b318c71ee95d08c40d677aadd)

# Conflicts:
#	docs/docs.json

* fix(docs): update Twitter URLs to X for consistency

(cherry picked from commit 9297ea48e51e5850f6b944e78c735d3334b8d12e)

* fix(docs): use canonical openclaw.ai domain instead of openclaw.bot

(cherry picked from commit 7a2c4d3cf19bbb7168ce956b0ce1f0ca51d600d5)

# Conflicts:
#	docs/gateway/troubleshooting.md
#	docs/help/faq.md
#	docs/help/troubleshooting.md
#	docs/install/index.md
#	docs/install/installer.md
#	docs/install/uninstall.md
#	docs/install/updating.md
#	docs/platforms/digitalocean.md
#	docs/platforms/exe-dev.md
#	docs/platforms/oracle.md
#	docs/platforms/raspberry-pi.md
#	docs/reference/RELEASING.md
#	docs/start/getting-started.md

* fix(docs): update MiniMax plugin URL from legacy moltbot org

(cherry picked from commit bce8c0eb1276bb81b96602369295e2309fa8479b)

# Conflicts:
#	docs/providers/minimax.md

* fix(docs): remove invalid channels. prefix from Discord URL

(cherry picked from commit a10603f9f092f9ef74a31f08b200363cc260a8f6)

* Docs: mention weak gateway auth tokens

(cherry picked from commit 66e33abd7b3f898610347fc95a9dec7a34687ce4)

* docs: fix Venice AI typo (Venius → Venice)

Co-authored-by: jonisjongithub <jonisjongithub@users.noreply.github.com>

Co-authored-by: Clawdbot <bot@clawd.bot>
(cherry picked from commit 96c9ffdedcb40b6027f2a52d6c5c324905c22f6c)

* feat: code

(cherry picked from commit b2aff036addc933de0405afad9a11e25783dd72c)

# Conflicts:
#	extensions/minimax-portal-auth/index.ts

* Docs: note MiniMax OAuth updates (#5402) (thanks @Maosghoul)

(cherry picked from commit 73c405f74aa82cf035431ce28654b4f4239d37fd)

# Conflicts:
#	CHANGELOG.md

* docs: document cacheRetention parameter (#6270)

* docs: document cacheRetention parameter (#6240)

* docs: standardize cacheRetention value quoting style

* style: format anthropic.md table

* Docs: align cacheRetention inline example

---------

Co-authored-by: Sebastian <sebslight@gmail.com>
(cherry picked from commit 7a8a39a141086522c609c7b2922ab6c552cc5772)

# Conflicts:
#	docs/concepts/session-pruning.md
#	docs/providers/anthropic.md

* docs: fix anchor link for Google Vertex/Antigravity/Gemini section (#5967)

* docs: fix anchor link for Google Vertex/Antigravity/Gemini section

* Docs: fix model provider MDX markers

---------

Co-authored-by: Sebastian <sebslight@gmail.com>
(cherry picked from commit 7fabe03a8bb6689106945a0c81848535ca0522b2)

# Conflicts:
#	docs/concepts/model-providers.md

* Docs: fix Moonshot MDX comment marker (#6311)

(cherry picked from commit 8582ed4d4f918e2b41e6d76dae4e3cc408fa0ba6)

# Conflicts:
#	docs/providers/moonshot.md

* docs(install): add pnpm approve-builds step for global installs (#5663)

* docs(install): add pnpm approve-builds step for global installs

pnpm requires explicit approval for packages with build scripts.
Without running `pnpm approve-builds -g`, openclaw and its dependencies
(node-llama-cpp, sharp, protobufjs) won't have their postinstall scripts
executed, causing runtime errors.

Fixes #5579

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* docs(install): clarify pnpm reinstall step after approve-builds

Address review feedback: after running `pnpm approve-builds -g`,
users need to re-run the install command for postinstall scripts
to actually execute.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 3ae049b5012cb61b5f241a5287a9d587369a4736)

# Conflicts:
#	docs/install/index.md

* docs(skills): update canvas URL prefix to /__openclaw__/ (#4729)

Update remaining __moltbot__ references in canvas skill documentation
to match the CANVAS_HOST_PATH constant (/__openclaw__/canvas).

(cherry picked from commit 701d43892fa1152a06f472b8ae44f170c99e0492)

# Conflicts:
#	skills/canvas/SKILL.md

* Docs: Fix typo in docs/tools/skills.md (#3050)

(cherry picked from commit 28a05f994092c52e5e84a66b267b8aa47f592d38)

* docs: fix heading numbering and add missing section onboarding.md (#3461)

(cherry picked from commit 76211500e81893c300fcec9ab129899b3270a297)

* Docs: Direct link to BotFather on Telegram (#4064)

* Docs: Direct link to BotFather on Telegram, sparing users from searching and potentially encountering impostors.

* Update numbering syntax

Update numbering syntax to match PR to latest doc layout.

* Docs: add BotFather verification note

---------

Co-authored-by: Sebastian <sebslight@gmail.com>
(cherry picked from commit 8ff75eaf12b37ff9f65f579454e8a26be28783b0)

# Conflicts:
#	CHANGELOG.md
#	docs/channels/telegram.md

* docs: add device pairing section to Control UI docs (#5003)

* docs: add device pairing section to Control UI docs

Explains that new browser connections require one-time pairing approval,
what error message users will see, and how to approve devices using the
CLI. This was a gap in the documentation that caused confusion for users
connecting via Tailscale Serve.

* docs: clarify Control UI pairing error

* docs: clarify device revoke flags

---------

Co-authored-by: Lucifer (via OpenClaw) <lucy@neuwirth.cc>
Co-authored-by: Sebastian <sebslight@gmail.com>
(cherry picked from commit 63b13c7e2fe5bacb17a6a19979c1952be48bd200)

* fix(docker): avoid using host port in gateway command (#5110) (thanks @mise42)

(cherry picked from commit bc5b0c82acc9301e5acf93c80f3d56f3fc87ab50)

# Conflicts:
#	docker-compose.yml

* Docs: add Mintlify language navigation

(cherry picked from commit 3cf35b0710216e50fb9545d7a963a861447fa00e)

# Conflicts:
#	docs/docs.json

* docs: add Mintlify language navigation (#6416) (thanks @joshp123)

(cherry picked from commit 6453f5c395a521b576444f5bce2104059c38fd33)

* fix(skill): update session-logs paths from .clawdbot to .openclaw (#4502)

Co-authored-by: Jarvis <jarvis@openclaw.ai>
Co-authored-by: CLAWDINATOR Bot <clawdinator[bot]@users.noreply.github.com>
Co-authored-by: Shadow <shadow@openclaw.ai>
(cherry picked from commit d3e53eaf276077530679901ebae00d3e94f2eb78)

# Conflicts:
#	CHANGELOG.md

* Docs: add zh-CN titles

(cherry picked from commit 964b14d59c8fa7fe9cd82591843d7750e5c0a3ac)

# Conflicts:
#	docs/zh-CN/index.md
#	docs/zh-CN/start/getting-started.md
#	docs/zh-CN/start/wizard.md

* docs: add zh-CN titles (#6487) (thanks @joshp123)

(cherry picked from commit 17287bc8d01b12a293e0452a76b1c117dd1e42c1)

* docs(discord): clarify exec approvals UI (#6550)

* docs(discord): clarify exec approvals UI

* Add link for slash command in Discord exec approvals

Updated documentation to include a link for the slash command used in Discord exec approvals.

* docs(discord): move exec approvals note

* docs(discord): document exec approvals config

* docs(discord): reorder exec approvals config

---------

Co-authored-by: Luke K (pr-0f3t) <2609441+lc0rp@users.noreply.github.com>
(cherry picked from commit 8f366babe4d427523b16203c2c351550cf6f6b18)

* Docs: clarify Moonshot endpoints (#4763)

Co-authored-by: hansbbans <hansbbans@users.noreply.github.com>
(cherry picked from commit a863ac9862f595c77cde31dc0c2d60664ed3da29)

* Docs: update clawtributors

(cherry picked from commit 6c03fe1a4d06c80cf4f456e3c7b99151b6fd406c)

# Conflicts:
#	README.md

* chore: fix Pi prompt template argument syntax (#6543)

- Fix @1 -> $1 in landpr.md
- Fix $@ -> $1 in reviewpr.md
- Remove stray /reviewpr line from reviewpr.md
- Delete old pr.md (replaced by reviewpr.md and landpr.md)

(cherry picked from commit 395810a60b06817e15d748f8f2d7dbafe6591a59)

# Conflicts:
#	.pi/prompts/pr.md

* chore: oxfmt fixes

(cherry picked from commit 443ee26af3f45272df545af2d4ccccaa1feaea0b)

# Conflicts:
#	docker-compose.yml
#	docs/channels/telegram.md
#	docs/concepts/model-providers.md
#	docs/providers/moonshot.md
#	skills/canvas/SKILL.md

* docs: preserve moonshot sync markers

(cherry picked from commit 92803facf6c1bc3b038c29db8505f0f5da58ed1e)

# Conflicts:
#	CHANGELOG.md
#	docs/concepts/model-providers.md
#	docs/providers/moonshot.md

* docs: improve exe.dev setup instructions (#4675)

* improve exe.dev setup instructions

1. Fix device approval command
2. Clarify where Gateway token can be found

* Update device approval instructions in exe-dev.md

Clarify instructions for approving devices in OpenClaw.

(cherry picked from commit d54605bd82fb932c7172a2577c0f12c9b8cb86b4)

# Conflicts:
#	docs/platforms/exe-dev.md

* chore: update changelog and relay formatting

(cherry picked from commit 238200f6527ded4e747b88ace131c707a7931e64)

# Conflicts:
#	CHANGELOG.md

* chore: update changelog

(cherry picked from commit a68e32d95b8e88c3d859dc78cb4d0f177209f997)

# Conflicts:
#	CHANGELOG.md

* chore: expand changelog

(cherry picked from commit 1968a4b7d24b101e78f23df54f25ad991f90ea9b)

# Conflicts:
#	CHANGELOG.md

* chore: trim docs changelog

(cherry picked from commit 99346314f58860dca5d53747f4b40e128b658c1e)

# Conflicts:
#	CHANGELOG.md

* chore: add TLS 1.3 minimum changelog (#5970) (thanks @loganaden)

(cherry picked from commit 92112a61db519296a7258d508677aa6c49f9a558)

# Conflicts:
#	CHANGELOG.md

* fix(twitch): enforce allowFrom allowlist

(cherry picked from commit 8c7901c984866a776eb59662dc9d8b028de4f0d0)

# Conflicts:
#	CHANGELOG.md
#	docs/channels/twitch.md

* Docs: clarify node host SSH tunnel flow

Co-authored-by: Dmytro Semchuk <x0m4ek@users.noreply.github.com>
(cherry picked from commit 63c9fac9fca850b82dea603686691844bb587768)

# Conflicts:
#	docs/nodes/index.md

* Docs: update clawtributors

(cherry picked from commit 0fa55ed2b4ec3d55b282332e63766007cc69420d)

# Conflicts:
#	README.md

* chore: Add `pnpm check` for fast repo checks.

(cherry picked from commit 902f96805654a316ec24f9f8c95d5b659a063fee)

# Conflicts:
#	AGENTS.md
#	CONTRIBUTING.md
#	docs/reference/RELEASING.md
#	docs/testing.md
#	package.json

* docs: add ClawHub registry overview

(cherry picked from commit 4682c2e3e20cd9388077b90474780077094d4bf5)

* docs: merge 2026.2.2 changelog into 2026.2.1

(cherry picked from commit d5f6caba3fbf6a2b50de8e4bcc0bc6906d4c53cd)

# Conflicts:
#	CHANGELOG.md

* docs: clarify docker power-user setup

(cherry picked from commit be9a2fb134182a4197d65989bbfaa7f54d6d3ae6)

* docs: add changelog entry for plugin install hardening

(cherry picked from commit f6d98a908af82437e823c15cc20d4feafbd005da)

# Conflicts:
#	CHANGELOG.md

* Docs: expand ClawHub overview

(cherry picked from commit 385e66cbd52b93458003635d39eb289b798c4715)

# Conflicts:
#	docs/tools/clawdhub.md

* docs: fold 2026.2.2 into 2026.2.1

(cherry picked from commit 8b64705e059ace205714fe7a55babbcab3b24e9e)

# Conflicts:
#	CHANGELOG.md

* docs: update 2026.2.1 changelog

(cherry picked from commit ed4529e24673fb19ea506bb04b2c6d3deed6a451)

# Conflicts:
#	CHANGELOG.md

* docs: note docker allow-unconfigured behavior

(cherry picked from commit d134a8c7f3e20e304e4ca71d394752f27cfbc019)

# Conflicts:
#	docs/install/docker.md

* Docs: add zh-CN translations

(cherry picked from commit 149dc7c4e76f2b264cd714c95b3e5ee399db3092)

* Docs: fix zh-CN template time wording

What: replace <2/<30 text in zh-CN AGENTS template with safe wording
Why: avoid MDX parse errors during docs build
Tests: not run (doc text change)
(cherry picked from commit e9d117d22168f9c05c3cbfd256aab99915f50f22)

* docs: add changelog for zh-CN translations (#6619) (thanks @joshp123)

(cherry picked from commit 4023b76ed39fe4b999f06137d738cc93cac93bf8)

# Conflicts:
#	CHANGELOG.md

* Docs: fix zh-CN ClawHub link

What: wrap clawhub.com in an explicit URL link in zh-CN skills doc
Why: avoid Mintlify broken-link parser treating trailing punctuation as part of the URL
Tests: not run (doc text change)
(cherry picked from commit b4cce3ac7a97efccbab400e2f3d4270b14e989ed)

* Docs: use explicit ClawHub markdown link

What: switch clawhub.com reference to explicit Markdown link syntax
Why: MDX parser rejects angle-bracket autolinks
Tests: not run (doc text change)
(cherry picked from commit 673583a38b8e7e72970b64490685ddf477a70aa6)

* Docs: normalize zh-CN terminology + tone

What: switch to 你/你的 tone; standardize Skills/Gateway网关/local loopback/私信 wording
Why: align zh-CN docs with issue 6995 feedback + idiomatic tech style
Tests: pnpm docs:build
(cherry picked from commit 5676a6b38de81a13194223ac688e20087d5b74e7)

* Docs: expand zh-Hans nav and fix assets

(cherry picked from commit e0aa8457c2511e7f9c72a2e912e3307b112fdfb5)

* Docs: expand zh-Hans nav (#7242) (thanks @joshp123)

(cherry picked from commit 7cee8c2345908fe23c2be0f6bc0e107a579d8b7e)

* docs: update changelog for PR #7226

(cherry picked from commit 1b34446bf55bcad9a03e2734c052f6580a5e11c1)

* chore: fix formatting and CI

(cherry picked from commit 37111435490e3378303c01a1f8dc3ff35211edec)

# Conflicts:
#	ui/src/ui/app-scroll.test.ts
#	ui/src/ui/app.ts

* iOS: wire node services and tests

(cherry picked from commit 7b0a0f3dace575c33dafb61d4a13cdef4dd0d64e)

# Conflicts:
#	apps/ios/Sources/Gateway/GatewayConnectionController.swift
#	apps/ios/Sources/Info.plist
#	apps/ios/Sources/Model/NodeAppModel.swift
#	apps/ios/SwiftSources.input.xcfilelist
#	apps/ios/Tests/GatewayConnectionControllerTests.swift
#	apps/ios/Tests/NodeAppModelInvokeTests.swift
#	apps/shared/MoltbotKit/Sources/MoltbotKit/CalendarCommands.swift
#	apps/shared/MoltbotKit/Sources/MoltbotKit/ContactsCommands.swift
#	apps/shared/MoltbotKit/Sources/MoltbotKit/DeviceCommands.swift
#	apps/shared/MoltbotKit/Sources/MoltbotKit/MotionCommands.swift
#	apps/shared/MoltbotKit/Sources/MoltbotKit/PhotosCommands.swift
#	apps/shared/MoltbotKit/Sources/MoltbotKit/RemindersCommands.swift

* Docs: add zh-CN landing notice + AI image

(cherry picked from commit 91e445c2601a55560769169c3d881058f9a7e9dd)

* Docs: add zh-CN landing note (#7303) (thanks @joshp123)

(cherry picked from commit ea9eed14f8589a58e59b6d5b37849daf0f6c72d0)

* Docs: expand zh-CN landing note

(cherry picked from commit c83bdb73a4a9a37e6e1de3269b36be671923cf80)

* fix(telegram): recover from grammY long-poll timeouts (#7466) (thanks @macmimi23)

(cherry picked from commit 561a10c491e28d04deb64b7abd9d89e4456561d0)

# Conflicts:
#	CHANGELOG.md

* Docs: fix compatibility shim note

(cherry picked from commit 0eae9f456cc978a5fc7d2d66026ebd4283830610)

# Conflicts:
#	CHANGELOG.md
#	docs/install/updating.md

* Changelog: note tool call repair

(cherry picked from commit 31face57402fc736bd4fcd474d5d3f20d73daadd)

* Docs: simplify transcript hygiene scope

(cherry picked from commit 118507953b1f743db7554163f1a434d223cf91ae)

# Conflicts:
#	docs/reference/transcript-hygiene.md

* Docs: clarify whats new FAQ heading (#7394)

(cherry picked from commit c8af8e95559c2e117426e815dd1a6c5b6816a1d4)

# Conflicts:
#	docs/help/faq.md

* chore: fix formatting

(cherry picked from commit 7dfa99a6f70c161ca88459be8b419cbfb9b75d7d)

# Conflicts:
#	docs/reference/templates/BOOTSTRAP.md
#	skills/healthcheck/SKILL.md

* chore: fix formatting

(cherry picked from commit d5593d647c2f1aed1fef6f938f4d6ae95a503af3)

# Conflicts:
#	docs/reference/templates/BOOTSTRAP.md

* Add how to trigger model downloads for qmd in documentation

(cherry picked from commit 20578da20407eea19bd725f2d1a8d0dbc186b9d8)

# Conflicts:
#	docs/concepts/memory.md

* Docs: align QMD state dir with OpenClaw

(cherry picked from commit 11a968f5c30fcc373acab31276a52dba399a5231)

* chore: oxfmt

(cherry picked from commit 4322ca6f4ac031086abbb3ea9ed2d89368a3216f)

# Conflicts:
#	CHANGELOG.md

* docs: finish renaming memory state dir references

(cherry picked from commit b37626ce6b1fb7476cc740c40d87090e6fa6367d)

# Conflicts:
#	CHANGELOG.md
#	docs/concepts/memory.md

* chore: update changelog for completion caching

(cherry picked from commit 3014a91b0779f7629bf1d91675a99629e2798cb3)

* Skills: refine healthcheck guidance

(cherry picked from commit fc40ba8e7eb1345afdb1c8d274219cd702b73354)

# Conflicts:
#	skills/healthcheck/SKILL.md

* fix(voice-call): harden inbound policy

(cherry picked from commit f8dfd034f5d9235c5485f492a9e4ccc114e97fdb)

# Conflicts:
#	CHANGELOG.md
#	extensions/voice-call/src/manager.ts
#	extensions/voice-call/src/media-stream.ts
#	extensions/voice-call/src/providers/twilio.ts

* fix(matrix): harden allowlists

(cherry picked from commit 8f3bfbd1c4fb967a2ddb5b4b9a05784920814bcf)

# Conflicts:
#	CHANGELOG.md
#	docs/channels/matrix.md
#	extensions/matrix/src/channel.ts
#	extensions/matrix/src/matrix/monitor/handler.ts

* docs: Update information architecture for OpenClaw docs (#7622)

* docs: restructure navigation into 5 tabs for better IA

* dedupe redirects

* use 8 tabs

* add missing /index extensions

* update zh navigation

* remove `default: true` and rearrange languages

* add missing redirects

* format:fix

* docs: update IA tabs + restore /images redirect (#7622) (thanks @ethanpalm)

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
(cherry picked from commit f57e70912cad81bc99680026865ffd1051c89ef5)

# Conflicts:
#	CHANGELOG.md
#	docs/docs.json

* chore: prepare 2026.2.2 release

(cherry picked from commit 1c4db91593358839a67f6e68576258cf31fa811e)

# Conflicts:
#	CHANGELOG.md
#	apps/android/app/build.gradle.kts
#	apps/ios/Sources/Info.plist
#	apps/ios/Tests/Info.plist
#	apps/ios/project.yml
#	apps/macos/Sources/Moltbot/Resources/Info.plist
#	docs/platforms/mac/release.md
#	extensions/bluebubbles/package.json
#	extensions/copilot-proxy/package.json
#	extensions/diagnostics-otel/package.json
#	extensions/discord/package.json
#	extensions/google-antigravity-auth/package.json
#	extensions/google-gemini-cli-auth/package.json
#	extensions/googlechat/package.json
#	extensions/imessage/package.json
#	extensions/line/package.json
#	extensions/llm-task/package.json
#	extensions/lobster/package.json
#	extensions/matrix/CHANGELOG.md
#	extensions/matrix/package.json
#	extensions/mattermost/package.json
#	extensions/memory-core/package.json
#	extensions/memory-lancedb/package.json
#	extensions/minimax-portal-auth/package.json
#	extensions/msteams/CHANGELOG.md
#	extensions/msteams/package.json
#	extensions/nextcloud-talk/package.json
#	extensions/nostr/CHANGELOG.md
#	extensions/nostr/package.json
#	extensions/open-prose/package.json
#	extensions/signal/package.json
#	extensions/slack/package.json
#	extensions/telegram/package.json
#	extensions/tlon/package.json
#	extensions/twitch/CHANGELOG.md
#	extensions/twitch/package.json
#	extensions/voice-call/CHANGELOG.md
#	extensions/voice-call/package.json
#	extensions/whatsapp/package.json
#	extensions/zalo/CHANGELOG.md
#	extensions/zalo/package.json
#	extensions/zalouser/CHANGELOG.md
#	extensions/zalouser/package.json
#	package.json

* fix(ui): note agent file refresh in changelog

(cherry picked from commit f52ca0a712c7c9a7ca917974177515ebe7530393)

# Conflicts:
#	CHANGELOG.md

* Docs: refresh zh-CN translations + i18n guidance

What:
- update zh-CN glossary, translation prompt, and TM
- regenerate zh-CN docs and apply targeted fixes
- add zh-CN AGENTS guidance for translation pipeline

Why:
- address zh-CN terminology and spacing feedback from #6995

Tests:
- pnpm build && pnpm check && pnpm test

(cherry picked from commit 9f03791aa94a506ec5f6fec90425118221df5f1f)

* Docs(zh-CN): add AGENTS translation workflow

(cherry picked from commit 4027b3583e9a79cb80f3ead487d4e2b7c21ab1ec)

* Docs: guard zh-CN i18n workflow

What:
- document zh-CN docs pipeline and generated-doc guardrails
- note Discord escalation when the pipeline drags

Why:
- prevent accidental edits to generated translations

Tests:
- pnpm build
- pnpm check
- pnpm test

Co-authored-by: Josh Palmer <joshpalmer123@gmail.com>
(cherry picked from commit fd8f8843bd02dbc4cf225af27f59563de14b8622)

# Conflicts:
#	CHANGELOG.md

* Docs: drop healthcheck from bootstrap

(cherry picked from commit 61a7fc5e0e135e04e3418050dc0142a870fa12e4)

# Conflicts:
#	docs/reference/templates/BOOTSTRAP.md

* chore: update changelog for #8193 (thanks @gildo)

(cherry picked from commit b64c1a56a13893aab4e22ccd35c2006f4950938f)

# Conflicts:
#	CHANGELOG.md

* style: update chat new-messages button

(cherry picked from commit 9f16de253354a0c064b0f54ed0479bf11c230d06)

# Conflicts:
#	ui/src/ui/views/chat.ts

* docs(skills): split tmux send-keys for TUI (#7737)

* docs(skills): split tmux send-keys for TUI

* docs(skills): soften TUI send-keys wording

---------

Co-authored-by: wangnov <1694546283@qq.com>
(cherry picked from commit 089d03453da1e643e1703aa846ac1cc3b44ff1e7)

* docs: note tmux send-keys TUI guidance (#7737) (thanks @Wangnov)

(cherry picked from commit efc9d0a4988fc4bdea2028d23332e62a5cc06fa8)

# Conflicts:
#	CHANGELOG.md

* docs: add changelog for #7178 (thanks @Yeom-JinHo)

(cherry picked from commit 44d1aa31f3e2a35275ff48135b4e832c34050521)

* docs: document secure DM mode preset (#7872)

* docs: document secure DM mode preset

* fix: resolve merge conflict in resizable-divider

(cherry picked from commit 6fdb136688d462e2a55c7bd728e153fb9d47ac95)

* docs: update Feishu plugin docs

(cherry picked from commit 5292367324adc951cdce877623dfe88dda5da5ba)

# Conflicts:
#	docs/channels/feishu.md
#	docs/reference/RELEASING.md

* feat: Add Docs Chat Widget with RAG-powered Q&A (#7908)

* feat: add docs chat prototype and related scripts

- Introduced a minimal documentation chatbot that builds a search index from markdown files and serves responses via an API.
- Added scripts for building the index and serving the chat API.
- Updated package.json with new commands for chat index building and serving.
- Created a new Vercel configuration file for deployment.
- Added a README for the docs chat prototype detailing usage and integration.

* feat: enhance docs chat with vector-based RAG pipeline

- Added vector index building and serving capabilities to the docs chat.
- Introduced new scripts for generating embeddings and serving the chat API using vector search.
- Updated package.json with new commands for vector index operations.
- Enhanced README with instructions for the new RAG pipeline and legacy keyword pipeline.
- Removed outdated Vercel configuration file.

* feat: enhance chat widget with markdown rendering and style updates

- Integrated dynamic loading of markdown rendering for chat responses.
- Implemented a fallback for markdown rendering to ensure consistent display.
- Updated CSS variables for improved theming and visual consistency.
- Enhanced chat bubble and input styles for better user experience.
- Added new styles for markdown content in chat bubbles, including code blocks and lists.

* feat: add copy buttons to chat widget for enhanced user interaction

- Implemented copy buttons for chat responses and code blocks in the chat widget.
- Updated CSS styles for improved visibility and interaction of copy buttons.
- Adjusted textarea height for better user experience.
- Enhanced functionality to allow users to easily copy text from chat bubbles and code snippets.

* feat: update chat widget styles for improved user experience

- Changed accent color for better visibility.
- Enhanced preformatted text styles for code blocks, including padding and word wrapping.
- Adjusted positioning and styles of copy buttons for chat responses and code snippets.
- Improved hover effects for copy buttons to enhance interactivity.

* feat: enhance chat widget styles for better responsiveness and scrollbar design

- Updated chat panel dimensions for improved adaptability on various screen sizes.
- Added custom scrollbar styles for better aesthetics and usability.
- Adjusted chat bubble styles for enhanced visibility and interaction.
- Improved layout for expanded chat widget on smaller screens.

* feat: refine chat widget code block styles and copy button functionality

- Adjusted padding and margin for preformatted text in chat responses for better visual consistency.
- Introduced a compact style for single-line code blocks to enhance layout.
- Updated copy button logic to skip short code blocks, improving user experience when copying code snippets.

* feat: add resize handle functionality to chat widget for adjustable panel width

- Implemented a draggable resize handle for the chat widget's sidebar, allowing users to adjust the panel width.
- Added CSS styles for the resize handle, including hover effects and responsive behavior.
- Integrated drag-to-resize logic to maintain user-set width across interactions.
- Ensured the panel resets to default width when closed, enhancing user experience.

* feat: implement rate limiting and error handling in chat API

- Added rate limiting functionality to the chat API, allowing a maximum number of requests per IP within a specified time window.
- Implemented error handling for rate limit exceeded responses, including appropriate headers and retry instructions.
- Enhanced error handling for other API errors, providing user-friendly messages for various failure scenarios.
- Updated README to include new environment variables for rate limiting configuration.

* feat: integrate Upstash Vector for enhanced document retrieval in chat API

- Implemented Upstash Vector as a cloud-based storage solution for document chunks, replacing the local LanceDB option.
- Added auto-detection of storage mode based on environment variables for seamless integration.
- Updated the chat API to utilize the new retrieval mechanism, enhancing response accuracy and performance.
- Enhanced README with setup instructions for Upstash and updated environment variable requirements.
- Introduced new scripts and configurations for managing the vector index and API interactions.

* feat: add create-markdown-preview.js for markdown rendering

- Introduced a new script for framework-agnostic HTML rendering of markdown content.
- The script includes various parsing functions to handle different markdown elements.
- Updated the chat widget to load the vendored version of @create-markdown/preview for improved markdown rendering.

* docs: update README for Upstash Vector index setup and environment variables

- Enhanced instructions for creating a Vector index in Upstash, including detailed settings and important notes.
- Clarified environment variable requirements for both Upstash and LanceDB modes.
- Improved formatting and organization of setup steps for better readability.
- Added health check and API endpoint details for clearer usage guidance.

* feat: add TRUST_PROXY environment variable for IP address handling

- Introduced the TRUST_PROXY variable to control the trust of X-Forwarded-For headers when behind a reverse proxy.
- Updated the README to document the new environment variable and its default value.
- Enhanced the getClientIP function to conditionally trust proxy headers based on the TRUST_PROXY setting.

* feat: add ALLOWED_ORIGINS environment variable for CORS configuration

- Introduced the ALLOWED_ORIGINS variable to specify allowed origins for CORS, enhancing security and flexibility.
- Updated the README to document the new environment variable and its usage.
- Refactored CORS handling in the server code to utilize the ALLOWED_ORIGINS setting for dynamic origin control.

* fix: ensure complete markdown rendering in chat widget

- Added logic to flush any remaining buffered bytes from the decoder, ensuring that all text is rendered correctly in the assistant bubble.
- Updated the assistant bubble's innerHTML to reflect the complete markdown content after streaming completes.

* feat: enhance DocsStore with improved vector handling and similarity conversion

- Added a constant for the distance metric used in vector searches, clarifying the assumption of L2 distance.
- Updated the createTable method to ensure all chunk properties are correctly mapped during table creation.
- Improved the similarity score calculation by providing a clear explanation of the conversion from L2 distance, ensuring accurate ranking of results.

* chore: fix code formatting

* Revert "chore: fix code formatting"

This reverts commit 6721f5b0b7bf60b76c519ccadfa41742f19ecf87.

* chore: format code for improved readability

- Reformatted code in serve.ts to enhance readability by adjusting indentation and line breaks.
- Ensured consistent style for function return types and object properties throughout the file.

* feat: Update API URL selection logic in chat widget

- Enhanced the API URL configuration to prioritize explicit settings, defaulting to localhost for development and using a production URL otherwise.
- Improved clarity in the code by adding comments to explain the logic behind the API URL selection.

* chore: Update documentation structure for improved organization

- Changed the path for the "Start Here" page to "start/index" for better clarity.
- Reformatted the "Web & Interfaces" and "Help" groups to use multi-line arrays for improved readability.

* feat: Enhance markdown preview integration and improve chat widget asset loading

- Wrapped the markdown preview functionality in an IIFE to expose a global API for easier integration.
- Updated the chat widget to load the markdown preview library dynamically, checking for existing instances to avoid duplicate loads.
- Adjusted asset paths in the chat widget to ensure correct loading based on the environment (local or production).
- Added CORS headers in the Vercel configuration for improved API accessibility.

* fix: Update chat API URL to include '/api' for correct endpoint access

- Modified the chat configuration and widget files to append '/api' to the API URL, ensuring proper endpoint usage in production and local environments.

* refactor: Simplify docs-chat configuration and remove unused scripts

- Removed outdated scripts and configurations related to the docs-chat feature, including build and serve scripts, as well as the associated package.json and README files.
- Streamlined the API URL configuration in the chat widget for better clarity and maintainability.
- Updated the package.json to remove unnecessary scripts related to the now-deleted functionality.

* refactor: Update documentation structure for improved clarity

- Changed the path for the "Start Here" page from "start/index" to "index" to enhance navigation and organization within the documentation.

* chore: Remove unused dependencies from package.json and pnpm-lock.yaml

- Deleted `@lancedb/lancedb`, `@upstash/vector`, and `openai` from both package.json and pnpm-lock.yaml to streamline the project and reduce bloat.

* chore: Clean up .gitignore by removing obsolete entries

- Deleted unused entries related to the docs-chat vector database from .gitignore to maintain a cleaner configuration.

* chore: Remove deprecated chat configuration and markdown preview script

- Deleted the `create-markdown-preview.js` script and the `docs-chat-config.js` file to eliminate unused assets and streamline the project.
- Updated the `docs-chat-widget.js` to directly reference the markdown library from a CDN, enhancing maintainability.

* chore: Update markdown rendering in chat widget to use marked library

- Replaced the deprecated `create-markdown-preview` library with the `marked` library for markdown rendering.
- Adjusted the script loading mechanism to fetch `marked` from a CDN, improving performance and maintainability.
- Enhanced the markdown rendering function to ensure security by disabling HTML pass-through and opening links in new tabs.

* Delete docs/start/index.md

(cherry picked from commit fa4b28d7af7464b07271bfef6c028e4135548f44)

* Changelog: move cron entries to 2026.2.3

(cherry picked from commit c396877dd9860dc5d4a5a1d37abd419f663536ea)

# Conflicts:
#	CHANGELOG.md

* Revert "feat: Add Docs Chat Widget with RAG-powered Q&A (#7908)" (#8834)

This reverts commit fa4b28d7af7464b07271bfef6c028e4135548f44.

(cherry picked from commit 2196456d4a44d1e54651dce5ee89046a829185e5)

* Add baidu qianfan model provider

(cherry picked from commit 1de05ad068ac0371b4b520a12697a9973faea54d)

# Conflicts:
#	docs/providers/qianfan.md

* Optimize doc

(cherry picked from commit 8c53dfb74f2484c323ffa835995978443f160baf)

* fix(web ui): agent model selection

(cherry picked from commit 9822985ea649b93f0deaa8a8a34928159795c55e)

# Conflicts:
#	ui/src/styles/components.css
#	ui/src/ui/app-render.ts
#	ui/src/ui/views/agents.ts

* chore: replace landpr prompt with end-to-end landing workflow (#8916)

(cherry picked from commit eab0a07f71734551fcc88c830bef407c1cdd5297)

* 🤖 docs: mirror landing revamp for zh-CN

What:
- add zh-CN versions of landing revamp pages (features, quickstart, docs directory, network model, credits)
- refresh zh-CN index and hubs, plus glossary entries

Why:
- keep Chinese docs aligned with the new English landing experience
- ensure navigation surfaces the new entry points

Tests:
- pnpm build && pnpm check && pnpm test

(cherry picked from commit aaeecc8c8ddc52ded041d1c840bc9af5e2398054)

# Conflicts:
#	docs/.i18n/glossary.zh-CN.json
#	docs/zh-CN/index.md
#	docs/zh-CN/start/hubs.md

* 🤖 docs: note zh-CN landing revamp (#8994) (thanks @joshp123)

What:
- add changelog entry for the zh-CN landing revamp docs

Why:
- record the doc update and thank the contributor

Tests:
- pnpm lint && pnpm build && pnpm test

(cherry picked from commit 2b1da4f5d86fa5e4dda630b7fc57213d973d4b26)

# Conflicts:
#	CHANGELOG.md

* changelog: add shell completion auto-fix entry

(cherry picked from commit 43590d8287df1a4e26d953ccd982f093ccf87d0f)

* chore: sync plugin versions to 2026.2.3

(cherry picked from commit f895c9fba12f0860f52f2689432023919b9b4b8f)

# Conflicts:
#	extensions/bluebubbles/package.json
#	extensions/copilot-proxy/package.json
#	extensions/diagnostics-otel/package.json
#	extensions/discord/package.json
#	extensions/feishu/package.json
#	extensions/google-antigravity-auth/package.json
#	extensions/google-gemini-cli-auth/package.json
#	extensions/googlechat/package.json
#	extensions/imessage/package.json
#	extensions/line/package.json
#	extensions/llm-task/package.json
#	extensions/lobster/package.json
#	extensions/matrix/CHANGELOG.md
#	extensions/matrix/package.json
#	extensions/mattermost/package.json
#	extensions/memory-core/package.json
#	extensions/memory-lancedb/package.json
#	extensions/msteams/CHANGELOG.md
#	extensions/msteams/package.json
#	extensions/nextcloud-talk/package.json
#	extensions/nostr/CHANGELOG.md
#	extensions/nostr/package.json
#	extensions/open-prose/package.json
#	extensions/signal/package.json
#	extensions/slack/package.json
#	extensions/telegram/package.json
#	extensions/tlon/package.json
#	extensions/twitch/CHANGELOG.md
#	extensions/twitch/package.json
#	extensions/voice-call/CHANGELOG.md
#	extensions/voice-call/package.json
#	extensions/whatsapp/package.json
#	extensions/zalo/CHANGELOG.md
#	extensions/zalo/package.json
#	extensions/zalouser/CHANGELOG.md
#	extensions/zalouser/package.json

* chore: update 2026.2.3 notes

(cherry picked from commit 54ddbc466085b42526983f6c90d152fdd7bf365f)

# Conflicts:
#	CHANGELOG.md
#	appcast.xml

* Optimize format

(cherry picked from commit ad759c94460c922e6b16951c9b8c1d09f7723baf)

# Conflicts:
#	docs/providers/qianfan.md

* Optimize doc

(cherry picked from commit ff948a6dd7bb0ae1cd257541c1bb6715e07e91c5)

# Conflicts:
#	docs/providers/qianfan.md

* Docs: streamline start and install docs (#9648)

* docs(start): streamline getting started flow

* docs(nav): reorganize start and install sections

* docs(style): move custom css to style.css

* docs(navigation): align zh-CN ordering

* docs(navigation): localize zh-Hans labels

(cherry picked from commit 675c26b2b013cf1d8c95122cc8f50e3c2e7b8497)

# Conflicts:
#	docs/docs.json
#	docs/start/docs-directory.md
#	docs/start/getting-started.md
#	docs/start/onboarding.md
#	docs/start/quickstart.md
#	docs/start/setup.md
#	docs/start/wizard.md

* docs(install): rename install overview page

(cherry picked from commit 34424ce5362908c2b0a51dd8f6adad209c7f63dc)

* docs(onboarding): add bootstrapping page (#9767)

(cherry picked from commit 3011b00d39e9fd6b64977efa573ef9c4f6295d1e)

# Conflicts:
#	docs/start/onboarding.md

* docs: fix onboarding rendering issues

(cherry picked from commit c8f4bca0c4219527b96730211b607ac9b26b88d6)

# Conflicts:
#	docs/start/onboarding.md

* docs(onboarding): streamline CLI onboarding docs (#9830)

(cherry picked from commit 9e0030b75f2ea20b1cc5e60df2a7c6418000a1e3)

# Conflicts:
#	docs/cli/onboard.md
#	docs/start/wizard.md

* update handle

(cherry picked from commit 1473fb19a521f68221fe3c5c527290505acc4bfb)

* docs: fix incorrect model.fallback to model.fallbacks in Ollama config (#9384) (#9749)

Both English and Chinese documentation had incorrect configuration template
using 'fallback' instead of 'fallbacks' in agents.defaults.model config.

Co-authored-by: damaozi <1811866786@qq.com>
(cherry picked from commit 679bb087db6f7ac59215171c213db55a3472aaad)

# Conflicts:
#	docs/providers/ollama.md

* feat(skills): add QR code skill (#8817)

feat(skills): add QR code generation and reading skill

Adds qr-code skill with:
- qr_generate.py - Generate QR codes with customizable size/error correction
- qr_read.py - Decode QR codes from images
- SKILL.md documentation

Co-authored-by: Omar-Khaleel
(cherry picked from commit ad13c265ba1fd22dadfe30325ed998d9a3d95e5c)

* chore(agentsmd): add tsgo command to AGENTS.md (#9894)

Add `pnpm tsgo` command to AGENTS.md development reference

Co-authored-by: vincentkoc <vincentkoc@users.noreply.github.com>
(cherry picked from commit db8e9b37c6dc798a74a988a68bd709f4661f4b2b)

* Revert "feat(skills): add QR code skill (#8817)"

This reverts commit ad13c265ba1fd22dadfe30325ed998d9a3d95e5c.

(cherry picked from commit 6b7d3c3062cdf5e1cf5e50860a56b867c8b2f66c)

* docs: tighten secure DM example

(cherry picked from commit 873182ec2d2c41546567ba97111d969ccacebf7d)

# Conflicts:
#	docs/concepts/session.md

* docs: note secure DM guidance update (#9377) (thanks @Shrinija17)

(cherry picked from commit 8fdc0a284154c4343ef92a4c88e1c0338779ec92)

# Conflicts:
#	CHANGELOG.md

* docs: restructure Get Started tab and improve onboarding flow (#9950)

* docs: restructure Get Started tab and improve onboarding flow

- Flatten nested Onboarding group into linear First Steps flow
- Add 'What is OpenClaw?' narrative section to landing page
- Split wizard.md into streamlined overview + full reference (reference/wizard.md)
- Move Pairing to Channels > Configuration
- Move Bootstrapping to Agents > Fundamentals
- Move macOS app onboarding to Platforms > macOS companion app
- Move Lore to Help > Community
- Remove duplicate install instructions from openclaw.md
- Mirror navigation changes in zh-CN tabs
- No content deleted — all detail preserved or relocated

* docs: move deployment pages to install/, fix Platforms tab routing, clarify onboarding paths

- Move deployment guides (fly, hetzner, gcp, macos-vm, exe-dev, railway, render,
  northflank) from platforms/ and root to install/
- Add 'Hosting and deployment' group to Install tab
- Slim Gateway & Ops 'Remote access and deployment' down to 'Remote access'
- Swap Platforms tab before Gateway & Ops to fix path-prefix routing
- Move macOS app onboarding into First steps (parallel to CLI wizard)
- Rename sidebar titles to 'Onboarding: CLI' / 'Onboarding: macOS App'
- Add redirects for all moved paths
- Update all internal links (en + zh-CN)
- Fix img tag syntax in onboarding.md

(cherry picked from commit c18452598aa0b6977ad8962c689bed03e144986d)

# Conflicts:
#	docs/docs.json
#	docs/help/faq.md
#	docs/index.md
#	docs/start/clawd.md
#	docs/start/wizard.md
#	docs/zh-CN/gateway/remote.md
#	docs/zh-CN/help/faq.md
#	docs/zh-CN/install/docker.md
#	docs/zh-CN/platforms/digitalocean.md
#	docs/zh-CN/platforms/index.md
#	docs/zh-CN/platforms/oracle.md
#	docs/zh-CN/platforms/raspberry-pi.md
#	docs/zh-CN/start/getting-started.md
#	docs/zh-CN/vps.md

* chore: remove tracked .DS_Store files

(cherry picked from commit 8577d015b24e5d9ba65f0ab02c271659b86d1855)

* chore: changelog for xAI onboarding (#9885) (thanks @grp06)

(cherry picked from commit 68393bfa36cbbd2bf2acf088f51bf8dbb74bfd90)

* Changelog: note #9976 thinking alias + Codex 5.3 docs sync

(cherry picked from commit 7db839544d081103c22e5a7db4195245ef2c97af)

# Conflicts:
#	CHANGELOG.md

* add PR review workflow templates

(cherry picked from commit 0a485924757174995a7bd6feae5b2da6e20bc58d)

* Chore: Update memory.md with current default workspace path (#9559)

Removed 'clawd' workspace reference - updated with current default workspace path of '~/.openclaw/workspace'

(cherry picked from commit b1430aaaca7613aa74f618ed7a83f6413a843435)

* docs: add activeHours to heartbeat field notes and examples (#9366)

Co-authored-by: unisone <unisone@users.noreply.github.com>
(cherry picked from commit d2aee7da6833898d847120c03c1d822d2267aa40)

# Conflicts:
#	docs/gateway/heartbeat.md

* docs: update clawtributors (add @unisone)

(cherry picked from commit ac0c2f260f6bb60f4236a9d49abfcdfe45f9b622)

# Conflicts:
#	README.md

* Docs: add PR and issue submission guides (#10150)

* Docs: add PR and issue submission guides

* Docs: fix LLM-assisted wording

(cherry picked from commit 50e687d17d7c7cd825efc23a67b76360c3c77ba8)

* Docs: sharpen Install tab to stop duplicating Getting Started (#10416)

* docs(install): reframe install overview to stop duplicating getting started

* docs(install): link default installer row to getting started, not internals

* docs(install): use Mintlify components for install overview

* docs(install): fix card grid layout with CardGroup

* docs(install): platform tabs for global install, npm/pnpm as accordion

* docs(install): add PowerShell no-onboard alternative

* docs(install): add repo link to from-source clone step

* docs(install): capitalize OpenClaw in repo link

* docs(install): add pnpm link --global to from-source steps

* docs(install): rewrite install overview for clarity and flow

* docs(install): use tooltip for Windows WSL2 recommendation

* docs(install): use Note box for Windows WSL2 recommendation

* docs(install): group install methods under single heading

* docs(install): standardize tab labels across installer sections

* docs(install): rewrite Node.js page with install instructions and better structure

* docs(install): clarify Node.js page intro

* docs(install): scope auto-install note to installer script, link Node page

* docs(install): fix installer script link to internals page

* docs: rename Install methods nav group to Other install methods

* docs(install): link to on-page anchor, use Tip box for recommended

* docs(install): wrap install methods in AccordionGroup with Tip box

* docs: move Node.js page from Install to Help > Environment and debugging

* docs(install): add complete flags and env vars reference to installer internals

* docs(install): use stable troubleshooting anchor for Node.js link

* docs(install): fix Node page installer anchor

* docs(install): fix broken installer script anchor in requirements note

(cherry picked from commit 18b480dd3ee7fc79605988c474b6f440f8083436)

# Conflicts:
#	docs/install/index.md
#	docs/install/installer.md
#	docs/install/node.md

* docs: linting

(cherry picked from commit 1bf9f237f719385517ba5f6c709875a18c1a53b6)

# Conflicts:
#	docs/channels/slack.md
#	docs/concepts/session.md
#	docs/help/faq.md
#	docs/platforms/mac/voice-overlay.md
#	docs/tui.md

* docs(markdownlint): enable autofixable rules and normalize links

(cherry picked from commit c7aec0660ea9075612c28d2e10eeb1829f0767d2)

# Conflicts:
#	.markdownlint-cli2.jsonc
#	docs/automation/gmail-pubsub.md
#	docs/bedrock.md
#	docs/brave-search.md
#	docs/channels/bluebubbles.md
#	docs/channels/line.md
#	docs/channels/matrix.md
#	docs/channels/msteams.md
#	docs/channels/nextcloud-talk.md
#	docs/channels/nostr.md
#	docs/channels/slack.md
#	docs/channels/telegram.md
#	docs/channels/twitch.md
#	docs/channels/zalo.md
#	docs/channels/zalouser.md
#	docs/concepts/groups.md
#	docs/concepts/memory.md
#	docs/concepts/model-providers.md
#	docs/concepts/system-prompt.md
#	docs/concepts/typebox.md
#	docs/debug/node-issue.md
#	docs/experiments/research/memory.md
#	docs/gateway/authentication.md
#	docs/gateway/configuration.md
#	docs/gateway/local-models.md
#	docs/gateway/security/index.md
#	docs/help/faq.md
#	docs/index.md
#	docs/install/docker.md
#	docs/install/northflank.mdx
#	docs/install/railway.mdx
#	docs/install/render.mdx
#	docs/install/uninstall.md
#	docs/install/updating.md
#	docs/platforms/ios.md
#	docs/platforms/mac/dev-setup.md
#	docs/plugin.md
#	docs/providers/cloudflare-ai-gateway.md
#	docs/providers/deepgram.md
#	docs/providers/moonshot.md
#	docs/providers/ollama.md
#	docs/providers/vercel-ai-gateway.md
#	docs/reference/AGENTS.default.md
#	docs/reference/RELEASING.md
#	docs/reference/credits.md
#	docs/reference/device-models.md
#	docs/reference/templates/AGENTS.md
#	docs/reference/templates/HEARTBEAT.md
#	docs/start/clawd.md
#	docs/start/setup.md
#	docs/tools/browser-linux-troubleshooting.md
#	docs/tools/browser.md
#	docs/tools/chrome-extension.md
#	docs/tools/llm-task.md
#	docs/tools/skills.md
#	docs/tools/web.md
#	docs/tui.md
#	docs/web/dashboard.md

* revert(docs): undo markdownlint autofix churn

(cherry picked from commit 0a1f4f666a66846a67a103d10eeddb29d2ec422f)

# Conflicts:
#	docs/automation/gmail-pubsub.md
#	docs/bedrock.md
#	docs/brave-search.md
#	docs/channels/bluebubbles.md
#	docs/channels/matrix.md
#	docs/channels/msteams.md
#	docs/channels/nextcloud-talk.md
#	docs/channels/nostr.md
#	docs/channels/telegram.md
#	docs/channels/twitch.md
#	docs/channels/zalo.md
#	docs/channels/zalouser.md
#	docs/concepts/groups.md
#	docs/concepts/memory.md
#	docs/concepts/system-prompt.md
#	docs/concepts/typebox.md
#	docs/debug/node-issue.md
#	docs/experiments/research/memory.md
#	docs/gateway/authentication.md
#	docs/gateway/configuration.md
#	docs/gateway/local-models.md
#	docs/gateway/security/index.md
#	docs/help/faq.md
#	docs/install/docker.md
#	docs/install/northflank.mdx
#	docs/install/railway.mdx
#	docs/install/render.mdx
#	docs/install/uninstall.md
#	docs/install/updating.md
#	docs/platforms/ios.md
#	docs/platforms/mac/dev-setup.md
#	docs/plugin.md
#	docs/providers/deepgram.md
#	docs/providers/moonshot.md
#	docs/providers/ollama.md
#	docs/providers/vercel-ai-gateway.md
#	docs/reference/AGENTS.default.md
#	docs/reference/RELEASING.md
#	docs/reference/device-models.md
#	docs/reference/templates/AGENTS.md
#	docs/reference/templates/HEARTBEAT.md
#	docs/start/clawd.md
#	docs/start/setup.md
#	docs/tools/browser-linux-troubleshooting.md
#	docs/tools/browser.md
#	docs/tools/chrome-extension.md
#	docs/tools/llm-task.md
#	docs/tools/skills.md
#	docs/tools/web.md
#	docs/tui.md
#	docs/web/dashboard.md

* Docs: enable markdownlint autofixables except list numbering (#10476)

* docs(markdownlint): enable autofixable rules except list numbering

* docs(zalo): fix malformed bot platform link

(cherry picked from commit 578a6e27aa76adab85471b322321d9b6d4227322)

# Conflicts:
#	docs/brave-search.md
#	docs/channels/bluebubbles.md
#	docs/channels/matrix.md
#	docs/channels/msteams.md
#	docs/channels/nextcloud-talk.md
#	docs/channels/telegram.md
#	docs/channels/twitch.md
#	docs/concepts/system-prompt.md
#	docs/concepts/typebox.md
#	docs/debug/node-issue.md
#	docs/gateway/configuration.md
#	docs/gateway/local-models.md
#	docs/gateway/security/index.md
#	docs/help/faq.md
#	docs/install/northflank.mdx
#	docs/install/railway.mdx
#	docs/install/render.mdx
#	docs/install/updating.md
#	docs/platforms/mac/dev-setup.md
#	docs/providers/moonshot.md
#	docs/providers/ollama.md
#	docs/tools/skills.md
#	docs/tools/web.md
#	docs/web/dashboard.md

* Docs: revamp installer internals for readability and accuracy (#10499)

* docs(install): revamp installer internals for readability and accuracy

Restructure the installer internals page with better flow and Mintlify
components (CardGroup, Steps, Tabs, AccordionGroup). All flags, env vars,
and behavioral descriptions cross-checked against install.sh,
install-cli.sh, and install.ps1 source code.

- Add CardGroup chooser and Quick Commands section at top
- Organize each script into consistent Flow → Examples → Reference pattern
- Move flags/env var tables into collapsible Accordions
- Consolidate troubleshooting into AccordionGroup at bottom
- Add missing flags (--version, --beta, --verbose, --help, etc.)
- Add missing env vars (OPENCLAW_VERSION, OPENCLAW_BETA, etc.)
- Document install-cli.sh fully (was one paragraph)
- Fix non-interactive checkout detection behavior (defaults to npm)
- Use --proto/--tlsv1.2 in curl examples to match script usage
- No content deleted; all original info preserved or relocated

* fix(docs): correct in-page anchor hrefs for installer cards

* docs(install): replace CardGroup with table for installer overview

(cherry picked from commit 991cf4d7fec5ce7215c02200325e54c7e3f38251)

# Conflicts:
#	docs/install/installer.md

* Docs: add PR sign-off template (#10561)

(cherry picked from commit 5842bcaaf72c7dcb883790f7c837df5530f3dae3)

* Docs: revise PR and issue submission guides (#10617)

* Docs: revise PR submission guide

* Docs: revise issue submission guide

(cherry picked from commit e3d3893d5dbec30c2046166b6a71bacfe641ef78)

* docs(changelog): prepare 2026.2.6

(cherry picked from commit 3b768a285134285ae52bafdbe57d48e37f838ca0)

# Conflicts:
#	CHANGELOG.md

* docs(changelog): include merged PRs since v2026.2.3

(cherry picked from commit ac5944cde71b8f7efa96b250a1f48575a75694b2)

# Conflicts:
#	CHANGELOG.md

* docs: fix markdownlint fragments + headings

(cherry picked from commit 5163833be5c5759798f1132b93958894ada6bf90)

# Conflicts:
#	docs/install/installer.md

* docs(changelog): refresh 2026.2.6 since v2026.2.3

(cherry picked from commit 7be921c4340cbac1d62ef0d993977b31c18f9819)

# Conflicts:
#	CHANGELOG.md

* docs(imessage): add macOS TCC troubleshooting

(cherry picked from commit fe308a3aa187870f752c25e21a61b4f60c4a9b50)

* docs(imessage): improve macOS TCC troubleshooting guidance (#10781)

(cherry picked from commit 93bf75279fbb2820e811d7cdabcaaf545018b575)

# Conflicts:
#	docs/channels/imessage.md

* docs(changelog): curate 2026.2.6

(cherry picked from commit c237a82b42f8fe885608560a389d0e368d5a019b)

# Conflicts:
#	CHANGELOG.md

* docs(changelog): highlight Opus 4.6 + Codex 5.3 first

(cherry picked from commit f831c48e56705184195b69ebbf662f785b032ae4)

* Fix QMD CLI installation link in memory.md (#8647)

Correct the installation link for the QMD CLI in the documentation.

(cherry picked from commit c80a09fc2f19c31b717bee9d06f5074ddf78ee4a)

* Docs: fix broken /plugins links (#9308)

* Docs: fix broken /plugins links to /plugin

The documentation linked to /plugins which doesn't exist.
The correct path is /plugin (singular) which contains the
plugins overview documentation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* docs: drop manual zh-CN doc edits from plugins link fix

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com>
(cherry picked from commit d1dc60774ba10bfdfa6d2167760e1172579227c9)

# Conflicts:
#	docs/cli/memory.md

* Fix repository links in formal-verification.md (#10200)

Updated repository links for formal verification models.

(cherry picked from commit 3d2fe9284eb6617bdb00f295c9e87472bd70e6b2)

* Revert previous change from 'Clawdbot' to 'OpenClaw' in lore (#9119)

(cherry picked from commit 4c1da23a710bd7a1ded7ca840bc51481b727c8e7)

* chore(skills): remove bird skill

(cherry picked from commit 31a7e4f9375f64ee3177bdc955cbe73dadfd96b1)

# Conflicts:
#	docs/tools/exec-approvals.md
#	skills/bird/SKILL.md

* docs(changelog): note CI pipeline optimization (#10784) (thanks @mcaxtr)

(cherry picked from commit 875324e7c730f4ab99db14a405cf51ebf1228811)

* chore(release): 2026.2.6-2

(cherry picked from commit ad4dd0422ea46d21ad336151ca6f2a63119e80f1)

# Conflicts:
#	extensions/bluebubbles/package.json
#	extensions/copilot-proxy/package.json
#	extensions/diagnostics-otel/package.json
#	extensions/discord/package.json
#	extensions/feishu/package.json
#	extensions/google-antigravity-auth/package.json
#	extensions/google-gemini-cli-auth/package.json
#	extensions/googlechat/package.json
#	extensions/imessage/package.json
#	extensions/line/package.json
#	extensions/llm-task/package.json
#	extensions/lobster/package.json
#	extensions/matrix/CHANGELOG.md
#	extensions/matrix/package.json
#	extensions/mattermost/package.json
#	extensions/memory-core/package.json
#	extensions/memory-lancedb/package.json
#	extensions/minimax-portal-auth/package.json
#	extensions/msteams/CHANGELOG.md
#	extensions/msteams/package.json
#	extensions/nextcloud-talk/package.json
#	extensions/nostr/CHANGELOG.md
#	extensions/nostr/package.json
#	extensions/open-prose/package.json
#	extensions/signal/package.json
#	extensions/slack/package.json
#	extensions/telegram/package.json
#	extensions/tlon/package.json
#	extensions/twitch/CHANGELOG.md
#	extensions/twitch/package.json
#	extensions/voice-call/CHANGELOG.md
#	extensions/voice-call/package.json
#	extensions/whatsapp/package.json
#	extensions/zalo/CHANGELOG.md
#	extensions/zalo/package.json
#	extensions/zalouser/CHANGELOG.md
#	extensions/zalouser/package.json
#	package.json

* chore(release): 2026.2.6-3

(cherry picked from commit 9f703a44dc954349d4c9571cba2f16b7fb3d2adc)

# Conflicts:
#	extensions/bluebubbles/package.json
#	extensions/copilot-proxy/package.json
#	extensions/diagnostics-otel/package.json
#	extensions/discord/package.json
#	extensions/feishu/package.json
#	extensions/google-antigravity-auth/package.json
#	extensions/google-gemini-cli-auth/package.json
#	extensions/googlechat/package.json
#	extensions/imessage/package.json
#	extensions/line/package.json
#	extensions/llm-task/package.json
#	extensions/lobster/package.json
#	extensions/matrix/CHANGELOG.md
#	extensions/matrix/package.json
#	extensions/mattermost/package.json
#	extensions/memory-core/package.json
#	extensions/memory-lancedb/package.json
#	extensions/minimax-portal-auth/package.json
#	extensions/msteams/CHANGELOG.md
#	extensions/msteams/package.json
#	extensions/nextcloud-talk/package.json
#	extensions/nostr/CHANGELOG.md
#	extensions/nostr/package.json
#	extensions/open-prose/package.json
#	extensions/signal/package.json
#	extensions/slack/package.json
#	extensions/telegram/package.json
#	extensions/tlon/package.json
#	extensions/twitch/CHANGELOG.md
#	extensions/twitch/package.json
#	extensions/voice-call/CHANGELOG.md
#	extensions/voice-call/package.json
#	extensions/whatsapp/package.json
#	extensions/zalo/CHANGELOG.md
#	extensions/zalo/package.json
#	extensions/zalouser/CHANGELOG.md
#	extensions/zalouser/package.json
#	package.json

* docs: add symptom-first troubleshooting hub and deep runbooks (#11196)

* docs(troubleshooting): add symptom-first troubleshooting runbooks

* docs(troubleshooting): fix approvals command examples

* docs(troubleshooting): wrap symptom cases in accordions

* docs(automation): clarify userTimezone missing-key behavior

* docs(troubleshooting): fix first-60-seconds ladder order

(cherry picked from commit 9a3f62cb86cd505d8ee490aa6a1fe9600d96ad65)

# Conflicts:
#	docs/channels/troubleshooting.md
#	docs/gateway/troubleshooting.md
#	docs/help/troubleshooting.md

* docs: add missing HEARTBEAT.md and MEMORY.md to bootstrap files list (#8105)

* docs: add missing HEARTBEAT.md and MEMORY.md to bootstrap files list

Fixes #7928

The documentation for skipBootstrap and workspace setup was missing
HEARTBEAT.md and MEMORY.md from the bootstrap files list.

Changes:
- docs/gateway/configuration.md: Add HEARTBEAT.md and MEMORY.md
- docs/zh-CN/gateway/configuration.md: Same for Chinese version
- docs/start/openclaw.md: Add HEARTBEAT.md, clarify MEMORY.md is optional
- docs/zh-CN/start/openclaw.md: Same for Chinese version

* fix: reference PR number instead of issue in CHANGELOG

* docs(workspace): align bootstrap file docs with runtime (#8105)

---------

Co-authored-by: damaozi <1811866786@qq.com>
Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com>
(cherry picked from commit a4d5c7f6730a4648b20163f4194c43140df35da0)

# Conflicts:
#	docs/start/clawd.md

* adding PR review workflow

(cherry picked from commit 6d1daf2ba5c8778f7cf0f6230c615e20b89eec2c)

* added more explicit instructions

(cherry picked from commit cde29fef715e4edf633be260051cdabab3db5dba)

* Fix typo in FAQ regarding model configuration command (#6048)

(cherry picked from commit 9201e140cb523fc9bac1362d6afef0efda415b88)

# Conflicts:
#	docs/help/faq.md

* Update CHANGELOG.md for version 2026.2.6-4: Added RPC methods for agent management, fixed context overflow recovery, improved LAN IP handling, enhanced memory retrieval, and updated media understanding for audio transcription.

(cherry picked from commit a30c4f45c38434af6f4cac5bcc2cdd6b0bc6b336)

# Conflicts:
#	CHANGELOG.md

* docs: clarify onboarding instructions for beginners (#10956)

(cherry picked from commit 9866a857a79a70bfe958034a2f462ff3a6150764)

# Conflicts:
#	README.md

* chore: updated PR review skills and workflow info on tests + fake timers

(cherry picked from commit c27b03794afa19128c92430ced70ddac194b0842)

* Fix Nix repository link in README (#7910)

Updated Nix repository link in README.

Co-authored-by: Josh <141778+bolapara@users.noreply.github.com>
Co-authored-by: Seb Slight <19554889+sebslight@users.noreply.github.com>
(cherry picked from commit 05a57e94a4b63d37bb5f063c2fe0466fa8299674)

# Conflicts:
#	README.md

* Docs: fix cron.update param name id → jobId (#11365) (#11467)

* Docs: fix cron.update param name id → jobId (#11365)

* Docs: sync zh-CN cron.update param name id → jobId

* docs: revert manual zh-CN generated docs edit (#11467) (thanks @lailoo)

---------

Co-authored-by: damaozi <1811866786@qq.com>
Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com>
(cherry picked from commit 0499656c5905e82f2bc492960708b8ef879a5e28)

* fix(ui): smooth chat refresh scroll and suppress new-messages badge flash

(cherry picked from commit bc475f0172d15a896596d35969441ff57e1356f2)

# Conflicts:
#	CHANGELOG.md
#	ui/s…
hughdidit pushed a commit to hughdidit/DAISy-Agency that referenced this pull request Mar 3, 2026
zooqueen pushed a commit to hanzoai/bot that referenced this pull request Mar 6, 2026
zooqueen pushed a commit to hanzoai/bot that referenced this pull request Mar 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: web-ui App: web-ui

Projects

None yet

Development

Successfully merging this pull request may close these issues.

WebChat: auto-scroll overrides user scroll position when reading history

2 participants