Commit Graph

326 Commits

Author SHA1 Message Date
Peter Steinberger
ee41d6a424 feat(gateway): enrich agent WS logs 2025-12-20 14:54:38 +00:00
Peter Steinberger
d652afe00a test(web): cover tool summary streaming 2025-12-20 13:53:56 +00:00
Peter Steinberger
89ee820c7c feat(web): stream tool summaries 2025-12-20 13:47:07 +00:00
Peter Steinberger
010b67dd91 fix(browser): restore tsc types 2025-12-20 01:27:51 +00:00
Peter Steinberger
e8892b37ca fix: remove WhatsApp batching delay 2025-12-20 01:48:29 +01:00
Peter Steinberger
98fa02eff2 feat(gateway): support bun-compiled embedded gateway 2025-12-19 19:21:26 +01:00
Peter Steinberger
aa972ab3af Web: fix lint/format for error formatter 2025-12-18 18:22:32 +00:00
Peter Steinberger
102cb4bd40 Web: improve WhatsApp error formatting 2025-12-18 18:03:25 +00:00
Peter Steinberger
3a253ec120 Web: harden WhatsApp creds handling 2025-12-18 17:19:53 +00:00
Peter Steinberger
fe2c5a2a3d test(web): avoid ENOTEMPTY cleanup race 2025-12-17 19:15:19 +00:00
Peter Steinberger
d17d7ba521 feat: embed pi agent runtime 2025-12-17 11:29:04 +01:00
Peter Steinberger
a1eecb7102 test(web): stabilize group heartbeat test 2025-12-14 05:36:01 +00:00
Peter Steinberger
bc0c7f7c08 style: satisfy formatters 2025-12-14 04:03:32 +00:00
Peter Steinberger
3b5162910d test(web): make heartbeat call selection deterministic 2025-12-14 03:59:40 +00:00
Peter Steinberger
ae4fe33a12 fix(web): use heartbeat inbound msg for delivery 2025-12-14 01:55:40 +00:00
Peter Steinberger
59e573643e fix(web): heartbeat fallback after group inbound 2025-12-14 01:26:40 +00:00
Peter Steinberger
138e935b09 feat(mac): host PeekabooBridge for ui 2025-12-13 16:56:22 +00:00
Peter Steinberger
da4a79c932 Cron: add scheduler, wakeups, and run history 2025-12-13 02:34:38 +00:00
Peter Steinberger
d8300af87f test(web): retry session tmp cleanup 2025-12-12 22:55:39 +00:00
Peter Steinberger
717b6584fc fix(gateway): handle SIGTERM shutdown cleanly 2025-12-12 18:28:08 +00:00
Peter Steinberger
ea54d75096 fix(auto-reply): prefer Pi RPC by default 2025-12-12 17:30:34 +00:00
Peter Steinberger
c96432e491 fix(voice): persist WhatsApp last route 2025-12-12 17:28:07 +00:00
Peter Steinberger
2d51f515be style(tests): format imports 2025-12-12 16:47:10 +00:00
Peter Steinberger
ee6120c325 feat(voicewake): route replies to last channel 2025-12-12 16:22:30 +00:00
Peter Steinberger
9b72b8b86c web: default to self-only without config 2025-12-12 01:22:03 +00:00
Peter Steinberger
7459ee656e lint: format and stabilize gateway health 2025-12-10 18:00:33 +00:00
Peter Steinberger
ec646e507e health: gateway-only status and stable reconnect 2025-12-10 16:47:38 +00:00
Peter Steinberger
cb56ab74fc gateway: force ws-only clients 2025-12-10 16:27:54 +00:00
Peter Steinberger
5ab3b922ef feat: add ws chat attachments 2025-12-09 23:16:57 +01:00
Peter Steinberger
19ab44692a web: reuse active listener for sends 2025-12-09 20:37:01 +00:00
Peter Steinberger
d1cf89782e gateway: drop ipc and simplify cli 2025-12-09 20:18:50 +00:00
Peter Steinberger
b4cb58204f gateway: improve conflict handling and logging 2025-12-09 20:07:24 +00:00
Peter Steinberger
70fb8e6799 surface: envelope inbound messages for agent 2025-12-09 18:43:21 +00:00
Peter Steinberger
f847d86da7 chore: rename relay to gateway 2025-12-09 18:00:01 +00:00
Peter Steinberger
d883866ed6 web: log disconnect error detail in reconnect loop 2025-12-09 17:38:49 +00:00
Peter Steinberger
1e84ca69a0 chore: drop runner shim and add committer helper 2025-12-09 17:24:25 +00:00
Peter Steinberger
d1ba45440e msg: retry web/telegram sends and add regression tests 2025-12-09 17:23:04 +00:00
Peter Steinberger
a832b90aae IPC: rename relay socket to gateway.sock 2025-12-09 17:04:58 +00:00
Peter Steinberger
3974a727e5 feat: surface system presence for the agent 2025-12-09 02:25:37 +01:00
Peter Steinberger
59677bc77e fix: block partial replies on external chat surfaces 2025-12-09 01:48:12 +01:00
Peter Steinberger
e663fbb7f2 fix: stop partial replies for whatsapp/telegram surfaces 2025-12-09 01:41:05 +01:00
Peter Steinberger
e5feff1b0e relay: add control channel and heartbeat stream 2025-12-08 21:50:24 +01:00
Peter Steinberger
43183aeff7 RPC: stream heartbeat events to menu 2025-12-08 20:18:54 +01:00
Peter Steinberger
1b888af439 Launch agent: disable autostart without killing running app 2025-12-07 19:01:14 +01:00
Peter Steinberger
8d2fd382e4 build: add local node bin to restart script PATH 2025-12-07 19:01:14 +01:00
Peter Steinberger
e1b888a7aa feat: add heartbeat toggle with live RPC control 2025-12-07 15:32:48 +01:00
Peter Steinberger
55c163bd77 agent: deliver via rpc and voice forward 2025-12-07 06:05:00 +01:00
Peter Steinberger
2438311637 Health: CLI probe and mac UI surfacing 2025-12-07 04:38:20 +00:00
Peter Steinberger
d6eb1add9b CLI: allow --provider flag for login/logout (default whatsapp) 2025-12-07 03:41:27 +00:00
Peter Steinberger
b662fcc9d2 chore: purge warelay references 2025-12-07 03:36:57 +00:00
Peter Steinberger
13826236de feat: unify main session and icon cues 2025-12-06 23:16:23 +01:00
Peter Steinberger
10f61845c1 feat: stream turn completions and tighten rpc timeout 2025-12-05 21:13:17 +00:00
Peter Steinberger
783e81486a chore: redact long texts in web logs 2025-12-05 19:21:23 +00:00
Peter Steinberger
b1f09f9943 chore: drop twilio and go web-only 2025-12-05 19:03:59 +00:00
Peter Steinberger
ed17fe51bd Switch to clawdis RPC mode and complete rebrand 2025-12-05 17:22:53 +00:00
Peter Steinberger
07c7353ccb branding: default to clawdis paths and launchd label 2025-12-04 18:01:30 +00:00
Peter Steinberger
925d1f061a web: fix mentioned JID extraction typing 2025-12-04 17:54:51 +00:00
Eng. Juan Combetto
4e3db62818 fix: resolve lint errors (unused vars, imports, formatting)
- Prefix unused test variables with underscore
- Remove unused piSpec import and idleMs class member
- Fix import ordering and code formatting
2025-12-04 16:15:17 +00:00
Eng. Juan Combetto
0fea51feb5 config: support clawdis.json path for rebranding
- Add CONFIG_PATH_CLAWDIS (~/.clawdis/clawdis.json) as preferred path
- Keep CONFIG_PATH_LEGACY (~/.warelay/warelay.json) for backward compatibility
- Update loadConfig() to check clawdis.json first, fallback to warelay.json
- Fix TypeScript type error in extractMentionedJids (null handling)

