Skip to content

feat(automation): publish a configSchema for the map node (designer parity, #3304)#3321

Merged
os-zhuang merged 1 commit into
mainfrom
claude/step-logs-run-observability-plxc2p
Jul 20, 2026
Merged

feat(automation): publish a configSchema for the map node (designer parity, #3304)#3321
os-zhuang merged 1 commit into
mainfrom
claude/step-logs-run-observability-plxc2p

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Second increment of #3304 (descriptor-side counterpart to objectui #2670 Phase 3, merged as objectui #2699). Follows increment 1 (loop.collection marker, merged as #3313).

What

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:

field schema objectui kind
collection xExpression: 'template' expression + refMode template
flowName xRef { kind: 'flow' } reference
itemObject xRef { kind: 'object' } reference
iteratorVariable / outputVariable plain string text

So 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 for map too.

Why only map (and what gates the rest)

map is the one previously-schemaless flow node whose fields are all scalars + typed references — no keyValue map, no virtual columns — so it maps cleanly through objectui's jsonSchemaToFlowFields with zero regression.

The other schemaless nodes lean on editor kinds the schema→fields adapter does not yet reproduce:

  • keyValue mapsassignment.assignments, the CRUD nodes' fields/filter, script.variables, subflow inputs, screen.defaults.
  • the decision virtual target columndecision.conditions (derived from out-edges, not stored config).
  • wait's top-level waitEventConfig block — a configSchema only describes config.*.

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 (teach jsonSchemaToFlowFields a keyValue mapping, decision-target handling, and the wait block); once that lands, the remaining nodes can be authored the same way as map.

Verification

  • New descriptor test: the registered map descriptor's configSchema carries the collection template marker + flowName/itemObject references (map-node.test.ts).
  • tsc --noEmit clean for @objectstack/service-automation; full package suite green (331 tests) — the added required: ['collection','flowName'] breaks nothing.
  • Touches no spec Zod, so no generated-schema / ratchet drift. Additive + backward-compatible; no runtime behavior change.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VuvxWgoadqryqBcjs7TpVi


Generated by Claude Code

…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
@vercel

vercel Bot commented Jul 19, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 19, 2026 6:37pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling size/s labels Jul 19, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): packages/services.

6 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/automation/webhooks.mdx (via packages/services)
  • content/docs/kernel/runtime-services/audit-service.mdx (via packages/services)
  • content/docs/kernel/runtime-services/index.mdx (via packages/services)
  • content/docs/kernel/runtime-services/settings-service.mdx (via packages/services)
  • content/docs/plugins/packages.mdx (via packages/services)
  • content/docs/protocol/kernel/i18n-standard.mdx (via packages/services)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang marked this pull request as ready for review July 20, 2026 00:56
@os-zhuang
os-zhuang merged commit f8c1b69 into main Jul 20, 2026
14 of 16 checks passed
@os-zhuang
os-zhuang deleted the claude/step-logs-run-observability-plxc2p branch 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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants