letta/creating-letta-code-channels/SKILL.md
Builds and debugs Letta Code channels, including first-party channel adapters and dynamic user channel plugins under ~/.letta/channels. Use when adding Telegram, WhatsApp, Bluesky, Slack, Discord, or custom channel support; testing channel routing, pairing, MessageChannel, runtime dependencies, or channel plugin manifests.
npx skillsauth add letta-ai/skills creating-letta-code-channelsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this when adding or debugging Letta Code channel support.
~/.letta/channels/<id>/) for headless experiments, community plugins, and fast workflow tests.src/channels/<id>/) when the channel needs bespoke Desktop UI, custom account snapshots, Slack/Discord-style auto-routing, rich protocol fields, or migration/compatibility shims.User plugins cannot shadow first-party ids: telegram, slack, and discord are ignored under ~/.letta/channels/. Use ids like telegram-test, whatsapp-community, or custom-chat.
~/letta/letta-code or a worktree.src/channels/README.md on branches with dynamic plugins.~/.letta/channels/<id>/channel.json~/.letta/channels/<id>/plugin.mjs~/.letta/channels/<id>/accounts.jsonmessageActions if agents should reply via MessageChannel.dmPolicy: "pairing" for testing, or allowlist/open for known headless deployments.adapter.onMessage(msg) to route/pairingMessageChannel calls messageActions.handleAction → adapter.sendMessagebun run typecheck, bun run lint, bun run build.Read only what is needed:
references/user-plugins.md — dynamic plugin manifest/account/runtime/headless flow and gotchas.references/first-party-channels.md — first-party channel file cascade and safety checks.references/testing.md — smoke-test checklist and commands.Use the bundled scaffold for a minimal user plugin skeleton. Replace <path-to-this-skill> with this skill directory path:
npx tsx <path-to-this-skill>/scripts/scaffold-user-channel-plugin.ts \
my-channel "My Channel" \
--runtime-package [email protected] \
--runtime-module some-sdk
It creates channel.json, plugin.mjs, and accounts.example.json. Replace the TODO inbound/outbound implementation with the real SDK calls.
MessageChannel silently feels broken if plugin.messageActions is missing. Every plugin that should reply needs describeMessageTool() and handleAction().approve replies.node_modules. Runtime modules should resolve from explicit runtime dirs only.letta channels pair --channel <id> --code <code> --agent <agent-id> --conversation <conversation-id>.pairing.yaml and routing.yaml on the next inbound miss; restart only when adapter/account config itself changed.testing
Navigates archived ChatGPT or Claude-style conversation exports and a MemFS reference archive on demand. Use when recalling what a past assistant knew, searching old conversations, rendering specific chats, seeding reference memory from export sidecars, or mining historical context without doing a full import.
testing
Migrates deprecated Letta Filesystem folders/files to MemFS using markdown document corpora, chunking, local lexical search, and QMD semantic search via the memfs-search skill. Use when replacing folders.files.upload, working with PDFs or document QA, or emulating open_file, grep_file, and search_file behavior.
data-ai
Configures Letta agent compaction settings and custom summarization prompts. Use when a user asks to change an agent's compaction prompt, improve summaries after context eviction, tune sliding-window or all-message compaction, or design companion/coding-agent continuity summaries.
development
Semantic search over agent memory files. Use when you need to find conceptually related memory blocks, discover forgotten reference files, check what you already know before creating new memory, or search beyond exact keyword matching. Currently supports QMD (local, no API keys).