Highlights
- Rewrote the CLI path in TypeScript/Bun while keeping the legacy Python test suite green.
- Added no-TCP live frame capture with
samoagent join --ws-video.
- Added on-demand frame export with safe defaults: incoming frames stay in memory until
samoagent frame is called.
- Hardened public tunnel surfaces with per-run tokens and safer runtime file permissions.
Agent workflow
samoagent join "<meeting-url>" --ws-video --name Leo --dict postgresfm
samoagent watch
samoagent frame
samoagent chat "..."
samoagent leave
Frame capture
- Uses Recall
video_separate_png.data over WSS through the normal ngrok HTTP tunnel.
- Avoids ngrok TCP, RTMP, and card verification for the preferred frame path.
samoagent frame writes ~/.samoagent/frames/latest.png and latest.json only on demand.
samoagent frame --archive creates timestamped PNG/JSON artifacts with bot, source, and participant metadata.
samoagent join --frame-dir DIR makes the frame output location configurable.
Safety
/webhook is token-protected and size-limited.
/video-ws, /frame, and /frame.json are token-protected.
- Tokenized WSS URLs are not printed or stored in state.
- Default runtime state is owner-only:
0700 directory, 0600 file.
- Explicit user-selected directories such as
/tmp are not chmodded.
Validation
bun run build
bun test - 167 pass, 0 fail
- Legacy Python pytest - 99 passed
- Manual WebSocket/frame smoke passed
- Independent test agent found no blockers
- Independent REV-style review found no findings