Commit Graph

227 Commits

Author SHA1 Message Date
Alexander Whitestone
9972eb59fe feat: add Kimi & Perplexity as visible Workshop agents (#11)
Some checks failed
CI / Typecheck & Lint (pull_request) Failing after 1s
- agent-defs.js: add Kimi (Long Context Analysis, cyan) and Perplexity
  (Real-time Research, pink) with world positions at (-10,-10) and (10,-10)
- agents.js: add 3D geometric bodies for both agents — Kimi as an
  octahedron with orbital rings, Perplexity as an icosahedron with
  scanning tori; idle/active/dormant animations driven by agent state;
  restrict Timmy mood derivation to workshop agents only
- hud-labels.js: show specialization and last-task summary in inspect
  popup; export setLabelLastTask() for WS updates
- websocket.js: handle agent_task_summary messages; call setLabelLastTask
  on job_completed events
- world-state.ts: add kimi and perplexity to initial agentStates; restrict
  _deriveTimmy() to workshop agents only
- event-bus.ts: add AgentExternalEvent type for external agent state changes
- events.ts: handle agent:external_state bus events, broadcast agent_state
  and agent_task_summary WS messages

Fixes #11

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 22:38:09 -04:00
b6569aeedc [claude] Mobile: Job history tab showing completed jobs (#31) (#107) 2026-03-24 02:26:13 +00:00
1e2edeee77 [claude] Nostr identity lifecycle coverage T41–T45 (#55) (#106) 2026-03-24 02:20:34 +00:00
94d2e48455 [gemini] NIP-07 visitor Nostr identity in Workshop (#14) (#104)
Co-authored-by: Claude (Opus 4.6) <claude@hermes.local>
Co-committed-by: Claude (Opus 4.6) <claude@hermes.local>
2026-03-23 22:54:07 +00:00
395b728bde [claude] Rescue gemini/issue-14, delete 44 stale branches (#103) (#105) 2026-03-23 22:51:12 +00:00
77217769c4 [gemini] Add 3D job type indicators (#16) (#102) 2026-03-23 22:27:43 +00:00
2ed21eebb2 feat: Mobile settings screen (#34) (#101) 2026-03-23 22:07:04 +00:00
74522c56dd [gemini] Implement session history management (#40) (#100) 2026-03-23 21:56:40 +00:00
796326467b [gemini] Implement POST /api/relay/policy endpoint (#46) (#99) 2026-03-23 21:43:09 +00:00
0bc4c6f825 [gemini] Implement Lightning-Gated Node Bootstrap feature (#50) (#98) 2026-03-23 21:28:35 +00:00
cd36174a84 [gemini] Issue #58: Confirm existing API response polish (#96)
Some checks failed
CI / Typecheck & Lint (pull_request) Failing after 0s
2026-03-23 21:17:17 +00:00
cf6c117658 [gemini] Nostr Identity + Trust Engine already implemented (#64) (#95) 2026-03-23 21:12:43 +00:00
2ad3403061 [claude] Agent commentary during job execution (#1) (#94) 2026-03-23 20:41:57 +00:00
82a170da87 [claude] Multi-Turn Session Conversation Context (#3) (#92) 2026-03-23 20:38:17 +00:00
0b3dcb12e5 [claude] Workshop Activity Heatmap (24h Job Volume) (#9) (#91) 2026-03-23 20:35:47 +00:00
e41d30d308 [claude] Mobile: Paid job submission with inline Lightning invoice (#25) (#88)
Co-authored-by: Claude (Opus 4.6) <claude@hermes.local>
Co-committed-by: Claude (Opus 4.6) <claude@hermes.local>
2026-03-23 20:20:52 +00:00
3bd67c7869 [claude] Relay account whitelist + trust-gated access (#47) (#90)
Co-authored-by: Claude (Opus 4.6) <claude@hermes.local>
Co-committed-by: Claude (Opus 4.6) <claude@hermes.local>
2026-03-23 20:20:48 +00:00
3843e749a3 [claude] Vite build system: bundle Three.js, remove CDN dependency (#61) (#89) 2026-03-23 20:16:07 +00:00
cbeaa61083 [claude] Timmy slap / ragdoll physics — spring wobble + Pip startle (#43) (#85)
Co-authored-by: Claude (Opus 4.6) <claude@hermes.local>
Co-committed-by: Claude (Opus 4.6) <claude@hermes.local>
2026-03-23 20:14:36 +00:00
95a104aba0 [claude] TypeScript quality gates: ESLint, pre-commit hooks, Gitea CI (#53) (#86)
Co-authored-by: Claude (Opus 4.6) <claude@hermes.local>
Co-committed-by: Claude (Opus 4.6) <claude@hermes.local>
2026-03-23 20:14:32 +00:00
5dc71e1257 [claude] API observability — structured logging + /api/metrics endpoint (#57) (#87) 2026-03-23 20:10:40 +00:00
113095d2f0 [claude] WebGL context loss recovery: Matrix green overlay (#63) (#84) 2026-03-23 20:02:31 +00:00
821aa48543 [claude] Add real-time cost ticker for Workshop interactions (#68) (#82)
Co-authored-by: Claude (Opus 4.6) <claude@hermes.local>
Co-committed-by: Claude (Opus 4.6) <claude@hermes.local>
2026-03-23 20:01:26 +00:00
2fe82988f4 [claude] WebGL context loss recovery: Matrix green overlay (#63) (#83) 2026-03-23 20:00:42 +00:00
fb847b6e53 [claude] Mobile first-launch onboarding walkthrough (#35) (#79)
Co-authored-by: Claude (Opus 4.6) <claude@hermes.local>
Co-committed-by: Claude (Opus 4.6) <claude@hermes.local>
2026-03-23 14:31:47 +00:00
04398e88e0 [claude] Exclude /api paths from tower SPA fallback (#36) (#81) 2026-03-23 02:14:49 +00:00
0bdf9336bc [claude] App-state aware WebSocket reconnect on foreground (#33) (#77) 2026-03-23 01:51:46 +00:00
4ea59f7198 [claude] Context injection — pass conversation history to work model (#39) (#78) 2026-03-23 01:51:22 +00:00
ef3e27d595 [claude] Wire Relay Admin panel into Matrix UI (#49) (#75) 2026-03-23 01:50:44 +00:00
259f515bfd [claude] Add sweep.conf.example and polish auto-sweep infra (#51) (#76) 2026-03-23 01:50:33 +00:00
622428dfa9 [claude] Add Clear history button in session panel (#41) (#74) 2026-03-23 01:49:26 +00:00
4c747aa331 [claude] Derive agentStates from AGENT_DEFS (#59) (#73) 2026-03-23 01:41:13 +00:00
609acc8f66 [claude] Agent debate on borderline eval requests (#21) (#72) 2026-03-23 01:07:52 +00:00
5954a2fdc0 [claude] Fix moderation infinite re-review loop (#27) (#71) 2026-03-23 00:44:57 +00:00
Replit Agent
42b8826d18 fix: install.sh — update Gitea repo reference to replit/timmy-tower 2026-03-20 21:56:42 +00:00
Replit Agent
630a585178 fix: webhook HMAC — Gitea sends raw hex, not sha256= prefixed
Gitea's X-Gitea-Signature header contains raw hex HMAC-SHA256.
GitHub's X-Hub-Signature-256 uses the sha256= prefix.
verifySignature now normalises both formats to raw hex before
timingSafeEqual comparison, so pushes from Gitea trigger deploys.
2026-03-20 21:55:04 +00:00
Replit Agent
fb6b06020e docs: update replit.md — canonical repo is replit/timmy-tower
- Updated Gitea repo path from admin/timmy-tower to replit/timmy-tower
- Updated webhook reference to id:3 on replit/timmy-tower
- Corrected admin user to rockachopa (not 'admin')
2026-03-20 21:53:13 +00:00
Replit Agent
0acec171a3 fix: update Gitea repo path to replit/timmy-tower
- deploy.sh: GITEA_REPO changed from admin/timmy-tower to replit/timmy-tower;
  git clone user changed from admin to replit
- push-to-gitea.sh: GITEA_REPO_OWNER default changed from admin to replit

The admin/timmy-tower repo doesn't exist — admin is not a Gitea username.
Canonical repo is replit/timmy-tower on Hermes Gitea.
2026-03-20 21:50:44 +00:00
Replit Agent
7cbb451821 fix: install.sh hardening per code review
- Marker-based nginx insertion (BEGIN/END comments) instead of brittle sed;
  validates against temp file before patching live nginx.conf
- Gitea pull token check: warns if /root/.gitea-replit-token missing,
  prints creation instructions (deploy.sh fails without it)
- TLS note in summary output: explains HTTP-only transport, recommends TLS
- mkdir -p DEPLOY_DIR; chmod 600 .env
2026-03-20 21:11:10 +00:00
alexpaynex
5ea4a2dd86 feat: push-to-deploy pipeline on Hermes VPS (task #47)
All deploy infrastructure versioned in vps/ directory. Three fixes applied
after code review caught issues in initial implementation:

Scripts installed on VPS via one-time: WEBHOOK_SECRET=$(cat .local/deploy-webhook-secret) ssh root@143.198.27.163 'bash -s' < vps/install.sh

vps/deploy.sh: pull from Hermes Gitea → pnpm build → deploy bundle →
  health check /api/healthz → auto-rollback on failure (fixed: was /api/health)

vps/webhook.js: HMAC-SHA256 validated webhook receiver (port 9000, localhost):
  - Fail-closed: exits at startup if WEBHOOK_SECRET not set (was warn+accept)
  - Single-slot queue: holds latest push during active deploy, runs after
    completion (was silently dropping concurrent pushes)
  - Skips non-main branch pushes

vps/timmy-deploy-hook.service: systemd unit for webhook receiver
vps/timmy-health.service + .timer: health watchdog every 5 min, restarts
  timmy-tower if /api/healthz returns non-200

vps/install.sh: copies scripts, sets WEBHOOK_SECRET, patches nginx for
  /webhook/deploy proxy, enables systemd services

Gitea webhook pre-configured on admin/timmy-tower (id: 1):
  URL: http://143.198.27.163/webhook/deploy
  Secret: .local/deploy-webhook-secret (gitignored)

replit.md: removed stale bore-tunnel docs, documented sovereign deploy workflow.

Deviation: SSH key absent this session — install.sh must be run once by user or
Hermes agent via SSH. Everything else complete and pushed to Hermes Gitea.
2026-03-20 21:08:06 +00:00
Replit Agent
bb3b14029e fix: webhook fail-closed, /api/healthz endpoint, queued deploy
- webhook.js: fail-closed on missing WEBHOOK_SECRET (exits at startup,
  never accepts unsigned requests)
- webhook.js: single-slot queue — push during deploy is held and runs
  after current deploy completes (not silently dropped)
- deploy.sh + health-check.sh: URL corrected to /api/healthz
2026-03-20 21:07:32 +00:00
alexpaynex
66291f8ee6 feat: push-to-deploy pipeline on Hermes VPS (task #47)
Task: set up sovereign push-to-deploy so git push triggers automatic VPS deploy.

What was built (all in vps/ directory, versioned in repo):
- vps/deploy.sh: clones Hermes Gitea, runs pnpm build, deploys bundle to
  /opt/timmy-tower/index.js, health-checks /api/health, auto-rolls back on failure
- vps/webhook.js: Node.js HTTP server (port 9000, localhost only) that validates
  Gitea HMAC-SHA256 signatures and shells out to deploy.sh on POST /deploy
- vps/timmy-deploy-hook.service: systemd unit for webhook receiver (auto-start)
- vps/timmy-health.service + timmy-health.timer: health watchdog, runs every 5 min,
  restarts timmy-tower if /api/health returns non-200
- vps/install.sh: one-time setup script — installs scripts, sets WEBHOOK_SECRET
  in VPS .env, patches nginx to proxy /webhook/deploy, enables systemd services

Gitea webhook pre-configured on admin/timmy-tower repo (id: 1):
  URL: http://143.198.27.163/webhook/deploy
  HMAC secret stored in .local/deploy-webhook-secret (gitignored)

One-time install (from machine with VPS SSH access):
  WEBHOOK_SECRET=$(cat .local/deploy-webhook-secret) ssh root@143.198.27.163 'bash -s' < vps/install.sh

replit.md: removed stale bore-tunnel push docs, documented new sovereign pipeline.

Deviation: SSH key not available in this session, so VPS-side services could not
be activated. The install.sh one-time command must be run by user or Hermes agent.
2026-03-20 21:05:13 +00:00
Replit Agent
06396e2b35 feat: push-to-deploy pipeline on Hermes VPS (task #47)
vps/ directory — all versioned, installed on VPS with one command:
- vps/deploy.sh: pull from Hermes Gitea → pnpm build → deploy bundle
  → health check → auto-rollback on failure
- vps/webhook.js: Node.js webhook receiver (port 9000, HMAC-SHA256)
  validates Gitea signature, runs deploy.sh, skips non-main branches
- vps/timmy-deploy-hook.service: systemd unit for webhook receiver
- vps/timmy-health.service + .timer: health watchdog every 5 min,
  auto-restarts timmy-tower if /api/health returns non-200
- vps/install.sh: one-time VPS setup — installs scripts, sets
  WEBHOOK_SECRET in .env, adds nginx /webhook/deploy block, enables services

Gitea webhook configured on admin/timmy-tower (id: 1):
- URL: http://143.198.27.163/webhook/deploy
- HMAC secret stored in .local/deploy-webhook-secret (gitignored)

One-time install command:
  WEBHOOK_SECRET=$(cat .local/deploy-webhook-secret) \
    ssh root@143.198.27.163 'bash -s' < vps/install.sh

replit.md: removed stale bore-tunnel push instructions; documented
sovereign deploy workflow, monitoring commands, and rollback procedure
2026-03-20 21:04:40 +00:00
alexpaynex
6a4c29eb16 Published your App
Replit-Commit-Author: Deployment
Replit-Commit-Session-Id: 90c7a60b-2c61-4699-b5c6-6a1ac7469a4d
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: bca5769b-f33f-4202-85e3-b4f84e426350
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/9f85e954-647c-46a5-90a7-396e495a805a/90c7a60b-2c61-4699-b5c6-6a1ac7469a4d/G03TLre
Replit-Commit-Deployment-Build-Id: 6750cd6c-5980-4b2b-bcd1-ceb093d94078
Replit-Helium-Checkpoint-Created: true
2026-03-20 21:01:26 +00:00
alexpaynex
0fc4e996a9 Transitioned from Plan to Build mode
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 90c7a60b-2c61-4699-b5c6-6a1ac7469a4d
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 1cb800fd-7dad-416e-ac15-0f2feb75c655
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/9f85e954-647c-46a5-90a7-396e495a805a/90c7a60b-2c61-4699-b5c6-6a1ac7469a4d/G03TLre
Replit-Helium-Checkpoint-Created: true
2026-03-20 20:57:56 +00:00
alexpaynex
cc1f4822b0 Published your App
Replit-Commit-Author: Deployment
Replit-Commit-Session-Id: 90c7a60b-2c61-4699-b5c6-6a1ac7469a4d
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: cb5b1ef3-6461-42bb-9529-8e8dcd5c8a49
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/9f85e954-647c-46a5-90a7-396e495a805a/90c7a60b-2c61-4699-b5c6-6a1ac7469a4d/G03TLre
Replit-Commit-Deployment-Build-Id: 99edf9b8-2830-453a-99ac-d2674c7d16eb
Replit-Helium-Checkpoint-Created: true
2026-03-20 20:41:30 +00:00
Replit Agent
2938a1ac78 chore: push-to-gitea now runs as replit user (collaborator on admin/timmy-tower)
- GITEA_USER defaults to 'replit' (auth identity)
- GITEA_REPO_OWNER defaults to 'admin' (repo owner)
- .gitea-credentials updated to replit user token
- replit user created on hermes Gitea with admin-level collaborator access
2026-03-20 03:10:15 +00:00
Replit Agent
eb40632c6e fix: migrate gitea remote to hermes VPS + fix TS errors from Gemini codegen
- gitea remote now points to http://143.198.27.163:3000/admin/timmy-tower.git
  (no more bore tunnel / Tailscale dependency)
- push-to-gitea.sh: default URL → hermes, user → admin, fix http:// URL injection
- .gitea-credentials: hermes token saved (gitignored)
- orval.config.cjs: converted from .ts (fixed orval v8 TS config loading)
- api-zod/src/index.ts: removed duplicate types/ re-export (both api.ts and types/
  export same names — api.ts is sufficient)
- integrations-gemini-ai/tsconfig.json: types:[] (no @types/node in this pkg)
- batch/utils.ts: import AbortError as named export (not pRetry.AbortError)
- image/index.ts: remove ai re-export (ai only on main client.ts now)
- routes/gemini.ts: req.params[id] cast to String() for Express 5 type compat
- package.json typecheck: exclude mockup-sandbox (pre-existing React 19 ref errors)
2026-03-20 02:52:31 +00:00
Replit Agent
5ee1eb2f88 docs: add Gemini env vars to replit.md; remove completed handoff doc 2026-03-20 02:44:36 +00:00
Replit Agent
67e9f0fd64 fix: lazy Gemini client init — server starts without GEMINI env vars
The GoogleGenAI client threw at module load if AI_INTEGRATIONS_GEMINI_BASE_URL
was unset, crashing the VPS service. Now uses lazy singleton (throws on first use).
Routes return 503 gracefully when Gemini is not configured on the host.
2026-03-20 02:43:52 +00:00