Skip to content

feat(studio): complete Houdini workflow editing and domestic OODA - #48

Merged
2233admin merged 2 commits into
mainfrom
codex/workflow-houdini-ooda
Jul 27, 2026
Merged

feat(studio): complete Houdini workflow editing and domestic OODA#48
2233admin merged 2 commits into
mainfrom
codex/workflow-houdini-ooda

Conversation

@2233admin

Copy link
Copy Markdown
Owner

Completes Houdini-style port interactions and the right inspector, adds the curated Dify/common node set and full OpenCLI capability catalog, and expands the domestic OODA template to 14 real sources across five groups. Preserves collect-per-source semantics end-to-end: mixed source failures are partial_success, while all-source failures remain failed with the package blocked. Verified with frontend regression suites (51/8/11/6), TypeScript, ESLint, 109 backend tests, Ruff, real OpenCLI source probes, and an independent merge review.

@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Added searchable, collapsible workflow outlines with ancestor-aware filtering.
    • Added upstream variable insertion for workflow parameters and moved JSON settings into an Advanced section.
    • Improved required-argument entry with dropdown choices, defaults, and numeric input support.
    • Added keyboard and right-click access to workflow port menus.
    • Expanded domestic market intelligence sources and source availability indicators.
  • Bug Fixes

    • Workflows can now report partial success when some sources fail under per-source collection mode.

Walkthrough

The changes add collect-per-source handling for OpenCLI workflows, expand workflow editor primitives and inspector interactions, and broaden domestic OODA source configuration with updated regression tests.

Changes

OpenCLI execution status handling

Layer / File(s) Summary
Materialize failure mode
backend/workflow/hda_templates.py, tests/integration/test_workflow_compile_api.py
Multi-source HDA materialization propagates failureMode into execution parameters, with compile coverage for collect-per-source.
Trace partial source outcomes
backend/workflow/opencli_hda_tracer.py, tests/integration/test_workflow_compile_api.py, tests/integration/test_workflow_opencli_hda_trace_api.py
Tracing and run-status computation preserve source failures while reporting partial_success when applicable, and retain blocking behavior when all sources fail or fail-fast is used.

Workflow authoring experience

Layer / File(s) Summary
Dify primitives and palette selection
frontend/lib/workflow/node-primitives.ts, frontend/components/flow/command-palette.tsx, frontend/scripts/check-dify-p0-regressions.mjs, frontend/scripts/check-workflow-regressions.mjs
Dify capability primitives are added, curated primitives are exposed in the palette, and duplicate catalog operators are filtered.
Workflow outline navigation
frontend/lib/workflow/workflow-outline.ts, frontend/components/flow/inspector.tsx, frontend/components/flow/inspector-shell.tsx
The inspector adds outline search, collapsible rows, ancestor-preserving filtering, upstream discovery, and shared workflow status mappings.
Parameter and port interactions
frontend/components/flow/inspector.tsx, frontend/components/flow/nodes/workflow-node.tsx, frontend/scripts/check-inspector-workflow-regressions.mjs, frontend/scripts/check-workflow-regressions.mjs, frontend/package.json
Editable fields support upstream variable insertion and advanced JSON disclosure; workflow ports support mouse and keyboard context-menu activation, with regression checks wired into the workflow test script.

Domestic OODA workflow sources

Layer / File(s) Summary
Source catalog and workflow configuration
frontend/lib/workflow/opencli-business-workflows.ts, frontend/lib/workflow/studio-templates.ts, frontend/scripts/check-opencli-business-workflows.mjs
Domestic source groups, explicit source gaps, source slots, workflow limits, allowed domains, and A-share template text are updated and validated.

Estimated code review effort: 4 (Complex) | ~45 minutes

Suggested reviewers: lunnynight

Poem

A rabbit hops through graphs of green,
With tidy ports and sources seen.
Failures gather, paths remain,
Search and sprouts arise again.
“Partial wins!” the bunny sings.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately reflects the main themes: workflow editing improvements and domestic OODA expansion.
Description check ✅ Passed The description is clearly aligned with the changeset and summarizes the workflow, OODA, and failure-semantics updates.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@repowise-bot

repowise-bot Bot commented Jul 27, 2026

Copy link
Copy Markdown

✅ Health: 8.0

📋 At a glance
7 new findings introduced.

🚨 Change risk: 9.6/10 (high)
This change's risk is driven by:

  • more lines added than baseline
  • more scattered than baseline

📊 Full report · ⭐ Star Repowise · 📥 Install bot · Last updated 2026-07-27 18:24 UTC
Silence on a single PR with [skip repowise] in the title · Per-repo toggle on repowise.dev/settings?tab=bot

