KoalaTrapLord
80f63f192a
fix: update DeepSeek endpoint IP in coach.py
2026-03-20 11:06:30 -04:00
KoalaTrapLord
46ed2f5606
fix: update DeepSeek endpoint IP from 192.168.0.122 to 192.168.0.240 in simulator.html
2026-03-20 11:05:10 -04:00
KoalaTrapLord
93a421b90a
fix: make colons optional in all regex patterns to match Forge output format (no colons after Game Outcome, Life, Add To Stack, Land, Zone Change, etc.); fix VERBOSE_TURN_PATTERN for 'Turn Turn N AiX' format; fix LIFE_CHANGE_PATTERN to use space instead of > separator
2026-03-20 09:26:02 -04:00
KoalaTrapLord
ee95f26bc4
fix: restore double-backslash escaping in Ai regex patterns (fixes compilation errors)
2026-03-20 09:03:55 -04:00
KoalaTrapLord
2ee574f678
diag: add [COMBAT-LINE] logging to identify Forge verbose output format for combat stats parsing
2026-03-20 08:15:03 -04:00
KoalaTrapLord
473a2bdcc7
fix: make Ai regex patterns support both Ai(N) and AiN formats for Forge output compatibility
2026-03-19 23:29:53 -04:00
KoalaTrapLord
a6e50ee0f0
feat: aggregate combat stats in StatsAggregator
2026-03-19 22:45:05 -04:00
KoalaTrapLord
e2a6a75fd9
feat: add combat stat fields to DeckSummary schema
2026-03-19 22:39:51 -04:00
KoalaTrapLord
030bdf2b81
fix: CAST_PATTERN and LAND_PLAY_PATTERN regex to match Forge verbose log prefixes
...
- CAST_PATTERN: Add optional (?:Add To Stack:\s*)? prefix to match Forge's verbose log format
- LAND_PLAY_PATTERN: Add optional (?:Land:\s*)? prefix to match Forge's verbose log format
- Add [PARSE] diagnostic logging after combat stats parsing to confirm spells/lands/cmdr stats per seat
Root cause: Forge verbose output prefixes cast lines with "Add To Stack: " and land lines with "Land: "
but the regexes expected Ai(N) at the start of the line, causing 0 matches for all combat stats.
2026-03-19 22:06:17 -04:00
KoalaTrapLord
e5377ef4bc
fix: correct indentation and add forge-gui candidate path
2026-03-19 18:24:57 -04:00
KoalaTrapLord
56ea2602b4
fix: scan sibling dirs for res/ in _resolve_forge_dir (finds forge-gui/res)
2026-03-19 18:19:32 -04:00
KoalaTrapLord
d86109c5c0
Fix duplicate WHERE clause in _load_deck_cards_by_name SQL query
2026-03-19 17:54:34 -04:00
KoalaTrapLord
d9dd098ca3
fix: add power, toughness, keywords to _load_deck_cards_by_name SQL query
2026-03-19 17:43:57 -04:00
KoalaTrapLord
69ce5b340e
fix: normalize indentation in _finish_sim (line 184-185)
2026-03-19 17:13:13 -04:00
KoalaTrapLord
103a74a0e1
fix: update DeepSeek brain default api_base to 192.168.0.240:1234
2026-03-19 17:11:56 -04:00
KoalaTrapLord
147121582b
fix: update DeepSeek/LM Studio default URL to 192.168.0.240:1234
2026-03-19 17:10:14 -04:00
KoalaTrapLord
8be96ab47d
fix: use coach.report_generator for deck report generation
2026-03-19 17:05:03 -04:00
KoalaTrapLord
e2653b3f72
fix: align sim results path with coach (routes/results)
2026-03-19 17:03:00 -04:00
KoalaTrapLord
7efac34279
fix: persist sim results to disk + auto-generate deck reports
2026-03-19 16:59:55 -04:00
KoalaTrapLord
b00df14f30
fix: use card_name key from _load_deck_cards_by_name (KeyError: 'name')
2026-03-19 16:51:27 -04:00
KoalaTrapLord
3542efd982
fix: align build_java_command with LabCli picocli args (--forge-jar, --forge-dir, --deck1..4)
2026-03-19 16:42:03 -04:00
KoalaTrapLord
1f93b5510d
fix: add missing load_weights() to rules.py
2026-03-19 15:49:00 -04:00
KoalaTrapLord
5c31be6023
fix: add Config extra=ignore to DeckCardWithStatus to prevent 422 from adapter extra fields
2026-03-19 15:34:18 -04:00
KoalaTrapLord
76139477be
fix: replace pplx.model with getattr, update V3 error messages for Ollama
2026-03-19 15:26:15 -04:00
KoalaTrapLord
0e5d7ba7d3
fix: harden _find_java17 to search multiple vendors, JAVA_HOME, and warn on wrong version
2026-03-19 15:23:44 -04:00
KoalaTrapLord
4ec6ed57d5
fix: add missing urllib imports to deckbuilder.py for Scryfall card lookup
2026-03-19 15:11:33 -04:00
KoalaTrapLord
08d81a4336
fix: remove stale Perplexity API key error message, allow Ollama/local mode to generate without hard block
2026-03-19 14:58:39 -04:00
KoalaTrapLord
f6ed40a253
fix: correct indentation in init_coach_service V3 deck gen block
2026-03-19 14:46:16 -04:00
KoalaTrapLord
9fd39e42c7
feat(phase-10): add DeckBuilderAdapter unit tests
2026-03-19 14:35:00 -04:00
KoalaTrapLord
72107df2ae
feat(phase-10): add comprehensive Pydantic model tests
2026-03-19 14:32:43 -04:00
KoalaTrapLord
2738bbdba4
feat: add scrython>=2.0.0 to requirements.txt
2026-03-19 14:28:38 -04:00
KoalaTrapLord
0bbc78ef23
fix: rewire routes/coach.py to use DeckBuilderAdapter + fix IndentationError
2026-03-19 14:02:23 -04:00
KoalaTrapLord
c2b470e251
refactor: replace DeckGeneratorV3 import with DeckBuilderAdapter alias
2026-03-19 13:50:30 -04:00
KoalaTrapLord
6135feb644
feat: add run_substitution stub + clean up adapter
2026-03-19 13:49:13 -04:00
KoalaTrapLord
b3b664872b
refactor: rewire V3 deck gen init to use DeckBuilderAdapter (Ollama)
2026-03-19 13:41:15 -04:00
KoalaTrapLord
a80e8908e1
fix: indent _deck_gen_v3_error inside if block in coach.py
2026-03-19 13:35:44 -04:00
KoalaTrapLord
a8ef10d5b7
feat: add DeckBuilderAdapter to bridge Ollama pipeline to legacy API
2026-03-19 13:24:29 -04:00
KoalaTrapLord
86af4b6de5
fix: close missing paren in _call_pplx_api client.post()
2026-03-19 13:16:22 -04:00
KoalaTrapLord
332606d6b5
Merge pull request #62 from KoalaTrapLord/feat/deck-builder-phase0
...
feat: Commander AI Deck Builder (Ollama gpt-oss:20b)
2026-03-19 12:45:04 -04:00
KoalaTrapLord
70dfa3d3e0
fix: robust JSON extraction for LLM responses (_extract_json)
2026-03-19 12:29:49 -04:00
KoalaTrapLord
f970b6d571
fix: api __init__ imports modules not classes
2026-03-19 12:08:26 -04:00
KoalaTrapLord
5ade916207
fix: make conversation log always visible with initial ready message
2026-03-19 11:50:52 -04:00
KoalaTrapLord
cc53c58344
feat(phase-0): add deck builder deps (requests, bs4, ollama)
2026-03-19 11:33:45 -04:00
KoalaTrapLord
3e64aa67eb
feat(phase-6): implement deck assembler (Ollama JSON parser)
2026-03-19 11:32:14 -04:00
KoalaTrapLord
70a7c07b81
feat: add conversation log panel below Generate Deck button
2026-03-19 11:31:10 -04:00
KoalaTrapLord
1b4e9f5a66
feat(phase-3): implement community scraper (Moxfield + Archidekt)
2026-03-19 11:30:53 -04:00
KoalaTrapLord
c962d1f16a
feat(phase-9): implement FastAPI + CLI entrypoint
2026-03-19 11:29:29 -04:00
KoalaTrapLord
dcdf15c56a
feat(phase-8): add deck_builder package init with public API
2026-03-19 11:28:08 -04:00
KoalaTrapLord
b0214009f4
feat(phase-8): add api __init__ exports
2026-03-19 11:27:07 -04:00
KoalaTrapLord
5fe0ac2bd6
feat(phase-8): add core __init__ exports
2026-03-19 11:26:04 -04:00
KoalaTrapLord
fc09249ad3
feat(phase-7): add pipeline __init__ exports
2026-03-19 11:24:47 -04:00
KoalaTrapLord
d2c7783ce1
feat(phase-7): implement 7-step deck build pipeline
2026-03-19 11:23:38 -04:00
KoalaTrapLord
0ccf35f241
feat(phase-5): implement collection filter with CSV loader
2026-03-19 11:22:09 -04:00
KoalaTrapLord
9a5105b0d6
feat(phase-5): implement rules engine with ban list and validation
2026-03-19 11:19:42 -04:00
KoalaTrapLord
6a688d1cd0
feat(phase-4): implement Ollama gpt-oss:20b client with 6 core functions
2026-03-19 11:18:13 -04:00
KoalaTrapLord
d9639a8414
feat(phase-3): implement EDHrec JSON client
2026-03-19 11:16:28 -04:00
KoalaTrapLord
633fd43b28
fix: replace sonar/sonar-pro model options with gpt-oss:20b in UI
2026-03-19 11:15:43 -04:00
KoalaTrapLord
45c72aadc9
feat(phase-2): implement Scryfall API client
2026-03-19 11:14:58 -04:00
KoalaTrapLord
81ab7ac34a
feat(phase-1): implement Pydantic models for deck builder
2026-03-19 11:13:06 -04:00
KoalaTrapLord
e0fe4144ae
Create test_collection_filter.py
2026-03-19 10:49:06 -04:00
KoalaTrapLord
68aa6eac3f
Create test_rules_engine.py
2026-03-19 10:48:23 -04:00
KoalaTrapLord
c870dd35fb
Create __init__.py
2026-03-19 10:47:49 -04:00
KoalaTrapLord
35ce67ed6f
Create collection.csv.example
2026-03-19 10:47:18 -04:00
KoalaTrapLord
232750a951
Create main.py
2026-03-19 10:46:45 -04:00
KoalaTrapLord
46c1c8cb01
Create build_deck.py
2026-03-19 10:46:14 -04:00
KoalaTrapLord
64a4cd3c7c
Create __init__.py
2026-03-19 10:45:36 -04:00
KoalaTrapLord
3f6b66fce3
Create deck_assembler.py
2026-03-19 10:44:53 -04:00
KoalaTrapLord
2887c09550
Create collection_filter.py
2026-03-19 10:44:18 -04:00
KoalaTrapLord
84d84a211f
Create rules_engine.py
2026-03-19 10:43:45 -04:00
KoalaTrapLord
12f90dd276
Create models.py
2026-03-19 10:43:15 -04:00
KoalaTrapLord
0b755c8428
Create __init__.py
2026-03-19 10:42:40 -04:00
KoalaTrapLord
50f36f284c
Create ollama_client.py
2026-03-19 10:42:12 -04:00
KoalaTrapLord
369cc9243f
Create community_scraper.py
2026-03-19 10:41:45 -04:00
KoalaTrapLord
22d3b64c2d
Create edhrec.py
2026-03-19 10:41:07 -04:00
KoalaTrapLord
beb3dac4d5
Create scryfall.py
2026-03-19 10:40:40 -04:00
KoalaTrapLord
330801107c
Create __init__.py
2026-03-19 10:40:11 -04:00
KoalaTrapLord
95c5a93584
feat(task-0.1): scaffold deck_builder subpackage structure
2026-03-19 10:39:21 -04:00
KoalaTrapLord
377a704a90
fix: update lab_api_new.py monolith to use local Ollama for deck gen
2026-03-19 10:32:56 -04:00
KoalaTrapLord
cc481bd71b
feat: switch deck generation from Perplexity to local Ollama (gpt-oss:20b)
2026-03-19 10:26:24 -04:00
KoalaTrapLord
c6d02fd38c
Fix bracket field handling: support both int and dict from AI response
2026-03-19 08:25:23 -04:00
KoalaTrapLord
0f2d3583ac
Remove unsupported response_format from Perplexity API call
2026-03-19 08:14:44 -04:00
KoalaTrapLord
2b355ed9ba
Fix NameError: _coach_embeddings not defined in V3 status endpoint
2026-03-19 08:05:26 -04:00
KoalaTrapLord
b4d8c2f50e
Fix indentation error on line 47 of forge_runner.py
2026-03-19 06:54:16 -04:00
KoalaTrapLord
9db1ed112f
Increase _STALL_LIMIT from 300s to 600s (10 min) to prevent premature batch kills
2026-03-19 06:30:03 -04:00
KoalaTrapLord
75568bfdb1
fix: expose full V3 init traceback in _deck_gen_v3_error for easier debugging
2026-03-19 06:27:04 -04:00
KoalaTrapLord
d834247885
Fix forge_runner.py: restore full file, fix sim mode arg
...
- Restored _run_deepseek_batch_thread and _get_deepseek_brain
(accidentally removed in prior commit)
- Changed '-sim' to 'sim' — Forge expects positional mode, not flag
2026-03-19 10:13:11 +00:00
KoalaTrapLord
ef7bde841f
Fix forge_runner.py: sim mode arg + indentation corruption
...
- Changed '-sim' to 'sim' (Forge expects positional mode, not flag)
- Fixed indentation: build_java_command, _run_process_blocking,
run_batch_subprocess were incorrectly nested inside get_java17()
- Fixed last_activity assignment stuck inside except block
- Added docstrings
2026-03-19 10:09:59 +00:00
KoalaTrapLord
87abfd801e
Fix V3 500 error: replace json_schema response_format with json_object
...
- Sonar does not support response_format type json_schema
- Switch to {"type": "json_object"} which Sonar supports
- Keep json_schema/schema_name params for call-site compatibility (ignored)
- Add exc_info=True to V3 generate error logging for full tracebacks
2026-03-19 10:04:36 +00:00
KoalaTrapLord
f2a782f0bd
feat(unity-ui): add MainMenu.uss styles for nav hub, server config, module cards
2026-03-19 04:00:31 -04:00
KoalaTrapLord
da67879491
feat(unity-ui): add MainMenu.uxml nav hub with server config and module cards
2026-03-19 03:59:31 -04:00
KoalaTrapLord
18beb9192e
feat(unity-ui): add UXML+USS layouts for all 5 GUI screens
...
- CollectionTracker.uxml — card grid, filter sidebar, detail panel
- CoachPanel.uxml — chat bubbles, analytics, mana curve chart
- DeckGenerator.uxml — 4-step wizard (commander → strategy → generate → result)
- SimulationPanel.uxml — 4-player config, progress bar, results table
- TrainingPanel.uxml — stats, start/stop, live charts, log, model history
- CommanderLabShared.uss — dark MTG theme shared across all screens
- CollectionTracker.uss
- CoachPanel.uss
- DeckGenerator.uss
- SimulationPanel.uss
- TrainingPanel.uss
2026-03-19 03:55:13 -04:00
KoalaTrapLord
85224f082e
fix: handle wrapped JSON object from /api/ml/models endpoint
...
The API returns {"models":[...]} rather than a bare array.
Added MlModelsResponse wrapper class and updated LoadModelHistory
to unwrap the list before iterating, preventing the deserialization
exception in TrainingController.
2026-03-19 02:57:46 -04:00
KoalaTrapLord
3f7f40d626
Make _call_pplx_api async with httpx.AsyncClient
...
- Replace blocking urlopen with async httpx.AsyncClient
- Add await at both call sites (deck_research, deck_generate_ai)
- Uvicorn event loop no longer stalled during Perplexity API calls
2026-03-19 06:32:18 +00:00
KoalaTrapLord
bc023ab6f6
Fix indentation in coach.py _build_deck_report_from_db (2-space -> 4-space)
2026-03-19 06:26:27 +00:00
KoalaTrapLord
83a8f288b7
Fix scrambled deck_service.py: close SQL query in _load_deck_cards_by_name, remove orphaned lines
2026-03-19 06:24:13 +00:00
KoalaTrapLord
e3f0787c73
Optimize deckgen: push colour-identity filtering into SQL with json_each
...
- Replace SELECT * + Python-side color loop in _get_collection_for_colors()
with projected SELECT + NOT EXISTS json_each() sub-query
- Apply same pattern to _build_collection_summary(), removing card_fits_identity()
- Add partial index idx_ce_quantity on collection_entries(quantity) WHERE qty > 0
- Handle NULL and empty-string color_identity via CASE guard
- Fix colorless commander bug: old code skipped color check entirely for []
- Add scripts/bench_deckgen.py benchmark (3-5x speedup on filtered queries)
- Add tests/test_deckgen_color_filter.py with 7 regression tests
2026-03-19 06:18:32 +00:00
KoalaTrapLord
2936fd37eb
Refactor routes/ml.py: replace state dicts with dataclasses + threading locks
...
- Add @dataclass classes _TrainingState, _PPOState, _TournamentState with snapshot() method
- Wrap all state mutations in threading.Lock() for thread safety
- Replace dict bracket access with attribute access
- Remove unnecessary global declarations from pipeline functions
2026-03-19 06:06:11 +00:00
KoalaTrapLord
cad2f00ec7
Fix all Unity C# errors: 4 truncated Editor scripts + 11 controller/model compilation fixes
2026-03-19 05:53:04 +00:00
KoalaTrapLord
6b50c6ee7d
Add PreconListWrapper and CollectionResponse classes to DeckGeneratorController
2026-03-19 01:40:50 -04:00
KoalaTrapLord
40a166188a
fix: unify DB connection management — init_collection_db() uses _get_db_conn()
...
Previously, init_collection_db() opened a separate sqlite3.connect() call,
ran migrations, then closed that connection — entirely outside the
thread-local pool that route handlers use via _get_db_conn().
This meant:
- The migration connection and the request-serving connection were
independent objects with no ordering guarantee under concurrent startup.
- The warm-up connection was thrown away immediately, so every handler
thread still had to open its own connection on first use.
Fix:
- init_collection_db() now calls _get_db_conn() directly, so schema
creation and migrations run on the same thread-local connection that
will serve subsequent requests.
- Added _close_db_conn() helper for explicit teardown on thread exit
(e.g. FastAPI lifespan shutdown or worker thread cleanup).
- Removed the redundant standalone conn.close() that discarded the
init connection without ever making it available to route handlers.
2026-03-19 01:24:24 -04:00