fix: L2-normalize local embedding vectors to fix semantic search#5332
Merged
gumadeiras merged 4 commits intoopenclaw:mainfrom Feb 2, 2026
Merged
Conversation
Contributor
Author
|
Hi @gumadeiras @thewilloftheshadow @cpojer, Would appreciate a review when you get a chance. This fixes a bug where local embeddings weren't normalized, causing semantic search to rank by vector magnitude instead of similarity. Added L2 normalization with proper edge-case handling and tests. Thanks! |
8b424a5 to
171b133
Compare
Member
|
Merged via squash.
Thanks @akramcodez! |
buiilding
pushed a commit
to buiilding/openclaw
that referenced
this pull request
Feb 2, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
dbachelder
pushed a commit
to dbachelder/openclaw
that referenced
this pull request
Feb 3, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
cjiewong
pushed a commit
to cjiewong/moltbot
that referenced
this pull request
Feb 3, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
HashWarlock
pushed a commit
to HashWarlock/openclaw
that referenced
this pull request
Feb 4, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
uxcu
pushed a commit
to uxcu/kook-openclaw
that referenced
this pull request
Feb 5, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
bestNiu
pushed a commit
to bestNiu/clawdbot
that referenced
this pull request
Feb 5, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
3 tasks
batao9
pushed a commit
to batao9/openclaw
that referenced
this pull request
Feb 7, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
6 tasks
6 tasks
hughdidit
pushed a commit
to hughdidit/DAISy-Agency
that referenced
this pull request
Feb 8, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> (cherry picked from commit 5020bfa) # Conflicts: # src/memory/embeddings.ts
FullStackKevinVanDriel
pushed a commit
to FullStackKevinVanDriel/openclaw
that referenced
this pull request
Feb 10, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
battman21
pushed a commit
to battman21/openclaw
that referenced
this pull request
Feb 12, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
battman21
pushed a commit
to battman21/openclaw
that referenced
this pull request
Feb 12, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
ecnepsyroc-bot
added a commit
to ecnepsyroc-bot/Clawdbot
that referenced
this pull request
Feb 17, 2026
…penclaw#5332) Adds sanitizeAndNormalizeEmbedding() to handle NaN/Infinity values and normalize vectors to unit length, fixing cosine similarity calculations for local embedding models. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
hughdidit
added a commit
to hughdidit/DAISy-Agency
that referenced
this pull request
Mar 1, 2026
* fix: restore verbose tool summaries in DM sessions
875b018ea removed onToolResult from dispatch-from-config.ts to prevent
tool summaries leaking into group channels. However, this also broke
verbose tool summaries in DM/private sessions where they are expected.
This restores onToolResult but gates it behind ChatType !== 'group',
so group channels remain unaffected while DM verbose works again.
mirror=false is passed to sendPayloadAsync to avoid duplicating tool
summaries in the session transcript (matching the block reply behavior).
Fixes #2665
(cherry picked from commit f27a5030d898ffd747d394d8c5066a332000ec79)
* fix: exclude native slash commands from onToolResult
Native slash commands (e.g. /verbose, /status) should not emit tool
summaries. Gate onToolResult behind CommandSource !== 'native' in
addition to the existing ChatType !== 'group' check.
Add test for native command exclusion.
(cherry picked from commit c13c39f1214f5acad37eea355fbc41a6df4fff07)
* fix: handle telegram video notes (#2905) (thanks @mylukin)
(cherry picked from commit 4ac7aa4a481503508e8bd2c49d2e71e00fccfe36)
* fix: include AccountId in telegram native command context (#2942) (thanks @Chloe-VP)
(cherry picked from commit fcc53bcf1bca757a2c330e6dab2383adb563aef3)
* fix: use & instead of <> in XML escaping test for Windows NTFS compatibility (#3750)
NTFS does not allow < or > in filenames, causing the XML filename
escaping test to fail on Windows CI with ENOENT.
Replace file<test>.txt with file&test.txt — & is valid on all platforms
and still requires XML escaping (&), preserving the test's intent.
Fixes #3748
(cherry picked from commit c20035094ddf95d3186429e88c1b753b99edc36b)
* fix: avoid silent telegram empty replies (#3796) (#3796)
(cherry picked from commit 718bc3f9c818a3521c675a58d8d2942c51d39f4e)
# Conflicts:
# CHANGELOG.md
# src/telegram/bot-native-commands.ts
# src/telegram/bot/delivery.ts
* fix: preserve reasoning tags inside code blocks (#4118) (thanks @vinaygit18)
(cherry picked from commit 4583f88626f20efedc454d893afaaf898c23523b)
# Conflicts:
# CHANGELOG.md
* fix: update config types
(cherry picked from commit d47b4e6f8127e698a9fa6263c0f6a0df93a88b40)
# Conflicts:
# src/commands/onboard-auth.config-core.ts
# src/plugins/config-state.ts
* fix: migrate legacy gateway services
(cherry picked from commit 02576615cb4c1382abf1d0aee10ed10f1f676e78)
# Conflicts:
# docs/providers/xiaomi.md
# package.json
# src/cli/banner.ts
# src/commands/doctor-gateway-services.ts
# src/commands/doctor.ts
# src/commands/onboard-helpers.ts
# src/daemon/inspect.ts
* fix: migrate legacy config
(cherry picked from commit a155e2f8ae32e0b8aa82daa1a546ebfa3b6f9124)
# Conflicts:
# src/commands/doctor-config-flow.ts
* fix: migrate legacy state dirs
(cherry picked from commit 9886fd1a5a3f1e07817865dbf4c1663a919749e3)
# Conflicts:
# package.json
# src/commands/onboard-helpers.ts
# src/config/paths.ts
* fix: migrate symlinked legacy state dirs
(cherry picked from commit b9afa3d33f97f86f7ee9e841719b877e887b76b1)
# Conflicts:
# package.json
# src/infra/state-migrations.ts
* fix: detect legacy gateway launchd labels
(cherry picked from commit 151ddd624bd368e6f4345207c8ea7d9e6521a619)
# Conflicts:
# package.json
* fix: scope telegram skill commands per bot (#4360) (thanks @robhparker)
(cherry picked from commit 9025da2296c11829bf48f0f38c434d6a0ce82fa3)
# Conflicts:
# src/telegram/bot-native-commands.ts
* fix: honor Telegram proxy dispatcher (#4456) (thanks @spiceoogway)
(cherry picked from commit 3a85cb18330ef7b426668191d0acb7ec7b6a86cf)
# Conflicts:
# CHANGELOG.md
* fix: accept numeric Telegram react ids (#4533) (thanks @Ayush10)
(cherry picked from commit bc432d8435214b3a00556f64a4a7ecd2f2ba7616)
# Conflicts:
# README.md
* fix: add docker ui install changelog entry (#4584) (thanks @obviyus)
(cherry picked from commit fa9ec6e85452a81d21fcb046c770e519a16e8dda)
# Conflicts:
# CHANGELOG.md
* fix: correct telegram html nesting (#4578) (thanks @ThanhNguyxn)
(cherry picked from commit da71eaebd2f613f8afaddccdff12cb28c1d7e0f4)
# Conflicts:
# CHANGELOG.md
# src/markdown/render.ts
# src/telegram/format.test.ts
* fix: don't warn about expired OAuth tokens with valid refresh tokens (#4593)
OAuth credentials with a refresh token auto-renew on first API call,
so the doctor should not warn about access token expiration when a
refresh token is present. This avoids unnecessary "expired" warnings
that prompt users to re-auth when no action is needed.
Fixes #3032
Co-authored-by: Ayush Ojha <ayushozha@outlook.com>
(cherry picked from commit 37e295fc029070a214e2690d08429791fcac1512)
* fix: local updates for PR #4780
Co-authored-by: jlowin <jlowin@users.noreply.github.com>
(cherry picked from commit f24e3cdae539b985593626e282a9404b9a00c917)
# Conflicts:
# src/cli/models-cli.ts
# src/commands/models/list.status-command.ts
# src/commands/models/list.status.test.ts
* fix: add per-agent models status (#4780) (thanks @jlowin)
(cherry picked from commit daf27dd37e99cb19b3d169569591a162d5547712)
# Conflicts:
# CHANGELOG.md
* fix: local updates for PR #4873
Co-authored-by: Hisleren <Hisleren@users.noreply.github.com>
(cherry picked from commit e5a95b5b66113b145dbf2f80cc082c269a73728e)
# Conflicts:
# src/commands/configure.gateway.ts
# src/wizard/onboarding.gateway-config.ts
* fix: prevent undefined gateway token defaults (#4873) (thanks @Hisleren)
Co-authored-by: Hisleren <Hisleren@users.noreply.github.com>
(cherry picked from commit 39eb0b7bc0c2594620a7d2eff34f07d987845528)
# Conflicts:
# CHANGELOG.md
* fix: resolve Control UI assets for global installs (#4909) (thanks @YuriNachos)
Co-authored-by: YuriNachos <YuriNachos@users.noreply.github.com>
(cherry picked from commit 34bdbdb4050dfc2bea27085e058e629060a1c8a4)
# Conflicts:
# CHANGELOG.md
# src/infra/control-ui-assets.ts
* fix: prefer requesterOrigin over stale session entry in subagent announce routing (#4957)
* fix: prefer requesterOrigin over stale session entry in subagent announce routing
When a subagent finishes and announces results back, resolveAnnounceOrigin
merged the session entry (primary) with requesterOrigin (fallback). If the
session store had a stale lastChannel (e.g. whatsapp) from a previous
interaction but the user was now on a different channel (e.g. bluebubbles),
the announce would route to the wrong channel.
Swap the merge order so requesterOrigin (captured at spawn time, reflecting
the actual current channel) takes priority, with the session entry as
fallback for any missing fields.
Error before fix:
Delivery failed (whatsapp to bluebubbles:chat_guid:...): Unknown channel: whatsapp
Adds regression test for the stale-channel scenario.
* fix: match test to exact failure scenario and improve reliability (#4957) (thanks @tyler6204)
- Remove lastTo from stale session store to match the exact mismatch scenario described in the PR
- Replace 5ms setTimeout sleeps with expect.poll for better test reliability
- Prevents flakiness on slower CI machines
(cherry picked from commit 57248a7ca120b1083005f37a833ffebcddbd45d8)
* fix: normalize telegram account token lookup (#5055) (thanks @jasonsschin)
(cherry picked from commit e849df64dcce9721844cc1f92fcd427ead210c31)
# Conflicts:
# CHANGELOG.md
# src/telegram/token.ts
* fix: preserve delivery thread fallback (#4911) (thanks @yevhen)
(cherry picked from commit 310eed825e92448552bea310236ff82b93660699)
# Conflicts:
# src/config/sessions/store.ts
# src/utils/delivery-context.test.ts
# src/utils/delivery-context.ts
* fix: suppress banner and doctor checks for completion command
(cherry picked from commit 48aaf6ce4eb3f6233391a6a1ba35a4d0555747fd)
* fix: remove unused variables and fix template literal type
(cherry picked from commit 3c8fa0f9130bca7fa97ab48d36fcad8c3eb8e13d)
# Conflicts:
# src/cli/completion-cli.ts
* fix: repair docker build typing
(cherry picked from commit e9f0be06eb6da3c62f22203f15945d81ce9e286b)
# Conflicts:
# src/agents/pi-embedded-runner/compact.ts
# src/agents/pi-model-discovery.ts
* fix: align embedded session setup with sdk
(cherry picked from commit d2a852b982fbc92941db8999a8482fc8d19ea2f3)
# Conflicts:
# src/agents/pi-embedded-runner/compact.ts
# src/agents/pi-embedded-runner/run/attempt.ts
# src/commands/models.list.test.ts
* fix: restore embedded extension discovery typings
(cherry picked from commit 51e72d41c29e861b24784c8e29b14849a906b181)
* fix: restore tsc build and plugin install tests
(cherry picked from commit a42e1c82d9ac256fe3a6ffd448e1c7d7a6bb406b)
# Conflicts:
# src/agents/bash-tools.exec.ts
# src/agents/model-scan.ts
# src/agents/pi-embedded-runner/run/attempt.ts
# src/agents/skills.ts
# src/agents/subagent-announce.ts
# src/auto-reply/reply/commands-subagents.ts
# src/cli/nodes-cli/register.status.ts
# src/discord/resolve-channels.ts
# src/wizard/onboarding.gateway-config.ts
# tsconfig.json
* fix: lint cleanups
(cherry picked from commit ee26b68fe17505e6872e1a3b43384c6138f25da9)
# Conflicts:
# src/auto-reply/reply/commands-subagents.ts
# src/discord/resolve-channels.ts
* fix: Also build `entry.ts` into `dist/entry.mjs`.
(cherry picked from commit ed65131c1cb813ff396b99884dac9e789ce65a81)
# Conflicts:
# package.json
# src/daemon/program-args.test.ts
# src/infra/control-ui-assets.ts
# src/infra/gateway-lock.ts
# src/infra/ports.test.ts
* fix: Update a few more `entry.js` to `entry.mjs` paths.
(cherry picked from commit 4b7406719cf785975835d8dae1c8c20bb98daea0)
* fix: Fix `scripts/watch-node.mjs` and use `tsdown --watch`.
(cherry picked from commit 68ba1afb34ee97b045e02d7a175102182f4210ed)
# Conflicts:
# package.json
# scripts/watch-node.mjs
* fix: resolve workspace templates from package root
(cherry picked from commit ddc5683c675d77427a06a3fb8b79b186e9723a2e)
# Conflicts:
# src/cli/gateway-cli/dev.ts
* fix: retry gateway watch after dist rebuild
(cherry picked from commit e25fedf9321e924f15313c7a88d050de95f5e3ff)
# Conflicts:
# scripts/watch-node.mjs
* fix: Update `CONTRIBUTING.md` + adjust `watch-node.mjs` again to be faster with `tsc`.
(cherry picked from commit dae00fe18450b6b2eb5dd6981d6b4ea80dce0091)
# Conflicts:
# CONTRIBUTING.md
# scripts/watch-node.mjs
* fix: sync docker-compose gateway command
(cherry picked from commit c3a8a5374f17c43cbf855dd49847ed2084fbe945)
# Conflicts:
# docker-compose.yml
* fix: avoid stderr backpressure in macOS discovery (#3304) (thanks @abhijeet117)
(cherry picked from commit b9b94715fa0b0bc0fff1ecf5e8e4665c1084ad9c)
# Conflicts:
# CHANGELOG.md
# apps/macos/Sources/MoltbotDiscovery/WideAreaGatewayDiscovery.swift
* fix: restore telegram draft streaming partials
(cherry picked from commit 37721ebd7ca95205973023947016cc772aed4a27)
# Conflicts:
# src/telegram/bot-message-dispatch.ts
# src/telegram/bot.ts
* fix: harden telegram streaming state
(cherry picked from commit a64d8d2d66eac8a5fe8b7c8305cd6b0d839d786f)
# Conflicts:
# src/telegram/draft-stream.ts
* fix: stabilize partial streaming filters
(cherry picked from commit b5c2b1880d8ccb50d1c61950bf6c2a6ec333c219)
* fix: restore telegram draft streaming partials (#5543) (thanks @obviyus)
(cherry picked from commit f1de88c198d84a1b15c646fa6fc717cfdfe2e672)
# Conflicts:
# CHANGELOG.md
* fix: Failing tests due to import sorting.
(cherry picked from commit 58f4185925a6b73d99d42cd3e6da86fb71c22d17)
# Conflicts:
# docs/channels/discord.md
# src/discord/monitor/native-command.ts
# src/discord/monitor/sender-identity.ts
* fix: skip extension append if command already has one
Addresses review feedback - now checks path.extname() before
appending .cmd to avoid producing invalid paths like npm.cmd.cmd
(cherry picked from commit dc8a63cb8bb325228779dce4f2813b0612d4e139)
# Conflicts:
# src/process/exec.ts
* fix: resolve Windows npm spawn ENOENT (#5815) (thanks @thejhinvirtuoso)
(cherry picked from commit 3d5c03ec29ebe60e3d6a46151e4034e3ee5edcfe)
# Conflicts:
# CHANGELOG.md
* fix(tui): prevent crash when searching with digits in model selector
highlightMatch() was replacing tokens inside ANSI escape codes,
corrupting sequences like [38;2;123;127;135m when searching for '2'.
Fix: apply highlighting to plain text before theme styling.
(cherry picked from commit c621c80afcfd6bfb42e4645a129da051fd5d7d2b)
* fix: use telegram user id for pairing request
(cherry picked from commit 633f8484815afa2f23f94dcf1be4cba0d0d97aa0)
# Conflicts:
# src/telegram/bot-message-context.ts
* fix: use shared pairing store for telegram (#6127) (thanks @obviyus)
(cherry picked from commit 1f3afa38e8d7d67f2aa9392e81ae88521c577adf)
* fix: secure chrome extension relay cdp
(cherry picked from commit a1e89afcc19efd641c02b24d66d689f181ae2b5c)
# Conflicts:
# src/browser/cdp.helpers.ts
# src/browser/extension-relay.ts
* fix: friendlier Windows onboarding message (#6242)
Co-authored-by: CLAWDINATOR <clawdinator@openclaw.ai>
Co-authored-by: Scott Hanselman <scott@hanselman.com>
(cherry picked from commit b897389b877a9d3a92cbc02c77f8c30d54d35337)
# Conflicts:
# src/commands/onboard.ts
* fix: update compaction safeguard to respect context window tokens
(cherry picked from commit 5d3c898a9496670f876a03cbd8368a9833f84148)
* fix: cap context window resolution (#6187) (thanks @iamEvanYT)
(cherry picked from commit 0992c5a8094316f26138ccb0c39b7cee7b0fceb8)
# Conflicts:
# docs/concepts/session-pruning.md
# src/agents/context-window-guard.ts
* fix: satisfy lint curly rule (#6310)
* fix: satisfy lint curly rule
* docs: apply oxfmt formatting
(cherry picked from commit e9f70e858563695c2f9013fb38dba10fb01d239b)
# Conflicts:
# docs/.i18n/README.md
# docs/concepts/session-pruning.md
# docs/zh-CN/index.md
# docs/zh-CN/start/getting-started.md
# docs/zh-CN/start/wizard.md
* fix: cover OpenRouter attribution headers
(cherry picked from commit 083ec9325e4195633bff306a6f8c42998a1b6123)
# Conflicts:
# src/agents/pi-embedded-runner/extra-params.ts
* fix: align embedded agent session setup
(cherry picked from commit bcde2fca5a100e9e540c7485ce56b50e44d17029)
# Conflicts:
# src/agents/auth-profiles/oauth.ts
# src/agents/pi-embedded-runner/compact.ts
# src/agents/pi-embedded-runner/run/attempt.ts
* fix: wire before_tool_call hook into tool execution (#6570) (thanks @ryancnelson) (#6660)
(cherry picked from commit 8eb11bd3044a21eb6ce76e8a451ae94ec4ab0549)
# Conflicts:
# CHANGELOG.md
# README.md
# src/agents/pi-embedded-subscribe.handlers.tools.ts
* fix: align embedded runner with session API changes
(cherry picked from commit 3367b2aa272f7626b3b2157c5f2ca8792a4f4d1a)
# Conflicts:
# src/agents/pi-embedded-runner/compact.ts
# src/agents/pi-embedded-runner/run/attempt.ts
* fix: harden host exec env validation (#4896) (thanks @HassanFleyah)
(cherry picked from commit a87a07ec8ada6e17d434306247b6258cb76eba68)
# Conflicts:
# CHANGELOG.md
# src/agents/bash-tools.exec.ts
* fix: clean up plugin linting and types
(cherry picked from commit 19775abdda11c4066c308752894fad156b9aeef4)
# Conflicts:
# .oxlintrc.json
# extensions/googlechat/src/accounts.ts
# extensions/line/src/channel.ts
* fix: align embedded runner with pi-coding-agent API
(cherry picked from commit e58291e070108aaffc36412d1ed71d01d64ed9c3)
# Conflicts:
# src/agents/pi-embedded-runner/compact.ts
# src/agents/pi-embedded-runner/run/attempt.ts
* fix: refine oauth provider guard
(cherry picked from commit 7aeabbabd46d544a23704732fc526e7355633856)
* fix: align pi-coding-agent typings and docs
(cherry picked from commit aa2eb48b9c0fe63aa7b8be6329869d3a2539c446)
# Conflicts:
# docs/pi.md
* fix: format issues and lint error in oauth.ts
(cherry picked from commit 4347d2468c37be54fe51ba4e4df0de502d4c87c3)
# Conflicts:
# CHANGELOG.md
# docs/nodes/index.md
# docs/providers/moonshot.md
* fix: convert HTML comments to MDX comments in docs
(cherry picked from commit 7ee99af9f892e7a6be9888e88d9b055fc8100d8c)
# Conflicts:
# docs/concepts/model-providers.md
* fix: format docs
(cherry picked from commit dda8a2b23848695b834fb77f95c34a022740917a)
# Conflicts:
# docs/concepts/model-providers.md
* fix: L2-normalize local embedding vectors to fix semantic search (#5332)
* fix: L2-normalize local embedding vectors to fix semantic search
* fix: handle non‑finite magnitude in L2 normalization and remove stale test reset
* refactor: add braces to l2Normalize guard clause in embeddings
* fix: sanitize local embeddings (#5332) (thanks @akramcodez)
---------
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
(cherry picked from commit 5020bfa2a9bdad33e79d5ae04e0b6a74a457485a)
# Conflicts:
# src/memory/embeddings.ts
* fix: unify telegram thread handling
(cherry picked from commit 19b8416a8108bc997cec1c1bc020a12389ae4739)
# Conflicts:
# src/telegram/bot-native-commands.ts
# src/telegram/bot/delivery.ts
* fix: require thread specs for telegram sends
(cherry picked from commit 1d7dd5f261492b4cfd0219871abbfcb8a975b6ac)
* fix: inline telegram thread scope type
(cherry picked from commit 0bc8a592a6ad47de0674396b3e1c2dc30159fedb)
* fix: add changelog for telegram thread spec (#6833) (thanks @obviyus)
(cherry picked from commit e25f8ed56c3dad7a79a5277ae8e633ce1bd732da)
# Conflicts:
# CHANGELOG.md
* fix: add telegram download timeouts (#6914) (thanks @hclsys)
(cherry picked from commit 01449a2f4158fed111807978424e20b7d5cf8b54)
* fix: treat '*' tool allowlist as valid
(cherry picked from commit 521b12181571c5cc2575389cc24a4c1eef8d2b67)
# Conflicts:
# CHANGELOG.md
* fix: flush block streaming on paragraph boundaries for chunkMode=newline (#7014)
* feat: Implement paragraph boundary flushing in block streaming
- Added `flushOnParagraph` option to `BlockReplyChunking` for immediate flushing on paragraph breaks.
- Updated `EmbeddedBlockChunker` to handle paragraph boundaries during chunking.
- Enhanced `createBlockReplyCoalescer` to support flushing on enqueue.
- Added tests to verify behavior of flushing with and without `flushOnEnqueue` set.
- Updated relevant types and interfaces to include `flushOnParagraph` and `flushOnEnqueue` options.
* fix: Improve streaming behavior and enhance block chunking logic
- Resolved issue with stuck typing indicator after streamed BlueBubbles replies.
- Refactored `EmbeddedBlockChunker` to streamline fence-split handling and ensure maxChars fallback for newline chunking.
- Added tests to validate new chunking behavior, including handling of paragraph breaks and fence scenarios.
- Updated changelog to reflect these changes.
* test: Add test for clamping long paragraphs in EmbeddedBlockChunker
- Introduced a new test case to verify that long paragraphs are correctly clamped to maxChars when flushOnParagraph is enabled.
- Updated logic in EmbeddedBlockChunker to handle cases where the next paragraph break exceeds maxChars, ensuring proper chunking behavior.
* refactor: streamline logging and improve error handling in message processing
- Removed verbose logging statements from the `processMessage` function to reduce clutter.
- Enhanced error handling by using `runtime.error` for typing restart failures.
- Updated the `applySystemPromptOverrideToSession` function to accept a string directly instead of a function, simplifying the prompt application process.
- Adjusted the `runEmbeddedAttempt` function to directly use the system prompt override without invoking it as a function.
(cherry picked from commit 9ef24fd400ba60bdca7cc9ab0e2d64a839c54f21)
# Conflicts:
# CHANGELOG.md
# docs/channels/bluebubbles.md
# extensions/bluebubbles/src/monitor.ts
# src/agents/pi-embedded-block-chunker.ts
# src/auto-reply/reply/block-reply-coalescer.ts
* fix: restore lint/build gates
(cherry picked from commit 34dd7324d90cbf26370181cfcb5382422f082763)
# Conflicts:
# .oxlintrc.json
# package.json
# src/agents/auth-profiles/oauth.ts
# src/agents/pi-embedded-runner/system-prompt.ts
* fix: harden plugin and hook install paths
(cherry picked from commit d03eca8450dc493b198a88b105fd180895238e57)
# Conflicts:
# src/agents/pi-embedded-runner/compact.ts
# src/hooks/install.ts
# src/plugins/install.test.ts
# src/plugins/install.ts
* fix: gate Teams media auth retries
(cherry picked from commit 41cc5bcd4f1d434ad1bbdfa55b56f25025ecbf6b)
# Conflicts:
# docs/channels/msteams.md
# extensions/msteams/src/attachments/download.ts
* fix: resolve system prompt overrides
(cherry picked from commit b8174decf334b1990c9a308b6e4d118a53933fc9)
# Conflicts:
# src/agents/pi-embedded-runner/system-prompt.ts
* fix: align tool execute signature
(cherry picked from commit 284d24209bf6d587c4943bb56ea9d21c3319a22d)
# Conflicts:
# src/agents/pi-tool-definition-adapter.ts
* fix: align tool execute parameter order
(cherry picked from commit 2d317ce423720af020403c2da86faef43e42ba8b)
# Conflicts:
# src/agents/pi-tool-definition-adapter.ts
* fix: align tool definition adapter
(cherry picked from commit 9ae1b732ef69ba880fa681fa41d9d788691b34c8)
# Conflicts:
# docs/install/docker.md
# src/agents/pi-embedded-runner.createsystempromptoverride.test.ts
# src/agents/pi-tool-definition-adapter.ts
* fix: normalize tool execute args
(cherry picked from commit bcb0ed0866c87c4ef1097569ec39890be010716c)
# Conflicts:
# src/agents/pi-tool-definition-adapter.ts
* fix: handle legacy tool execute signatures
(cherry picked from commit 845d97b6a50eecc1e614ee529b6246131c91f6d2)
* fix: satisfy tool adapter lint
(cherry picked from commit bf08b485bde8e66e9bb0a48592326c5f3767d4ef)
* fix: guard remote media fetches with SSRF checks
(cherry picked from commit 81c68f582d4a9a20d9cca9f367d2da9edc5a65ae)
# Conflicts:
# CHANGELOG.md
# src/agents/tools/web-fetch.ts
# src/media/fetch.test.ts
# src/media/fetch.ts
# src/media/input-files.ts
# src/slack/monitor/media.ts
# src/web/media.test.ts
# src/web/media.ts
* fix: start gateway in docker CMD (#6635) (thanks @kaizen403)
(cherry picked from commit 66307695eba71b7da1a03cfa10e770bd4b1c9004)
* fix: polish docker setup flow
(cherry picked from commit dfef943f0a18e05e9c81b82f1e800024f444d276)
# Conflicts:
# docker-setup.sh
* fix: expand SSRF guard coverage
(cherry picked from commit 9bd64c8a1f91dda602afc1d5246a2ff2be164647)
# Conflicts:
# CHANGELOG.md
# src/media-understanding/providers/deepgram/audio.test.ts
# src/media-understanding/providers/openai/audio.test.ts
# src/slack/monitor/media.ts
# src/telegram/bot.media.downloads-media-file-path-no-file-download.test.ts
* fix: stabilize docker e2e flows
(cherry picked from commit f9fae2c439bbbe6fcd4305cd2cb2958df5a45473)
# Conflicts:
# scripts/e2e/doctor-install-switch-docker.sh
# scripts/e2e/onboard-docker.sh
# scripts/e2e/plugins-docker.sh
* fix: address review feedback — retryDelay uses effectiveForce, default overrides param, @state() on chatNewMessagesBelow
(cherry picked from commit 822388fe9236abe6e66a4b1b40967fb8d754ce82)
# Conflicts:
# ui/src/ui/app-scroll.test.ts
# ui/src/ui/app-scroll.ts
# ui/src/ui/app.ts
* fix: resolve check errors in nodes-tool and commands-ptt
(cherry picked from commit d3bb32273e1b77e13d05a8d10e97194be94e9806)
# Conflicts:
# src/agents/tools/nodes-tool.ts
# src/auto-reply/reply/commands-ptt.ts
* fix: validate AbortSignal instances before calling AbortSignal.any()
Fixes #7269
(cherry picked from commit a63ec41a7bf53efeea97ab46e2216deb85051c55)
# Conflicts:
# src/agents/pi-tools.abort.ts
* fix: validate AbortSignal instances before calling AbortSignal.any() (#7277) (thanks @Elarwei001)
(cherry picked from commit 5fb8f779ca1e4a5432fc8fd9c0fd243107b95de9)
# Conflicts:
# CHANGELOG.md
# src/agents/pi-tools.abort.ts
* 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>
(cherry picked from commit f49297e2c116281b9ffc292297e83a1d4781ea33)
# Conflicts:
# CHANGELOG.md
# src/media-understanding/apply.test.ts
# src/media-understanding/apply.ts
* fix: repair malformed tool calls and session transcripts (#7473) (thanks @justinhuangcode)
(cherry picked from commit cfd6b21d0eb6d98c8d122bc897b226ece0751ce2)
# Conflicts:
# CHANGELOG.md
* fix: harden exec allowlist parsing
(cherry picked from commit d1ecb46076145deb188abcba8f0699709ea17198)
# Conflicts:
# src/infra/exec-approvals.ts
* fix: error handling in restore failure reporting
(cherry picked from commit e9f182def70a6a692e258c4529780ad9b2d4c2a0)
# Conflicts:
# src/terminal/restore.ts
* Fix build regressions after merge
(cherry picked from commit 23cfcd60df5418bf16c374cf8132854d3f9b8c45)
# Conflicts:
# src/config/zod-schema.ts
# src/memory/manager.ts
# src/memory/types.ts
* fix: make QMD cache key deterministic
(cherry picked from commit d0b98c75e574852e53894eabd98f5b91ca631c3f)
# Conflicts:
# src/memory/search-manager.ts
* fix: derive citations chat type via session parser
(cherry picked from commit edd6289f26f19b4c03f0626b6295e934eca3ba95)
# Conflicts:
# src/agents/tools/memory-tool.citations.test.ts
# src/agents/tools/memory-tool.ts
* fix: restore session_status and CLI examples
(cherry picked from commit 7d5ca1176d0ef8a7bc4fd50b0b39006b82dcf75f)
* fix: restore safety + session_status hints
(cherry picked from commit afbb1af6c5d875a17b4b63883d3bb7aa42f8e415)
# Conflicts:
# src/agents/system-prompt.ts
* fix: changelog entry for QMD memory (#3160) (thanks @vignesh07)
(cherry picked from commit 1ee57cf7277ec70043dfca8a0747909ab7207950)
# Conflicts:
# CHANGELOG.md
* fix: Remove `tsconfig.oxlint.json` AGAIN.
(cherry picked from commit 425003417dff3a2b57af05bc352f22d9e98b1b15)
# Conflicts:
# .oxlintrc.json
# package.json
# src/media-understanding/providers/google/video.test.ts
# src/telegram/bot.media.downloads-media-file-path-no-file-download.test.ts
# src/web/auto-reply.web-auto-reply.compresses-common-formats-jpeg-cap.test.ts
# src/web/auto-reply.web-auto-reply.falls-back-text-media-send-fails.test.ts
# tsdown.config.ts
* fix: Fix Mac app build step.
(cherry picked from commit be4f7ef361a88cf3a46faf5338d99f1543d32902)
# Conflicts:
# scripts/package-mac-app.sh
* fix: harden Windows exec allowlist
(cherry picked from commit a7f4a53ce80c98ba1452eb90802d447fca9bf3d6)
* fix: restore OpenClaw docs/source links in system prompt
(cherry picked from commit 9d2066bd53f675d525187732c162ec702b433e3d)
# Conflicts:
# src/agents/system-prompt.ts
* fix: harden control ui framing + ws origin
(cherry picked from commit 66d8117d4483df542d450b9f4bb6dd2a2b769046)
# Conflicts:
# src/config/schema.ts
# src/config/types.gateway.ts
# src/config/zod-schema.ts
# src/gateway/control-ui.test.ts
# src/gateway/control-ui.ts
# src/gateway/server/ws-connection/message-handler.ts
* fix: use build-info for version fallback
(cherry picked from commit a9bb96ade321073914f12f640d82e09ffd4cba14)
# Conflicts:
# src/version.ts
* fix: improve build-info resolution for commit/version
(cherry picked from commit e895e85f5488f85e007940b46829d779b04b29f7)
# Conflicts:
# CHANGELOG.md
# package.json
* fix: enforce Nextcloud Talk allowlist by user id
(cherry picked from commit 6b4b6049b47c3329a7014509594647826669892d)
* fix: add legacy daemon-cli shim for updates
(cherry picked from commit 9c5941ba466b86e3056b6743cd6d4fc554b13e8d)
# Conflicts:
# package.json
* fix: honor telegram model overrides in buttons (#8193) (thanks @gildo)
(cherry picked from commit 41a4f1200bb10672ebbf578d29a430342cd7a153)
# Conflicts:
# CHANGELOG.md
# src/telegram/bot-handlers.ts
* fix: keep Moonshot CN base URL in onboarding (#7180) (thanks @waynelwz)
(cherry picked from commit 4a5d36892691ae70b63bbf9dae6fb6b48a4b2553)
# Conflicts:
# CHANGELOG.md
# src/commands/auth-choice.apply.api-providers.ts
# src/commands/onboard-auth.config-core.ts
* fix: harden voice-call webhook verification
(cherry picked from commit a749db9820eb6d6224032a5a34223d286d2dcc2f)
# Conflicts:
# CHANGELOG.md
# extensions/voice-call/src/config.ts
# extensions/voice-call/src/providers/plivo.ts
# extensions/voice-call/src/providers/twilio.ts
# extensions/voice-call/src/runtime.ts
# extensions/voice-call/src/webhook-security.ts
* fix: cron announce delivery path (#8540) (thanks @tyler6204)
(cherry picked from commit 6341819d74c1d9f4664ac40c33fec79b70dd56b9)
# Conflicts:
# docs/automation/cron-jobs.md
# src/cron/isolated-agent.delivers-response-has-heartbeat-ok-but-includes.test.ts
# src/cron/isolated-agent.skips-delivery-without-whatsapp-recipient-besteffortdeliver-true.test.ts
# src/cron/isolated-agent/run.ts
# src/cron/service/timer.ts
# ui/src/ui/format.test.ts
* fix: trim legacy signature fallback, type fromChatType as union
(cherry picked from commit b2361292e7a7c12fc2b874b05013ef3183b5597a)
# Conflicts:
# src/telegram/bot/helpers.test.ts
# src/telegram/bot/helpers.ts
* fix: telegram forward metadata + cron delivery guard (#8392) (thanks @Glucksberg)
(cherry picked from commit 78fd1947228634111a4e2a36f2a7e3c13b321998)
# Conflicts:
# CHANGELOG.md
# src/cron/isolated-agent/run.ts
# src/telegram/bot/helpers.ts
* 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
(cherry picked from commit f633a8cb22302fe62ce3b9d541ac991cd2e7bc22)
# Conflicts:
# src/imessage/client.ts
# src/imessage/monitor/monitor-provider.ts
# src/imessage/probe.ts
* fix: align proxy fetch typing
(cherry picked from commit 19ecdce2751d51b177c47341fc3bbe09759e6ec9)
# Conflicts:
# src/telegram/proxy.ts
* fix: force reload cron store
(cherry picked from commit 6f200ea77f2da9d3ec5b520090a578a4c2ce732f)
# Conflicts:
# src/cron/service/store.ts
* fix: cover anonymous voice allowlist callers (#8104) (thanks @victormier) (#9188)
(cherry picked from commit 0cd47d830f8681339ef76a745397866f4fa1c0f4)
# Conflicts:
# CHANGELOG.md
# extensions/voice-call/src/manager.test.ts
* fix: enforce owner allowlist for commands
(cherry picked from commit 385a7eba3376a4ca65093ce42c6d009c49089c40)
# Conflicts:
# src/auto-reply/command-auth.ts
# src/auto-reply/command-control.test.ts
* 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>
(cherry picked from commit 22927b0834926a4188fb248fa2309aa04b1800ff)
# Conflicts:
# CHANGELOG.md
# src/commands/onboard-non-interactive.cloudflare-ai-gateway.test.ts
# src/commands/onboard-non-interactive/local.ts
* fix: gracefully downgrade xhigh thinking level in cron isolated agent (#9363)
When thinkingDefault is set to "xhigh" but the configured model does not
support it (e.g. Claude), the cron isolated-agent path throws a hard error
causing the job to fail. The interactive chat path already handles this by
silently downgrading to "high".
Apply the same graceful downgrade in the cron path: log a warning and
fall back to "high" instead of crashing.
Co-authored-by: hyf0-agent <hyf0-agent@users.noreply.github.com>
(cherry picked from commit 85246664548b4481f2da2b706dd58157484abe86)
* fix: restore discord owner hint from allowlists
(cherry picked from commit d84eb46467d74e12e7fad63ee2a257ad1473fcd8)
# Conflicts:
# CHANGELOG.md
# src/auto-reply/command-auth.ts
# src/auto-reply/command-control.test.ts
# src/auto-reply/templating.ts
# src/discord/monitor/message-handler.process.ts
* fix: remove unused cron import
(cherry picked from commit 3b40227bc677fb50a7931d5cce00a370a5d405b6)
# Conflicts:
# src/cron/isolated-agent/run.ts
* fix: resolve bundled chrome extension assets (#8914) (thanks @kelvinCB)
(cherry picked from commit 1ee1522daad498a322febaa93e6bc66e84ae0fb0)
# Conflicts:
# CHANGELOG.md
# src/cli/browser-cli-extension.test.ts
# src/cli/browser-cli-extension.ts
* fix: stabilize windows acl tests and command auth registry (#9335) (thanks @M00N7682)
(cherry picked from commit d6cde28c8e33f4908f91a4160fbeb331862a5901)
# Conflicts:
# src/security/windows-acl.test.ts
* fix: resolve discord owner allowFrom matches
(cherry picked from commit a4d1af1b1118c08aef0792b88b33f4a24878d8c5)
* fix: preserve telegram DM topic threadId (#9039) (thanks @lailoo)
(cherry picked from commit f2c5c847bd265701fa7ec3966ff5dc96bdddc5b8)
# Conflicts:
# CHANGELOG.md
* fix: update changelog for help sorting (#8068) (thanks @deepsoumya617)
(cherry picked from commit cf95b2f3f41bd1b5fb8024e3bf073df06993f15e)
# Conflicts:
# CHANGELOG.md
* fix: auto-inject Telegram forum topic threadId in message tool
When using Telegram DM topics (forum topics), messages sent via the
message tool (media, buttons, etc.) land in General Topic instead of
the user's current topic. This happens because Slack has
resolveSlackAutoThreadId for auto-threading but Telegram had no
equivalent.
Add resolveTelegramAutoThreadId that mirrors the Slack pattern:
- When channel is telegram and no explicit threadId is provided
- Check if toolContext.currentThreadTs (the topic ID) is set
- Verify the target matches the originating chat
- Inject the threadId into params so the Telegram plugin action
handler picks it up for sendMessage/sendMedia
The subagent announce path already correctly passes threadId via
requesterOrigin (set from agentThreadId in sessions-spawn-tool),
so no changes needed there.
(cherry picked from commit eef247b7a4bcbac0ef43d70f6ecbab5a97dc8a9b)
# Conflicts:
# src/infra/outbound/message-action-runner.ts
* fix: pass threadId/to/accountId from parent to subagent gateway call
When spawning a subagent, the requesterOrigin's threadId, to, and
accountId were not forwarded to the callGateway({method:'agent'}) params.
This meant the subagent's runContext had no currentThreadTs or
currentChannelId, so resolveTelegramAutoThreadId could not auto-inject
the forum topic thread ID when the subagent used the message tool.
Changes:
- sessions-spawn-tool: pass to, accountId, threadId from requesterOrigin
- run-context: populate currentChannelId from opts.to as fallback
Fixes subagent messages landing in General Topic instead of the correct
Telegram DM topic thread.
(cherry picked from commit a13efbe2b5818a2ebf632afa591f94fb8c108a78)
* fix: telegram topic auto-threading — use parseTelegramTarget, add tests (#7235) (thanks @Lukavyi)
(cherry picked from commit 01db1dde1ad77392c96ff0e3d9be72d5146a9e91)
# Conflicts:
# CHANGELOG.md
# src/agents/sessions-spawn-threadid.test.ts
# src/infra/outbound/message-action-runner.threading.test.ts
# src/infra/outbound/message-action-runner.ts
* fix: remove orphaned tool_results during compaction pruning
When pruneHistoryForContextShare drops chunks of messages, it could drop
an assistant message with tool_use blocks while leaving corresponding
tool_result messages in the kept portion. These orphaned tool_results
cause Anthropic's API to reject the session with 'unexpected tool_use_id'.
Fix by calling repairToolUseResultPairing after each chunk drop to clean
up any orphaned tool_results. This reuses existing battle-tested code
from session-transcript-repair.ts.
Fixes #9769, #9724, #9672
(cherry picked from commit f32eeae3bc00ab3e8b6b0e33fe61336449d3b196)
# Conflicts:
# CHANGELOG.md
* fix cron scheduling and reminder delivery regressions (#9733)
* fix(cron): prevent timer from allowing process exit (fixes #9694)
The cron timer was using .unref(), which caused the Node.js event
loop to exit or sleep if no other handles were active. This prevented
cron jobs from firing in some environments.
* fix(cron): infer delivery target for isolated jobs (fixes #9683)
When creating isolated agentTurn jobs (e.g. reminders) without explicit
delivery options, the job would default to 'announce' but fail to
resolve the target conversation. Now, we infer the channel and
recipient from the agent's current session key.
* fix(cron): enhance delivery inference for threaded sessions and null inputs (#9733)
Improves the delivery inference logic in the cron tool to correctly handle threaded session keys and cases where delivery is explicitly set to null. This ensures that the appropriate delivery mode and target are inferred based on the agent's session key, enhancing the reliability of job execution.
* fix: preserve telegram topic delivery inference (#9733) (thanks @tyler6204)
* fix: simplify cron delivery merge spread (#9733) (thanks @tyler6204)
(cherry picked from commit 821520a05718b58bb47c88ba329e3bc01d755514)
# Conflicts:
# src/agents/tools/cron-tool.ts
* fix: clear stale token metrics on /new and /reset (#8929)
When starting a new session via /new or /reset, the token usage fields
(totalTokens, inputTokens, outputTokens, contextTokens) survived from the
previous session via the spread pattern in session init. This caused /status
to display misleading context usage from the old session.
Clear all four token metrics explicitly in the isNewSession block, alongside
the existing compactionCount reset. Also add diagnostic logging for session
forking via ParentSessionKey to help trace context inheritance.
(cherry picked from commit 93b450349f77fa2521c7948a724a6ffdaeaeb09f)
* fix: allow multiple compaction retries on context overflow (#8928)
Previously, overflowCompactionAttempted was a boolean flag set once, preventing
recovery when a single compaction wasn't enough. Change to a counter allowing up
to 3 attempts before giving up. Also add diagnostic logging on overflow events to
help debug early-overflow issues.
Fixes sessions that hit context overflow during long agentic turns with many tool
calls, where one compaction round isn't sufficient to bring context below limits.
(cherry picked from commit 4e1a7cd60cc78ce0b3b1790a2e5b96a7a8deddc4)
* Fix: Enable scrolling on the dashboard config page (#1822)
* Fix: Enable scrolling in dashboard
* Fix: Enable scrolling in dashboard
* Fix: Enable scrolling in dashboard
(cherry picked from commit cefd87f3557ce7bee0550050f39349ebe5c8bd10)
* fix: normalize xhigh aliases and docs sync (#9976)
(cherry picked from commit de7b2ba7d523e37521d4acc7cc682dbc5ecebd74)
# Conflicts:
# docs/tools/thinking.md
* fix: release session locks on process termination (#1962)
Adds cleanup handlers to release held file locks when the process
terminates via SIGTERM, SIGINT, or normal exit. This prevents orphaned
lock files that would block future sessions.
Fixes #1951
(cherry picked from commit ec0728b3574f115c83fd458967ea9493f388c647)
* fix: untrack dist/control-ui build artifacts (#1856)
The dist/control-ui/ files were committed before the dist/ gitignore
rule was effective. These build artifacts get regenerated during
builds, causing dirty repo errors that block the auto-update mechanism.
Removes the files from git tracking while keeping them locally and
respecting the existing dist/ gitignore entry.
Fixes #1838
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 3ad7958365485db2179fb98658b939206f930ff9)
* fix: wire onToolResult callback for verbose tool summaries (#2022)
HOTFIX: Tool summaries were not being sent to chat channels when verbose mode
was enabled. The onToolResult callback was defined in the types but never
wired up in dispatch-from-config.ts.
This adds the missing callback alongside onBlockReply, using the same
dispatcher.sendBlockReply() path to deliver tool summaries to WhatsApp,
Telegram, and other chat channels.
Fixes verbose tool summaries not appearing in WhatsApp despite /verbose on.
(cherry picked from commit 05b28c147d5d27be3b751d4d7d1d735b21a4296c)
* fix: Gateway canvas host bypasses auth and serves files unauthenticated
(cherry picked from commit 47538bca4d8ac702c7545b218e183fced155dfff)
# Conflicts:
# src/gateway/server-http.ts
* fix: `onToolResult` fallback is not expected.
(cherry picked from commit 8abce8a84dc93ddd474fb7067bcb13a8794805ea)
* fix: Do not `process.exit(0)` in the middle of a test.
(cherry picked from commit f16e32b73d321a0571a16f94ab226487e4f3f060)
* fix: silence unused hook token url param (#9436)
* fix: Gateway authentication token exposed in URL query parameters
* fix: silence unused hook token url param
* fix: remove gateway auth tokens from URLs (#9436) (thanks @coygeek)
* test: fix Windows path separators in audit test (#9436)
---------
Co-authored-by: George Pickett <gpickett00@gmail.com>
(cherry picked from commit 717129f7f9b21dd919a990f06c26008c63863f3d)
# Conflicts:
# docs/gateway/configuration.md
# docs/help/faq.md
# docs/platforms/exe-dev.md
# docs/start/clawd.md
# docs/web/dashboard.md
# src/commands/dashboard.ts
# src/gateway/hooks.ts
# src/gateway/server-http.ts
# src/wizard/onboarding.finalize.ts
# ui/src/ui/app-settings.ts
# ui/src/ui/views/overview.ts
* fix: add fallback for Control UI asset resolution in global installs
(cherry picked from commit 72245855e5fea3dbf1026ea282dcc91e621ace4b)
# Conflicts:
# CHANGELOG.md
# src/infra/control-ui-assets.ts
* fix: remove dead restore control-ui step from update runner
(cherry picked from commit b40da2cb7aa4643c5f3cc36a66b01db9aac6e666)
* fix: CLI harden update restart imports and fix nested bundle version resolution
(cherry picked from commit 4a59b7786be7a98492358b3cc837c1f7cbe40e72)
# Conflicts:
# src/cli/update-cli.ts
# src/version.ts
* fix: guard resolveUserPath against undefined input (#10176)
* fix: guard resolveUserPath against undefined input
When subagent spawner omits workspaceDir, resolveUserPath receives
undefined and crashes on .trim(). Add a falsy guard that falls back
to process.cwd(), matching the behavior callers already expect.
Closes #10089
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: harden runner workspace fallback (#10176) (thanks @Yida-Dev)
* fix: harden workspace fallback scoping (#10176) (thanks @Yida-Dev)
* refactor: centralize workspace fallback classification and redaction (#10176) (thanks @Yida-Dev)
* test: remove explicit any from utils mock (#10176) (thanks @Yida-Dev)
* security: reject malformed agent session keys for workspace resolution (#10176) (thanks @Yida-Dev)
---------
Co-authored-by: Yida-Dev <reyifeijun@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
(cherry picked from commit 421644940517ae1857281bddf8603aeef9cebf1c)
# Conflicts:
# CHANGELOG.md
# src/agents/cli-runner.test.ts
# src/agents/cli-runner.ts
# src/agents/pi-embedded-runner/run.ts
# src/agents/pi-embedded-runner/run/attempt.ts
# src/auto-reply/reply/agent-runner-execution.ts
# src/commands/status-all/channels.ts
# src/utils.test.ts
* fix(hooks): replace debug console.log with proper subsystem logging in session-memory (#10730)
* fix: replace debug console.log with proper subsystem logging in session-memory
* fix(hooks): normalize session-memory subsystem logging
---------
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
(cherry picked from commit 2c8af78d20d4d1f9d2a1151fc1ff15bfec847a3d)
* fix: cron scheduler reliability, store hardening, and UX improvements (#10776)
* refactor: update cron job wake mode and run mode handling
- Changed default wake mode from 'next-heartbeat' to 'now' in CronJobEditor and related CLI commands.
- Updated cron-tool tests to reflect changes in run mode, introducing 'due' and 'force' options.
- Enhanced cron-tool logic to handle new run modes and ensure compatibility with existing job structures.
- Added new tests for delivery plan consistency and job execution behavior under various conditions.
- Improved normalization functions to handle wake mode and session target casing.
This refactor aims to streamline cron job configurations and enhance the overall user experience with clearer defaults and improved functionality.
* test: enhance cron job functionality and UI
- Added tests to ensure the isolated agent correctly announces the final payload text when delivering messages via Telegram.
- Implemented a new function to pick the last deliverable payload from a list of delivery payloads.
- Enhanced the cron service to maintain legacy "every" jobs while minute cron jobs recompute schedules.
- Updated the cron store migration tests to verify the addition of anchorMs to legacy every schedules.
- Improved the UI for displaying cron job details, including job state and delivery information, with new styles and layout adjustments.
These changes aim to improve the reliability and user experience of the cron job system.
* test: enhance sessions thinking level handling
- Added tests to verify that the correct thinking levels are applied during session spawning.
- Updated the sessions-spawn-tool to include a new parameter for overriding thinking levels.
- Enhanced the UI to support additional thinking levels, including "xhigh" and "full", and improved the handling of current options in dropdowns.
These changes aim to improve the flexibility and accuracy of thinking level configurations in session management.
* feat: enhance session management and cron job functionality
- Introduced passthrough arguments in the test-parallel script to allow for flexible command-line options.
- Updated session handling to hide cron run alias session keys from the sessions list, improving clarity.
- Enhanced the cron service to accurately record job start times and durations, ensuring better tracking of job execution.
- Added tests to verify the correct behavior of the cron service under various conditions, including zero-delay timers.
These changes aim to improve the usability and reliability of session and cron job management.
* feat: implement job running state checks in cron service
- Added functionality to prevent manual job runs if a job is already in progress, enhancing job management.
- Updated the `isJobDue` function to include checks for running jobs, ensuring accurate scheduling.
- Enhanced the `run` function to return a specific reason when a job is already running.
- Introduced a new test case to verify the behavior of forced manual runs during active job execution.
These changes aim to improve the reliability and clarity of cron job execution and management.
* feat: add session ID and key to CronRunLogEntry model
- Introduced `sessionid` and `sessionkey` properties to the `CronRunLogEntry` struct for enhanced tracking of session-related information.
- Updated the initializer and Codable conformance to accommodate the new properties, ensuring proper serialization and deserialization.
These changes aim to improve the granularity of logging and session management within the cron job system.
* fix: improve session display name resolution
- Updated the `resolveSessionDisplayName` function to ensure that both label and displayName are trimmed and default to an empty string if not present.
- Enhanced the logic to prevent returning the key if it matches the label or displayName, improving clarity in session naming.
These changes aim to enhance the accuracy and usability of session display names in the UI.
* perf: skip cron store persist when idle timer tick produces no changes
recomputeNextRuns now returns a boolean indicating whether any job
state was mutated. The idle path in onTimer only persists when the
return value is true, eliminating unnecessary file writes every 60s
for far-future or idle schedules.
* fix: prep for merge - explicit delivery mode migration, docs + changelog (#10776) (thanks @tyler6204)
(cherry picked from commit d90cac990c8f9864d2bcb0f3605a057fad2003cf)
# Conflicts:
# CHANGELOG.md
# docs/automation/cron-jobs.md
# scripts/test-parallel.mjs
# src/agents/openclaw-tools.subagents.sessions-spawn-applies-thinking-default.test.ts
# src/cli/cron-cli/register.cron-add.ts
# src/cron/delivery.ts
# src/cron/isolated-agent.skips-delivery-without-whatsapp-recipient-besteffortdeliver-true.test.ts
# src/cron/isolated-agent/run.ts
# src/cron/normalize.ts
# src/cron/run-log.ts
# src/cron/service.every-jobs-fire.test.ts
# src/cron/service.skips-main-jobs-empty-systemevent-text.test.ts
# src/cron/service.store.migration.test.ts
# src/cron/service/jobs.ts
# src/cron/service/store.ts
# src/cron/service/timer.ts
# src/cron/store.ts
# src/gateway/protocol/schema/cron.ts
# src/gateway/session-utils.ts
# ui/src/ui/app-defaults.ts
# ui/src/ui/app-render.helpers.ts
# ui/src/ui/app-render.ts
# ui/src/ui/format.test.ts
# ui/src/ui/format.ts
# ui/src/ui/views/cron.ts
# ui/src/ui/views/sessions.ts
* fix: comprehensive BlueBubbles and channel cleanup (#11093)
* feat(bluebubbles): auto-strip markdown from outbound messages (#7402)
* fix(security): add timeout to webhook body reading (#6762)
Adds 30-second timeout to readBody() in voice-call, bluebubbles, and nostr
webhook handlers. Prevents Slow-Loris DoS (CWE-400, CVSS 7.5).
Merged with existing maxBytes protection in voice-call.
* fix(security): unify Error objects and lint fixes in webhook timeouts (#6762)
* fix: prevent plugins from auto-enabling without user consent (#3961)
Changes default plugin enabled state from true to false in enablePluginEntry().
Preserves existing enabled:true values. Fixes #3932.
* fix: apply hierarchical mediaMaxMb config to all channels (#8749)
Generalizes resolveAttachmentMaxBytes() to use account → channel → global
config resolution for all channels, not just BlueBubbles. Fixes #7847.
* fix(bluebubbles): sanitize attachment filenames against header injection (#10333)
Strip ", \r, \n, and \\ from filenames after path.basename() to prevent
multipart Content-Disposition header injection (CWE-93, CVSS 5.4).
Also adds sanitization to setGroupIconBlueBubbles which had zero filename
sanitization.
* fix(lint): exclude extensions/ from Oxlint preflight check (#9313)
Extensions use PluginRuntime|null patterns that trigger
no-redundant-type-constituents because PluginRuntime resolves to any.
Excluding extensions/ from Oxlint unblocks user upgrades.
Re-applies the approach from closed PR #10087.
* fix(bluebubbles): add tempGuid to createNewChatWithMessage payload (#7745)
Non-Private-API mode (AppleScript) requires tempGuid in send payloads.
The main sendMessageBlueBubbles already had it, but createNewChatWithMessage
was missing it, causing 400 errors for new chat creation without Private API.
* fix: send stop-typing signal when run ends with NO_REPLY (#8785)
Adds onCleanup callback to the typing controller that fires when the
controller is cleaned up while typing was active (e.g., after NO_REPLY).
Channels using createTypingCallbacks automatically get stop-typing on
cleanup. This prevents the typing indicator from lingering in group chats
when the agent decides not to reply.
* fix(telegram): deduplicate skill commands in multi-agent setup (#5717)
Two fixes:
1. Skip duplicate workspace dirs when listing skill commands across agents.
Multiple agents sharing the same workspace would produce duplicate commands
with _2, _3 suffixes.
2. Clear stale commands via deleteMyCommands before registering new ones.
Commands from deleted skills now get cleaned up on restart.
* fix: add size limits to unbounded in-memory caches (#4948)
Adds max-size caps with oldest-entry eviction to prevent OOM in
long-running deployments:
- BlueBubbles serverInfoCache: 64 entries (already has TTL)
- Google Chat authCache: 32 entries
- Matrix directRoomCache: 1024 entries
- Discord presenceCache: 5000 entries per account
* fix: address review concerns (#11093)
- Chain deleteMyCommands → setMyCommands to prevent race condition (#5717)
- Rename enablePluginEntry to registerPluginEntry (now sets enabled: false)
- Add Slow-Loris timeout test for readJsonBody (#6023)
(cherry picked from commit 1007d71f0cece18ca74d2a2bc7ab3b88c734f75e)
# Conflicts:
# extensions/bluebubbles/src/chat.ts
# extensions/bluebubbles/src/send.ts
# extensions/voice-call/src/webhook.ts
# src/auto-reply/skill-commands.ts
# src/config/plugin-auto-enable.ts
* fix: add .caf to AUDIO_FILE_EXTENSIONS (#10982)
* fix: add .caf to AUDIO_FILE_EXTENSIONS for iMessage voice messages
* fix: add caf audio extension regression coverage (#10982) (thanks @succ985)
---------
Co-authored-by: succ985 <succ985@users.noreply.github.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
(cherry picked from commit b8f740fb148cce8e56191114c583859b6393bf61)
# Conflicts:
# CHANGELOG.md
# src/media/mime.test.ts
* fix: recover from context overflow caused by oversized tool results (#11579)
* fix: gracefully handle oversized tool results causing context overflow
When a subagent reads a very large file or gets a huge tool result (e.g.,
gh pr diff on a massive PR), it can exceed the model's context window in
a single prompt. Auto-compaction can't help because there's no older
history to compact — just one giant tool result.
This adds two layers of defense:
1. Pre-emptive: Hard cap on tool result size (400K chars ≈ 100K tokens)
applied in the session tool result guard before persistence. This
prevents extremely large tool results from being stored in full,
regardless of model context window size.
2. Recovery: When context overflow is detected and compaction fails,
scan session messages for oversized tool results relative to the
model's actual context window (30% max share). If found, truncate
them in the session via branching (creating a new branch with
truncated content) and retry the prompt.
The truncation preserves the beginning of the content (most useful for
understanding what was read) and appends a notice explaining the
truncation and suggesting offset/limit parameters for targeted reads.
Includes comprehensive tests for:
- Text truncation with newline-boundary awareness
- Context-window-proportional size calculation
- In-memory message truncation
- Oversized detection heuristics
- Guard-level size capping during persistence
* fix: prep fixes for tool result truncation PR (#11579) (thanks @tyler6204)
(cherry picked from commit 0deb8b0da187ed3a5ca1b0dc37736548795fbe31)
# Conflicts:
# src/agents/pi-embedded-runner/run.ts
# src/agents/session-tool-result-guard.test.ts
# src/agents/session-tool-result-guard.ts
* Memory: add SQLITE_BUSY fallback regression test
(cherry picked from commit 95263f4e60e734709cfd53ac45aa84d1a81fc108)
# Conflicts:
# src/memory/search-manager.test.ts
* fix: use STATE_DIR instead of hardcoded ~/.openclaw for identity and canvas (#4824)
* fix: use STATE_DIR instead of hardcoded ~/.openclaw for identity and canvas
device-identity.ts and canvas-host/server.ts used hardcoded
path.join(os.homedir(), '.openclaw', ...) ignoring OPENCLAW_STATE_DIR
env var and the resolveStateDir() logic from config/paths.ts.
This caused ~/.openclaw/identity and ~/.openclaw/canvas directories
to be created even when state dir was overridden or resided elsewhere.
* fix: format and remove duplicate imports
* fix: scope state-dir patch + add regression tests (#4824) (thanks @kossoy)
* fix: align state-dir fallbacks in hooks and agent paths (#4824) (thanks @kossoy)
---------
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
(cherry picked from commit ebe57304016aaadf69c0357d49ec1e36df6a5daa)
# Conflicts:
# CHANGELOG.md
# src/agents/agent-scope.ts
# src/agents/sandbox/constants.ts
# src/canvas-host/server.ts
# src/cli/update-cli.ts
# src/commands/agents.test.ts
# src/hooks/bundled/command-logger/handler.ts
# src/hooks/bundled/session-memory/handler.ts
# src/infra/device-identity.ts
* fix: context overflow compaction and subagent announce improvements (#11664) (thanks @tyler6204)
* initial commit
* feat: implement deriveSessionTotalTokens function and update usage tests
* Added deriveSessionTotalTokens function to calculate total tokens based on usage and context tokens.
* Updated usage tests to include cases for derived session total tokens.
* Refactored session usage calculations in multiple files to utilize the new function for improved accuracy.
* fix: restore overflow truncation fallback + changelog/test hardening (#11551) (thanks @tyler6204)
(cherry picked from commit 191da1feb52e2cb164c6d1212c0dd133ae3f9198)
# Conflicts:
# CHANGELOG.md
# scripts/test-parallel.mjs
# src/agents/clawdbot-tools.subagents.sessions-spawn-normalizes-allowlisted-agent-ids.test.ts
# src/agents/pi-embedded-runner/run.overflow-compaction.test.ts
# src/agents/pi-embedded-runner/run.ts
# src/agents/pi-embedded-runner/run/types.ts
# src/agents/pi-embedded-subscribe.handlers.messages.ts
# src/agents/subagent-announce.format.test.ts
# src/agents/subagent-announce.ts
# src/agents/subagent-registry.ts
# src/agents/timeout.ts
# src/agents/usage.test.ts
# src/commands/agent/session-store.ts
# ui/src/styles/components.css
# ui/src/ui/views/chat.ts
---------
Co-authored-by: Clawdbot <lukavyi@me.com>
Co-authored-by: Ayaan Zaidi <zaidi@uplause.io>
Co-authored-by: Conroy Whitney <konreu@gmail.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Co-authored-by: Shakker <shakkerdroid@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Ayush Ojha <ayushgreat10@gmail.com>
Co-authored-by: Ayush Ojha <ayushozha@outlook.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
Co-authored-by: Tyler Yust <64381258+tyler6204@users.noreply.github.com>
Co-authored-by: cpojer <christoph.pojer@gmail.com>
Co-authored-by: Jhin <jhin@summonai.org>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
Co-authored-by: clawdinator[bot] <253378751+clawdinator[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@iamevan.dev>
Co-authored-by: Sk Akram <skcodewizard786@gmail.com>
Co-authored-by: Marco Marandiz <admin-marco@Mac.lan>
Co-authored-by: Elarwei <elarweis@gmail.com>
Co-authored-by: Ji <jizhang.work@gmail.com>
Co-authored-by: Benjamin Jesuiter <bjesuiter@gmail.com>
Co-authored-by: Vignesh Natarajan <vigneshnatarajan92@gmail.com>
Co-authored-by: Glucksberg <markuscontasul@gmail.com>
Co-authored-by: Yudong Han <hanyd@pku.edu.cn>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com>
Co-authored-by: hyf0-agent <ada.20260202@outlook.com>
Co-authored-by: hyf0-agent <hyf0-agent@users.noreply.github.com>
Co-authored-by: Christian Klotz <hello@christianklotz.co.uk>
Co-authored-by: Glucksberg <80581902+Glucksberg@users.noreply.github.com>
Co-authored-by: Daijiro Miyazawa <dxd5001@gmail.com>
Co-authored-by: Darshil <ddhameliya@mail.sfsu.edu>
Co-authored-by: Sash Zats <sash@zats.io>
Co-authored-by: zerone0x <hi@trine.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: adam91holt <mail@adamholt.co.nz>
Co-authored-by: Coy Geek <65363919+coygeek@users.noreply.github.com>
Co-authored-by: Yida-Dev <92713555+Yida-Dev@users.noreply.github.com>
Co-authored-by: Shadril Hassan Shifat <63901551+shadril238@users.noreply.github.com>
Co-authored-by: succ985 <3186520056@qq.com>
Co-authored-by: Oleg Kossoy <oleg.kossoy@gmail.com>
Co-authored-by: hughdidit <hugh.chapman@hughdidit.com>
hughdidit
pushed a commit
to hughdidit/DAISy-Agency
that referenced
this pull request
Mar 3, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> (cherry picked from commit 5020bfa) # Conflicts: # src/memory/embeddings.ts
zooqueen
pushed a commit
to hanzoai/bot
that referenced
this pull request
Mar 6, 2026
…nclaw#5332) * fix: L2-normalize local embedding vectors to fix semantic search * fix: handle non‑finite magnitude in L2 normalization and remove stale test reset * refactor: add braces to l2Normalize guard clause in embeddings * fix: sanitize local embeddings (openclaw#5332) (thanks @akramcodez) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
john-ver
pushed a commit
to apmcoin/apmclaw
that referenced
this pull request
Mar 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
fixes #5301
Problem
The local embedding provider using
node-llama-cppreturns raw unnormalized vectors from models like EmbeddingGemma. These vectors had magnitudes ranging from 10–15 instead of the expected 1.0. Since semantic search relies on cosine similarity, which assumes unit vectors, the search was dominated by vector magnitude rather than semantic direction. This caused the same high-magnitude chunks to rank first regardless of the query, making semantic search completely non-functional for local model users.Solution
Added an
l2Normalize()utility function that normalizes any embedding vector to unit magnitude after inference. This is applied to bothembedQueryandembedBatchoutputs in the local embedding provider. A guard clause handles the zero vector case to prevent division by zero.File Changes
src/memory/embeddings.tsl2Normalize()helper functionembedQueryoutputembedBatchoutputsrc/memory/embeddings.test.tsGreptile Overview
Greptile Summary
This PR adds L2 normalization for vectors returned by the local embedding provider (
node-llama-cpp) by introducing anl2Normalize()helper and applying it to bothembedQueryandembedBatchoutputs insrc/memory/embeddings.ts. It also adds a dedicated test suite insrc/memory/embeddings.test.tsthat mocks./node-llama.jsto verify normalized magnitude (~1.0) for single and batch embeddings, and safe handling of the zero vector.Overall, the change aligns local embeddings with cosine-similarity assumptions used by semantic search, preventing ranking from being dominated by vector magnitude.
Confidence Score: 4/5
Context used:
dashboard- CLAUDE.md (source)dashboard- AGENTS.md (source)