@2233admin
2233admin merged commit cfcf3d9 into main Jul 27, 2026
1 check was pending

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (5)
frontend/scripts/check-opencli-business-workflows.mjs (1)

16-37: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Assert the actual slot and gap records, not independent file-wide strings.

These regexes can pass when a required site, command, and sourceGroup occur in different objects; they also do not enforce 14 slots or prohibit a runnable gelonghui slot. Scope assertions to ASHARE_OPENCLI_SOURCES and assert exact { id, sourceGroup, site, command } tuples, slot count, and that no source slot uses a site marked unavailable.

As per coding guidelines, “Do not claim completion without fresh evidence”; these checks need to prove the configured records rather than incidental text.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/scripts/check-opencli-business-workflows.mjs` around lines 16 - 37,
Strengthen the tests around ASHARE_OPENCLI_SOURCES instead of matching
independent file-wide strings: extract the configured source records and assert
exactly 14 slots with the expected { id, sourceGroup, site, command } tuples.
Also validate the explicit gap records and ensure no runnable source slot uses a
site marked unavailable, including gelonghui, while preserving the existing
deterministic, raw-item, and empty-display expectations.

Source: Coding guidelines

tests/integration/test_workflow_opencli_hda_trace_api.py (1)

1008-1013: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

Consider asserting the successful source's terminal status too.

The test verifies multi-source-opencli::source-xiaohongshu is failed but doesn't explicitly assert multi-source-opencli::source-bilibili is completed, only inferring it from the overall partial_success outcome.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/integration/test_workflow_opencli_hda_trace_api.py` around lines 1008 -
1013, Extend the node-state assertions in the workflow test to explicitly verify
that states["multi-source-opencli::source-bilibili"]["status"] is "completed",
alongside the existing failed Xiaohongshu assertion.
backend/workflow/opencli_hda_tracer.py (1)

2184-2210: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Avoid re-deriving invariant state per node in _collect_per_source_package_ids.

This helper is invoked once per node_state from _run_status's dict comprehension (line 2124-2130). Each call does a linear next(... for node in runtime_nodes ...) lookup and rebuilds tolerant_package_ids from scratch via a full scan of runtime_nodes, even though both are invariant across all states for a given runtime_nodes list. This is O(N·M) redundant work; for typical workflow sizes this is negligible, but it's an easy, low-risk cleanup.

♻️ Proposed refactor: precompute lookups once in `_run_status`
 def _run_status(
     node_states: list[WorkflowRunNodeState],
     valid: bool,
     runtime_nodes: list[CompiledWorkflowNode] | None = None,
 ) -> WorkflowRunStatus:
     if not valid:
         return "failed"
     statuses = {state.status for state in node_states}
+    nodes_by_id = {node.id: node for node in (runtime_nodes or [])}
+    tolerant_package_ids = {
+        node.id for node in (runtime_nodes or []) if _collects_per_source_failures(node)
+    }
     collect_per_source_package_ids_by_state = (
         {
-            state.nodeId: _collect_per_source_package_ids(state, runtime_nodes)
+            state.nodeId: _collect_per_source_package_ids(
+                state, nodes_by_id, tolerant_package_ids
+            )
             for state in node_states
         }
         if runtime_nodes
         else {}
     )
 def _collect_per_source_package_ids(
     state: WorkflowRunNodeState,
-    runtime_nodes: list[CompiledWorkflowNode],
+    nodes_by_id: dict[str, CompiledWorkflowNode],
+    tolerant_package_ids: set[str],
 ) -> set[str]:
     source_groups = getattr(state, "sourceGroups", [])
     node_path = getattr(state, "nodePath", [])
-    runtime_node = next(
-        (node for node in runtime_nodes if node.id == state.nodeId),
-        None,
-    )
+    runtime_node = nodes_by_id.get(state.nodeId)
     if (
         not source_groups
         or runtime_node is None
         or not (
             _read_string(runtime_node.params.get("sourceGroup"))
             or _read_string(runtime_node.params.get("source_group"))
         )
     ):
         return set()
