Commit Graph

112 Commits

Author SHA1 Message Date
Cameron
13d84245c5 feat: add X-Letta-Source header for telemetry (#73)
Add "X-Letta-Source: lettabot" header to Letta API client
for usage tracking/telemetry.

Closes #72

Written by Cameron ◯ Letta Code

"If you can't measure it, you can't improve it." - Peter Drucker
2026-02-02 16:19:17 -08:00
Cameron
7b27ac1b6c fix(transcription): handle AAC audio format from Signal (#76)
Signal voice messages use .aac format which OpenAI Whisper doesn't
accept directly. Fix by normalizing .aac to .m4a (same codec, different
container name) before sending to the API.

Written by Cameron ◯ Letta Code

"The best error message is the one that never shows up." - Thomas Fuchs
2026-02-02 14:58:47 -08:00
Parth Modi
dd105fd556 Production-grade WhatsApp refactoring with Baileys delivery fixes (#66)
* refactor(whatsapp): production-grade modular architecture + delivery fixes

Major refactoring of WhatsApp integration following OpenClaw's battle-tested
patterns. Implements proper separation of concerns, full type safety, and fixes
critical Baileys delivery issues.

Refactored monolithic 882-line file into modular structure:

New structure (14 files, 2,722 lines):
- src/channels/whatsapp/
  - index.ts (750 lines) - Main orchestration
  - session.ts (289 lines) - Socket creation
  - types.ts (110 lines) - Type definitions
  - utils.ts (171 lines) - Helper functions
  - outbound.ts (181 lines) - Message sending
  - inbound/
    - types.ts (106 lines) - Message types
    - extract.ts (173 lines) - Message parsing
    - access-control.ts (189 lines) - Pairing logic

Shared utilities (reusable across channels):
- src/utils/backoff.ts (155 lines) - Reconnection primitives
- src/utils/dedupe-cache.ts (184 lines) - TTL deduplication
- src/utils/creds-queue.ts (233 lines) - Credential management
- src/utils/debouncer.ts (183 lines) - Message batching

1. Message type filtering - Only process "notify" and "append" types
2. Status/broadcast filtering - Skip @status and @broadcast messages
3. Improved deduplication - Use whatsapp:remoteJid:messageId key
4. History handling - Skip auto-reply for "append" type messages
5. Credentials backup - Backup and validate before saving
6. Read receipts - Send for all messages (except self-chat)
7. WebSocket error handling - Prevent crashes from socket errors
8. Group metadata caching - 5min TTL, reduces API calls
9. Connection timestamp filtering - Skip old messages on reconnect
10. Message debouncing - Batch rapid consecutive messages
11. Full type safety - Replaced 26+ 'any' with proper Baileys types

Implements getMessage callback pattern to solve delivery failures:
- Store sent messages for 24h retry capability
- Storage happens at SEND-TIME (not upsert-time) to avoid race conditions
- Prevents "waiting for this message" errors and single tick issues
- Based on Baileys issue #1767 solution

Key insight: Storing messages in messages.upsert listener interferes with
consecutive message processing. Storing at send-time eliminates race conditions.

Full TypeScript type safety with proper Baileys types:
- Imported WASocket, WAMessage, proto.IMessage from Baileys
- Replaced 26+ instances of 'any' with proper types
- Added null checks for type safety
- All functions properly typed

Impact: Both message delivery AND consecutive message handling now work.
Based on OpenClaw analysis and Baileys community solutions.

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* feat(whatsapp): integrate PR #64 attachment support into modular structure

Port attachment download/upload features from PR #64 to our refactored
modular WhatsApp architecture.

## Features Added

- Media download (images, videos, audio, documents, stickers)
- Media upload (images and documents with captions)
- Size limit enforcement (attachmentsMaxBytes config)
- Metadata-only mode (0 bytes = no download)
- Organized storage (attachmentsDir/whatsapp/chatId/)

## Architecture

Created new module: inbound/media.ts (173 lines)
- unwrapMessageContent() - Unwraps ephemeral/viewOnce messages
- extractMediaPreview() - Quick media detection
- collectAttachments() - Download and save media
- extensionFromMime() - MIME type to extension conversion

Updated modules:
- inbound/types.ts - Added attachments field, AttachmentExtractionConfig
- inbound/extract.ts - Integrated media extraction
- types.ts - Added attachmentsDir, attachmentsMaxBytes to config
- outbound.ts - Added sendFile() for image/document sending
- index.ts - Wired attachment config throughout

## Integration Pattern

Attachments are opt-in via configuration:
- If attachmentsDir configured → Downloads enabled
- If not configured → Text-only mode (backward compatible)
- downloadContentFromMessage imported from Baileys dynamically
- Attachment config passed through extraction pipeline

## Maintains

-  Consecutive message handling
-  getMessage delivery pattern
-  Full type safety
-  Modular architecture
-  All existing functionality

Based on PR #64 by Cameron and Jason, integrated into modular structure.

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>

* feat(whatsapp): add addReaction stub for API completeness

Add addReaction method stub to match upstream API.
Currently a no-op as Baileys reactions not yet supported.

Ensures complete ChannelAdapter interface compatibility.

---------

Co-authored-by: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
2026-02-02 12:47:23 -08:00
Cameron
f3e619cd7b Add testing infrastructure with vitest (#67)
- Add vitest as dev dependency
- Add test scripts: `npm test` (watch) and `npm run test:run` (CI)
- Add initial unit tests for pure utility functions:
  - src/utils/phone.test.ts (10 tests)
  - src/utils/server.test.ts (10 tests)
  - src/channels/attachments.test.ts (6 tests)

All 26 tests passing.

Written by Cameron ◯ Letta Code
2026-02-01 22:38:25 -08:00
Cameron
67f0550bd3 Add inbound attachment support with download, metadata, and pruning (#64)
* Add inbound attachment handling and pruning

* Add Signal attachment support and logging

- Implement full Signal attachment collection (copies from signal-cli dir)
- Add logging when attachments are saved to disk for all channels
- Skip audio attachments in Signal (handled by voice transcription)

Written by Cameron ◯ Letta Code

* Gitignore bun.lock

Keep lockfile local, don't track in repo.

Written by Cameron ◯ Letta Code

---------

Co-authored-by: Jason Carreira <jason@visotrust.com>
2026-02-01 22:14:30 -08:00
puffo
7f12cbdc60 Unify self-hosted URL detection with shared isLettaCloudUrl() (#60)
Docker service hostnames (e.g. http://letta:8283) were misidentified as
Letta Cloud. Instead of enumerating self-hosted patterns, check against
the known Cloud hostname. Everything else is self-hosted.
2026-02-01 20:36:39 -08:00
Parth Modi
d8d140fa71 fix: normalize WhatsApp phone numbers for consistent pairing (#61)
- Add normalizePhoneForStorage() utility to handle @lid, @s.whatsapp.net suffixes
- Strip @lid/@s.whatsapp.net/@g.us and normalize to E.164 format (+prefix)
- Fix pairing approval format mismatch causing re-prompts for approved contacts
- Normalize userId on extraction, storage, and access checks

Fixes issue where approved contacts get pairing codes on every message
due to format inconsistencies:
- Extracted: 54941422981120@lid
- Checked: +54941422981120@lid
- Stored: 54941422981120@lid
- No match!

Now all formats normalize to: +54941422981120
2026-02-01 20:29:27 -08:00
dependabot[bot]
f27227cfc3 chore(deps): bump @letta-ai/letta-client from 1.7.6 to 1.7.7 (#63)
Bumps [@letta-ai/letta-client](https://github.com/letta-ai/letta-node) from 1.7.6 to 1.7.7.
- [Release notes](https://github.com/letta-ai/letta-node/releases)
- [Changelog](https://github.com/letta-ai/letta-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/letta-ai/letta-node/compare/v1.7.6...v1.7.7)

---
updated-dependencies:
- dependency-name: "@letta-ai/letta-client"
  dependency-version: 1.7.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-01 20:19:16 -08:00
dependabot[bot]
4b681b0fa4 chore(deps): bump @letta-ai/letta-code-sdk from 0.0.3 to 0.0.4 (#62)
* chore(deps): bump @letta-ai/letta-code-sdk from 0.0.3 to 0.0.4

Bumps [@letta-ai/letta-code-sdk](https://github.com/letta-ai/letta-code-sdk) from 0.0.3 to 0.0.4.
- [Release notes](https://github.com/letta-ai/letta-code-sdk/releases)
- [Commits](https://github.com/letta-ai/letta-code-sdk/compare/v0.0.3...v0.0.4)

---
updated-dependencies:
- dependency-name: "@letta-ai/letta-code-sdk"
  dependency-version: 0.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Fix SDK 0.0.4 API changes

- createSession() signature changed: (agentId?, options?) instead of (options)
- Remove canUseTool callback - bypassPermissions mode auto-allows all tools

Written by Cameron ◯ Letta Code

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Cameron Pfiffer <cameron@pfiffer.org>
2026-02-01 20:16:27 -08:00
Cameron
053763bf89 Add voice message transcription support (#54)
* Add voice message transcription support (all channels)

Adds OpenAI Whisper transcription for voice messages across all channels:
- Telegram: ctx.message.voice
- WhatsApp: audioMessage via downloadMediaMessage
- Signal: audio attachments from local files
- Slack: audio files via url_private_download
- Discord: audio attachments

Voice messages sent to agent as "[Voice message]: <transcript>"

Configuration (config takes priority over env):
- lettabot.yaml: transcription.apiKey, transcription.model
- Env: OPENAI_API_KEY, TRANSCRIPTION_MODEL

Closes #47

Written by Cameron ◯ Letta Code

"The best interface is no interface - just talk."

* Add voice message documentation to README

- Add Voice Messages to features list
- Add configuration section for transcription
- Document supported channels

Written by Cameron ◯ Letta Code

* Notify users when voice transcription is not configured

Instead of silently ignoring voice messages, send a helpful message
linking to the documentation.

Written by Cameron ◯ Letta Code

* feat: upgrade to letta-code-sdk main + fix Signal voice transcription

- Switch from published SDK (v0.0.3) to local main branch (file:../letta-code-sdk)
- Update bot.ts for new SDK API: createSession(agentId?, options) signature
- Add conversationId tracking to store for proper conversation persistence
- Fix Signal voice transcription: read attachments from ~/.local/share/signal-cli/attachments/
- Fix Telegram markdown ESM issue: make markdownToTelegramV2 async with dynamic import
- Add transcription config to lettabot.yaml
- Add extensive debug logging for queue and session processing

Signal voice messages now properly transcribe and send to agent.

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

Co-Authored-By: Letta <noreply@letta.com>

* fix: update Signal CLI message sender to use daemon JSON-RPC API

- Switch from signal-cli-rest-api to signal-cli daemon (port 8090)
- Use JSON-RPC send method instead of REST /v2/send
- Support group IDs with group: prefix
- Handle 201 responses and empty bodies correctly

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

Co-Authored-By: Letta <noreply@letta.com>

* Add placeholder for untranscribed voice messages on Signal

If a voice-only message arrives and transcription fails or is disabled,
forward a placeholder so the user knows the message was received.

Written by Cameron ◯ Letta Code

---------

Co-authored-by: Letta <noreply@letta.com>
2026-02-01 20:07:57 -08:00
Charles Packer
cf1f03e0c7 Merge pull request #59 from MrDys/main
Update README.md
2026-01-31 14:51:38 -08:00
Sean Hannan
588894d904 Update README.md
Lettabot actually requires Node 20+
2026-01-31 16:31:33 -05:00
Cameron
8017c4617e Add update-notifier to CLI (#53)
Shows a notification when a new version is available, helping users
stay up to date with security fixes.

Written by Cameron ◯ Letta Code
2026-01-30 17:16:49 -08:00
Cameron
6258da1a6e Add update instructions to README (#52)
Written by Cameron ◯ Letta Code
2026-01-30 17:14:14 -08:00
cthomas
c98c5041db Merge pull request #51 from letta-ai/caren/fix-whatsapp-self-chat
fix: whatsapp self-chat setting
2026-01-30 16:46:20 -08:00
Caren Thomas
5c7c2f1fef fix: whatsapp self-chat setting 2026-01-30 16:31:35 -08:00
cthomas
ab8e5651ac Merge pull request #50 from letta-ai/caren/agent-onboarding-improvements
feat: improvements for agent onboarding
2026-01-30 16:30:29 -08:00
Cameron
20ab73cc25 Fix WhatsApp selfChatMode sending to wrong person (#49)
* Fix WhatsApp selfChatMode sending to wrong person

Two safety fixes:

1. Fail-safe on unknown LID - refuse to send instead of letting baileys
   resolve it to potentially the wrong person

2. Improve self-chat detection - remove !senderPn requirement which can
   fail in some cases, causing messages to leak to other contacts

Written by Cameron ◯ Letta Code

"Better to fail loudly than succeed silently at the wrong thing."

* Default selfChatMode to true for WhatsApp and Signal

- main.ts: WhatsApp now uses !== 'false' pattern (like Signal)
- config/io.ts: Only set env var if explicitly false
- onboard.ts: Default to 'personal' in config initialization

Written by Cameron ◯ Letta Code
2026-01-30 16:24:38 -08:00
Caren Thomas
d9de732729 improvements for agent onboarding 2026-01-30 16:21:20 -08:00
cthomas
1d66f42dad feat: add non-interactive onboarding and SKILL.md (#45)
* feat: add non-interactive onboarding and SKILL.md

Add agent-friendly setup flow:
- lettabot onboard --non-interactive flag
- Reads all config from environment variables
- SKILL.md documents env-based setup for agents
- Supports all channels (Telegram, Slack, Discord, WhatsApp, Signal)
- No prompts - ideal for coding agents automating setup

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

Co-Authored-By: Letta <noreply@letta.com>

* fix: address non-interactive setup issues

- Add SLACK_APP_NAME for customizable app name (defaults to LETTA_AGENT_NAME or LettaBot)
- Clarify WhatsApp requires WHATSAPP_ENABLED and WHATSAPP_SELF_CHAT to be explicit
- Document all 5 channels supported (Telegram, Slack, Discord, WhatsApp, Signal)
- Fix WhatsApp selfChat default to be explicit false

* docs: recommend non-interactive setup as primary method

Update README per review feedback to show env-based setup first.
This is simpler for most users and ideal for automation.

* docs: rewrite setup to be AI-first per feedback

Make recommended setup AI-focused:
- Show prompt to paste into AI coding assistants
- AI handles clone/install/config autonomously
- Manual wizard becomes Option 2 for human users

---------

Co-authored-by: Letta <noreply@letta.com>
2026-01-30 16:14:29 -08:00
Cameron
76ea0da8fd Send separate assistant messages as separate channel messages (#31)
* Send separate assistant messages as separate channel messages

Track assistant message UUIDs to detect when a new assistant message
starts. This allows the agent to send multiple messages in response
to a single user message, appearing as separate bubbles.

Complements the existing message-type-change detection with UUID-based
separation for consecutive assistant messages.

Written by Cameron ◯ Letta Code

"Communication works best when it's broken into digestible pieces."

* Clean up bot logging and add message bubble separation

- Remove verbose diagnostic logging (API key, base URL, node version)
- Add useful event logging: tool calls, message sends
- Add UUID-based detection for separate assistant messages
- Messages now appear as separate bubbles when UUID changes

Written by Cameron ◯ Letta Code

"Good logging tells you what happened, not what you already know."
2026-01-30 13:45:08 -08:00
Sarah Wooders
c68ead7a40 Fix heartbeat skip logic to only check user messages (#43)
- Previously heartbeats were skipped if agent had ANY recent activity
  (Gmail polling, cron jobs, other heartbeats, etc.)
- Now only skips if user sent a message in the last 5 minutes
- Added getLastUserMessageTime() to LettaBot to track user messages
- Manual /heartbeat command bypasses the skip check
- Discord /heartbeat now replies with confirmation (Telegram stays silent)

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

Co-authored-by: Letta <noreply@letta.com>
2026-01-30 10:41:52 -08:00
Cameron
365d4d00ce Add diagnostic logging for session initialization (#41)
Log API key presence, base URL, and Node version before initializing
session to help debug timeout issues like #38.

Written by Cameron ◯ Letta Code

"Debugging is twice as hard as writing the code in the first place." - Brian Kernighan
2026-01-30 08:10:53 -08:00
Sarah Wooders
d7d4edab85 Merge pull request #33 from letta-ai/caren/slack-wizard-manifest
Add Slack setup wizard with manifest-based creation
2026-01-29 23:00:49 -08:00
Sarah Wooders
f83b554f2b Merge pull request #36 from letta-ai/fix/module-not-found-error
Fix: Resolve main.js path relative to CLI file, not cwd
2026-01-29 22:59:16 -08:00
Sarah Wooders
b64aea9b61 Fix: Resolve main.js path relative to CLI file, not cwd
When running via `npx lettabot server`, the CLI was looking for
main.js/main.ts relative to process.cwd() (user's directory), but
the compiled files are in the npm cache or node_modules.

Now uses import.meta.url to find main.js in the same directory as
cli.js, which works correctly for:
- npx lettabot
- global install (npm install -g)
- local development

Fixes ERR_MODULE_NOT_FOUND error on server restart.

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

Co-Authored-By: Letta <noreply@letta.com>
2026-01-29 22:58:22 -08:00
Sarah Wooders
e3f4d43dc8 Merge pull request #35 from letta-ai/fix/message-bubbles-and-tool-approval
Fix message bubbles and tool approval
2026-01-29 22:58:08 -08:00
Sarah Wooders
a41966657a Add Google Workspace setup wizard to onboarding
- Add stepGoogle() wizard that guides users through gog CLI setup
- Check/install gog via Homebrew, guide OAuth credential setup
- Let users select existing accounts or add new ones
- Configure which Google services to enable (gmail, calendar, drive, etc.)
- Add GoogleConfig type and integrations.google to config schema
- Wire GMAIL_ACCOUNT env var from YAML config for polling service
- Add discord.js dependency (fixes build)

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

Co-Authored-By: Letta <noreply@letta.com>
2026-01-29 22:51:53 -08:00
Cameron
fe61c8869f Fix message bubbles and tool approval
- Separate message bubbles when stream message type changes
  (e.g., assistant → tool_call → assistant now sends as separate messages)
- Track sentAnyMessage to avoid spurious "(No response from agent)"
- Add canUseTool workaround for SDK v0.0.3 bypassPermissions bug
  (see letta-ai/letta-code-sdk#10)
- Clean up verbose debug logging

Written by Cameron ◯ Letta Code

"The stream of consciousness is not a river but a series of pools." - William James
2026-01-29 21:58:02 -08:00
Caren Thomas
36ee6d7bd5 chore: update package-lock after merge 2026-01-29 18:29:54 -08:00
Caren Thomas
a7fa850b9c Merge main into slack-wizard-manifest 2026-01-29 18:29:33 -08:00
Caren Thomas
11609ea83e feat: add Slack setup wizard with manifest-based creation
3-step wizard using Slack manifest URL:
- Step 1: Create app from manifest (scopes/events/Socket Mode pre-configured)
- Step 2: Install to workspace + copy Bot Token
- Step 3: Get App-Level Token from Socket Mode
- Token validation with success summary
- Manual entry path also gets validation
- Shared validators between flows
- Total time: ~2 minutes

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

Co-Authored-By: Letta <noreply@letta.com>
2026-01-29 18:23:31 -08:00
Cameron
ba196714cc Fix model being overwritten on every message (#32)
The model option was being passed to resumeSession on every message,
causing the SDK to update the agent's model configuration each time.
This resulted in the agent's model being reset to the config default
(e.g., glm-4.7) on every incoming message.

Now model is only passed when creating a new agent, not when resuming
an existing one.

Written by Cameron ◯ Letta Code

"The best code is no code at all." - Jeff Atwood
2026-01-29 18:06:49 -08:00
Cameron
75d18c70b3 Add Apache 2.0 LICENSE file (#30) 2026-01-29 17:18:26 -08:00
Cameron
10aee9bb4b Add Discord setup documentation (#29)
- Create docs/discord-setup.md with full setup guide
- Update README to include Discord in channel list
- Add Discord to network architecture table
2026-01-29 16:52:47 -08:00
cpacker
c176a74533 fix: use correct path for tsx fallback in server command
When running `lettabot server` without a built dist/ directory, the
fallback to tsx was using a path relative to import.meta.url. This
resolved to dist/main.ts when running from the compiled CLI, but that
file doesn't exist (only dist/main.js exists after compilation).

Changed to use an absolute path to src/main.ts for the development
fallback.

Fixes #28

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

Co-Authored-By: Letta <noreply@letta.com>
2026-01-29 16:39:28 -08:00
Cameron
2b8499a220 Fix WhatsApp self-chat bypassing pairing check (#27)
Self-chat messages were incorrectly triggering pairing requests because
the access check didn't skip for self-chat messages.

Added `&& !isSelfChat` to the access check condition so self-chat
messages bypass pairing entirely.

Written by Cameron ◯ Letta Code

"The simplest solution is usually the correct one." - Occam
2026-01-29 16:37:02 -08:00
Cameron
14b1d82e72 Clarify WhatsApp self-chat mode in onboarding (#23)
* Improve Discord onboarding with detailed setup instructions

- Add step-by-step instructions for creating Discord bot
- Include guidance on enabling Message Content Intent
- Show OAuth2 URL Generator steps with required permissions
- Auto-generate invite URL after user enters bot token
  (extracts application ID from token and builds URL with correct permissions)

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

Co-Authored-By: Letta <noreply@letta.com>

* Clarify WhatsApp and Signal self-chat mode in onboarding

Changed confusing yes/no prompts to clearer selects:

WhatsApp:
- "Dedicated bot number" - Responds to all incoming messages
- "My personal number" - Only responds to "Message Yourself" chat

Signal (new):
- "Dedicated bot number" - Responds to all incoming messages
- "My personal number" - Only responds to "Note to Self" chat

This makes it clear what each option actually does.

Written by Cameron ◯ Letta Code

"The question is not what you look at, but what you see." - Thoreau

---------

Co-authored-by: Letta <noreply@letta.com>
2026-01-29 15:41:04 -08:00
Jason Carreira
d420e5d3b5 Add reactions CLI for Telegram/Slack/Discord (#20)
* Add lettabot-react CLI and message IDs

* Expose message IDs for reactions

---------

Co-authored-by: Jason Carreira <jason@visotrust.com>
2026-01-29 15:40:50 -08:00
Cameron
ccc13f4242 Improve Discord onboarding with detailed setup instructions (#22)
- Add step-by-step instructions for creating Discord bot
- Include guidance on enabling Message Content Intent
- Show OAuth2 URL Generator steps with required permissions
- Auto-generate invite URL after user enters bot token
  (extracts application ID from token and builds URL with correct permissions)

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

Co-authored-by: Letta <noreply@letta.com>
2026-01-29 15:31:24 -08:00
Cameron
46ba1a26cc Fix onboarding to preserve existing channel selections (#21)
- Pre-select channels that are already enabled when re-running onboarding
- Improves Discord setup instructions with step-by-step guide
- Better placeholder text for Discord bot token

Previously, re-running onboarding would wipe existing channel configs.

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

Co-authored-by: Letta <noreply@letta.com>
2026-01-29 15:09:28 -08:00
Cameron
c3a19584ce Add Home Assistant documentation to README (#18)
Documents how to install and enable the homeassistant skill from ClawdHub.
The skill sync workflow already supports this - just needed documentation.

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

Co-authored-by: Letta <noreply@letta.com>
2026-01-29 14:43:29 -08:00
Jason Carreira
0f68b9b52f Add Discord channel support (#16)
* Add Discord channel support and pairing (#15)

* Address Discord adapter review feedback

* Fix stream counter after merge

* Remove stream count logging

---------

Co-authored-by: Jason Carreira <jason@visotrust.com>
2026-01-29 14:11:50 -08:00
Cameron
0804367d4b Merge pull request #17 from letta-ai/fix/remove-debug-logs
Remove debug stream logging
2026-01-29 13:14:12 -08:00
Cameron
fa8b2f0311 Remove debug stream logging from bot.ts
These console.logs were useful during development but are noisy in production.

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

Co-Authored-By: Letta <noreply@letta.com>
2026-01-29 13:13:41 -08:00
Charles Packer
487a735530 Merge pull request #12 from letta-ai/caren/add-slack-setup-wizard
feat: add interactive Slack setup wizard
2026-01-29 12:02:30 -08:00
Charles Packer
5e3c0840a2 Merge pull request #11 from letta-ai/fix/format-hints
Re-add format hints to message envelope
2026-01-29 12:02:20 -08:00
Charles Packer
3c730c9f43 Merge pull request #10 from letta-ai/fix/npx-instructions
Fix CLI instructions to use npx prefix
2026-01-29 12:02:12 -08:00
Caren Thomas
1747347036 feat: add interactive Slack setup wizard
- Step-by-step guided setup through all 7 Slack configuration steps
- Opens browser automatically to api.slack.com/apps
- Clear instructions for each screen (app creation, Socket Mode, scopes, events, App Home, install)
- Token validation with Slack API auth.test endpoint
- Shows bot username and workspace after validation
- Input validation for xapp- and xoxb- token formats
- Option to use wizard or fall back to manual token entry
- Wizard is opt-in during onboarding (defaults yes for new setups)

Improves UX over static docs link - users now get guided through the full process with validation at each step.

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

Co-Authored-By: Letta <noreply@letta.com>
2026-01-29 11:47:08 -08:00
Cameron
732e4826a5 Re-add format hints to message envelope
Shows agent what formatting syntax each channel supports:
- Slack: *bold* _italic_ `code`
- Telegram: *bold* _italic_ `code` [links](url)
- WhatsApp: *bold* _italic_ `code`
- Signal: ONLY *bold* _italic_ `code`

This helps the agent use appropriate formatting for each channel.

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

Co-Authored-By: Letta <noreply@letta.com>
2026-01-29 11:22:17 -08:00