* Update dependency com.zaxxer:HikariCP to v7
* Regenerate Maven lockfile after rebase
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Dan Crosby <dan@danielcrosby.net>
* Clean up C++ test warnings
* Keep player setup expected map size readable
* Declare direct Bazel module dependencies (#7069)
* Check Shardok map proto parse results
* Prepare Apple and protobuf module resolution
* Declare direct Bazel module dependencies
* Replace file-based ClientTextStore with SQLite implementation
SQLite provides indexed lookups instead of loading/parsing a 5MB+ text file.
This should significantly reduce the ~142ms spent on loadTextStore during
game loading.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add S3 sync for SQLite client text store
- Store dbPath and optional persister reference in SqliteClientTextStore
- Sync database file to cloud storage in saved() method
- Download from cloud storage on load if local file doesn't exist
- Pass persister to createWithData for new game creation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Sync SQLite to S3 immediately after migration
Prevents data loss if server restarts before saved() is called after
migrating from old text-based format to SQLite.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Major version upgrade with new features including:
- Feature flag evaluations on scope(s)
- MDC properties attached to structured logs as attributes
- Various bug fixes and improvements
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Upgrade to the latest AWS SDK for Java v2, which includes many bug fixes,
performance improvements, and new features.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add io.sentry:sentry dependency
- Initialize Sentry from SENTRY_DSN environment variable
- Report uncaught exceptions via ExceptionInterceptor
- Add SENTRY_DSN to docker-compose and CI workflow
When SENTRY_DSN is configured, uncaught exceptions in gRPC handlers
will be reported to Sentry for email/Slack alerts.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Add server-side OAuth authentication infrastructure that supports both
Discord and Google as identity providers, while maintaining backwards
compatibility with existing Basic Auth.
## New Components
- **Auth Proto Definitions**: gRPC service with endpoints for OAuth flow
(GetOAuthUrl, ExchangeCode, SetDisplayName, RefreshToken, GetCurrentUser)
- **User Proto**: Storage schema with admin flag for impersonation support
- **JwtService**: RS256 token creation/validation with 7-day access tokens
- **OAuthService**: OAuth code exchange with Discord and Google APIs
- **UserService**: User CRUD with file-based persistence via Persister
- **AuthServiceImpl**: gRPC service wiring OAuth flow together
## Key Features
- Dual auth: Basic Auth continues working; JWT activates when configured
- Admin impersonation: Set X-Impersonate-User header to debug as another user
- Display name validation: 3-20 chars, alphanumeric + underscore, unique
- Graceful degradation: Server starts without OAuth if keys not configured
## Environment Variables
```bash
# JWT (required for OAuth)
JWT_PRIVATE_KEY='{"kty":"RSA",...}' # RSA key in JWK format
# Discord OAuth
DISCORD_CLIENT_ID=
DISCORD_CLIENT_SECRET=
# Google OAuth
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
```
## Next Steps for Full Integration
1. Generate RSA key for JWT signing
2. Configure Discord/Google OAuth apps with redirect URI eagle0://auth/callback
3. Implement Unity client OAuth flow with system browser + deep links
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Java HttpClient lacks read timeout support for streaming connections.
If the server stops sending data without closing the connection, the
client waits forever. This is a known limitation with no workaround.
OkHttp supports read timeouts via `readTimeout()` on the client builder.
If no data is received for the configured timeout (60s by default), the
connection will timeout with an IOException, allowing proper error
handling and retry.
Changes:
- Add OkHttp and okhttp-sse dependencies to MODULE.bazel
- Create OkHttpSseListener to handle SSE events with CompletableFuture
- Convert ExternalTextGenerationCaller to use OkHttp instead of Java HttpClient
- Add toOkHttpRequest helper to convert Java HttpRequest to OkHttp Request
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* getting there
* moar
* progress
* a few more dependency fixes
* a bit more is passing
* weird staging thing
* more fixes
* fix another
* fix another
* more fixes
* BattalionC constructor
* moar
* moar
* more
* try a regex, gulp
* fix a bunch
* another exception
* some more tests
* province converter
* fixed a few more
* this is actually making progress
* another dep
* more deps
* more deps
* more
* so slooow
* a few more
* remove an asInstanceOf
* moar
* server builds maybe
* different reflection
* hmm
* get exceptions
* missing deps
* a few more fixes
* moar tests
* a few more
* Moar test fixes
* almost there
* just reflection issues now
* Fix Scala 3 compatibility issues in UnrequestedTextHandlerTest
- Fix ScalaTest import for Scala 3 compatibility: use shouldBe and the from Matchers
- Resolve build error that was preventing all tests from passing
All 200 tests now pass successfully with Scala 3.
* remove reflectiveSelectable
* remove staging dependency
* upgrade migration doc
* update to grpc 1.67
* bad
* still fail
* update rules_scala
* update grpc to 1.67.1 (from 1.53.0)
* 1.69.0
* more going back
* more
* protobuf too
* guess I did need the scalapb changes too
* resolve a couple of dep differences
* update protobuf path for ignoring warnings
* suppress another warning in parallel_hashmap
* another explicit dep
* delete, don't comment out