Alexander Whitestone 65693b1569 feat: publish job completions as Nostr kind:1 events (#13)
On job completion, Timmy generates a privacy-safe 1-3 sentence summary
(via Haiku) and broadcasts it as a signed Nostr kind:1 note.

- New `nostr-publish.ts` utility: signs event with Timmy's nsec,
  publishes to Hermes strfry (HTTP inject) and optionally to an
  external relay (wss://relay.damus.io) via NIP-01 WebSocket.
  Failed publishes are non-blocking (warn + continue).
- `AgentService.generateJobSummary()`: Haiku call producing a public-safe
  summary and category slug; falls back to canned text in stub mode.
- `runWorkInBackground` fires the broadcast fire-and-forget after the
  job DB row is committed; persists the event ID on `jobs.nostr_event_id`.
- Tags: `["t","timmy-tower"]`, job category, link to alexanderwhitestone.com.
- Tower Log includes nostrEventId + njump.me link in the completion log entry.
- DB schema: `nostr_event_id` on `jobs`, `job_id` on `timmy_nostr_events`.
- Migration: `0009_nostr_job_completions.sql`.

Fixes #13

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 16:26:39 -04:00
2026-03-20 20:41:30 +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%