-    tolerant_package_ids = {
-        node.id for node in runtime_nodes if _collects_per_source_failures(node)
-    }
     return {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/workflow/opencli_hda_tracer.py` around lines 2184 - 2210, Refactor
`_run_status` and `_collect_per_source_package_ids` so invariant data is
computed once per `runtime_nodes` list: prebuild a node-id lookup and the set of
IDs from `_collects_per_source_failures`, then pass or reuse these values for
each state instead of performing `next(...)` and rescanning `runtime_nodes`
inside every helper call. Preserve the helper’s existing filtering and returned
package IDs.
frontend/components/flow/nodes/workflow-node.tsx (1)

403-448: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Port handle aria-label hardcodes Chinese text regardless of the language toggle.

"输出"/"输入" are hardcoded in the aria-label, while the rest of this component (and the app) respects the language setting (zh-CN/en-US) for user-facing/assistive text. English-language users will still get a Chinese-only accessibility label for every port handle.

🌐 Suggested fix
-      "aria-label": `${isBusinessLevel ? businessLabel : nodeViewContract.identity.label} · ${handleType === "source" ? "输出" : "输入"} · ${port.id ?? "default"} · ${port.type ?? "unknown"}`,
+      "aria-label": `${isBusinessLevel ? businessLabel : nodeViewContract.identity.label} · ${handleType === "source" ? (language === "zh-CN" ? "输出" : "Output") : (language === "zh-CN" ? "输入" : "Input")} · ${port.id ?? "default"} · ${port.type ?? "unknown"}`,
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/components/flow/nodes/workflow-node.tsx` around lines 403 - 448,
Update the port handle aria-label construction in the returned attributes to use
the active language setting for the source/output and target/input direction
text instead of hardcoded Chinese strings. Preserve the existing label structure
and provide English wording when the language is en-US while retaining Chinese
wording for zh-CN.
frontend/components/flow/inspector.tsx (1)

1016-1033: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

"Insert variable" replaces the whole field instead of inserting.

variableSelector's onValueChange calls updateParameterField(field, value), which overwrites the entire field value with just the selected {{portId}} reference. For textarea/template fields where users compose static text plus one or more variable references, selecting a variable wipes out anything already typed (including a previously-inserted variable). The label ("Reference upstream output" / "引用上游输出") implies composing, not replacing.

♻️ Lower-effort improvement: append instead of replace
-      <Select onValueChange={(value) => value && updateParameterField(field, value)}>
+      <Select onValueChange={(value) => value && updateParameterField(field, `${typeof raw === "string" ? raw : ""}${value}`)}>

True cursor-position insertion would be a better long-term fix but requires tracking caret position in the textarea/input ref.

Also applies to: 1123-1133, 1261-1271

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/components/flow/inspector.tsx` around lines 1016 - 1033, The
onValueChange callback in variableSelector overwrites the entire field value
instead of appending the selected variable reference. Update the callback to
append the selected value to the existing field content rather than replacing it
entirely. This applies to all three occurrences of variableSelector in the file
(at the ranges mentioned). The fix should preserve any previously typed text or
inserted variables by appending the new variable reference to what is already in
the field, not overwriting it with updateParameterField(field, value).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/components/flow/inspector.tsx`:
- Around line 1323-1356: Update the upstream variable option construction in the
node inspector so deduplication uses both the candidate source node identity and
output port id, rather than only workflowInputReferenceForPort(port.id).
Preserve distinct picker entries for different upstream nodes while keeping each
option’s binding value correctly scoped to its selected source.

---

Nitpick comments:
In `@backend/workflow/opencli_hda_tracer.py`:
- Around line 2184-2210: Refactor `_run_status` and
`_collect_per_source_package_ids` so invariant data is computed once per
`runtime_nodes` list: prebuild a node-id lookup and the set of IDs from
`_collects_per_source_failures`, then pass or reuse these values for each state
instead of performing `next(...)` and rescanning `runtime_nodes` inside every
helper call. Preserve the helper’s existing filtering and returned package IDs.

In `@frontend/components/flow/inspector.tsx`:
- Around line 1016-1033: The onValueChange callback in variableSelector
overwrites the entire field value instead of appending the selected variable
reference. Update the callback to append the selected value to the existing
field content rather than replacing it entirely. This applies to all three
occurrences of variableSelector in the file (at the ranges mentioned). The fix
should preserve any previously typed text or inserted variables by appending the
new variable reference to what is already in the field, not overwriting it with
updateParameterField(field, value).

In `@frontend/components/flow/nodes/workflow-node.tsx`:
- Around line 403-448: Update the port handle aria-label construction in the
returned attributes to use the active language setting for the source/output and
target/input direction text instead of hardcoded Chinese strings. Preserve the
existing label structure and provide English wording when the language is en-US
while retaining Chinese wording for zh-CN.

In `@frontend/scripts/check-opencli-business-workflows.mjs`:
- Around line 16-37: Strengthen the tests around ASHARE_OPENCLI_SOURCES instead
of matching independent file-wide strings: extract the configured source records
and assert exactly 14 slots with the expected { id, sourceGroup, site, command }
tuples. Also validate the explicit gap records and ensure no runnable source
slot uses a site marked unavailable, including gelonghui, while preserving the
existing deterministic, raw-item, and empty-display expectations.

In `@tests/integration/test_workflow_opencli_hda_trace_api.py`:
- Around line 1008-1013: Extend the node-state assertions in the workflow test
to explicitly verify that
states["multi-source-opencli::source-bilibili"]["status"] is "completed",
alongside the existing failed Xiaohongshu assertion.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 81ccf603-f556-4658-bc77-82ebca7c366f

📥 Commits

Reviewing files that changed from the base of the PR and between 7a65721 and 9e7458e.

📒 Files selected for processing (17)
  • backend/workflow/hda_templates.py
  • backend/workflow/opencli_hda_tracer.py
  • frontend/components/flow/command-palette.tsx
  • frontend/components/flow/inspector-shell.tsx
  • frontend/components/flow/inspector.tsx
  • frontend/components/flow/nodes/workflow-node.tsx
  • frontend/lib/workflow/node-primitives.ts
  • frontend/lib/workflow/opencli-business-workflows.ts
  • frontend/lib/workflow/studio-templates.ts
  • frontend/lib/workflow/workflow-outline.ts
  • frontend/package.json
  • frontend/scripts/check-dify-p0-regressions.mjs
  • frontend/scripts/check-inspector-workflow-regressions.mjs
  • frontend/scripts/check-opencli-business-workflows.mjs
  • frontend/scripts/check-workflow-regressions.mjs
  • tests/integration/test_workflow_compile_api.py
  • tests/integration/test_workflow_opencli_hda_trace_api.py

Comment on lines +1323 to +1356
const upstreamNodeIds = workflowDirectUpstreamNodeIds(node.id, edges)
const upstreamVariableOptions = Array.from(new Map(nodes.flatMap((candidate) => {
if (!upstreamNodeIds.has(candidate.id)) return []
const candidateProjectNode = hydrateProjectNodeIdentity(
findWorkflowProjectNodeByCanvasId(workflowProject, candidate.id),
candidate.data,
)
const candidateContract = buildCanonicalNodeViewContract(
candidateProjectNode,
candidate.data,
candidate.id,
)
const localized = localizeNodeText(
getNodeDisplayId(candidate.data),
{ label: candidate.data.label, description: candidate.data.description },
language,
)
return candidateContract.ports
.filter((port) => port.direction === "output")
.flatMap((port) => {
const value = workflowInputReferenceForPort(port.id)
return value ? [{
value,
label: `${localized.label} · ${port.id} (${port.type})`,
}] : []
})
}).map((option) => [option.value, option])).values())
const parameterGroups = parameterInterfaceView?.groups ?? []
const activeParameterGroupId = parameterGroups.some((group) => group.id === parameterGroupTab)
? parameterGroupTab
: parameterGroups[0]?.id
const activeParameterFields = parameterInterfaceView?.fields.filter((field) => field.groupId === activeParameterGroupId) ?? []
const regularParameterFields = activeParameterFields.filter((field) => field.type !== "json")
const advancedParameterFields = activeParameterFields.filter((field) => field.type === "json")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check how {{portId}} references are resolved server-side to see if collisions across
# multiple upstream nodes sharing a port id are actually safe.
rg -nP '\{\{.*?\}\}|workflowInputReferenceForPort|input_reference' backend -g '*.py' -C3

Repository: 2233admin/opencli-admin

Length of output: 50380


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== locate relevant files =="
fd 'inspector\.tsx$|nodes\.(ts|tsx)$|.*flow.*\.ts$|.*work.*flow.*\.ts$|.*workflow.*\.ts$' frontend backend | sed -n '1,120p'

echo
echo "== inspect frontend component around upstreamVariableOptions =="
nl -ba frontend/components/flow/inspector.tsx | sed -n '1280,1375p'

echo
echo "== search definitions/usages of helper functions =="
rg -n "function workflowInputReferenceForPort|const workflowInputReferenceForPort|export .*workflowInputReferenceForPort|workflowInputReferenceForPort\\(" frontend -C3
rg -n "function workflowDirectUpstreamNodeIds|const workflowDirectUpstreamNodeIds|workflowDirectUpstreamNodeIds\\(" frontend -C3

Repository: 2233admin/opencli-admin

Length of output: 1057


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== inspect frontend component around upstreamVariableOptions =="
awk '{printf "%5d\t%s\n", NR, $0}' frontend/components/flow/inspector.tsx | sed -n '1280,1375p'

echo
echo "== search definitions/usages of helper functions =="
rg -n "function workflowInputReferenceForPort|const workflowInputReferenceForPort|export .*workflowInputReferenceForPort|workflowInputReferenceForPort\\(" frontend frontend/components/flow frontend/lib/workflow -C3 || true
rg -n "function workflowDirectUpstreamNodeIds|const workflowDirectUpstreamNodeIds|workflowDirectUpstreamNodeIds\\(" frontend frontend/components/flow frontend/lib/workflow -C3 || true

echo
echo "== focused backend search for workflow input references / port-id-only resolution =="
rg -n "workflowInputReferenceForPort|input_reference|input reference|referenceForPort|port_id|ports\\.output|output_ports|\\{\\{[^{}]*\\}\\}" backend frontend -g '*.py' -g '*.ts' -g '*.tsx' -g '*.json' | head -n 200

Repository: 2233admin/opencli-admin

Length of output: 36408


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== inspect runtime template resolver =="
awk '{printf "%5d\t%s\n", NR, $0}' backend/workflow/native_node_runtime.py | sed -n '1,140p'

echo
echo "== inspect compiler output/input binding handling =="
awk '{printf "%5d\t%s\n", NR, $0}' backend/workflow/compiler.py | sed -n '740,830p'

echo
echo "== inspect frontend outline helpers =="
awk '{printf "%5d\t%s\n", NR, $0}' frontend/lib/workflow/workflow-outline.ts | sed -n '120,160p'

echo
echo "== read-only behavioral probe for Map key dedupe =="
node - <<'JS'
function workflowInputReferenceForPort(portId) {
  const WORKFLOW_INPUT_REFERENCE_PATH = /^[A-Za-z_][\w.-]*$/;
  const path = portId.trim();
  return WORKFLOW_INPUT_REFERENCE_PATH.test(path) ? `{{${path}}}` : undefined;
}

const upstreamNodeIds = new Set(['nodeA', 'nodeB']);
const nodes = [
  { id: 'nodeA', data: { label: 'A' } },
  { id: 'nodeB', data: { label: 'B' } },
];
const output = Array.from(new Map(nodes.flatMap((candidate) => {
  if (!upstreamNodeIds.has(candidate.id)) return [];
  const ports = [{ id: 'result', type: 'any' }];
  return ports.map((port) => {
    const value = workflowInputReferenceForPort(port.id);
    return value ? [{ value, label: `${candidate.data.label} · ${port.id} (${port.type})`, nodeId: candidate.id, portId: port.id }] : [];
  });
}).map((option) => [option.value, option])).values());

console.log(JSON.stringify(output, null, 2));
console.log('count', output.length);
console.log('labels', output.map((o) => o.label).join(', '));
JS

Repository: 2233admin/opencli-admin

Length of output: 10680


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== inspect rest of native runtime template resolver =="
awk '{printf "%5d\t%s\n", NR, $0}' backend/workflow/native_node_runtime.py | sed -n '140,380p'

echo
echo "== inspect compiler input binding construction =="
rg -n "_build.*input|input_binding|binding|\\{\\{[^{}]*\\}\\}|port_id|input_value|source_node|edge\\.source|edge\\.target" backend/workflow/compiler.py backend/workflow/turbopush_executor.py backend/workflow/swarm_simulation.py -C3 | head -n 260

echo
echo "== inspect selected runtime executor path =="
rg -n "templates|template_convert|_TEMPLATE_REFERENCE|context|variables|source|edge|input" backend/workflow/native_node_runtime.py backend/workflow/turbopush_executor.py backend/workflow/swarm_simulation.py -C3 | head -n 360

Repository: 2233admin/opencli-admin

Length of output: 50379


Dedupe and display upstream variable options by source node plus port id.

workflowInputReferenceForPort(port.id) creates {{portId}}, and the frontend Map(option.value, option) dedupes solely by that value. If two direct upstream nodes both expose an output with the same id, one option disappears from the picker even though the labels still show different nodes. Use a node/scoped key for dedupe, or avoid making {{result}} the value for both options so users can choose which upstream source to bind.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/components/flow/inspector.tsx` around lines 1323 - 1356, Update the
upstream variable option construction in the node inspector so deduplication
uses both the candidate source node identity and output port id, rather than
only workflowInputReferenceForPort(port.id). Preserve distinct picker entries
for different upstream nodes while keeping each option’s binding value correctly
scoped to its selected source.

@2233admin
2233admin deleted the codex/workflow-houdini-ooda branch July 28, 2026 09:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant