- README.md is now English (was README.en.md)
- README.zh.md is now Chinese (was README.md)
- Updated all cross-language links in README.md, README.zh.md, README.ja.md
- No content changes, only file rename and link updates
- Expand area positions from 3 to 8 per zone (breakroom/writing/error)
in both game.js (AREA_POSITIONS) and index.html (getAreaPoint)
- Replace global areaPositionCounters with per-render slot index
(_slotIndex) to ensure consistent position assignment across
poll cycles
Previously, agents in the same area would overlap after the 3rd one
because positions cycled via modulo. The counter-based approach also
caused misalignment when existing agents skipped position increments.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Backend: print STAR_BACKEND_PORT hint so users can change port without
editing app.py (e.g. when 18791 is already in use).
- office-agent-push.py: print state file source and LOCAL_STATUS_URL at
startup so users can verify path and URL when state does not update.
Made-with: Cursor
- Defer applySavedPositionOverrides() until user is authed: check
/assets/auth/status first and only call it when authed, so new
visitors never trigger /assets/positions and /assets/defaults (which
return 401 when not logged in).
- When opening the asset drawer and already authed, call
applySavedPositionOverrides() so saved layout is still applied.
- Same logic in both index.html and electron-standalone.html.
Made-with: Cursor
- Add scripts/gemini_image_generate.py to repo (was only in local skill dir)
- Update SKILL.md section 4: add step-by-step setup for image generation env
- No changes to app.py or any existing logic; script is a standalone addition
- Users can now set up image generation by following SKILL.md instructions
- POST /assets/generate-rpg-background now returns immediately with a
task_id, runs generation in a background thread
- Added GET /assets/generate-rpg-background/poll?task_id=xxx for
frontend to poll completion status
- Frontend polls every 3s with elapsed time display
- Prevents Cloudflare's 100s timeout from killing the connection
- Also extracted shared error handling into _handleGenError()
The fetchStatus function had a duplicated else branch that broke the
try/catch structure, resulting in 'Missing catch or finally after try'
error which prevented the entire page from loading.
- add_no_cache_headers now only applies long-cache headers to 2xx responses
- non-2xx static responses (e.g. 404) get no-cache to prevent CDN from
caching error pages (which was the root cause of office.hyacinth.im
failing to load - Cloudflare cached a 404 for phaser.js for 2.7 days)
- add version cache-bust param to phaser.js script tag (matching all
other static assets)