Part of the warelay → clawdis rebranding effort.
2025-12-04 16:15:17 +00:00
Peter Steinberger
35459ee524 fix(web): capture mentions from media captions 2025-12-03 15:45:43 +00:00
Peter Steinberger
c5a1020fa4 fix(web): surface media fetch failures 2025-12-03 15:45:43 +00:00
Peter Steinberger
0bdb3b718e feat(web): prime group sessions with member roster 2025-12-03 15:45:43 +00:00
Peter Steinberger
4d6bc8eeaf fix(web): annotate group replies with sender 2025-12-03 13:25:34 +00:00
Peter Steinberger
b83035d13c fix(web): unwrap ephemeral/view-once and keep mentions 2025-12-03 13:15:46 +00:00
Peter Steinberger
922d15c6f3 test(web): ensure group messages carry sender + bypass allowFrom 2025-12-03 13:12:05 +00:00
Peter Steinberger
481c5ea192 fix(web): let group pings bypass allowFrom 2025-12-03 13:11:01 +00:00
Peter Steinberger
46f2e39142 fix(web): allow group replies past allowFrom 2025-12-03 13:08:54 +00:00
Peter Steinberger
a53117273e fix(web): detect self number mentions in group chats 2025-12-03 12:43:20 +00:00
Peter Steinberger
cee6618fd6 feat(web): add group chat mention support 2025-12-03 12:35:18 +00:00
Peter Steinberger
c761de9f0c Web: simplify logout message 2025-12-03 11:04:12 +00:00
Peter Steinberger
11529882e7 Heartbeat: normalize reply arrays for twilio/web 2025-12-03 00:43:28 +00:00
Peter Steinberger
f1ee08659e Heartbeat: normalize array replies 2025-12-03 00:40:19 +00:00
Peter Steinberger
d25d12ca8a Auto-reply: smarter chunking breaks 2025-12-03 00:25:01 +00:00
Peter Steinberger
80b2967ae8 web: handle multi-payload replies 2025-12-02 23:46:11 +00:00
Peter Steinberger
0f378bb640 limits: chunk replies for twilio/web 2025-12-02 23:10:16 +00:00
Joao Lisboa
26ae8c780e style: fix biome lint errors 2025-12-02 21:07:13 +00:00
Peter Steinberger
2a2b662c3e perf(pi): reuse tau rpc for command auto-replies 2025-12-02 20:09:51 +00:00
Peter Steinberger
1f0c022b96 chore(security): purge session store on logout 2025-12-02 16:33:44 +00:00
Peter Steinberger
241941fb70 chore(security): harden ipc socket 2025-12-02 16:09:40 +00:00
Peter Steinberger
84d9501e85 Tests: cover agents and fix web defaults
Co-authored-by: RealSid08 <RealSid08@users.noreply.github.com>
2025-12-02 11:08:00 +00:00
Peter Steinberger
d61e641496 Agents: add pluggable CLIs
Co-authored-by: RealSid08 <RealSid08@users.noreply.github.com>
2025-12-02 11:07:46 +00:00
Peter Steinberger
94a404d769 feat(web): batch inbound messages 2025-12-02 07:54:13 +00:00
Peter Steinberger
32564ca6d3 Add typing indicator after IPC send
After sending via IPC, automatically show "composing" indicator so
user knows more messages may be coming from the running session.
2025-12-02 06:58:17 +00:00
Peter Steinberger
030968e2de Add IPC to prevent Signal session corruption from concurrent connections
When the relay is running, `warelay send` and `warelay heartbeat` now
communicate via Unix socket IPC (~/.warelay/relay.sock) to send messages
through the relay's existing WhatsApp connection.

