feat: same-phone mode with echo detection and configurable marker

Adds full support for self-messaging setups where you chat with yourself
and an AI assistant replies in the same WhatsApp bubble.

Changes:
- Same-phone mode (from === to) always allowed, bypasses allowFrom check
- Echo detection via bounded Set (max 100) prevents infinite loops
- Configurable samePhoneMarker in config (default: "[same-phone]")
- Messages prefixed with marker so assistants know the context
- fromMe filter removed from inbound.ts (echo detection in auto-reply)
- Verbose logging for same-phone detection and echo skips

Tests:
- Same-phone allowed without/despite allowFrom configuration
- Body prefixed only when from === to
- Non-same-phone rejected when not in allowFrom
This commit is contained in:
Peter Steinberger
2025-11-29 04:50:56 +00:00
parent 5bafe9483d
commit d88ede92b9
9 changed files with 202 additions and 4 deletions

View File

@@ -46,6 +46,7 @@ export type WarelayConfig = {
logging?: LoggingConfig;
inbound?: {
allowFrom?: string[]; // E.164 numbers allowed to trigger auto-reply (without whatsapp:)
samePhoneMarker?: string; // Prefix for same-phone mode messages (default: "[same-phone]")
transcribeAudio?: {
// Optional CLI to turn inbound audio into text; templated args, must output transcript to stdout.
command: string[];
@@ -139,6 +140,7 @@ const WarelaySchema = z.object({
inbound: z
.object({
allowFrom: z.array(z.string()).optional(),
samePhoneMarker: z.string().optional(),
transcribeAudio: z
.object({
command: z.array(z.string()),