Commit Graph

213 Commits

Author SHA1 Message Date
root 3721d2de5b fix: persist admin runtime constants to DB across restarts
Constants were purely in-memory; any server restart reverted them
to code defaults. Now saved to metadata table as JSON on every
autosave and restored on startup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 19:37:17 +00:00
root 53be21e512 fix: increase maxTokens limits to reduce truncation failures
Default 200→400, invention 300→600, desireGeneration 500→800,
backstoryAndDesires 800→1200. Can trim back once we have usage data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 19:32:02 +00:00
root 70ce82302a refactor: use centralized getDayNumber() in inventionSystem 2026-03-10 19:14:04 +00:00
root c71640fd3b feat: broadcast dayNumber in state updates 2026-03-10 19:13:38 +00:00
root 815769ad69 feat: add getCycleTicks() and getDayNumber() to GameLoop 2026-03-10 19:13:27 +00:00
root b32e0f8489 fix: use full OpenRouter model IDs in pricing lookup
MODEL_PRICING keys were 'gpt-oss-120b' but the actual model string
from env is 'openai/gpt-oss-120b'. The lookup always missed, so
calculateCost returned 0 for every call. Updated keys to match the
full OpenRouter model identifiers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:54:36 +00:00
root e465167651 refactor: add jsonResponse flag to auto-inject compact JSON instruction
Templates with jsonResponse:true automatically get the compact
single-line JSON instruction appended to their system prompt via
renderTemplate. Removes manually duplicated JSON formatting
instructions from invention, backstoryAndDesires, and desireGeneration
templates.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:51:36 +00:00
root dc6dd946a2 fix: salvage backstory from truncated JSON, request compact output
Model sometimes returns pretty-printed JSON with newlines/indentation,
wasting tokens and causing truncation. Now requests compact single-line
JSON. When JSON is truncated, regex-extracts the backstory field rather
than setting raw JSON as the backstory text.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:49:06 +00:00
root 2b5bf86b0f fix: bump maxTokens again (800/500) and add conciseness instructions
Post-restart logs show model still hitting 600-token ceiling on verbose
responses — truncated JSON at exactly 599-600 output tokens. Average
successful response was ~418 tokens but outliers reach 600+. Added
explicit conciseness instructions to backstory prompt to reduce variance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:42:56 +00:00
root 0d0080a6ff fix: increase maxTokens for backstory (600) and desire (400) templates
Every single LLM failure was finish_reason='length' — the model was
running out of output tokens before completing the JSON response.
backstoryAndDesires at 350 tokens couldn't fit a backstory + 2 desires
with fulfillment criteria; desireGeneration at 250 was too tight for
a single desire with reasoning.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:38:33 +00:00
root 087426e894 feat: add llm_debug_log table for persistent LLM failure diagnostics
Captures full prompt content, response text, HTTP status, and finish
reason on every LLM failure path. Replaces silent null returns in
openRouterClient with structured CompletionFailure objects so error
details propagate up through the queue and service layers.

Also removes recipeList from backstoryAndDesires prompt (not useful
for backstory generation) and adds schema migration v3.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 18:35:44 +00:00
root 18f649d766 debug: add diagnostic logging to invention system
Every failure path was silent — LLM nulls, parse failures, validation
rejections, and promise errors were all swallowed. Adds per-attempt
logging at each gate plus a periodic summary of NPC/inventory/item state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 17:32:37 +00:00
root 8e6a970ae4 fix: backstory generation reliability and admin LLM stats loading
- Fix LLM stats panel stuck on "Loading stats..." by requesting stats
  immediately after admin authentication succeeds
- Add retry mechanism for backstory generation (up to 3 attempts with
  increasing delays) so transient failures don't permanently skip NPCs
- Fix stale model bug: queued LLM requests now use the current model at
  dequeue time instead of capturing it at enqueue time, so fallback
  model switches take effect for pending requests
- Add per-template maxTokens (backstory: 350, invention: 300, desire:
  250) to prevent "length" finish truncation on structured JSON responses
