Commit Graph

425 Commits

Author SHA1 Message Date
Cameron
f1f3540005 fix(heartbeat): prioritize user messages over in-flight heartbeats (#594)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-13 14:40:04 -07:00
Cameron
039707387e feat(bluesky): fetch parent thread context for reply posts (#592)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-13 14:17:33 -07:00
Cameron
f5005c33a0 fix(core): resize images before sending to LLM to prevent llm_api_error (#593) 2026-03-13 14:10:05 -07:00
Cameron
68056ed21b fix: clarify stuck approval error message with /reset and consequences (#590)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-12 23:33:23 -07:00
Cameron
25fbd7b9fa fix(cron): prevent cross-agent job leakage from global store migration (#588)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-12 22:53:20 -07:00
Cameron
b0fc98d064 fix(portal): fix JS syntax error that prevented login() from being defined (#587)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-12 22:47:55 -07:00
Cameron
35cff5098f fix(telegram): escape horizontal rules in MarkdownV2 output (#586)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-12 22:43:20 -07:00
Cameron
acfb90e2e5 feat: use SDK recoverPendingApprovals for approval conflict recovery (#585)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-12 22:28:14 -07:00
Cameron
227b986396 fix(skills): persist Railway skill directories across redeploys (#582)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-12 21:55:12 -07:00
Cameron
791e722fca fix: strip <no-reply/> marker in sendToAgent before returning to callers (#584)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-12 21:37:53 -07:00
Cameron
9bd74227d9 fix(bluesky): persist session JWTs and skip retries on rate limits (#583)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-12 21:27:59 -07:00
Cameron
5bed4e78cd fix(recovery): deny orphaned approvals sequentially for parallel tool calls (#580)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-12 18:37:27 -07:00
Cameron
00a0433358 fix(core): parse <actions> blocks anywhere in responses (#579)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-12 17:02:06 -07:00
Cameron
1d636d6fa9 feat(signal): default Signal read receipts to true (#576)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-12 09:10:38 -07:00
Cameron
a6b1a43ec5 fix(logging): record structured abort errors in turn logs (#572)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-11 23:45:27 -07:00
Cameron
6ecd78e294 feat: turn JSONL logging with live web viewer (v2) (#567)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-11 23:24:54 -07:00
Cameron
593b28892c fix: cast vi.fn() mock to satisfy bun-types fetch type (#571) 2026-03-11 20:13:05 -07:00
Cameron
d25da06852 fix: separate reasoning blocks with newline on markdown boundaries (#569) 2026-03-11 18:11:34 -07:00
Cameron
d873f04cc8 fix(help): centralize Telegram help output with shared command text (#566)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-11 17:27:07 -07:00
Cameron
f60b723f4e fix(telegram): simplify command responses and enrich status output (#565)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-11 16:58:38 -07:00
Cameron
fb32a4c3cd fix(discord): route thread messages with per-thread conversations (#564) 2026-03-11 16:54:19 -07:00
Cameron
13426396ac refactor: extract DisplayPipeline from processMessage stream loop (#550)
Extracts a DisplayPipeline async generator that wraps the raw SDK stream
and yields clean DisplayEvent types. Refactors processMessage() to consume
pipeline events instead of raw StreamMsg objects.

- Locks foreground on first substantive event (reasoning/tool_call/etc),
  eliminating buffering delay for real-time display
- Filters pre-foreground error/retry events to prevent false approval recovery
- Re-throws 429 in rejectApproval to prevent rate-limit loops
- Gates reasoning log on display config
- 12 pipeline unit tests + updated integration tests (56 total)
- Net -224 lines from bot.ts

Written by Cameron ◯ Letta Code

"The purpose of abstraction is not to be vague, but to create a new
semantic level in which one can be absolutely precise." -- Edsger Dijkstra
2026-03-11 16:22:26 -07:00
Cameron
dc4204d6f4 fix: default group chat settings and voice transcription to 'no' in o… (#563) 2026-03-11 16:09:30 -07:00
Cameron
6231af560d test(session): cover invalid tool-call mismatch recovery paths (#562)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-11 15:29:24 -07:00
github-actions[bot]
8973e97464 fix(whatsapp): warn when streaming is set in WhatsApp config (#558)
Co-authored-by: letta-code <248085862+letta-code@users.noreply.github.com>
Co-authored-by: Cameron <cpfiffer@users.noreply.github.com>
2026-03-11 15:18:52 -07:00
Jason Carreira
e38f5a4db7 fix(session): auto-clear stuck conversation on invalid tool call ID mismatch (#555)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 15:18:02 -07:00
github-actions[bot]
535e5680c3 fix: surface memfs errors in heartbeat with actionable diagnostics (#559)
Co-authored-by: letta-code <248085862+letta-code@users.noreply.github.com>
Co-authored-by: Cameron <cameron@pfiffer.org>
2026-03-11 15:10:43 -07:00
github-actions[bot]
0aedc6b4c9 fix: skip reasoning messages in sendToAgent response accumulation (#557)
Co-authored-by: letta-code <248085862+letta-code@users.noreply.github.com>
Co-authored-by: Cameron <cpfiffer@users.noreply.github.com>
Co-authored-by: Cameron <cameron@pfiffer.org>
2026-03-11 15:02:19 -07:00
Cameron
08ee846b71 refactor: extract memfs resolution with server-mode awareness (#560) 2026-03-11 14:51:41 -07:00
Cameron
ef1504bd9a fix(discord): gate managed commands and harden attachment fetches (#549)
Co-authored-by: Letta Code <noreply@letta.com>
2026-03-10 17:03:37 -07:00
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