Skip to content

feat(conductor): guided designer UX — dropdowns + builders replace raw ISO/cron/JSON inputs#398

Merged
Weegy merged 3 commits into
mainfrom
feat/conductor-designer-ux
Jul 1, 2026
Merged

feat(conductor): guided designer UX — dropdowns + builders replace raw ISO/cron/JSON inputs#398
Weegy merged 3 commits into
mainfrom
feat/conductor-designer-ux

Conversation

@Weegy

@Weegy Weegy commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

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/)

  • DurationInput — reminder/deadline as value + unit ⇄ ISO-8601; a non-single-unit
    or unsupported ISO stays editable as raw (never truncated).
  • ScheduleBuilder — cron trigger via presets + day/time + a plain-language
    preview ("Every Monday at 09:00"); advanced-cron escape.
  • ConditionBuilder — postcondition / transition guard as field/op/value rows ⇄
    predicate AST, AND/OR, with an advanced-JSON fallback for nested/not/const.
  • KeyValueEditor — action input as key/value rows ⇄ JSON object (no hand-written
    JSON), advanced-JSON escape for nested values.
  • SelectPicker / RefPicker / ChannelSelect / QuorumSelect — agent + action steps
    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.
  • Workflow slug auto-derived from the name (NFKD-folded: München → munchen), Save
    guarded against empty slug/name.

Backend

  • GET /conductors/agents (orchestrator slug+name from the registry) and
    GET /conductors/actions (deterministic-action ids), registered before the
    catch-all /:slug; threaded via wireConductor (listActions) +
    createConductorRouter (agentCatalog/actionCatalog). New api clients
    getConductorAgents / 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:

  • DurationInput raw-escape for non-representable ISO; ScheduleBuilder re-seeds raw
    on mode switch + trims the resync compare; ConditionBuilder routes comma/structured
    in lists to advanced; definedness-not-truthiness rehydration of falsy
    input/postcondition/guard; agent free-text fallback on empty catalog; live-hyphen
    slug + unicode fold + save guard; stable row keys / useId datalists; integer-only
    durations. Refuted (both, with evidence): infinite resync loops, falsy-eq
    round-trip, matches/const/not/nested round-trip, i18n parity.

Tests / gates

  • tsc clean, eslint 0 errors, npm run i18n:check OK (1585 keys, en+de ICU
    parity), next build compiled, middleware build clean.
  • Verified live on the local omadia-dev stack (:3333); the new catalog endpoints
    return 401 (auth) not 404 (registered + reachable).

Follow-ups

  • Per-action input JSON-schemas would turn the action-input key/value editor into a
    typed form (the registry currently exposes only ids).
  • a11y: associate the principal-block label with its control.

Weegy added 3 commits June 30, 2026 17:22
…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.
@Weegy Weegy merged commit 82434f4 into main Jul 1, 2026
7 checks passed
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