feat(conductor): guided designer UX — dropdowns + builders replace raw ISO/cron/JSON inputs#398
Merged
Merged
Conversation
…quorum surfaced Replace the Conductor designer's raw text inputs with self-explanatory controls and add inline guidance, so a workflow can be built without typing ISO-8601 durations, cron strings, or predicate JSON: - DurationInput (reminder/deadline): value + unit <-> ISO-8601. - ScheduleBuilder (cron trigger): presets + day/time + human-readable preview. - ConditionBuilder (postcondition/guard): field/op/value rows <-> predicate AST, with an advanced JSON escape hatch for shapes rows can't model. - QuorumSelect (was never rendered), ChannelSelect, RefPicker (roles/events). - New getConductorRoles client + role/event catalogs feed the pickers. - Full en/de i18n; tsc + eslint + i18n:check + next build green. Folded a Claude + Forge (Codex) double review (both executed the round-trip functions): DurationInput now keeps non-single-unit/unsupported ISO in a raw editor instead of truncating; ScheduleBuilder re-seeds raw on mode switch and trims the resync compare so advanced edits aren't reverted; ConditionBuilder routes comma/structured 'in' lists to the advanced editor; stable row keys + useId datalist; integer-only durations; defensive quorum default.
…put + slug auto-gen Phase 2 — eliminate the remaining free-text inputs in the designer: - Backend: GET /conductors/agents (orchestrator slug+name) and /conductors/actions (deterministic-action ids), threaded from the registries; registered before the catch-all /:slug route. - Agent + action steps become real <select> dropdowns (SelectPicker, preserves an unknown stored value), with a free-text RefPicker fallback when the catalog is empty/unavailable (so a forward-reference or disabled agent stays authorable). - Action input: KeyValueEditor (key/value rows ⇄ JSON object) replaces the raw JSON textarea, with an advanced-JSON escape for nested values. - Workflow slug auto-derived from the name (until edited / on load), NFKD-folded so München → munchen; Save guarded against empty slug/name. Folded a Forge (Codex) review (executed the transforms; no HIGH): agent free-text fallback (M1), definedness-not-truthiness rehydration of falsy input/postcondition/ guard (M3), live slug typing keeps hyphens (M2), unicode-fold + save-guard (M4), string-coercion hint (M5), dead-ternary cleanup. tsc+eslint+i18n+next build green.
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.
Summary
Overhauls the Conductor designer so a workflow can be built without typing
ISO-8601 durations, cron strings, predicate/JSON blobs, or free-text agent/action
ids. Every raw input becomes a guided control (dropdown, picker, value+unit,
schedule/condition builder), with an advanced escape hatch wherever a shape can't
be modelled. Frontend-only except two small read-only catalog endpoints.
Guided controls (
web-ui/app/conductor/_components/)or unsupported ISO stays editable as raw (never truncated).
preview ("Every Monday at 09:00"); advanced-cron escape.
predicate AST, AND/OR, with an advanced-JSON fallback for nested/not/const.
JSON), advanced-JSON escape for nested values.
become real
<select>dropdowns (free-text fallback when the catalog is empty),quorum is finally rendered (it was in the model but had no UI), channel + role/event
are pickers.
guarded against empty slug/name.
Backend
GET /conductors/agents(orchestrator slug+name from the registry) andGET /conductors/actions(deterministic-action ids), registered before thecatch-all
/:slug; threaded viawireConductor(listActions) +createConductorRouter(agentCatalog/actionCatalog). New api clientsgetConductorAgents/getConductorActions/getConductorRoles.Reviews (Claude + Forge/Codex, both executed the round-trip transforms)
Folded every HIGH/MED across two review passes — all data-loss round-trips fixed:
on mode switch + trims the resync compare; ConditionBuilder routes comma/structured
inlists to advanced; definedness-not-truthiness rehydration of falsyinput/postcondition/guard; agent free-text fallback on empty catalog; live-hyphen
slug + unicode fold + save guard; stable row keys /
useIddatalists; integer-onlydurations. Refuted (both, with evidence): infinite resync loops, falsy-eq
round-trip, matches/const/not/nested round-trip, i18n parity.
Tests / gates
tscclean,eslint0 errors,npm run i18n:checkOK (1585 keys, en+de ICUparity),
next buildcompiled, middleware build clean.omadia-devstack (:3333); the new catalog endpointsreturn 401 (auth) not 404 (registered + reachable).
Follow-ups
typed form (the registry currently exposes only ids).