Commit Graph

395 Commits

Author SHA1 Message Date
Cameron
ef63efc892 docs: clarify Bluesky notification filtering and reply behavior (#551)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-10 17:02:48 -07:00
Cameron
7f44043962 feat: add Bluesky channel adapter and runtime tooling (supersedes #401) (#486) 2026-03-10 13:59:27 -07:00
Cameron
6e8d1fc19d feat: add core config TUI editor (#522)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-10 11:51:05 -07:00
Cameron
0321558ee6 feat: add config-driven sleeptime support with memfs guard (#534)
Co-authored-by: Letta Code <noreply@letta.com>
Co-authored-by: letta-code <248085862+letta-code@users.noreply.github.com>
Co-authored-by: Cameron <cpfiffer@users.noreply.github.com>
2026-03-10 11:51:02 -07:00
Cameron
d3367e8c6a fix: rebind foreground run ID on post-tool-call assistant events (#545) 2026-03-09 23:12:53 -07:00
Cameron
1c9489683f fix: escape accidental Telegram blockquote markers in MarkdownV2 output (#524)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-09 21:48:11 -07:00
Cameron
e8c57ebd9c fix: avoid false italic conversion in Telegram reasoning (#526) 2026-03-09 21:47:48 -07:00
dependabot[bot]
03618faf5b chore(deps): bump @letta-ai/letta-client from 1.7.11 to 1.7.12 (#531)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-09 21:47:37 -07:00
Cameron
15b98758cc Merge pull request #542 from letta-ai/fix/thread-only-per-thread-conversations 2026-03-09 18:47:14 -07:00
Cameron
be60a00057 fix: align commands, batching, reactions, and LRU with forcePerChat
Address review findings from self-review and codex:

- Commands (/reset, /cancel) now receive forcePerChat from the Discord
  adapter and resolve the correct per-thread conversation key
- Group batcher propagates forcePerChat to synthetic batch messages so
  debounced thread messages don't fall back to shared routing
- Reaction handler sets forcePerChat for thread-only reactions
- Session LRU eviction fires regardless of conversationMode so
  forcePerChat sessions don't accumulate without bounds
- Docs now correctly state thread-only overrides shared/per-channel
  modes (not disabled mode)

Written by Cameron ◯ Letta Code

"The best way to predict the future is to implement it." -- David Heinemeier Hansson
2026-03-09 18:40:09 -07:00
Cameron
b79f29d8fa fix(discord): isolate conversations per-thread in thread-only mode
Thread-only mode previously relied on the global conversationMode to
determine whether threads got separate conversations. In shared or
per-channel mode, all threads shared one conversation causing crosstalk.

Add forcePerChat flag on InboundMessage that the Discord adapter sets
when thread-only mode is active. resolveConversationKey treats flagged
messages as per-chat regardless of the configured mode, giving each
thread its own isolated conversation while still sharing agent memory.

Written by Cameron ◯ Letta Code

"Time is an illusion. Lunchtime doubly so." -- Douglas Adams
2026-03-09 18:25:09 -07:00
Cameron
69cd7e5225 fix: recover default-conversation approval deadlocks without conversation reset (#541)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-09 18:15:52 -07:00
Cameron
4d037aca6a feat(discord): add thread-only mode and reduce stream log noise (#538)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-09 17:28:01 -07:00
Cameron
30c74a716c feat(discord): thread-only groups with auto-thread mentions + reaction gating (#540)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-09 16:32:38 -07:00
Cameron
d038c1361a fix: reduce per-event stream log noise and add regression test (#539)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-09 16:19:11 -07:00
Cameron
d23f0f9328 fix: harden voice memo delivery diagnostics (#536)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-09 13:22:26 -07:00
Cameron
7da991206f test: cover sendToAgent no-source directive filtering 2026-03-09 13:14:25 -07:00
Cameron
cf47522bf6 fix: skip non-targeted directives when no source adapter context
When sendToAgent() has no valid sourceChannel (e.g. webhook/feed
triggers), filter directives to only those that carry explicit
channel/chat targets. Prevents non-targeted directives (react, voice,
untargeted send-file) from executing against an arbitrary first-registered
adapter.

Written by Cameron ◯ Letta Code

"Simplicity is prerequisite for reliability." -- Edsger Dijkstra
2026-03-09 13:10:40 -07:00
Cameron
542ec8ce45 fix: execute directives in background flows, reject partial send-file targeting
Two fixes from PR review:

1. sendToAgent() now parses and executes directives from agent responses.
   Previously, directives were only executed in processMessage() (foreground),
   so <send-message> and targeted <send-file> never fired from heartbeats,
   cron, or webhook contexts. Targeted directives resolve their own adapter;
   non-targeted directives use source context from the trigger if available.

2. send-file with only one of channel/chat (partial targeting) is now
   rejected with a warning instead of silently falling back to the
   triggering chat, which could send to an unintended destination.

Written by Cameron ◯ Letta Code

"Be conservative in what you send, be liberal in what you accept."
-- Jon Postel
2026-03-09 12:29:20 -07:00
Cameron
f7d8005be4 feat: add <send-message> directive and cross-channel targeting for <send-file>
Adds a new `<send-message>` directive that lets the agent proactively
send text messages to any connected channel:chat, and extends
`<send-file>` with optional `channel`/`chat` attributes for targeted
file delivery. Both work from any context including heartbeats and cron.

Written by Cameron ◯ Letta Code

"The question of whether a computer can think is no more interesting
than the question of whether a submarine can swim." -- Edsger Dijkstra
2026-03-09 12:01:53 -07:00
Ezra
d7ab7f1c4b fix: reduce log spam from pre-foreground event buffering (#529)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-07 13:42:57 -08:00
Cameron
467f890371 docs: document /api/v1/chat/async endpoint (#518) 2026-03-06 17:39:20 -08:00
Cameron
acfd8dbeab fix: convert markdown bold/italic to HTML in Telegram thinking blocks (#523) 2026-03-06 17:33:45 -08:00
Cameron
7c3ab04494 Low-risk simplification pass: bot pipeline, startup, API, onboarding, provider sync (#520) 2026-03-06 17:20:24 -08:00
Cameron
b3634d0f29 fix: align API key guidance links to project keys page (#519)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-06 15:24:27 -08:00
Cameron
77fc7005e8 test: add Docker image build check to CI (#516)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-06 14:47:12 -08:00
Cameron
ead65ff1e7 fix: restore public store and invalidateSession on LettaBot (#515) 2026-03-06 12:04:05 -08:00
Cameron
c71c45150e feat: add ignoreBotReactions config toggle for Discord (#508) 2026-03-06 12:03:42 -08:00
Cameron
e80c5b4dd6 fix: prevent non-foreground run events leaking into user response stream (#513) 2026-03-06 11:51:05 -08:00
Cameron
761de6d716 feat: add set-conversation command (CLI, API, channel, portal) (#512) 2026-03-06 11:30:06 -08:00
Cameron
53c24bcdc7 fix: resolve WhatsApp LID to phone number for inbound DMs (#510) 2026-03-06 11:07:32 -08:00
Cameron
9da79aef09 fix: enable link preview generation for WhatsApp outbound messages (#511) 2026-03-06 11:04:46 -08:00
Jason Carreira
0fa3173e73 fix: create new conversation for per-channel mode instead of resuming default (#503)
Co-authored-by: Letta Code <noreply@letta.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-06 10:54:56 -08:00
Cameron
bcbe6dff9b fix: prevent reasoning text from leaking as response on LLM API errors (#509) 2026-03-06 10:14:16 -08:00
dependabot[bot]
ba1ef7ab6e chore(deps): bump @letta-ai/letta-client from 1.7.10 to 1.7.11 (#490)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-06 09:52:24 -08:00
Cameron
ef2302b2aa fix: strip variation selectors in Telegram emoji reactions (#499) 2026-03-06 09:34:18 -08:00
Cameron
c018369cae fix: serialize all sendToAgent calls and use per-key canUseTool callbacks (#501) 2026-03-05 17:57:04 -08:00
Cameron
c964ca3826 refactor: extract shared channel utilities (access control, emoji, message splitting) (#492) 2026-03-05 11:20:57 -08:00
Cameron
7173d2e2c4 fix: use sender phone number as userId for WhatsApp group messages (#491) 2026-03-05 10:37:06 -08:00
Cameron
9bf19ebab4 feat: ChatGPT subscription connect flow (#487) 2026-03-05 10:16:35 -08:00
Cameron
bb0ccd65e1 docs: consolidate voice documentation into docs/voice.md (#485) 2026-03-04 16:18:37 -08:00
Cameron
025fd38d5f feat: add per-group daily message limits (dailyLimit + dailyUserLimit) (#484) 2026-03-04 12:55:49 -08:00
Ezra
a9cab72426 feat: add POST /api/v1/chat/async endpoint for fire-and-forget messages (#329) 2026-03-04 11:45:09 -08:00
dustindoan
587621d9e4 fix: close API server on shutdown to prevent EADDRINUSE (#477)
Co-authored-by: Dustin Doan <dustin@myhealthspan.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 11:40:58 -08:00
Vedant0200
87aaa779bf Update README to use local preview image (#481) 2026-03-04 11:30:52 -08:00
Cameron
cb563d617b fix: detect and recover from stuck 409 PENDING_APPROVAL errors (#478) 2026-03-03 15:37:36 -08:00
Nouamane Benbrahim
94b7eea127 feat: unified lettabot initialization via lettactl (agents.yml) (#393)
Co-authored-by: Cameron <cameron@pfiffer.org>
2026-03-03 14:13:13 -08:00
Cameron
743cb1fbc9 fix: add diagnostic logging when agent skips lettabot-message CLI in silent mode (#476) 2026-03-03 12:32:50 -08:00
Cameron
ef13c3d8ab fix: add resolveEmailPrompt tests and consolidate prompt builders (#474) 2026-03-03 11:59:59 -08:00
Jason Carreira
e7f6e85880 feat(polling): add custom prompt support for Gmail email polling (#471)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-03 11:24:58 -08:00