Repository navigation
fix(app-shell): Studio treats connector_action connectorConfig.input values as value slots - #28312
Merged
Merged
Conversation
…s value slots in Studio
The flow expression ledger roots connector_action input.* in the node's
connectorConfig sibling block. Studio's readers ignored the entry's block,
so the Input section offered no CEL-expression editor and no in-form
refusal of a {…} token, and isValueEnvelopeSlot answered for the
unreachable config.input instead.
- isValueEnvelopeSlot matches the entry's block (flowNodeExpressionBlock).
- FlowNodeConfigField judges a typed input field through the value-slot
judge with the node's sibling blocks, so it renders the text / expression
control and the spec's refusal.
- The Debug run judges a connector_action node's input before mocking it,
and names the block in the refusal.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibxVHVAdKszs18owvD6
Contributor
Author
|
domain:ui#3 · os-tesla · session_01L9qibz8HEj53Wx2uphTo2o 维护者速读
席位意见:读者改为按账本声明的 席位核对ACCEPT · seat
|
This was referenced Oct 31, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Tesla · project thread
Fixes #28164
Clause-②: no
Metadata-protocol: none
维护者速读
{…}模板记号时当场在表单里显示拒绝原因;调试运行也会在该步骤报出同一条拒绝。{…}记号,但 Studio 读表达式台账时忽略了条目所在的块(connectorConfig),作者要到发布才看到错误,也没有写表达式的入口。flow-value-envelope.ts的isValueEnvelopeSlot、FlowNodeConfigField.tsx的isScalarValueSlot/valueSlotRefusals、flow-simulator.ts的configRefusal。pnpm --dir ui exec vitest run packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.connectorInputEnvelope-28164.test.tsx,预期 5 个测试全绿。What changes
The flow expression ledger roots
connector_actioninput.*in the node'sconnectorConfigsibling block (block: 'connectorConfig', landed with #28150). Studio's three readers did not read the entry's block:flow-value-envelope.tsisValueEnvelopeSlotnow matches the entry's block through the spec'sflowNodeExpressionBlock. It answers true for['connectorConfig', 'input']on aconnector_actionnode, and false for the unreachable['config', 'input']it used to answer for. The Input key/value repeater therefore gets the text / CEL-expression toggle and its per-row refusal, like the other value maps.FlowNodeConfigField.tsx:isScalarValueSlotaccepts a field rooted in a declared sibling block (FLOW_NODE_SIBLING_EXPRESSION_BLOCKS) and asksresolveFlowNodeValueSlotswith the node's sibling blocks. A typed connector input field (the ones an action'sinputSchemaproduces, atconnectorConfig.input.KEY) now renders the value-slot control.valueSlotRefusalshandsflowNodeValueTemplateRefusalsthe node and keeps only refusals in the field's own block, so the spec's refusal of a{…}token shows under the value as it is typed.configfields behave exactly as before: still one key deep, and still judged by both config judges.flow-simulator.ts:configRefusaltakes the node, hands the value-slot judge its sibling blocks, and names the refusal's block in the line. The Debug run judges aconnector_actionstep before mocking it, because the executor resolvesconnectorConfig.inputbefore dispatch and refuses a{…}token there.No i18n keys were added: the toggle label, placeholder and refusal sentences are the existing ones and the spec's own.
Tests
FlowNodeInspector.connectorInputEnvelope-28164.test.tsxdrives the real inspector render path through a host that applies each patch. For a typed field, a token typed into the Text input shows the spec's refusal (flowNodeValueTemplateRefusals, read from the installed spec) in the form, and a stored token shows it too. A plain literal shows none, and the toggle stores{ dialect: 'cel', source }at the same key. For the repeater (an action with noinputSchema), a stored token and a typed token are both refused in place, and the toggle is offered on each row.flow-simulator.connectorInput-28164.test.ts: a token inconnectorConfig.inputfails the step with the spec's refusal namingconnectorConfig.input.text. A literal plus a CEL envelope is mocked as before.flow-value-envelope.test.ts: a new case pins the block reading (true forconnectorConfig.input, false forconfig.inputand for another node type). The six-map case changes to seven, on purpose. test(ui): pin the 19th flow value-ledger entry, connector_action input.* #28193 left it alone pending this card, and the new truth is that the designer table'sconnector_actionconnectorConfig.inputkey/value field is offered the envelope. The confirmation case that follows measures the new slot against the judgeregisterFlowapplies there (FlowValueSlotSchema, throughvalueEnvelopeRefusals), and it gives the same sentences as the editor'sAssignmentValueSchemafor malformed envelopes and accepts the same literals. The ledger's 19-entryvaluelist is unchanged.Acceptance notes
connectorConfig.input.retry.attempts) is not a whole value slot, so it keeps its plain control. This matchesconfigfields, which are value-slot controls only one key deep. The slot's refusal still reaches publish through the spec judge.number/select/booleankeeps its typed control with no expression toggle, as onconfigvalue slots, which offer the control only to text / textarea / expression fields.create_record/update_recordfields.*,httpbody). It mocks those nodes without reading their values, as before. Onlyconnector_actionwas in this card's scope. Noted, not filed.Verification
All readings on head
ac2e380a, worktree offorigin/main6285203d.Targeted tests and package checks
pnpm --dir ui exec vitest runoverinspectors/,previews/and the 31 otherapp-shelltest files that import a changed module or its hosts (FlowNodeConfigField,flow-value-envelope,flow-simulator,FlowNodeInspector,FlowKeyValueField,FlowPreview,FlowCanvas): Test Files 405 passed (405), Tests 4763 passed, 1 skipped. Lock VERDICT command-exit 0.pnpm --filter @object-ui/app-shell type-check(bothtsc --noEmitandtsc -p tsconfig.test.json): VERDICT command-exit 0.eslintover the six changed ui files: exit 0.pnpm check:new-line-citations: 0 new citations, exit 0.app-shellsuite (about 2,000 files) was started with 2 workers and stopped unfinished after about 50 minutes. CI's shardedTest UIruns the whole suite.Ablation (one-shot)
With the fix committed, the three changed sources were restored from
origin/main(tests kept) and the three new/updated test files were run: Test Files 3 failed (3), Tests 8 failed | 11 passed. Every new pin went red. Restored withgit checkout HEAD, andgit diff HEADwas empty afterwards. A first attempt was a no-op: its paths carried aui/prefix, which the vitest invocation guard refused. It was rerun with the paths written relative toui/.Derived gates (dispatch-gates --commands, 35 families)
Every line ran with stdin from /dev/null, and its exit code was recorded before any pipe.
dispatch-gates --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. All 35 exited 0, includingnode scripts/check-sdui-manifest.mjsand its--self-test,pnpm --dir ui exec vitest run scripts/(Test Files 169 passed, 2 skipped),pnpm check:type-check-debt(run under the verify lock after a first run timed out in the queue, exit 3 NOT MEASURED), andpnpm check:query-options-erasure(rerun without the 280 s per-gate cap that cut its first run, exit 124).Generated by Claude Code