Previously, these commands created new Baileys sockets that wrote to the
same auth state files, corrupting the Signal session ratchet and causing
the relay's subsequent sends to fail silently.

Changes:
- Add src/web/ipc.ts with Unix socket server/client
- Relay starts IPC server after connecting
- send command tries IPC first, falls back to direct
- heartbeat uses sendWithIpcFallback helper
- inbound.ts exposes sendMessage on listener object
- Messages sent via IPC are added to echo detection set
2025-12-02 06:31:07 +00:00
Peter Steinberger
f2d2d3dce6 web: isolate session fixtures and skip heartbeat when busy 2025-12-02 06:17:16 +00:00
Peter Steinberger
7ea879ac46 Fix test corrupting production sessions.json
The test 'falls back to most recent session when no to is provided' was
using resolveStorePath() which returns the real ~/.warelay/sessions.json.
This overwrote production session data with test values, causing session
fragmentation issues.

Changed to use a temp directory like other tests.
2025-12-02 05:54:31 +00:00
Peter Steinberger
8a94bc1b30 Fix empty result JSON dump and missing heartbeat prefix
Bug fixes:
- Empty result field handling: Changed truthy check to explicit type
  check (`typeof parsed?.text === "string"`) in command-reply.ts.
  Previously, Claude CLI returning `result: ""` would cause raw JSON
  to be sent to WhatsApp.
