Skip to content

Add headless engine worker with JSON-lines RPC - #2566

Closed
Skitty4fingers wants to merge 14 commits into
PathOfBuildingCommunity:devfrom
Skitty4fingers:claude/serene-hawking-ft5foq
Closed

Skitty4fingers wants to merge 14 commits into
PathOfBuildingCommunity:devfrom
Skitty4fingers:claude/serene-hawking-ft5foq

Conversation

@Skitty4fingers

Copy link
Copy Markdown

engine/worker.lua boots Path of Building headless (without HeadlessWrapper's
blocking stdin prompt) and serves namespaced methods over stdin/stdout:
build, stats (incl. item/passive what-if), skills, items, tree, config, data.
Upstream src/ is untouched.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01TWRTJMJXeedgrL19GpAUs7Fixes # .

Description of the problem being solved:

Steps taken to verify a working solution:

Link to a build that showcases this PR:

Before screenshot:

After screenshot:

claude and others added 14 commits September 26, 2026 02:53
engine/worker.lua boots Path of Building headless (without HeadlessWrapper's
blocking stdin prompt) and serves namespaced methods over stdin/stdout:
build, stats (incl. item/passive what-if), skills, items, tree, config, data.
Upstream src/ is untouched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TWRTJMJXeedgrL19GpAUs7
- engine.py manages the LuaJIT worker process
- codec.py handles share codes and pobb.in/pastebin/poe.ninja links
- service.py holds operations shared by all front ends and a change revision
- mcp_server.py exposes 32 tools, 2 resources and 2 prompts (MCP SDK v2)
- web/ is a FastAPI REST API that also serves MCP at /mcp on the same build
- cli.py prints JSON
- pytest suite covering codec, engine integration and REST

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TWRTJMJXeedgrL19GpAUs7
Vite + React 19 + Tailwind 4 + TanStack Query. Canvas passive tree with
hover what-if deltas and click-to-allocate, skills, items workbench
(compare before equip), config, and MCP connection help. Live-refreshes
when an agent edits the build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TWRTJMJXeedgrL19GpAUs7
scripts/setup-engine.sh builds LuaJIT at commit 2460b3ff (needed for the
syntax extensions upstream now uses) plus lua-utf8 without luarocks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TWRTJMJXeedgrL19GpAUs7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TWRTJMJXeedgrL19GpAUs7
compose.tailscale.yml runs the app in a Tailscale sidecar's network
namespace with Tailscale Serve providing HTTPS on the tailnet (Funnel off,
no host ports). POB2_ALLOWED_HOSTS extends /mcp's DNS-rebinding
protection so requests to the tailnet hostname are accepted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TWRTJMJXeedgrL19GpAUs7
Tree
- Export/import official PoE2 planner links (pathofexile2.com, format v7)
  with weapon sets and attribute choices; legacy codes still import.
- Convert the game's DDS tree atlases to WebP at image build time
  (scripts/build_tree_art.py) and draw real node icons, frames, jewels,
  class/ascendancy art and orbit arcs in the web tree.

Advisors (engine modules + REST + MCP + web UI)
- Guide tab: compare against a PoE2 BuildPlanner .build reference
  (passives, skills/supports, gear, stages) and rank next steps.
- Tree advisor: next passive point, point to move, attribute node
  recommendations constrained by gear/gem requirements.
- Upgrades tab: per-slot gear/jewel value, dead mods, what to look for,
  weighted trade searches; gem support/level advice; unique shopping
  with poe.ninja prices.
- One-click Update from poe.ninja character (ladder or profile) links,
  keeping Config settings; index.html served with no-cache.

Spirit and totems
- PoB reports totem DPS per totem, reserves Ancestral Bond Spirit once
  and does not apply "Your Totem Limit is doubled". New budget module
  counts totems the Spirit can keep up; every advisor scores with DPS
  across all totems and what-ifs drop the replaced item's granted skills.
- "Check before you buy" verdict (check_item) with warnings for lost
  totems, Spirit shortfalls, requirements and removed skills; sidebar
  Spirit/totem card; equip asks for confirmation on warnings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Commit the PoE2 tree artwork (tree-art/, WebP) so a clone and the Docker
  build need no conversion step; the image no longer ships the .zst
  textures. scripts/build_tree_art.py regenerates it after tree updates.
- Publish a multi-arch image to GitHub Container Registry on pushes to
  main and version tags (.github/workflows/publish.yml).
- compose.image.yml runs the prebuilt image; both Compose files take
  POB2_BIND and POB2_ALLOWED_HOSTS for hosting on a server.
- Remove upstream-only workflows (releases, installer, backports, beta,
  spellcheck) that need Path of Building's secrets; run PoB's tests and
  the enhanced CI on main.
- Rewrite the README for this project with screenshots, hosting options
  (image, Compose, source, NAS), usage, MCP, configuration and credits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Spell Totem's skill data OVERRIDEs ActiveTotemLimit to 2, which drops
BASE bonuses such as Oracle's Unnamed Heartwood (+1). The budget now adds
non-gem BASE totem limit mods back, doubles only the skill's base for
Ancestral Bond (the game places 5 = 2 x 2 + 1), and lets the
"# of Summoned Totems" config raise the cap as well as lower it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream GetPrimarySlot returns "Focus" for foci, which is not a slot,
so check_item crashed indexing a nil slot. Map foci to Weapon 2 and fail
with a clear message for any other item type without a slot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
sockets.analyze values each socketed augment (vs an empty socket) and
ranks every legal replacement per socket. Legality uses PoB's
GetValidRunesForItem plus corruption, level, per-item limits and
character-wide limitIds (e.g. Ancient Augment), flagging options a
limit held elsewhere blocks. sockets.optimize builds a greedy plan,
re-measured after each swap, including paired swaps that free a limit;
augments with lines PoB does not model are kept unless freeing a limit.
Exposed as the socket_advice MCP tool and /api/sockets(/plan).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upgrades > Sockets shows each rune, soul core and idol's worth (dead,
unmodelled and socket-bound flagged), the best legal alternatives with
"blocked by" badges, and a Build plan that lists the ordered swaps with
paired swaps grouped, the total and warnings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With a slot filter, character-wide limits (limitId) only saw the
filtered item, so e.g. Amanamu's Gaze looked legal in the chest while
the gloves held the Ancient Augment limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DPS and EHP lead in large type (DPS counts totems when the main skill
uses them), followed by the resources the character has: Mana, Spirit,
Rage or Runic Ward, each with a bar and net regen vs skill cost. Change
chips show the effect of the last recalculation, a spinner and dimming
mark refetches, a skeleton covers loading, and hover panels break down
DPS, EHP (defences, resists) and Spirit reservations.

budget.get adds skill, ehp, life, es, resources and defence, and counts
totems for Spirit even when another skill is the main skill.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@LocalIdentity LocalIdentity added the invalid This doesn't seem right label Oct 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

invalid This doesn't seem right

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants