Allow passing pre-parsed parameters to parse_tool_test_descriptions()
to avoid re-calling input_models_for_tool_source() when the caller
already has the parameters.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Allow null in FormInputNode.help for FormEntry compatibility
- Change stepsNotMatchingRequest from number[] to string[]
- Remove index signature from FormInputNode, cast in syncServerAttributes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bug fix: onChange previously called buildFormData() which mutated
formData.value before the comparison, making the condition always
false. Now buildFormData is pure (returns params without side effects),
and onChange follows compare → assign → emit ordering.
syncServerAttributes now filters client-owned fields (value, error,
warning) from the server node before assigning to input.attributes.
This enforces the separation between server state (attributes) and
client state (clone properties).
set() audit: only used where properties are genuinely new on freshly
cloned objects (error/warning in cloneInputs, attributes in
syncServerAttributes). Subsequent mutations use plain assignment since
properties already exist and are reactive.
Additional changes:
- Initialize warning=null alongside error in cloneInputs
- Document bootstrap emission as intentional pre-watcher behavior
- Note flush:"sync" as a performance consideration
- Note getCurrentInstance as a Vue 2.7 constraint
- Document inferred-defaults-vs-user-intent as known debt with test
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rewrites FormDisplay.vue from Options API to <script setup> backed
by the useFormState composable. All watchers use flush: "sync" to
preserve the synchronous timing of the original Options API watchers.
Uses Vue.set() (imported as set) for reactive property additions on
cloned input nodes, which is required for Vue 2.7 reactivity.
External API (props/events) is unchanged — all 13 consumers work
without modification.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extracts form state logic (cloning, indexing, attribute sync, errors,
warnings, validation) into a pure composable with no DOM dependencies.
Uses visitAllInputs for attribute sync so inactive conditional cases
receive fresh server attributes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
visitInputs only visits the active conditional case, which is correct
for building submission data but not for syncing server attributes.
visitAllInputs walks every conditional branch so that attribute sync
covers inactive cases too, fixing stale data_column options when
switching conditionals.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>