LogicGate nodes had no way to set their digital inputs in the editor; the new
LogicGateMetaData.inputs field (krill-sdk 0.0.29) was unused by the UI.
Feature work, not a bug: the first item in migrating LogicGate off the
node-executes-node model toward the executionSource pattern. The editor only
exposed legacy positional sources/targets.
Added an Inputs section to the LogicGate Settings tab (EditLogicGate.kt) under
the Truth Table: one or two clickable input slots (driven by
gateType.requiresTwoInputs()) beside a large gate icon, and a picker dialog
listing swarm nodes where Node.isDigital is true, grouped by type. Selections
persist into LogicGateMetaData.inputs via the editor’s existing edited()
path. Pure helpers digitalInputCandidates, withInput, clearInput are
unit-tested; the composables are QA/manual-verified.
Node.isDigital in krill-sdk 0.0.29 is a function (node.isDigital()),
not a property — node.isDigital does not compile.LogicGateMetaData.inputs is Pair<NodeIdentity?, NodeIdentity?> (nullable
slot elements, default Pair(null, null)), not a non-null Pair. The UI treats
both null and an empty-nodeId identity as “unset” via a small private
nonNull() bridge (maps null -> NodeIdentity("", "")), so cleared slots are
stored as the empty identity rather than null. A later work item that wires
inputs into server evaluation must treat null OR empty-nodeId as unset.Keep input-selection state policy in pure helpers (tested) and out of
composables. The legacy sources/targets display still shows — later work
items remove it and wire inputs into server evaluation + executionSource;
track that so the two models don’t drift while both are visible.