- Response prefix on heartbeat: Apply `responsePrefix` to heartbeat
  alert messages in runReplyHeartbeat, matching behavior of regular
  message handler.
2025-12-02 04:29:17 +00:00
Peter Steinberger
4c4a08fade Increase watchdog timeout to 30 minutes
Changed from 10 to 30 minutes to avoid false positives when
heartbeatMinutes is set to 10. The watchdog should be significantly
longer than the heartbeat interval to account for:
- Network latency
- Slow command responses
- Brief connection hiccups

With heartbeatMinutes=10, a 30-minute watchdog gives 3x buffer before
triggering auto-restart.
2025-11-30 18:03:19 +00:00
Peter Steinberger
9f1c2169eb Fix test isolation to prevent loading real user config
Tests were picking up real ~/.warelay/warelay.json with emojis and
prefixes (like "🦞"), causing test assertions to fail. Added proper
config mocks to all test files.

Changes:
- Mock loadConfig() in index.core.test.ts, inbound.media.test.ts,
  monitor-inbox.test.ts
- Update test-helpers.ts default mock to disable all prefixes
- Tests now use clean config: no messagePrefix, no responsePrefix,
  no timestamp, allowFrom=["*"]

This ensures tests validate core behavior without user-specific config.
The responsePrefix feature itself is already fully config-driven - this
only fixes test isolation.
2025-11-30 18:00:57 +00:00
Peter Steinberger
a7926fc49f Add auto-recovery from stuck WhatsApp sessions
Fixes issue where unauthorized messages from +212652169245 (5elements spa)
triggered Bad MAC errors and silently killed the event emitter, preventing
all future message processing.

Changes:
1. Early allowFrom filtering in inbound.ts - blocks unauthorized senders
   before they trigger encryption errors
2. Message timeout watchdog - auto-restarts connection if no messages
   received for 10 minutes
3. Health monitoring in heartbeat - warns if >30 min without messages
4. Mock loadConfig in tests to handle new dependency

Root cause: Event emitter stopped firing after Bad MAC errors from
decryption attempts on messages from unauthorized senders. Connection
stayed alive but all subsequent messages.upsert events silently failed.
2025-11-30 17:53:32 +00:00
Peter Steinberger
cfef4e82b1 Skip responsePrefix for HEARTBEAT_OK responses
Preserve exact match so warelay recognizes heartbeat responses
and doesn't send them as messages.
2025-11-29 06:02:21 +00:00
Peter Steinberger
fb2710e1cb Simplify timestampPrefix: bool or timezone string, default true
- timestampPrefix: true (UTC), false (off), or 'America/New_York'
- Removed separate timestampTimezone option
- Default is now enabled (true/UTC) unless explicitly false
2025-11-29 05:29:29 +00:00
Peter Steinberger
29df1639ed Generalize prefix config: messagePrefix + responsePrefix
Replaces samePhoneMarker/samePhoneResponsePrefix with:
- messagePrefix: prefix for all inbound messages
  - Default: '[warelay]' if no allowFrom, else ''
- responsePrefix: prefix for all outbound replies

Also adds timestamp options:
- timestampPrefix: boolean to enable [Nov 29 06:30] format
- timestampTimezone: IANA timezone (default UTC)

Updated README with new config table entries.
2025-11-29 05:27:58 +00:00
Peter Steinberger
a97dfc255d Add timestampPrefix config for datetime awareness
New config options:
- timestampPrefix: boolean - prepend timestamp to messages
- timestampTimezone: string - IANA timezone (default: UTC)

Format: [Nov 29 06:30] - compact but informative
Helps AI assistants stay aware of current date/time.
2025-11-29 05:25:53 +00:00
Peter Steinberger
8d02e34389 Add samePhoneResponsePrefix config option
Automatically prefixes responses with a configurable string when in
same-phone mode. This helps distinguish bot replies from user messages
in the same chat bubble.

Example config:
  "samePhoneResponsePrefix": "🦞"

