feat(automation): publish a configSchema for the map node (designer parity, #3304)#3321
Merged
Merged
Conversation
…arity, #3304) Second increment of #3304 (descriptor-side counterpart to objectui #2670 Phase 3). The `map` node shipped no `configSchema`, so the flow designer had no server-driven form for it. Its descriptor now carries one that mirrors objectui's hardcoded `map` field group field-for-field: • collection → xExpression: 'template' (an interpolate() `{items}` template, same marker + rationale as loop.collection) • flowName → xRef { kind: 'flow' } (typed reference picker) • itemObject → xRef { kind: 'object' } • iteratorVariable / outputVariable → plain text `map` is the one previously-schemaless flow node whose fields are all scalars and typed references — no `keyValue` map, no virtual columns — so it maps cleanly through objectui's jsonSchemaToFlowFields with zero regression, making the online and offline forms agree. The other schemaless nodes (assignment, the CRUD quartet, script, subflow, screen, wait, decision) rely on editor kinds the schema→fields adapter does not yet reproduce — `keyValue` maps, the decision virtual `target` column, `wait`'s top-level `waitEventConfig` block. Shipping their configSchemas before the adapter learns those would make objectui prefer the server schema and DROP those editors (a live regression), so they are deferred to #3304 pending an objectui adapter extension. Verified: new descriptor test (map configSchema carries the collection template marker + flowName/itemObject references); tsc clean; full @objectstack/service- automation suite green (331 tests) — the added `required` breaks nothing. Additive; no runtime behavior change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VuvxWgoadqryqBcjs7TpVi
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
📓 Docs Drift CheckThis PR changes 1 package(s): 6 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
os-zhuang
marked this pull request as ready for review
July 20, 2026 00:56
os-zhuang
added a commit
that referenced
this pull request
Jul 20, 2026
…s (designer parity, #3304) (#3327) assignment, create/update/delete/get_record, and screen now publish configSchemas mirroring objectui's hardcoded field groups — free-form maps as JSON-Schema open objects (additionalProperties: true) rendered by the designer's keyValue editor (objectui #2708), object references as xRef, screen's visibleWhen as an xExpression CEL column. decision/wait/script/subflow stay deliberately schemaless (documented + tested — a partial schema would drop editors). Verified: parity tests, tsc, 335-test suite green. Descriptor metadata only; no runtime behavior change. Closes the #3304 implementation series: loop (#3313), map (#3321), objectui adapter (#2708), this PR.
5 tasks
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.
Second increment of #3304 (descriptor-side counterpart to objectui #2670 Phase 3, merged as objectui #2699). Follows increment 1 (
loop.collectionmarker, merged as #3313).What
The
mapnode shipped noconfigSchema, so the flow designer had no server-driven form for it. Its descriptor now carries one that mirrors objectui's hardcodedmapfield group field-for-field:collectionxExpression: 'template'flowNamexRef { kind: 'flow' }itemObjectxRef { kind: 'object' }iteratorVariable/outputVariableSo the online (schema-driven) and offline forms agree, and
map.collection's{items}template no longer degrades to plain text / false-flags the CEL brace-trap — the divergence #3304 leads with, now closed formaptoo.Why only
map(and what gates the rest)mapis the one previously-schemaless flow node whose fields are all scalars + typed references — nokeyValuemap, no virtual columns — so it maps cleanly through objectui'sjsonSchemaToFlowFieldswith zero regression.The other schemaless nodes lean on editor kinds the schema→fields adapter does not yet reproduce:
keyValuemaps —assignment.assignments, the CRUD nodes'fields/filter,script.variables,subflowinputs,screen.defaults.targetcolumn —decision.conditions(derived from out-edges, not stored config).wait's top-levelwaitEventConfigblock — aconfigSchemaonly describesconfig.*.Those nodes currently have no
configSchema, so objectui uses its rich hardcoded forms. Shipping partial schemas now would make objectui prefer the server schema and drop those editors — a live regression, the opposite of #3304's intent. They're deferred to #3304 pending an objectui adapter extension (teachjsonSchemaToFlowFieldsakeyValuemapping, decision-target handling, and thewaitblock); once that lands, the remaining nodes can be authored the same way asmap.Verification
mapdescriptor'sconfigSchemacarries thecollectiontemplate marker +flowName/itemObjectreferences (map-node.test.ts).tsc --noEmitclean for@objectstack/service-automation; full package suite green (331 tests) — the addedrequired: ['collection','flowName']breaks nothing.🤖 Generated with Claude Code
https://claude.ai/code/session_01VuvxWgoadqryqBcjs7TpVi
Generated by Claude Code