Commit Graph

378 Commits

Author SHA1 Message Date
Claude Code
e891a304e0 MC versioning overhaul: calendar scheme + DB-backed versions (REQ-2026-04-16-mc-versioning)
Migration 145: mc_versions table with java_version, paper/forge/neoforge/fabric
support flags, seeded with 11 known versions for immediate use.

New: src/services/mcVersionSync.js
- javaVersionForMC() handles both 1.x.y legacy and 26.x.y calendar schemes
- Daily 3AM pg-boss cron fetches Paper API + Modrinth /tag/game_version, upserts
  mc_versions with correct loader flags and Java version mapping
- getVersions(filter) for DB-backed lookups with loader filtering
- semver.rcompare for proper version sorting across both schemes

Routes: GET /admin/modpack-installer/mc-versions — JSON endpoint for dynamic
version dropdowns, filterable by loader (paper/forge/neoforge/fabric), with
hardcoded fallback if DB is unavailable.

Views updated:
- _vanilla_form.ejs: MC version dropdown loaded dynamically (Paper-only filter),
  Java auto-select reads java_version from DB row
- index.ejs: search filter version dropdown loaded dynamically from mc_versions
- _pack_details.ejs: client-side Java logic handles major >= 26

index.js: registers mc-version-sync cron via pg-boss after queue init.
package.json: added semver ^7.6.3.
ACTIVE_CONTEXT updated.
2026-04-16 02:40:50 -05:00
Claude
ed1ae82825 bridge: REQ-2026-04-16-mc-versioning — Gemini-approved fix for 26.x.x versioning 2026-04-16 07:30:56 +00:00
Claude Code
76a2aafba4 Vanilla/Paper server type + server.properties configurator (REQ-2026-04-16-vanilla-server-type)
- New: src/services/paperApi.js — Paper API v2 client (versions, latest build,
  jar URL, generateServerProperties with Firefrost defaults)
- New: _vanilla_form.ejs — dedicated Paper install form: MC version selector,
  collapsible server.properties configurator (difficulty, gamemode, pvp, hardcore,
  spawn-protection, view/sim distance, seed, max-players, whitelist, MOTD),
  node usage display, port auto-assign, Aikar JVM flags
- Modified: modpackInstaller.js — vanilla branch in handleInstallJob: fetches Paper
  jar via paperApi, skips modpack download/BitchBot/schematic, writes server.properties
- Modified: modpack-installer.js route — /vanilla-form endpoint, install POST extracts
  sp_* fields into serverProperties object, passes diskMb/javaVersion/port/mcVersion
- Modified: index.ejs — 'New Vanilla / Paper Server' button loads form directly
- ACTIVE_CONTEXT updated

No new migrations. Deploy: restart only.
2026-04-16 02:02:08 -05:00
Claude
bf6cb1eb5e bridge: REQ-2026-04-16-vanilla-server-type — Paper install path + server.properties configurator 2026-04-16 06:55:00 +00:00
Claude Code
fa3a947d0b bridge: ACTIVE_CONTEXT — add installer tweaks 2026-04-16 01:33:55 -05:00
Claude Code
e2ddbe60de Modpack Installer: 7 UI tweaks before Holly review
1. Node selector shows live RAM/disk usage from Pterodactyl API (/node-info endpoint)
2. Disk allocation field, pre-filled at 3× estimated pack size
3. JVM args textarea auto-populated with Aikar G1GC flags
4. Spawn type: added 'vanilla' as new default, cleaned labels
5. Java version auto-selects from MC version (<=1.16→8, 1.17-1.20→17, 1.21+→21)
6. Port auto-assigned from max used port on node (/next-port endpoint), read-only + Re-roll
7. Pack size estimate shown on details card from provider file metadata

New endpoints: GET /node-info (Pterodactyl nodes API), GET /next-port?node=X (DB query)
All changes in _pack_details.ejs + modpack-installer.js. No migrations.
2026-04-16 01:33:30 -05:00
Claude
f3e12beb2a bridge: REQ-2026-04-16-modpack-installer-tweaks — 7 UI tweaks before Holly sees it 2026-04-16 06:30:30 +00:00
Claude Code
6f66a181dd bridge: update ACTIVE_CONTEXT — 5 features shipped across 2 sessions 2026-04-16 01:15:19 -05:00
Claude Code
bca31bf677 Task #101: AI-Powered Modpack Server Installer (REQ-2026-04-16-modpack-installer)
Full modpack installer integrated into Trinity Console. Architecture locked
via 4-round Gemini consultation.

