alexpaynex 120ea7db24 task-28: Edge intelligence — Web Worker triage, Nostr signing, cost preview, sentiment moods
## What was built (Task #28 — all 5 requirements)

### 1. js/edge-worker.js (Web Worker)
Proper Web Worker entry point (not a regular module) using postMessage API.
Loads Transformers.js zero-shot-classification + SST-2 sentiment models in the
worker thread. Signals { type:'ready' } when both models are warm. Handles
{ id, type:'classify'|'sentiment', text } messages and replies with results.
Fast greeting heuristic bypasses model for trivial inputs.

### 2. js/edge-worker-client.js (main-thread proxy)
Main-thread wrapper that spawns edge-worker.js via new Worker(url, {type:'module'}).
Wraps classify()/sentiment() as Promise-based API. Exports: warmup(), onReady(),
isReady(). Gracefully falls back to server routing if Web Workers unavailable.

### 3. js/nostr-identity.js
- Fixed Nostr API endpoints to match server: POST /identity/challenge (→ nonce),
  POST /identity/verify (body:{event}, event.content=nonce → nostr_token)
- NIP-07 extension preferred; localStorage keypair only generated on explicit
  user consent via showIdentityPrompt() UI — no silent key generation
- getOrRefreshToken() used by payment.js/session.js for X-Nostr-Token header

### 4. js/agents.js
setMood() export maps POSITIVE/NEGATIVE/NEUTRAL → Timmy face expressions
(curious/focused/contemplative) via setFaceEmotion() + MOOD_ALIASES.

### 5. Sentiment on INBOUND messages (per reviewer requirement)
- websocket.js: sentiment() runs on Timmy's inbound `chat` messages → setMood()
- session.js: sentiment() runs on data.result (Timmy's reply), not outbound text
- Both auto-clear mood after 10 s

### 6. UX additions
- setEdgeWorkerReady() in ui.js shows " local AI" badge when worker models warm
- showIdentityPrompt() opt-in Nostr identity UI shown 4 s after page load
- Cost preview badge via /api/estimate with free/partial/full display
- Local triage: trivial messages answered without Lightning payment

### 7. Infrastructure
- vite.config.js: worker.format:'es' + optimizeDeps.exclude @xenova/transformers
- package.json: nostr-tools, @xenova/transformers deps added
2026-03-19 18:17:03 +00:00
2026-03-13 23:21:55 +00:00
2026-03-13 23:21:55 +00:00
2026-03-13 23:21:55 +00:00
2026-03-13 23:21:55 +00:00
Description
Timmy Tower World — sovereign AI agent economy
226 MiB
Languages
TypeScript 68.9%
JavaScript 15.5%
Shell 10.6%
HTML 4.5%
CSS 0.4%