clawd/memory/2026-01-29-clawdnode-sprint.md

218 lines
7.2 KiB
Markdown

# Evening Sprint - 2025-01-29 @ 7pm ET
## PRIORITY 1: Flutter Styleguide (BLOCKING DEPLOYMENT!)
**Task:** Trash current styleguide, rebuild from scratch using exact CSS values.
**Source:** https://inou.com/static/style.css (saved to /tmp/inou-style.css)
**Approach:**
1. Extract ALL values from the CSS exactly
2. Font: Sora (Google Fonts)
3. Base: 15px, line-height 1.5
4. Match every font-size, weight, letter-spacing exactly
5. Test side-by-side with web version
**Key Typography (from styleguide page):**
- Page Title: 2.5rem / 700
- Section Title: 1.4rem / 600
- Subsection Title: 1.1rem / 600
- Label/Category: 0.75rem / 600 / caps
- Intro text: 1.15rem / 300
- Body light: 1rem / 300
- Body regular: 1rem / 400
- Mono: SF Mono
**Colors:**
- Accent: #B45309
- Text: #1C1917
- Text Muted: #78716C
- Background: #F8F7F6
- Success: #059669
- Danger: #DC2626
---
## PRIORITY 2: MoltMobile Phone Assistant
### Goal
Full phone assistant functionality — answer calls, handle spam, relay messages.
## Features to Build
### 1. Answer Phone Calls (InCallService)
- Implement Android InCallService to actually control calls
- Hook into DirectGateway command handlers
- call.answer → actually pick up
- call.reject → actually reject
- call.hangup → actually hang up
### 2. Spam Call Handling
When "spam likely" or unknown number calls:
1. Pick up automatically
2. Ask: "Who is calling and from what company?"
3. Speak legal disclaimer:
> "This call is being recorded. You have reached a number registered on the Do Not Call list.
> This is an unsolicited call. We request immediate removal from your calling list.
> Any recurring call from your organization will result in a formal complaint to the
> Florida Department of Agriculture and Consumer Services and may result in penalties
> of up to $10,000 per violation under the Florida Telemarketing Act."
4. Listen for response
5. Store full conversation verbatim in `~/clawd/memory/calls/YYYY-MM-DD-HH-MM-number.md`
6. Hang up
### 3. Known Number Handling
When a known/saved contact calls:
1. Pick up
2. Say: "Hello, this is James, Johan's assistant. How can I help you?"
3. Listen to their message
4. Respond: "I'll relay [summary] to Johan. Is there anything else?"
5. Say goodbye and hang up
6. Store verbatim transcript in `~/clawd/memory/calls/YYYY-MM-DD-HH-MM-contact.md`
7. Send summary to Johan via Signal
### 4. Answer Texts (SMS)
- Capture incoming SMS via notification
- Identify spam vs legitimate
- For spam: auto-reply "STOP"
- For legitimate: relay to Johan, await instructions
### 5. TTS/STT Integration
- Need text-to-speech for speaking to callers
- Need speech-to-text for transcribing caller's responses
- Options: Android built-in, Google Cloud, ElevenLabs
### 6. 🚨 SUPER ATTENTION MODE
**Purpose:** Maximum urgency alerts — make the phone go CRAZY to get attention.
**Triggers:**
- Gateway command: `POST /attention/super`
- Use case: Medical emergency, Sophia alert, critical system failure
**All of these simultaneously:**
- 📢 **Volume:** Force to MAX (ignore Do Not Disturb)
- 🔔 **Ringtone:** Loudest/most jarring tone available
- 📳 **Vibration:** Continuous strong vibration pattern
- 💡 **Screen:** Full brightness, flashing colors (red/white strobe)
- 🔦 **Flashlight:** Strobe the camera flash LED
- 🔊 **Audio:** Play alarm sound on loop
- 📱 **Wake:** Force screen on, prevent sleep
- 🔁 **Loop:** Continue until acknowledged via app or gateway
**Android APIs needed:**
- `AudioManager.setStreamVolume(STREAM_ALARM, max, FLAG_ALLOW_RINGER_MODES)`
- `Vibrator.vibrate(VibrationEffect.createWaveform(pattern, repeat))`
- `WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | FLAG_TURN_SCREEN_ON`
- `CameraManager.setTorchMode()` for flash strobe
- `PowerManager.WakeLock` to prevent sleep
- Override DND with `NotificationManager.INTERRUPTION_FILTER_ALL`
**Stop conditions:**
- User taps "ACKNOWLEDGE" button on full-screen alert
- Gateway sends `POST /attention/stop`
- Timeout (configurable, default: none — keep going until ack)
### 7. 🌐 Remote Browser (WebView GUI)
**Purpose:** Let James control a browser on the phone — open URLs, interact with pages, take screenshots.
**Simple GUI:**
- Full-screen WebView activity
- Can be launched via gateway command
- Status bar shows "James is browsing"
**Gateway endpoints:**
- `POST /browser/open` — Launch browser activity with URL
- `POST /browser/navigate` — Go to new URL
- `POST /browser/js` — Execute JavaScript
- `GET /browser/screenshot` — Capture current view
- `POST /browser/close` — Close browser activity
**Use cases:**
- Check websites that need mobile view
- Fill out forms that require phone
- Debug mobile-specific issues
- Access phone-only services
- Screenshots of mobile layouts
**Implementation:**
```kotlin
class RemoteBrowserActivity : AppCompatActivity() {
lateinit var webView: WebView
override fun onCreate(savedInstanceState: Bundle?) {
webView = WebView(this).apply {
settings.javaScriptEnabled = true
settings.domStorageEnabled = true
webViewClient = WebViewClient()
}
setContentView(webView)
// Load URL from intent
intent.getStringExtra("url")?.let { webView.loadUrl(it) }
}
fun executeJs(script: String, callback: (String) -> Unit) {
webView.evaluateJavascript(script, callback)
}
fun captureScreenshot(): Bitmap {
val bitmap = Bitmap.createBitmap(webView.width, webView.height, Bitmap.Config.ARGB_8888)
webView.draw(Canvas(bitmap))
return bitmap
}
}
```
**Permissions needed:**
- `android.permission.INTERNET` (already have)
- No special permissions for WebView
## Technical Requirements
### Android InCallService
```kotlin
class MoltMobileCallService : InCallService() {
override fun onCallAdded(call: Call) {
// Can now control the call
call.answer(VideoProfile.STATE_AUDIO_ONLY)
call.reject(false, null)
call.disconnect()
}
}
```
Manifest:
```xml
<service android:name=".calls.MoltMobileCallService"
android:permission="android.permission.BIND_INCALL_SERVICE">
<meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="false"/>
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
</service>
```
### Florida Legal Reference
- Florida Telemarketing Act (Chapter 501, Part IV)
- Do Not Call list violations: up to $10,000 per call
- FDACS complaint: https://www.fdacs.gov/Consumer-Resources/Consumer-Rights-and-Responsibilities/Telemarketing
## Files to Create/Modify
- `calls/MoltMobileCallService.kt` - InCallService implementation
- `calls/CallHandler.kt` - Logic for spam vs known caller handling
- `calls/TtsEngine.kt` - Text-to-speech wrapper
- `calls/SttEngine.kt` - Speech-to-text wrapper
- `gateway/DirectGateway.kt` - Wire up call control
- `AndroidManifest.xml` - Add InCallService
## Gateway Endpoints Needed
- POST /call/speak - TTS to caller
- POST /call/listen - Get transcription
- POST /call/transcript - Full call transcript
- POST /sms/reply - Send SMS reply
## Testing
1. Test with wife's phone (known contact)
2. Test with Google Voice number (unknown)
3. Wait for actual spam call 😈