- Remove unused "reasoning" field from backstory prompt to reduce token usage
- Add failure logging throughout LLM pipeline (backstory null results,
  queue errors) for better diagnostics

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 17:21:00 +00:00
root b6f93dd694 feat: add world preamble to LLM prompts, update gitignore
- Extract shared WORLD_PREAMBLE and prepend to all system prompts
- Remove duplicated world-setting text from individual templates
- Add server/saves/ and treesnstone.zip to .gitignore

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 17:03:38 +00:00
root e5d3517416 feat: add socket handlers for LLM stats and tracking toggle
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 13:25:55 +00:00
root 274789a76a feat: wire llmStatsService into GameLoop
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 13:25:02 +00:00
root 9f31144430 feat: schema migration v1→v2 adding llm_call_log table
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 13:23:47 +00:00
root b9edbee77d feat: instrument llmService to record calls via llmStatsService
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 13:22:11 +00:00
root 478ca06818 feat: add llmStatsService with SQLite persistence and aggregation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 13:20:26 +00:00
root a6c92e7f99 feat: include retry count in openRouterClient CompletionSuccess
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 13:17:45 +00:00
root f3186f6020 feat: add model pricing config and cost calculation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 13:15:57 +00:00
root 6712942436 fix: address code review — auth gating, subscription cleanup, debounce, npcBrainSystem
- Wire npcBrainSystem to RuntimeConstants (was using hardcoded shared imports)
- Add auth gating on admin-update-constant and admin-reset-defaults sockets
- Unsubscribe from previous tab's data sources on left-panel tab switch
- Use per-key debounce timers in AdminPanel to avoid dropped changes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 02:42:51 +00:00
root e5715ec467 feat: wire all gameplay systems to RuntimeConstants
Replace direct constant imports with rc.get() calls in needsDecaySystem,
socialSystem, statModifierSystem, movementSystem, gatheringSystem,
craftingSystem, buildingSystem, and SocketServer. All system functions
now accept a RuntimeConstants parameter, enabling live-tuning of game
constants via the admin panel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 02:35:39 +00:00
root e2670b0c34 feat: add admin auth and log streaming socket handlers
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 02:23:46 +00:00
root ff53096d94 feat: wire LogService into LLM layer for error/warning logging
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 02:22:20 +00:00
root 191770acbe feat: wire LogService into network layer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 02:21:08 +00:00
root 0d8573e11f feat: wire LogService + RuntimeConstants into GameLoop
Replace direct constant imports (TICK_RATE, BROADCAST_EVERY_N_TICKS,
ENERGY_DECAY_PER_TICK, DAY_NIGHT_RATIO) with RuntimeConstants lookups.
Add LogService for autosave logging and tick overrun detection.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 02:19:55 +00:00
root 0d93574e76 feat: add RuntimeConstants service with get/update/reset
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 02:17:50 +00:00
root f8cb83481e feat: add LogService with ring buffer and subscriber push
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 02:17:48 +00:00
root 377b24d225 fix: clean up raw JSON backstories on load from save
Backstories stored as raw JSON (containing desires) are now parsed
on deserialization to extract just the backstory text.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 01:43:47 +00:00
root 034f799431 feat: multi-tile trees with treesnstone tileset and trunk bridging
Replace single-tile tree rendering with 6 multi-tile tree variants using
the treesnstone.png tileset. Each tree is 3 tiles wide with canopy tiles
on the decorations layer (above characters) and ground/shadow tiles on
the trunkDecorations layer (below characters). Add trunk bridge tiles
(tile 41) behind transparent canopy areas to connect canopy to ground
visually, fixing floating canopy appearance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 01:22:47 +00:00
root a8f27a869d fix: emit desire_fulfilled events, populate LLM context, fix category scoring
- desireFulfillmentSystem records memory events when desires are fulfilled
- desireGeneratorSystem populates recentEvents and recentInventions template vars
- industrySystem own_item_category scoring now checks recipe output category

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:14:35 +00:00
root f3591e68d7 feat: industrySystem scores recipes by desire match
Adds scoreCraftableRecipes helper that scores recipes based on NPC
desires (priority * 10 for own_item match). Falls back to first
available when no desires match.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:07:09 +00:00
root c548d0ac05 test: add desire lifecycle integration test
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:04:30 +00:00
root 7ef9636307 feat: wire desire systems into GameLoop and spawner
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:02:40 +00:00
root 733cdfb20f feat: send desires to client via state serializer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:00:20 +00:00
root a63ff776de feat: persist desires component in entity serializer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:59:47 +00:00
root cf5558ce0f feat: pass NPC desires into invention prompts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:59:29 +00:00
root 808ffc06c6 feat: add desire generator system for periodic and event-driven desire creation
Factory-function system that generates new desires via LLM based on
periodic stat-based probability checks and external event triggers.
Tracks pending entities to prevent duplicate in-flight requests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:55:29 +00:00
root 5835206171 feat: add combined backstory + desires LLM generator
Add backstoryAndDesires and desireGeneration templates. Rewrite
backstoryGenerator with getWorldContext, validateDesire, and
generateBackstoryAndDesires helpers while keeping legacy generateBackstory
for backward compatibility. Add comprehensive tests (22 cases).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:50:51 +00:00
root 979a318651 refactor: reframe LLM templates from medieval to frontier settlement
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:47:21 +00:00
root f94a6363aa feat: add desire fulfillment system with criteria checks
Checks NPC desires against world state every 100 ticks and removes
fulfilled ones. Supports own_item, own_item_category, structure_exists,
relationship_tier, recipe_exists criteria. building_exists and custom
always return false (deferred).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:44:46 +00:00
root d3706c90b8 feat: add desireConfig with tuning values
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:42:04 +00:00
root ee7f22c2c3 feat: ensure default stockpiles on load, use full stat names in backstory prompts
- Add ensureDefaultStockpiles() to handle saves from before stockpile spawning
- Switch backstory prompt stat formatting from abbreviations (STR, DEX) to
  full names (strength, dexterity) for better LLM comprehension
- Add prior design/plan docs for LLM fallback and NPC sleep system

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 22:05:14 +00:00
root 1da03c46f3 refactor: extract findNearestStockpile helper in npcBrainSystem
Deduplicates stockpile-finding logic that was repeated in the dropoff
preservation block and the target selection block.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:55:26 +00:00
root a84b93bfd3 feat: gatheringSystem uses carry capacity for dropoff decision
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:52:15 +00:00
root 18b011fbf5 fix: preserve dropoff goal in npcBrainSystem and add carry capacity priority
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:50:48 +00:00
root a9c1cd55d6 feat: add getCarryCapacity stat helper
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:49:29 +00:00
root 1bfb9c581c feat: add getTotalItemCount inventory helper
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 21:48:46 +00:00
root 219f02d7d6 test: add integration test for stat-driven invention prompt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 20:37:25 +00:00