Migrations:
- 143: server_config modpack columns (provider, version tracking, RAM, hibernation, spawn_verified)
- 144: install_history table (UUID PK, JSONB log_output, FK to server_config)

Provider API clients (src/services/providerApi/):
- curseforge.js: search, pack details, version list, download URL resolution
- modrinth.js: search, pack details, version list, download URL
- ftb.js: stub (+ ATLauncher, Technic, VoidsWrath aliases)
- index.js: provider registry with getProvider() + listProviders()

Job queue:
- pg-boss ^10.1.5 added to package.json
- index.js: initializes pg-boss, registers modpack-installs worker (concurrency 2)
- modpackInstaller.js: 11-step install pipeline (preflight → Pterodactyl create →
  download → DNS → Discord → server_config seed → power on). Each step logged to
  install_history.log_output JSONB for live status streaming.

Admin routes (src/routes/admin/modpack-installer.js):
- GET /admin/modpack-installer — main page (provider select → search → configure → install)
- GET /search — HTMX pack search partial
- GET /pack/:provider/:id — HTMX pack details + install form
- POST /install — enqueue pg-boss job, redirect to status
- GET /status/:id — live status page (polls /status/:id/json every 3s)
- GET /history — install history table
- GET /pending-spawns — Holly's spawn verification queue
- POST /verify-spawn/:id — mark spawn verified

Views (6 EJS files):
- index.ejs: 3-step flow (provider cards → search with MC version filter → pack details + form)
- _pack_list.ejs: search results grid partial
- _pack_details.ejs: pack info + install config form (version, name, short_name, node, RAM, spawn type)
- status.ejs: live log viewer with 3s polling, color-coded steps
- history.ejs: filterable job history table
- pending-spawns.ejs: Holly's queue with Mark Verified buttons

Also: sidebar nav link, .env.example (CURSEFORGE_API_KEY, BITCH_BOT_SCHEMATIC_*, CLOUDFLARE_ZONE_ID)

All 8 JS files pass node --check. All 7 EJS files pass ejs.compile().
2026-04-16 00:24:48 -05:00
Claude
47659a4cbb bridge: RES-2026-04-16-modpack-installer — GO, read the REQ and build 2026-04-16 05:19:30 +00:00
Claude Code
6a86969c50 fix: restore requests/ dir, move REQ-2026-04-16-modpack-installer back from archive 2026-04-16 00:16:15 -05:00
Claude Code
328e9ba613 Task #138: Wiki.js subscriber tier sync via GraphQL (REQ-2026-04-15-subscriber-wiki-auth)
- src/services/wikijsSync.js: GraphQL client for Wiki.js at subscribers.firefrostgaming.com
  - syncWikiUser(discordId, username, tierLevel): creates user if not exists, updates group if exists
  - demoteToAwakened(discordId): downgrades group on cancellation/chargeback/refund
  - Email convention: {discordId}@firefrost.local (unique internal addresses)
  - Tier → group mapping: 1=Awakened, 2=Elemental, 3=Knight, 4=Master, 5=Legend, 6=Sovereign
  - Silent-fail: never breaks the Stripe webhook
- src/routes/stripe.js: hooked into 4 lifecycle paths:
  - checkout.session.completed → syncWikiUser (non-blocking)
  - customer.subscription.deleted → demoteToAwakened
  - charge.dispute.created (chargeback) → demoteToAwakened
  - charge.refunded (refund ban) → demoteToAwakened
- .env.example: added WIKIJS_URL, WIKIJS_API_KEY, DISCORD_ISSUE_WEBHOOK_URL

