Commit Graph

213 Commits

Author SHA1 Message Date
cpojer
43c97d18aa chore: Fix types in tests 17/N. 2026-02-17 12:00:29 +09:00
cpojer
003d6c45d6 chore: Fix types in tests 6/N. 2026-02-17 10:57:31 +09:00
Peter Steinberger
13ae1ae056 fix(memory): tighten embedding manager inheritance types 2026-02-17 00:59:54 +00:00
Peter Steinberger
5115f6fdf3 style: normalize imports for oxfmt 0.33 2026-02-17 00:59:54 +00:00
Peter Steinberger
ddef3cadba refactor: replace memory manager prototype mixing 2026-02-17 01:50:04 +01:00
cpojer
1dc9bb8d62 chore: Fix more type issues. 2026-02-17 09:29:47 +09:00
cpojer
90ef2d6bdf chore: Update formatting. 2026-02-17 09:18:40 +09:00
Peter Steinberger
9bfd3ca195 refactor(memory): consolidate embeddings and batch helpers 2026-02-17 00:11:02 +00:00
Rodrigo Uroz
65ad9a4262 Memory: fix MMR tie-break and temporal timestamp dedupe 2026-02-16 23:59:19 +01:00
Rodrigo Uroz
33cf27a52a fix: MMR default disabled, tie-break null guard, correct docs URL
- DEFAULT_MMR_CONFIG.enabled = false (opt-in, was incorrectly true)
- Tie-break: handle bestItem === null so first candidate always wins
- CHANGELOG URL: docs.clawd.bot → docs.openclaw.ai
- Tests updated to pass enabled: true explicitly where needed
2026-02-16 23:59:19 +01:00
Rodrigo Uroz
6b3e0710f4 feat(memory): Add opt-in temporal decay for hybrid search scoring
Exponential decay (half-life configurable, default 30 days) applied
before MMR re-ranking. Dated daily files (memory/YYYY-MM-DD.md) use
filename date; evergreen files (MEMORY.md, topic files) are not
decayed; other sources fall back to file mtime.

Config: memorySearch.query.hybrid.temporalDecay.{enabled, halfLifeDays}
Default: disabled (backwards compatible, opt-in).
2026-02-16 23:59:19 +01:00
Rodrigo Uroz
fa9420069a feat(memory): Add MMR re-ranking for search result diversity
Adds Maximal Marginal Relevance (MMR) re-ranking to hybrid search results.

- New mmr.ts with tokenization, Jaccard similarity, and MMR algorithm
- Integrated into mergeHybridResults() with optional mmr config
- 40 comprehensive tests covering edge cases and diversity behavior
- Configurable lambda parameter (default 0.7) to balance relevance vs diversity
- Updated CHANGELOG.md and memory docs

This helps avoid redundant results when multiple chunks contain similar content.
2026-02-16 23:59:19 +01:00
康熙
bcab2469de feat: LLM-based query expansion for FTS mode
When searching in FTS-only mode (no embedding provider), extract meaningful
keywords from conversational queries using LLM to improve search results.

Changes:
- New query-expansion module with keyword extraction
- Supports English and Chinese stop word filtering
- Null safety guards for FTS-only mode (provider can be null)
- Lint compliance fixes for string iteration

