Commit Graph

221 Commits

Author SHA1 Message Date
Cameron
1cad6e6508 feat(core): structured logging with pino (#368) 2026-02-23 16:35:23 -08:00
Cameron
1ce869e5b7 fix(core): gate directive execution in listening mode and anchor paths to workingDir (#371) 2026-02-23 16:28:54 -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
ad4c22ba54 fix(whatsapp): fix encryption retries, session lifecycle, and group defaults (#358)
- Fix getMessage callback to return proto.IMessage for delivery retries
- Store incoming messages in messageStore for bidirectional retry
- Stop calling sock.logout() on server stop (was destroying credentials)
- Suppress noisy stack traces, surface actual disconnect reason
- Remove auto-clearing of credentials on connection failures
- Raise session failure threshold from 3 to 8
- Default group behavior to disabled when no groups config

Written by Cameron and Letta Code
2026-02-23 15:22:38 -08:00
Cameron
b1f72e0150 fix: auto-resolve LETTABOT_API_KEY from lettabot-api.json (#367) 2026-02-23 15:04:25 -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
Cameron
6bda859559 fix: default memfs to false instead of undefined (#362) 2026-02-23 12:59:13 -08:00
Cameron
e7bb2a77f1 feat: community-contributable loom displays (#361) 2026-02-23 12:39:43 -08:00
Cameron
4fa212a9a1 fix: harden agent store persistence and startup agent discovery (#357) 2026-02-23 12:06:53 -08:00
Cameron
0544102fe3 feat: display tool calls and reasoning in channel output (#302) 2026-02-23 09:15:43 -08:00
Cameron
a06641b08d feat: surface meaningful API error messages to users (#350) 2026-02-23 00:11:04 -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
0ee044bf94 fix: reset-conversation clears per-channel conversations in v2 store (#320)
The reset-conversation CLI command was reading/writing the agent JSON file directly, missing the per-channel conversations map introduced with conversation routing. Now uses Store.clearConversation() which clears both the legacy conversationId and all per-channel conversation keys.

Also adds multi-agent awareness: prompts which agent to reset when multiple agents are configured.

Closes #316

Written by Cameron and Letta Code

"Debugging is twice as hard as writing the code in the first place." -- Brian Kernighan
2026-02-21 12:37:22 +01:00
Jason Carreira
38428c1e7c fix: parse directives before checking no-reply marker (#338)
Fixes reaction-only responses triggering spurious error messages. The <no-reply/> check now runs after directive parsing in both finalizeMessage() and the post-stream handler.

Fixes the case where <actions><react emoji="..." /></actions> as the full response would add the reaction but also send an error message.

Written by Cameron and Letta Code

"First, solve the problem. Then, write the code." -- John Johnson
2026-02-21 12:37:02 +01:00
Cameron
d4c3d32a8d fix: replace unhelpful error messages with actionable guidance (#332) 2026-02-21 12:17:12 +01:00
Cameron
6cc59708ff fix(core): harden session lifecycle around init/send failures (#333) 2026-02-21 12:16:58 +01:00
Cameron
83da7069cf revert: remove unreviewed multi-agent routing scaffold (#330) 2026-02-18 14:57:50 +01:00
Sarah Wooders
44c5a70761 fix(core): restore gateway compatibility and unblock build (#327)
Co-authored-by: Letta <noreply@letta.com>
2026-02-17 18:58:55 -08:00
Sarah Wooders
60f70089a6 feat(core): add multi-agent routing foundation
Add config normalization, routing bindings, and per-agent instance management to support channel/account-aware dispatch with default agent fallback.

👾 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta <noreply@letta.com>
2026-02-17 17:34:48 -08:00
Charles Packer
d85a836ba7 test: lock SDK session reuse contract for follow-up sends (#314) 2026-02-16 19:52:17 -08:00
github-actions[bot]
b6bfd14cd9 fix: wire up cron job --deliver flag to actually deliver responses (#290)
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-02-13 18:10:24 -08:00
Cameron
6ef987a04f fix: modernize onboarding group settings with unified modes (#296) 2026-02-13 17:59:40 -08:00
Cameron
c083638be1 feat: remote pairing approval via API (#301) 2026-02-13 17:35:56 -08:00
Cameron
560380d721 feat: per-channel conversation routing (#299) 2026-02-13 17:21:38 -08:00
Cameron
09ce3b810f fix: listen mode streaming leak + receiveBotMessages for Discord (#295) 2026-02-12 18:57:13 -08:00
Cameron
add73bdb51 feat: show version and commit hash in startup banner (#293) 2026-02-12 18:49:20 -08:00
Cameron
296db3a858 fix: expose WhatsApp/Signal connection fields in per-agent config (#294) 2026-02-12 18:40:46 -08:00
John Wessel
d0a34d209e Auto-bind to 0.0.0.0 on container platforms for health checks (#291)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:38:47 -08:00
Cameron
014c2b56aa fix: read heartbeat target from per-agent config (#292) 2026-02-12 18:36:25 -08:00
Cameron
b79d705a99 perf: reuse SDK session subprocess across messages (#289) 2026-02-12 11:24:58 -08:00
Cameron
01ed38a15d feat: per-agent todo system with heartbeat integration (#288) 2026-02-12 10:23:14 -08:00
Cameron
dcd428d598 fix: improve error logging for failed agent runs (#287) 2026-02-11 15:42:17 -08:00
Cameron
de216ea3ff fix: TS compilation errors from #283 squash merge (#286) 2026-02-11 15:24:48 -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
046f15feaa fix: centralize strict config loading and fail fast on invalid config (#280) 2026-02-11 10:47:16 -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
Cameron
9d684b6a69 fix: resolve TS2349 build error in ask-user-question test (#274) 2026-02-10 19:53:34 -08:00
Cameron
358339b76b fix: clarify system prompt to prevent duplicate message delivery (#269) 2026-02-10 19:47:13 -08:00
Cameron
39d2667667 feat: AskUserQuestion channel flow support (#272) 2026-02-10 17:58:47 -08:00
Cameron
57f102dfd4 feat: add loom ASCII art startup banner (#270) 2026-02-10 17:57:19 -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
Charles Packer
c7cb3b723b Merge pull request #260 from letta-ai/feat/disallow-interactive-plan-tools
feat: add disallowed interactive tools config for sessions
2026-02-10 16:20:33 -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
745291841d feat: default new configs to multi-agent format (#261)
* feat: default new configs to multi-agent format

Onboarding and non-interactive config generation now emit the
agents[] array format instead of the legacy agent/channels/features
flat structure. This makes adding a second agent a simple array
append rather than a config format migration.

Existing legacy configs continue to work -- normalizeAgents()
handles both formats at runtime.

Written by Cameron and Letta Code

"The future is already here -- it's just not very evenly distributed." -- William Gibson

* test: add save/load roundtrip tests for agents[] config format

Tests the actual YAML serialization path:
- agents[] written without legacy agent/channels at top level
- roundtrip through save + load + normalizeAgents preserves all fields
- global fields (providers, transcription) stay at top level

Written by Cameron and Letta Code

"Programs must be written for people to read, and only incidentally for machines to execute." -- Abelson & Sussman

* feat: eagerly create agent during onboarding

When the user picks "Create new agent", the agent is now created
immediately (with spinner) rather than deferred to first message.
The agent ID is written directly to lettabot.yaml, making the
config file the single source of truth.

Creates the agent with system prompt, memory blocks, selected model,
display name, skills, and disables tool approvals -- same setup that
bot.ts previously did lazily on first message.

Graceful fallback: if creation fails, falls back to lazy creation.

Written by Cameron and Letta Code

"Make it work, make it right, make it fast." -- Kent Beck
2026-02-10 14:58:46 -08:00
Cameron
e8a97a2cbb fix: add stream debug visibility for tool calls and UUID gap detection (#264)
Tool call events between assistant messages were invisible in [Stream]
debug output, making it hard to understand message finalization timing.

- Add sawNonAssistantSinceLastUuid tracking to warn when assistant UUID
  changes with no visible tool_call/reasoning events in between
- Replace [Bot] tool logging with [Stream]-prefixed structured summaries
  (>>> TOOL CALL, <<< TOOL RESULT) for greppable output
- Bridge DEBUG=1 to DEBUG_SDK=1 so SDK-level dropped wire messages are
  visible when debugging

Written by Cameron ◯ Letta Code

"The stream does not resist the rock; it flows around it, revealing its shape." -- Unknown
2026-02-10 14:49:06 -08:00