Menci
c741f2410b
fix(conversation): correct token trimming edge cases ( #207 )
...
- Treat maxTokens=0 as "unconfigured/unlimited" instead of disabling
trimming for any non-positive value (which masked exhausted budgets)
- Set historyBudget=1 when maxTokens>0 but overhead exceeds the limit,
ensuring aggressive trimming instead of no trimming
- Estimate token cost for messages without usage data (len/4 fallback)
so user/tool messages are not free-passed during budget accounting
2026-03-09 13:06:19 +08:00
BBQ
3739def43f
fix(text): avoid breaking UTF-8 during truncation
...
Use rune-aware truncation for user-facing text and log previews so multibyte content is not corrupted in memory context, Telegram messages, or diagnostics.
2026-03-09 12:43:57 +08:00
Ringo.Typowriter
e6a6dbe3f6
feat(channel): add QQ channel support and image message pipeline ( #199 )
...
* feat(channel): add qq adapter and outbound delivery
* feat(channel): ingest inbound qq messages
* feat(web): expose qq channel in management ui
* feat(channel): support qq attachment ingestion
* fix(mcp): fail read raw immediately for missing files
* fix(agent): parse inline image data into native image parts
* test(agent): align read_media tool tests with SDK options
* fix(channel): harden qq image delivery and reconnect loop
Avoid data URLs for qq channel images, reset reconnect backoff after healthy sessions, and fall back gracefully for malformed public image URLs.
* fix(channel): restore qq media delivery and target resolution
* fix(qq,mcp,agent): fix message/qq regressions and pass go lint
* fix(qq,agent): validate inline base64 and sync heartbeat seq
* fix(qq): validate remote voice mime for upload checks
* fix(qq): fall back intents and restore adapter wiring
* fix(qq): prevent final text leakage and dedupe persisted inbound query
2026-03-07 17:12:06 +08:00
Acbox
4109a141f9
feat: move all tools from @memoh/agent into built-in mcp
2026-03-06 16:48:18 +08:00
BBQ
3feb03aca7
ci: add go lint and race test workflow ( #187 )
2026-03-05 11:25:33 +08:00
Acbox Liu
ea719f7ca7
refactor: memory provider ( #140 )
...
* refactor: memory provider
* fix: migrations
* feat: divide collection from different built-in memory
* feat: add `MEMORY.md` and `PROFILES.md`
* use .env for docker compose. fix #142 (#143 )
* feat(web): add brand icons for search providers (#144 )
Add custom FontAwesome icon definitions for all 9 search providers:
- Yandex: uses existing faYandex from FA free brands
- Tavily, Jina, Exa, Bocha, Serper: custom icons from brand SVGs
- DuckDuckGo, SearXNG, Sogou: custom icons from Simple Icons
Icons are registered with a custom 'fac' prefix and rendered as
monochrome (currentColor) via FontAwesome's standard rendering.
* fix: resolve multiple UI bugs (#147 )
* feat: add email service with multi-adapter support (#146 )
* feat: add email service with multi-adapter support
Implement a full-stack email service with global provider management,
per-bot bindings with granular read/write permissions, outbox audit
storage, and MCP tool integration for direct mailbox access.
Backend:
- Email providers: CRUD with dynamic config schema (generic SMTP/IMAP, Mailgun)
- Generic adapter: go-mail (SMTP) + go-imap/v2 (IMAP IDLE real-time push via
UnilateralDataHandler + UID-based tracking + periodic check fallback)
- Mailgun adapter: mailgun-go/v5 with dual inbound mode (webhook + poll)
- Bot email bindings: per-bot provider binding with independent r/w permissions
- Outbox: outbound email audit log with status tracking
- Trigger: inbound emails push notification to bot_inbox (from/subject only,
LLM reads full content on demand via MCP tools)
- MailboxReader interface: on-demand IMAP queries for listing/reading emails
- MCP tools: email_accounts, email_send, email_list (paginated mailbox),
email_read (by UID) — all with multi-binding and provider_id selection
- Webhook: /email/mailgun/webhook/:config_id (JWT-skipped, signature-verified)
- DB migration: 0019_add_email (email_providers, bot_email_bindings, email_outbox)
Frontend:
- Email Providers page: /email-providers with MasterDetailSidebarLayout
- Dynamic config form rendered from ordered provider meta schema with i18n keys
- Bot detail: Email tab with bindings management + outbox audit table
- Sidebar navigation entry
- Full i18n support (en + zh)
- Auto-generated SDK from Swagger
Closes #17
* feat(email): trigger bot conversation immediately on inbound email
Instead of only storing an inbox item and waiting for the next chat,
the email trigger now proactively invokes the conversation resolver
so the bot processes new emails right away — aligned with the
schedule/heartbeat trigger pattern.
* fix: lint
---------
Co-authored-by: Acbox <acbox0328@gmail.com >
* chore: update AGENTS.md
* feat: files preview
* feat(web): improve MCP details page
* refactor(skills): import skill with pure markdown string
* merge main into refactor/memory
* fix: migration
* refactor: temp delete qdrant and bm25 index
* fix: clean merge code
* fix: update memory handler
---------
Co-authored-by: Leohearts <leohearts@leohearts.com >
Co-authored-by: Menci <mencici@msn.com >
Co-authored-by: Quincy <69751197+dqygit@users.noreply.github.com >
Co-authored-by: BBQ <35603386+HoneyBBQ@users.noreply.github.com >
Co-authored-by: Ran <16112591+chen-ran@users.noreply.github.com >
2026-03-03 15:33:50 +08:00
Ringo.Typowriter
d3edd17d90
feat(agent): loop detection ( #152 )
...
* feat(loop-detection): add configurable text and tool loop guards
* style(web): remove duplicate separator in bot settings
2026-03-02 15:00:09 +08:00
Acbox Liu
0cdf822603
feat: token usage state ( #153 )
...
* feat: token usage state
* fix: typo
2026-03-01 02:19:07 +08:00
Acbox Liu
fe10abf3fc
refactor: inbox ( #137 )
...
* refactor: inbox
* fix: migrations
* fix: migrations
2026-02-26 20:16:02 +08:00
Acbox Liu
2f38662d4d
feat: heartbeat ( #108 )
...
* feat: heartbeat
* feat: independent heartbeat model
2026-02-25 16:32:52 +08:00
Acbox Liu
17cd077f34
feat: add thinking support ( #100 )
...
* feat: add thinking support
* feat: improve thinking block render in web and filter thinking content in channels
* fix: migrate
2026-02-23 14:41:27 +08:00
Acbox
ac929f9f44
feat: add message id in user header
2026-02-23 00:06:15 +08:00
ringotypowriter
f00e4bcd4e
fix(flow): support UUID model refs when provider filter is set
2026-02-22 16:53:30 +08:00
ringotypowriter
8cd7c4aa86
Merge branch 'main' into fix/provider-scoped-model-id-resolution
2026-02-22 12:47:37 +08:00
Acbox Liu
c591af14b0
feat: bot inbox ( #77 )
...
* feat: bot inbox
* feat: unified header
* fix: missing tool_call usage
* feat: add group name in header
2026-02-22 01:27:24 +08:00
ringotypowriter
50bdbd519c
fix(models,settings,conversation): scope model_id uniqueness per
...
provider and harden model reference resolution
2026-02-21 22:31:32 +08:00
Ringo.Typowriter
9461f923df
fix(flow): stabilize chunked SSE and unify prune limits for read/exec/gateway ( #71 )
...
* fix(agent): emit chunked SSE data
fix(flow): reassemble chunked SSE and prune tool payloads
fix: avoid whitespace prune bypass; optimize chunked SSE builder
* refactor: LLM provider pruning use shared textprune library
* chore: smaller range
2026-02-21 17:06:02 +08:00
Acbox
6b7c3db952
refactor: process user header in go side
2026-02-20 21:40:13 +08:00
Acbox
ab84e29dde
fix: change memory message role from system to user caused by the imcompatibility of anthropic messages api
2026-02-20 15:19:24 +08:00
Acbox
5e1de4fe7b
fix: include system tokens in max tokens compute
2026-02-19 18:28:29 +08:00
Acbox
a65c741e28
fix(agent): missing user header in message store
2026-02-19 17:19:39 +08:00
BBQ
bc374fe8cd
refactor: content-addressed assets, cross-channel multimodal, infra simplification ( #63 )
...
* refactor(attachment): multimodal attachment refactor with snapshot schema and storage layer
- Add snapshot schema migration (0008) and update init/versions/snapshots
- Add internal/attachment and internal/channel normalize for unified attachment handling
- Move containerfs provider from internal/media to internal/storage
- Update agent types, channel adapters (Telegram/Feishu), inbound and handlers
- Add containerd snapshot lineage and local_channel tests
- Regenerate sqlc, swagger and SDK
* refactor(media): content-addressed asset system with unified naming
- Replace asset_id foreign key with content_hash as sole identifier
for bot_history_message_assets (pure soft-link model)
- Remove mime, size_bytes, storage_key from DB; derive at read time
via media.Resolve from actual storage
- Merge migrations 0008/0009 into single 0008; keep 0001 as canonical schema
- Add Docker initdb script for deterministic migration execution order
- Fix cross-channel real-time image display (Telegram → WebUI SSE)
- Fix message disappearing on refresh (null assets fallback)
- Fix file icon instead of image preview (mime derivation from storage)
- Unify AssetID → ContentHash naming across Go, Agent, and Frontend
- Change storage key prefix from 4-char to 2-char for directory sharding
- Add server-entrypoint.sh for Docker deployment migration handling
* refactor(infra): embedded migrations, Docker simplification, and config consolidation
- Embed SQL migrations into Go binary, removing shell-based migration scripts
- Consolidate config files into conf/ directory (app.example.toml, app.docker.toml, app.dev.toml)
- Simplify Docker setup: remove initdb.d scripts, streamline nginx config and entrypoint
- Remove legacy CLI, feishu-echo commands, and obsolete incremental migration files
- Update install script and docs to require sudo for one-click install
- Add mise tasks for dev environment orchestration
* chore: recover migrations
---------
Co-authored-by: Acbox <acbox0328@gmail.com >
2026-02-19 00:20:27 +08:00
Ringo.Typowriter
1bd080c155
fix(flow): drop leading orphan tool messages after token trimming ( #68 )
2026-02-18 22:27:38 +08:00
Acbox
d6c47472b2
refactor: move client_type key from provider to model
2026-02-18 18:30:27 +08:00
Acbox
77e9f585a1
feat: max context tokens
2026-02-18 17:20:22 +08:00
Acbox
7d72f86152
Revert "refactor(agent): move user identity headers to system prompt and sanitize input ( #64 )"
...
This reverts commit c9d4ee2a60 .
2026-02-18 06:29:25 +08:00
tommy0103
c9d4ee2a60
refactor(agent): move user identity headers to system prompt and sanitize input ( #64 )
...
* refactor(agent): move user identity headers to system prompt and sanitize input
- Relocate user-context headers from User Prompt to System Prompt for better instruction adherence.
- Implement soft-sanitization to strip header-like patterns from user input to prevent prompt injection.
- Update resolver logic in Go to support the new prompt structure.
* refactor(agent): move user identity headers to system prompt and sanitize input
- Relocate user-context headers from User Prompt to System Prompt for better instruction adherence.
- Implement soft-sanitization to strip header-like patterns from user input to prevent prompt injection.
- Update resolver logic in Go to support the new prompt structure.
* chore: remove same process in go side
---------
Co-authored-by: Acbox <acbox0328@gmail.com >
2026-02-18 05:36:50 +08:00
BBQ
df7876a30c
feat: add media asset system, channel lifecycle refactor, and chat attachments ( #54 )
2026-02-17 19:06:46 +08:00
Ringo.Typowriter
3aea635e44
fix: skill normalize ( #57 )
2026-02-17 17:55:07 +08:00
Acbox
37360ad8e4
fix: schedule run failed
2026-02-15 16:12:53 +08:00
Acbox
3d575e031e
feat: run memory extraction in the background
2026-02-15 14:15:55 +08:00
Ran
7817ec8147
fix(web): channel switch failure
...
Also add webui memory page
2026-02-14 07:30:21 +08:00
BBQ
faaadf14c5
feat(channel): pass conversation type through to agent gateway and persist in route
...
Propagate conversation type (direct/group/thread) from channel adapters
all the way to the agent prompt. Store conversation_type on bot_channel_routes
so the bot knows whether a message originates from a p2p chat, group, or thread.
Schema changes are folded into the 0001 init migration (destructive update).
2026-02-13 06:22:24 +08:00
BBQ
85251a2905
refactor(core): codebase quality cleanup
...
- Remove user-level model settings (chat_model_id, memory_model_id,
embedding_model_id, max_context_load_time, language) from users table
- Merge migration 0002 into 0001, remove compatibility migrations
- Delete dead conversation/resolver.go (1177 lines, only flow/resolver.go used)
- Remove type aliases (Chat=Conversation, types_alias.go)
- Fix SQL: remove AND false stub, fix UpdateChatTitle model_id,
reset model IDs in DeleteSettings, add preauth expiry filter,
add ListMessages limit, remove 10 dead queries
- Extract shared handler helpers (RequireChannelIdentityID, AuthorizeBotAccess)
- Rename internal/router to internal/channel/inbound
- Fix identity confusion: remove UserID->ChannelIdentityID fallbacks
- Fix all _ = var patterns with proper error logging
- Fix error propagation: storeMessages, rescheduleJob, botContainerID
- Fix naming: ModelId->ModelID, active->is_active, Duration semantic fix
- Remove dead code: mcpService, ReplyTarget, callMCPServer, sshShellQuote,
buildSessionMetadata, ChatRequest.Language, TriggerPayload.ChatID
- Fix code quality: errors.Is(), remove goto, CreateHuman deprecated
- Remove Enable model endpoint and user-level settings CLI commands
- Regenerate sqlc, swagger, SDK
2026-02-12 23:50:48 +08:00
BBQ
1c15eb2146
refactor(core): restructure conversation/channel/message domains and modernize deployment
...
- Replace chat package with conversation flow architecture
- Add channel identity avatar support (migration 0002)
- Refactor channel adapters, identities, and message routing
- Update frontend: simplify composables, modernize UI components
- Improve Docker builds with cache mounts and version metadata
- Optimize healthchecks and simplify service dependencies
2026-02-12 20:55:03 +08:00
BBQ
ca5c6a1866
refactor(core): restructure conversation, channel and message domains
...
- Rename chat module to conversation with flow-based architecture
- Move channelidentities into channel/identities subpackage
- Add channel/route for routing logic
- Add message service with event hub
- Add MCP providers: container, directory, schedule
- Refactor Feishu/Telegram adapters with directory and stream support
- Add platform management page and channel badges in web UI
- Update database schema for conversations, messages and channel routes
- Add @memoh/shared package for cross-package type definitions
2026-02-12 15:34:40 +08:00