Commit Graph
3 Commits
Author SHA1 Message Date
DumiFlex 108d5f49e3 fix(engine): internal vars propagate across nodes, filter at prompt-render only
User-reported bug: a variable marked internal in an upstream Context
node could not be read by downstream Combine / Derivation modules —
they saw it as missing. The previous design treated the
PIPELINE_CONTEXT socket as the public boundary and stripped both
engine `__` keys AND user-flagged internal vars at socket emit.

Correct semantic: internal = "don't render as standalone $var in the
final prompt." It does NOT mean "don't propagate through context."
Downstream nodes still need to read internal vars to compose them
into other vars (e.g. a Combine builds `$subject` from an internal
`$style` + a public `$pose`). Only the final PromptAssembler must
skip internal vars at template substitution time.

Implementation:

- engine/context.py: split the filter into two helpers.
  `strip_engine_internals` drops only `__`-prefixed engine keys —
  used at the socket boundary. `strip_internals` keeps the original
  dual-layer behavior (engine + user-flagged) — used at the prompt-
  render boundary.

- wp_nodes/types.py: socket emit now uses `strip_engine_internals`,
  so user-flagged internal vars cross node boundaries as regular
  context keys. `__wp_internal_flags__` is added to
  `_CROSS_NODE_INTERNAL_KEYS` so downstream PromptAssemblers can
  still know which vars to filter at render.

- wp_nodes/assembler_node.py: before resolving variables, merges
  the cross-node `__wp_internal_flags__` back into a copy of the
  socket context and calls `strip_internals` — drops both engine
  keys and user-flagged internal vars. Net effect on the rendered
  prompt: unchanged from the user's perspective (internal vars
  still don't appear as standalone $vars).

- tests/test_context.py: regression tests for the new helper +
  propagation behavior.
2026-05-16 13:59:45 +03:00
DumiFlex 6921606570 feat(context): module picker + lock/internal + card indicators (#8)
Phase 5.5.4 (SPA library picker for ContextWidget) plus QA-driven polish.

* New ModulePickerModal with search, kind tabs, single + multi-pick, and
  compact filter UX (favorites/hide-added inline; category + tag chips
  behind popover with active-count badge).
* ModuleEditModal kind-aware body — wildcard option editor with
  enable/disable, weight overrides, mode picker (random/subset/pinned),
  sub-category multi-select.
* Lock + internal per-instance overrides ported and adapted: locked_seed
  derives a per-wildcard rng via sha256(seed:binding); internal hides
  bindings from the public PIPELINE_CONTEXT payload.
* Card indicators: modified dot (option-pool overrides), missing-from-
  library dot (polled hash check), in-card lock + internal toggles.
* RNG-faithful assembler preview via new /wp/api/preview/resolve; header
  shows "PREVIEW · 42". UNRESOLVED chips clickable to strip $var.
* Bulk collapse/expand toggle, focus toast w/ pulsing border overlay
  that tracks node bounds, friendly @name substitution in modal.
* Backend: new /wp/api/modules/import-from-workflow endpoint preserves
  uuid; engine emits per-module effective seeds via WP_Context UI
  payload for authoritative lock-toggle defaults.
2026-04-30 00:53:13 +03:00
DumiFlex 61a2e0e9ac feat(engine): add Context type and strip_internals helper 2026-04-25 01:35:59 +03:00