This helps users find relevant memory entries even with vague queries.
2026-02-16 23:53:21 +01:00
康熙
65aedac20e fix: enable FTS fallback when no embedding provider available (#17725)
When no embedding provider is available (e.g., OAuth mode without API keys),
memory_search now falls back to FTS-only mode instead of returning disabled: true.

Changes:
- embeddings.ts: return null provider with reason instead of throwing
- manager.ts: handle null provider, use FTS-only search mode
- manager-search.ts: allow searching all models when provider is undefined
- memory-tool.ts: expose search mode in results

The search results now include a 'mode' field indicating 'hybrid' or 'fts-only'.
2026-02-16 23:53:21 +01:00
康熙
153794080e fix: support OAuth for Gemini media understanding
Extract parseGeminiAuth() to shared infra module and use it in both
embeddings-gemini.ts and inline-data.ts.

Previously, inline-data.ts directly set x-goog-api-key header without
handling OAuth JSON format. Now it properly supports both traditional
API keys and OAuth tokens.
2026-02-16 23:53:21 +01:00
康熙
3379b9d341 fix: support OAuth for Gemini embedding API
Add parseGeminiAuth() to detect OAuth JSON format ({"token": "...", "projectId": "..."})
and use Bearer token authentication instead of x-goog-api-key header.

This allows OAuth users (using gemini-cli-auth extension) to use memory_search
with Gemini embedding API.
2026-02-16 23:53:21 +01:00
Peter Steinberger
04892ee230 refactor(core): dedupe shared config and runtime helpers 2026-02-16 14:59:30 +00:00
Peter Steinberger
ceddb4a593 style(memory): format flaky ci test files 2026-02-16 05:32:42 +01:00
Vignesh Natarajan
b32ae6fa0c fix (memory/qmd): isolate managed collections per agent 2026-02-15 20:14:45 -08:00
Peter Steinberger
b4a9eacd76 chore: format qmd-manager test 2026-02-16 04:18:42 +01:00
Vignesh Natarajan
501e893676 fix (memory/search): support unicode tokens in FTS query builder 2026-02-15 19:17:03 -08:00
Vignesh Natarajan
85430c8495 fix (memory/qmd): rebind drifted managed collection paths 2026-02-15 19:03:55 -08:00
Peter Steinberger
9805ce0097 refactor(memory): reuse cached embedding collector 2026-02-16 02:32:59 +00:00
Peter Steinberger
58cf37ceeb refactor(memory): reuse batch utils in gemini 2026-02-16 00:34:10 +00:00
Peter Steinberger
d8691ff4ec refactor(memory): share sync progress helpers 2026-02-16 00:29:01 +00:00
Peter Steinberger
8251f7c235 refactor(memory): dedupe batch helpers 2026-02-16 00:26:03 +00:00
Peter Steinberger
92f8c0fac3 perf(test): speed up suites and reduce fs churn 2026-02-15 19:29:27 +00:00
Peter Steinberger
a4b958efcd perf(test): cover embedding chunk limits without indexing 2026-02-15 19:29:27 +00:00
Gustavo Madeira Santana
2e64cbd1b8 chore(memory): tighten embedding harness types 2026-02-15 10:30:19 -05:00
Peter Steinberger
71c1d09f22 refactor(test): share memory embedding fixture 2026-02-15 15:07:09 +00:00
Peter Steinberger
a7b6555195 refactor(test): share memory embedding mocks 2026-02-15 14:48:23 +00:00
Peter Steinberger
0d47bea3bf refactor(memory): dedupe embedding batch runner options 2026-02-15 13:37:42 +00:00
Peter Steinberger
ebb54d71ef refactor(memory): share batch create retry 2026-02-15 06:43:20 +00:00
Vignesh Natarajan
46a3c16066 test (memory/qmd): cover per-collection query fallback behavior 2026-02-14 19:02:44 -08:00
Vignesh Natarajan
04a88a6ee6 fix (memory/qmd): avoid multi-collection query ranking corruption 2026-02-14 19:02:41 -08:00
Vignesh Natarajan
44bbb4ddf4 chore (memory): add status dirty rebound regression test 2026-02-14 18:48:58 -08:00
Vignesh Natarajan
7addb519da fix (memory/builtin): keep status dirty state stable across invocations 2026-02-14 18:48:58 -08:00
Peter Steinberger
f9bb748a6c fix(memory): prevent QMD scope deny bypass 2026-02-15 02:41:45 +00:00
Vignesh Natarajan
df820f0315 Memory/QMD: add null-byte collection repair regressions 2026-02-14 18:09:12 -08:00
Vignesh Natarajan
2dfbb407ba Memory/QMD: self-heal null-byte collection metadata on update 2026-02-14 18:09:12 -08:00
Peter Steinberger
075b335ba6 refactor(memory): dedupe batch embedding glue 2026-02-15 01:46:51 +00:00
Vignesh Natarajan
decf2b518a Memory: reduce watcher FD pressure for markdown sync 2026-02-14 17:25:07 -08:00
Peter Steinberger
161222f6fe perf(test): speed up qmd manager suite 2026-02-15 01:15:47 +00:00
Peter Steinberger
10a52ac294 refactor(memory): share sync indexing helper 2026-02-15 01:15:43 +00:00
Peter Steinberger
ef91cd8479 perf(test): drop recursive mkdir in qmd manager suite 2026-02-15 00:26:41 +00:00
Peter Steinberger
ae1214140e perf(test): drop polling waits in qmd manager suite 2026-02-15 00:26:41 +00:00
Peter Steinberger
bfbe12d9f5 perf(test): reduce memory suite resets 2026-02-15 00:26:41 +00:00
Peter Steinberger
27eef96380 fix: improve sqlite missing runtime error 2026-02-15 01:18:53 +01:00
Vignesh Natarajan
53a8f474ee Memory/QMD: handle fallback init failures gracefully 2026-02-14 15:42:02 -08:00
Vignesh Natarajan
c4dbcc3444 Memory/QMD: make status checks side-effect free 2026-02-14 15:42:02 -08:00