Commit Graph

73 Commits

Author SHA1 Message Date
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
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
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
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
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
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
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
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
Cameron
467f890371 docs: document /api/v1/chat/async endpoint (#518) 2026-03-06 17:39:20 -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
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
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
Cameron
3b23777b02 docs: note that skills CLI commands are directory-scoped (#473) 2026-03-03 11:16:29 -08:00
Cameron
355c96a493 fix: include WORKING_DIR/.skills/ in PATH when spawning session subprocess (#462) 2026-03-02 17:08:16 -08:00
Cameron
01edde976a docs: add skills architecture and authoring guide (#455) 2026-03-02 15:41:19 -08:00
Cameron
5a58d759e0 refactor: extract SessionManager from bot.ts (#457) 2026-03-02 14:46:00 -08:00
Cameron
b3366228ef feat: add disabled conversation mode (#453) 2026-03-02 13:01:38 -08:00
Cameron
db5630740f fix: default cron job delivery to last message target (#454) 2026-03-02 12:53:18 -08:00
Cameron
6a2493da5c feat: make streaming edits toggleable per-channel, disabled by default (#436) 2026-02-27 16:08:51 -08:00
Cameron
481b458af1 feat: cloud deployment support with inline config, Dockerfile, and admin portal (#434) 2026-02-27 15:24:17 -08:00
Cameron
35dad4dedc docs: consolidate conversation routing and document per-chat mode (#426) 2026-02-27 11:30:14 -08:00
Cameron
d11777a1a2 feat: per-agent workingDir config (#412) 2026-02-26 14:22:16 -08:00
Cameron
955bdacab7 fix: merge env var credentials into YAML channel blocks and warn on silent skip (#408) 2026-02-26 10:48:14 -08:00
Cameron
e96ddc1db1 feat: add voice memo responses via TTS (#394) 2026-02-25 16:47:33 -08:00
Cameron
cdfb7e1cd5 docs: add OpenAI-compatible API documentation (#395) 2026-02-25 10:40:41 -08:00
Cameron
1c078421c8 docs: add Open WebUI setup guide (#390) 2026-02-24 15:49:23 -08:00
Jason Carreira
69b3d165d6 Add per-channel conversation overrides (#340)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Cameron <cameron@pfiffer.org>
2026-02-24 11:14:26 -08:00
Cameron
1cad6e6508 feat(core): structured logging with pino (#368) 2026-02-23 16:35:23 -08:00
Jason Carreira
1fbd6d5a2e Add send-file directive and Discord/CLI file support (#319)
Co-authored-by: Jason Carreira <jason@visotrust.com>
Co-authored-by: Cameron <cameron@pfiffer.org>
Co-authored-by: Charles Packer <packercharles@gmail.com>
Co-authored-by: Sarah Wooders <sarahwooders@gmail.com>
Co-authored-by: Letta <noreply@letta.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 15:44:34 -08:00
Cameron
7028f042af fix: display-reasoning stream fixes and Signal compatibility (#355) 2026-02-23 15:00:17 -08:00
jamesdanielwhitford
cae5b104b3 feat: add Mistral Voxtral transcription support (#228) 2026-02-23 13:37:12 -08:00
github-actions[bot]
a3c944bd13 feat: expose memfs (memory filesystem) option in lettabot config and SDK session (#336)
Adds features.memfs config key that controls whether the Letta Code CLI
receives --memfs or --no-memfs when creating/resuming SDK sessions. This
enables lettabot users to opt into git-backed memory filesystem (context
repositories) for persistent local memory sync.

- Config types: memfs?: boolean on AgentConfig.features, LettaBotConfig.features, BotConfig
- Bot wiring: baseSessionOptions() and createAgent() pass memfs to SDK when defined
- Main wiring: YAML config takes precedence, LETTABOT_MEMFS env var as fallback
- Legacy fix: conversations passthrough in single-agent normalization
- Tests: 3 memfs wiring tests (true/false/undefined), 2 conversations passthrough tests
- Docs: configuration.md section with known limitations, example YAML

Fixes #335

Written by Cameron and Letta Code

"The best way to predict the future is to implement it." -- David Heinemeier Hansson
2026-02-22 05:37:01 +01:00
Jason Carreira
4e697001c0 docs: update conversation routing and group config documentation (#318)
Adds documentation for per-channel conversation routing and updated group configuration options. Fills the gap left by the implementation PRs.

Closes #304

Written by Cameron and Letta Code

"Documentation is a love letter that you write to your future self." -- Damian Conway
2026-02-21 12:38:06 +01:00
Cameron
c083638be1 feat: remote pairing approval via API (#301) 2026-02-13 17:35:56 -08:00
Cameron
01ed38a15d feat: per-agent todo system with heartbeat integration (#288) 2026-02-12 10:23:14 -08:00
Cameron
c405c96c9d feat: add per-group allowedUsers filtering for all channels (#283) 2026-02-11 15:20:01 -08:00
Cameron
9550fc0c03 Fix cron-jobs path mismatch between CronService and lettabot-schedule (#284) 2026-02-11 14:04:26 -08:00
Cameron
e395dc58a4 docs: add group behavior and multi-bot sections to Discord setup (#282) 2026-02-11 12:23:32 -08:00
Cameron
c0f82ccd63 Merge remote-tracking branch 'origin/fix/server-api-config' into HEAD
# Conflicts:
#	docs/configuration.md
#	src/config/io.ts
#	src/main.ts
2026-02-10 20:39:54 -08:00
Charles Packer
de1adcf4fe fix: fix server terminology with mode aliases (#277) 2026-02-10 20:34:29 -08:00
Cameron
c4c8b17018 fix: support server.api config, preserve api across onboard, fix load error logging
Three bugs fixed:

1. server.api is now the canonical location for API server config (port,
   host, CORS). Users naturally nest api under server -- this now works.
   Top-level api still accepted with a deprecation warning.

2. Onboarding no longer silently drops api and attachments config when
   saving. Both interactive and non-interactive paths now preserve
   unmanaged top-level fields from the existing config.

3. When YAML parsing fails, the log no longer misleadingly says
   "Loaded from lettabot.yaml". A didLoadFail() flag enables accurate
   status reporting without changing 17+ loadConfig() call sites.

Written by Cameron ◯ Letta Code

"The map is not the territory, but a good map sure helps you find port 6702."
2026-02-10 20:16:36 -08:00
Cameron
83569d968e fix: add LETTA_AGENT_NAME env var and improve Railway docs (#275) 2026-02-10 19:55:16 -08:00
ghosttigerllc-bit
28adc22388 feat: add telegram-mtproto channel for user account messaging (#189)
Co-authored-by: Kai <noreply@gtb.ai>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Cameron <cameron@pfiffer.org>
2026-02-10 17:25:44 -08:00
Cameron
c410decd18 feat: unified group modes (open/listen/mention-only) (#267)
Consolidates listeningGroups and groups.requireMention into a single
groups config with explicit mode per group. Backward compatible --
legacy formats auto-normalize with deprecation warnings.

- Add shared group-mode.ts with isGroupAllowed/resolveGroupMode helpers
- Update all 5 channel adapters to use mode-based gating
- Default to mention-only for configured entries (safe), open when no config
- Listening mode now set at adapter level, bot.ts has legacy fallback
- Fix YAML large-ID parsing for groups map keys (Discord snowflakes)
- Add migration in normalizeAgents for listeningGroups + requireMention
- Add unit tests for group-mode helpers + update all gating tests
- Update docs, README, and example config

Closes #266

Written by Cameron and Letta Code

"Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away." -- Antoine de Saint-Exupery
2026-02-10 16:01:21 -08:00
Cameron
320c1cd6a0 docs: add npm run update script and recommend npm ci (#259)
Users running npm install get a dirty lockfile that blocks git pull.
Add an update script that handles the reset+pull+install+build cycle,
and document npm ci as the recommended install method.

Written by Cameron ◯ Letta Code

"Simplicity is the ultimate sophistication." -- Leonardo da Vinci
2026-02-10 13:25:42 -08:00