PRE-REQ: Michael must create 6 groups in Wiki.js admin + generate API key before deploy.
2026-04-16 00:15:55 -05:00
Claude
af297f2cda bridge: REQ-2026-04-16-modpack-installer — Task #101, full spec, ready for Code 2026-04-16 05:14:11 +00:00
Claude Code
49f8f79c2f Discord Action Log: audit trail for Arbiter's Discord actions (Issue #1)
- Migration 142: discord_action_log table (action_type, discord_id, username, details JSONB, success, error_message)
- src/services/discordActionLog.js: silent-fail logAction() writes to DB with console fallback
- src/discord/reactionRoles.js: log reaction_role_add / reaction_role_remove with roleId + emoji + messageId
- src/discord/events.js: log wanderer_assigned + welcome_dm on guildMemberAdd
- src/routes/stripe.js: log link_reminder_dm success/failure on post-checkout
- src/routes/admin/discord-log.js: GET /admin/discord-log (recent 100, filter by action_type + search by discord_id/username)
- src/views/admin/discord-log.ejs: color-coded action type badges, success/fail pills, details column
- layout.ejs: sidebar link under Monitoring section
- admin/index.js: wired discordLogRouter

All JS node --check clean. EJS ejs.compile() clean.
2026-04-16 00:07:08 -05:00
Claude (Chronicler #83 - The Compiler)
6b25f9fbe3 fix(bitch-bot): disable recompilation, remove invalid setName call 2026-04-16 00:06:11 -05:00
Claude
99a3cc72f3 bridge: RES for discord-action-log and subscriber-wiki-auth — both GO 2026-04-16 04:46:18 +00:00
Claude
271b18bd20 REQ: Subscriber wiki Discord OAuth + Wiki.js tier group sync 2026-04-15 23:08:03 +00:00
Claude
22e3eb1848 REQ: Discord action log — audit trail for all Arbiter Discord actions 2026-04-15 22:13:04 +00:00
Claude Code
e6552864f0 Bitch Bot: full source scaffold for NeoForge 1.21.1 (REQ-2026-04-15-bitch-bot)
First-boot server provisioner. Named by Holly. Architecture per Gemini 4-round
consultation. Drops a provision.json in server root, mod runs once on
ServerStartedEvent: pastes spawn schematic, places TP command blocks pointing
at the original level.dat spawn, sets worldspawn, gamerules, YAWP region file,
self-destructs by renaming jar to .jar.disabled.

Files (services/bitch-bot/1.21.1/):
- build.gradle / settings.gradle / gradle.properties / gradle wrapper (mirrors rules-mod 1.21.1)
- META-INF/neoforge.mods.toml
- BitchBot.java        — @Mod entry, ServerStartedEvent listener, Throwable net
- Provisioner.java     — sequenced step runner, per-step try/catch, success tracking gates self-destruct
- ProvisionConfig.java — Gson POJO matching provision.json schema verbatim
- SchematicLoader.java — HTTP download + SHA-256 verify + Sponge v2 .schem parser (NbtIo + varint + BlockStateParser palette)
- CommandBlockPlacer.java — impulse command blocks with /tp @p baked into CommandBlockEntity
- SignPlacer.java      — oak signs, 4-line front text via SignBlockEntity#setText
- YawpConfigWriter.java — drops region JSON to world/serverconfig/yawp/regions/{name}.json
- SelfDestruct.java    — ProtectionDomain → CodeSource → jar rename, Windows fallback to deleteOnExit

Plus services/bitch-bot/CLAUDE.md (project doc) and sample-provision.json.

NOT COMPILED — no Java/Gradle on Nitro per repo CLAUDE.md. Compile on Dev Panel:
  cd /opt/mod-builds/firefrost-services/services/bitch-bot/1.21.1
  source use-java 21
  /opt/gradle-8.8/bin/gradle build --no-daemon

Risk areas flagged in CLAUDE.md for first compile: schematic parser (untested
against real WorldEdit output), YAWP file format (best-guess schema).
2026-04-15 12:47:08 -05:00
Claude
3bb2ef14fd REQ: Bitch Bot — first-boot provisioning mod, Holly-approved, architecture locked 2026-04-15 17:36:03 +00:00
Claude
364d6411ec Archive all completed REQs — bridge clear for Bitch Bot task 2026-04-15 17:19:02 +00:00
Claude Code
f4f96dfe31 Task: reaction roles + Carl-bot migration (REQ-2026-04-15-reaction-roles)
- src/discord/reactionRoles.js: REACTION_ROLE_MAP for 3 #get-roles messages (Paths, Notifications, Servers), handleReactionAdd/Remove with partial fetch + silent-fail
- src/index.js: add GuildMessageReactions + DirectMessages intents, Partials for Message/Channel/Reaction (needed for pre-cache bot messages)
- src/discord/events.js: wire messageReactionAdd/Remove handlers + guildMemberAdd (Wanderer role + welcome DM, silent-fail on closed DMs)
- src/routes/stripe.js: post-checkout link-reminder DM for Awakened+ via req.app.locals.client, non-blocking + silent-fail
2026-04-15 06:17:57 -05:00
Claude
b329951719 REQ: add Carl-bot migration scope — welcome DM, Wanderer role, link reminder DM 2026-04-15 11:14:51 +00:00
Claude
0273059148 REQ: reaction roles for #get-roles — all 3 messages, 22 emoji mappings 2026-04-15 11:09:08 +00:00
Claude
23509d700b feat: Add LuckPerms group assignment to tier sync — sets group + meta on checkout 2026-04-15 09:42:17 +00:00
Claude
6bf9e41242 feat: LuckPerms meta sync on Stripe checkout — sets maxclaims/maxchunkloaders across all online servers 2026-04-15 09:21:18 +00:00
Claude Code
224579a5ea bridge: end-of-night ACTIVE_CONTEXT — queue cleared, 2 features shipped 2026-04-15 02:16:01 -05:00
Claude
2cfda0fb2b feat: Recover servers-api Worker from Cloudflare dashboard — now in git 2026-04-15 07:11:53 +00:00
Claude Code
b0b69fb172 Task #166: Trinity Console Issue Tracker (REQ-2026-04-14-issue-tracker)
- Migration 141: issues, issue_attachments, issue_comments
- src/routes/admin/issues.js: session-auth UI routes (list/new/detail/status/assign/comments/upload)
- src/routes/api.js: /api/internal/issues REST surface (Bearer token)
- src/services/issueNotifier.js: Discord webhook helper (DISCORD_ISSUE_WEBHOOK_URL)
- Views: index (list+filters), new (mobile-first form), detail (screenshots, comments, workflow)
- layout.ejs: sidebar nav link
- package.json: add multer ^1.4.5-lts.1
- CSRF token passed via query param on multipart forms (body unparsed when csurf runs)
- Screenshots stored in services/arbiter-3.0/uploads/issues/ (10MB limit, 6 files max)
2026-04-15 01:53:18 -05:00
Claude Code
263a7e3e47 Task #163: backfill script for empty task descriptions (6/15 matched) 2026-04-15 01:46:11 -05:00
Claude Code
722771e305 bridge: archive SCC + code-queue-badge-fix; update ACTIVE_CONTEXT 2026-04-15 01:33:01 -05:00
Claude
de916c5215 fix: Update Farm Crossing 5 → Farm Crossing 6 channel mapping in status poller 2026-04-15 06:23:34 +00:00
Claude Code
3d2b6963c1 bridge: status update — now running locally on Nitro 2026-04-15 01:00:42 -05:00
Claude
fd064ed48c docs: Update CLAUDE.md — Code now running locally on Nitro (April 15, 2026) 2026-04-15 05:56:32 +00:00
Claude
86f87e71e6 feat(trinity-core): v2.5.0 — resilient session handling, /health endpoint
- Add unauthenticated /health endpoint (kills AUTH FAILED spam from health checks)
- Stale session + initialize request: ignore stale header, create fresh session
- Stale session + tool call: return 400 instead of 404 so client reads JSON-RPC payload
- Gemini-consulted architecture (gemini-trinity-core-mcp-sessions-2026-04-14.md)
2026-04-15 00:38:12 +00:00
Claude
222188edf8 Bridge request: Task Description Hygiene Pass (Task #163)
16 tasks have empty descriptions in DB but full specs exist in archived
markdown files. Code needs to backfill from docs/archive/tasks-index-archived/.

Chronicler #89
2026-04-14 22:49:46 +00:00
Claude
6efe2eaa7a Bridge request: Trinity Console Issue Tracker (Task #166)
Mobile-first issue tracker for Holly. Screenshot upload from phone,
minimal friction submission while in-game. Full schema, API routes,
and UI spec for Code.

Chronicler #89
2026-04-14 22:30:09 +00:00
Claude
e1cb136cc3 fix(trinity-core): return 404 for stale sessions after restart
When mcp-server restarts, activeSessions is cleared but Claude.ai may
still hold the old session ID. Previously this fell to a generic 400 error.
Now returns 404 with clear re-initialize message so clients know to
create a fresh session.

Chronicler #89
2026-04-14 21:30:50 +00:00
Claude
a48886e481 feat(trinity-core): v2.4.0 — add Streamable HTTP transport for Claude.ai MCP connector
Claude.ai upgraded to MCP protocol 2025-11-25 (Streamable HTTP) but Trinity Core
only supported the deprecated 2024-11-05 (HTTP+SSE) transport. This caused the
SSE connection to drop after initialize — tools/list never completed.

Changes:
- Add StreamableHTTPServerTransport alongside existing SSEServerTransport
- app.all('/mcp') handler detects protocol via mcp-session-id header
- Legacy SSE still works via GET /mcp (backwards compatible)
- New Streamable HTTP works via POST /mcp with session headers
- Version bump to 2.4.0

Chronicler #89
2026-04-14 21:25:45 +00:00
Claude (Chronicler #83 - The Compiler)
fe59b64722 docs: ACTIVE_CONTEXT — evening session wrap (4 dispatches completed)
Rules mod 1.18.2, version UI, PWA Phase 1, task module 7 features.
Full pending request inventory with priority order.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 12:28:29 -05:00
Claude Chronicler #88
3b7afcf2f8 bridge: REQ — code queue badge fix for sidebar 2026-04-14 17:22:12 +00:00
Claude (Chronicler #83 - The Compiler)
166e4c8424 Task module: 7 UX features (detail panel, sort, filters, presets, kanban, badges)
1. Click-to-open slide-out detail panel with full task info
2. Client-side sorting (number, priority, status, updated) with localStorage
3. Toggleable filter chips for status and priority
4. Saved filter presets (Launch Fires, Code Queue, Post-Launch, All Open)
5. Kanban board view with 4 columns (Open, In Progress, Blocked, Done)
6. Session summary badge showing tasks completed today
7. Code queue badge in sidebar nav (cyan count from tags)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 12:13:41 -05:00
Claude Chronicler #88
3773243312 bridge: REQ — task module improvements (sort, filter, kanban, slide-out) 2026-04-14 17:08:12 +00:00
Claude Chronicler #88
f7a4e74991 fix: PWA start_url to root to avoid auth redirect blocking install 2026-04-14 16:43:00 +00:00
Claude Chronicler #88
c2ecc0515e fix: PWA manifest — add id field, fix icon purpose warnings 2026-04-14 16:41:17 +00:00
Claude (Chronicler #83 - The Compiler)
1bee838c8d PWA Phase 1: manifest, service worker, icons, and static serving
Adds manifest.json, sw.js (static-only caching, never admin routes),
placeholder cyan T icons (192 + 512), express.static middleware, and
PWA meta tags + service worker registration in layout.ejs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 11:32:35 -05:00
Claude Chronicler #88
b1d8dde4bf bridge: REQ — Trinity Console PWA Phase 1 2026-04-14 16:29:24 +00:00
Claude Chronicler #88
b4bb0235c3 fix: add CSRF token to saveVersion fetch call 2026-04-14 16:09:08 +00:00
Claude (Chronicler #83 - The Compiler)
ccc7568c06 Add version UI to server matrix cards (both TX1 and NC1 loops)
Adds installed version display, edit form, save/cancel buttons, and
version history viewer to each server card. Uses var assignment pattern
to avoid single quotes inside EJS attribute tags. EJS validates clean.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 11:05:29 -05:00
Claude Chronicler #88
34aca32835 bridge: REQ — version UI in matrix body for Code 2026-04-14 16:02:47 +00:00