You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(approvals): typed decisionOutputs — record pickers for decision-output fields (#3447) (#3554)
A decisionOutputs entry may be { key, label?, type, multiple? } alongside
the bare string: typed entries render sys_user / business-unit / position /
team pickers in the decision dialog (multiple → id array) instead of free
text. normalizeDecisionOutputs (spec) is the one reader of the union —
service whitelist, request read and os lint all key off it, so bare and
typed can never behave differently. The request read adds
decision_output_defs next to the skew-safe decision_outputs key list; the
showcase demo flow and SKILL.md adopt the typed form, and the end-to-end
skill example is now os:check'd (compiled against the spec in CI).
Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Typed `decisionOutputs` declarations (#3447 follow-up). A `decisionOutputs` entry may now be `{ key, label?, type: 'text' | 'user' | 'department' | 'position' | 'team', multiple? }` alongside the bare-string form — a typed entry tells the decision UI to render the matching record picker (id values; `multiple` collects an id array) instead of free text, turning "paste user ids" into "pick people". The type shapes only the input widget: the runtime whitelist works by `key` either way, via the new `normalizeDecisionOutputs` helper exported from `@objectstack/spec/automation` — the single reader of the union shape shared by the service, the request read, and `os lint`. The request read now carries `decision_output_defs` (normalized declarations) alongside the version-skew-safe `decision_outputs` key list.
0 commit comments