Will prefix all same-phone replies with the lobster emoji.
2025-11-29 05:24:01 +00:00
Peter Steinberger
a7b6914a64 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
2025-11-29 04:52:21 +00:00
Peter Steinberger
8315896d20 feat(heartbeat): allow manual message and dry-run for web/twilio 2025-11-28 08:14:07 +01:00
Peter Steinberger
258bb716c5 chore: release 1.2.1 2025-11-28 08:11:07 +01:00
Peter Steinberger
6b8240ab72 fix(media): sniff mime and keep extensions 2025-11-28 08:07:53 +01:00
Peter Steinberger
d054d28d99 Heartbeat defaults and ws guard; format 2025-11-27 18:37:30 +01:00
Peter Steinberger
2a4f56e66b Fix WebSocket crash + heartbeat default 10min + docs refresh
- Wrap Baileys connection.update listeners in try-catch to prevent
  unhandled exceptions from crashing the relay process
- Add WebSocket-level error handlers in session.ts
- Add global unhandledRejection/uncaughtException handlers in index.ts
- Make listener.onClose error-safe with .catch() in auto-reply.ts
- Change default heartbeat from 30min to 10min
- Rewrite claude-config.md with personality, better explain personal
  assistant features, add recommended MCPs section
2025-11-27 18:21:14 +01:00
Peter Steinberger
d3119175b5 Fix CI: type gaps and hasMedia check 2025-11-27 18:14:20 +01:00
Peter Steinberger
44570769b7 Heartbeat: add ultrathink marker 2025-11-27 03:15:51 +01:00
Peter Steinberger
67c743d00c Heartbeat: shorten prompt to token 2025-11-27 02:48:23 +01:00
Peter Steinberger
a633e6dc8c Heartbeat: honor session override 2025-11-26 18:32:25 +01:00
Peter Steinberger
53399da89f Heartbeat: allow session-id override (with test) 2025-11-26 18:28:02 +01:00
Peter Steinberger
a24e7125ee Docs: show --all heartbeat example 2025-11-26 18:17:30 +01:00
Peter Steinberger
ba543640d3 Heartbeat: harden targeting and support lid mapping 2025-11-26 18:15:57 +01:00
Peter Steinberger
1c64f83b31 Heartbeat: add relay helper and fix CLI tests 2025-11-26 17:49:34 +01:00
Peter Steinberger
4c58baa14b docs: document heartbeat idle override and tests 2025-11-26 17:31:56 +01:00
Peter Steinberger
0b25836a1b test: cover heartbeat skip preserving session timestamp 2025-11-26 17:29:12 +01:00
Peter Steinberger
250e52abfb feat: add heartbeat idle override and preserve session freshness 2025-11-26 17:26:17 +01:00
Peter Steinberger
4fffed6412 chore: add verbose heartbeat session logging 2025-11-26 17:21:59 +01:00
Peter Steinberger
d644d7eace chore: log heartbeat session snapshot 2025-11-26 17:20:48 +01:00
Peter Steinberger
c0043da6c8 chore: log heartbeat fallback and add test 2025-11-26 17:12:28 +01:00
Peter Steinberger
bf714164d3 fix: heartbeat falls back to last session contact 2025-11-26 17:08:43 +01:00
Peter Steinberger
3dd2baba9d feat: add heartbeat cli and relay trigger 2025-11-26 17:04:43 +01:00
Peter Steinberger
2bb62c1594 docs: finalize web refactor and coverage 2025-11-26 02:54:43 +01:00
Peter Steinberger
76df74ecd9 web: add reconnect logging + troubleshooting doc 2025-11-26 02:41:10 +01:00
Peter Steinberger
dd5774906e web: extract reconnect helpers and add tests 2025-11-26 02:39:31 +01:00
Peter Steinberger
00cd24e7e5 web: add heartbeat and bounded reconnect tuning 2025-11-26 02:34:43 +01:00
Peter Steinberger
8c417ff887 chore: commit pending cli/web test tweaks 2025-11-26 02:19:45 +01:00
Peter Steinberger
da46c8e95f feat(web): add logout command and tests 2025-11-26 01:29:02 +01:00
Peter Steinberger
2cb244ec35 chore(tests): organize web test imports 2025-11-26 01:24:34 +01:00
Peter Steinberger
786a6d4952 test(web): split provider web suite 2025-11-26 01:23:34 +01:00
Peter Steinberger
f4a3c406d0 refactor(web): split provider module 2025-11-26 01:16:54 +01:00