@galaxy-tool-util/schema 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.d.ts +87 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +62 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/schema/type-guards.d.ts +14 -0
  7. package/dist/schema/type-guards.d.ts.map +1 -0
  8. package/dist/schema/type-guards.js +25 -0
  9. package/dist/schema/type-guards.js.map +1 -0
  10. package/dist/test-format/cross-check/check.d.ts +18 -0
  11. package/dist/test-format/cross-check/check.d.ts.map +1 -0
  12. package/dist/test-format/cross-check/check.js +89 -0
  13. package/dist/test-format/cross-check/check.js.map +1 -0
  14. package/dist/test-format/cross-check/extract-format2.d.ts +13 -0
  15. package/dist/test-format/cross-check/extract-format2.d.ts.map +1 -0
  16. package/dist/test-format/cross-check/extract-format2.js +98 -0
  17. package/dist/test-format/cross-check/extract-format2.js.map +1 -0
  18. package/dist/test-format/cross-check/extract-native.d.ts +4 -0
  19. package/dist/test-format/cross-check/extract-native.d.ts.map +1 -0
  20. package/dist/test-format/cross-check/extract-native.js +89 -0
  21. package/dist/test-format/cross-check/extract-native.js.map +1 -0
  22. package/dist/test-format/cross-check/extract.d.ts +9 -0
  23. package/dist/test-format/cross-check/extract.d.ts.map +1 -0
  24. package/dist/test-format/cross-check/extract.js +16 -0
  25. package/dist/test-format/cross-check/extract.js.map +1 -0
  26. package/dist/test-format/cross-check/index.d.ts +7 -0
  27. package/dist/test-format/cross-check/index.d.ts.map +1 -0
  28. package/dist/test-format/cross-check/index.js +6 -0
  29. package/dist/test-format/cross-check/index.js.map +1 -0
  30. package/dist/test-format/cross-check/type-compat.d.ts +23 -0
  31. package/dist/test-format/cross-check/type-compat.d.ts.map +1 -0
  32. package/dist/test-format/cross-check/type-compat.js +48 -0
  33. package/dist/test-format/cross-check/type-compat.js.map +1 -0
  34. package/dist/test-format/cross-check/types.d.ts +23 -0
  35. package/dist/test-format/cross-check/types.d.ts.map +1 -0
  36. package/dist/test-format/cross-check/types.js +10 -0
  37. package/dist/test-format/cross-check/types.js.map +1 -0
  38. package/dist/test-format/index.d.ts +3 -0
  39. package/dist/test-format/index.d.ts.map +1 -0
  40. package/dist/test-format/index.js +3 -0
  41. package/dist/test-format/index.js.map +1 -0
  42. package/dist/test-format/tests.schema.generated.d.ts +5610 -0
  43. package/dist/test-format/tests.schema.generated.d.ts.map +1 -0
  44. package/dist/test-format/tests.schema.generated.js +6899 -0
  45. package/dist/test-format/tests.schema.generated.js.map +1 -0
  46. package/dist/test-format/validate.d.ts +20 -0
  47. package/dist/test-format/validate.d.ts.map +1 -0
  48. package/dist/test-format/validate.js +41 -0
  49. package/dist/test-format/validate.js.map +1 -0
  50. package/dist/tool-state-validator.d.ts +23 -0
  51. package/dist/tool-state-validator.d.ts.map +1 -0
  52. package/dist/tool-state-validator.js +59 -0
  53. package/dist/tool-state-validator.js.map +1 -0
  54. package/dist/workflow/clean.d.ts +56 -3
  55. package/dist/workflow/clean.d.ts.map +1 -1
  56. package/dist/workflow/clean.js +227 -27
  57. package/dist/workflow/clean.js.map +1 -1
  58. package/dist/workflow/coercions.d.ts +22 -0
  59. package/dist/workflow/coercions.d.ts.map +1 -0
  60. package/dist/workflow/coercions.js +67 -0
  61. package/dist/workflow/coercions.js.map +1 -0
  62. package/dist/workflow/index.d.ts +17 -4
  63. package/dist/workflow/index.d.ts.map +1 -1
  64. package/dist/workflow/index.js +18 -3
  65. package/dist/workflow/index.js.map +1 -1
  66. package/dist/workflow/lint-profiles.d.ts +27 -0
  67. package/dist/workflow/lint-profiles.d.ts.map +1 -0
  68. package/dist/workflow/lint-profiles.js +49 -0
  69. package/dist/workflow/lint-profiles.js.map +1 -0
  70. package/dist/workflow/lint-rules.d.ts +15 -0
  71. package/dist/workflow/lint-rules.d.ts.map +1 -0
  72. package/dist/workflow/lint-rules.js +15 -0
  73. package/dist/workflow/lint-rules.js.map +1 -0
  74. package/dist/workflow/lint.d.ts +4 -18
  75. package/dist/workflow/lint.d.ts.map +1 -1
  76. package/dist/workflow/lint.js +9 -30
  77. package/dist/workflow/lint.js.map +1 -1
  78. package/dist/workflow/lint_profiles.yml +41 -0
  79. package/dist/workflow/linting.d.ts +54 -0
  80. package/dist/workflow/linting.d.ts.map +1 -0
  81. package/dist/workflow/linting.js +71 -0
  82. package/dist/workflow/linting.js.map +1 -0
  83. package/dist/workflow/normalized/index.d.ts +5 -2
  84. package/dist/workflow/normalized/index.d.ts.map +1 -1
  85. package/dist/workflow/normalized/index.js +2 -0
  86. package/dist/workflow/normalized/index.js.map +1 -1
  87. package/dist/workflow/normalized/stateful-runner.d.ts +82 -0
  88. package/dist/workflow/normalized/stateful-runner.d.ts.map +1 -0
  89. package/dist/workflow/normalized/stateful-runner.js +122 -0
  90. package/dist/workflow/normalized/stateful-runner.js.map +1 -0
  91. package/dist/workflow/normalized/toFormat2.d.ts +19 -1
  92. package/dist/workflow/normalized/toFormat2.d.ts.map +1 -1
  93. package/dist/workflow/normalized/toFormat2.js +47 -16
  94. package/dist/workflow/normalized/toFormat2.js.map +1 -1
  95. package/dist/workflow/normalized/toFormat2Stateful.d.ts +30 -0
  96. package/dist/workflow/normalized/toFormat2Stateful.d.ts.map +1 -0
  97. package/dist/workflow/normalized/toFormat2Stateful.js +58 -0
  98. package/dist/workflow/normalized/toFormat2Stateful.js.map +1 -0
  99. package/dist/workflow/normalized/toNative.d.ts +10 -1
  100. package/dist/workflow/normalized/toNative.d.ts.map +1 -1
  101. package/dist/workflow/normalized/toNative.js +24 -8
  102. package/dist/workflow/normalized/toNative.js.map +1 -1
  103. package/dist/workflow/normalized/toNativeStateful.d.ts +31 -0
  104. package/dist/workflow/normalized/toNativeStateful.d.ts.map +1 -0
  105. package/dist/workflow/normalized/toNativeStateful.js +55 -0
  106. package/dist/workflow/normalized/toNativeStateful.js.map +1 -0
  107. package/dist/workflow/param-navigation.d.ts +26 -0
  108. package/dist/workflow/param-navigation.d.ts.map +1 -0
  109. package/dist/workflow/param-navigation.js +60 -0
  110. package/dist/workflow/param-navigation.js.map +1 -0
  111. package/dist/workflow/precheck.d.ts +54 -0
  112. package/dist/workflow/precheck.d.ts.map +1 -0
  113. package/dist/workflow/precheck.js +91 -0
  114. package/dist/workflow/precheck.js.map +1 -0
  115. package/dist/workflow/raw/gxformat2.effect.d.ts +97 -97
  116. package/dist/workflow/raw/gxformat2.effect.d.ts.map +1 -1
  117. package/dist/workflow/raw/gxformat2.effect.js +98 -88
  118. package/dist/workflow/raw/gxformat2.effect.js.map +1 -1
  119. package/dist/workflow/raw/native.d.ts +2 -2
  120. package/dist/workflow/raw/native.d.ts.map +1 -1
  121. package/dist/workflow/raw/native.effect.d.ts +33 -33
  122. package/dist/workflow/raw/native.effect.d.ts.map +1 -1
  123. package/dist/workflow/raw/native.effect.js +42 -32
  124. package/dist/workflow/raw/native.effect.js.map +1 -1
  125. package/dist/workflow/report-models.d.ts +412 -0
  126. package/dist/workflow/report-models.d.ts.map +1 -0
  127. package/dist/workflow/report-models.js +342 -0
  128. package/dist/workflow/report-models.js.map +1 -0
  129. package/dist/workflow/roundtrip.d.ts +77 -0
  130. package/dist/workflow/roundtrip.d.ts.map +1 -0
  131. package/dist/workflow/roundtrip.js +597 -0
  132. package/dist/workflow/roundtrip.js.map +1 -0
  133. package/dist/workflow/runtime-markers.d.ts +20 -0
  134. package/dist/workflow/runtime-markers.d.ts.map +1 -0
  135. package/dist/workflow/runtime-markers.js +26 -0
  136. package/dist/workflow/runtime-markers.js.map +1 -0
  137. package/dist/workflow/schema-rules.d.ts +38 -0
  138. package/dist/workflow/schema-rules.d.ts.map +1 -0
  139. package/dist/workflow/schema-rules.js +28 -0
  140. package/dist/workflow/schema-rules.js.map +1 -0
  141. package/dist/workflow/schema_rules.yml +69 -0
  142. package/dist/workflow/serialize.d.ts +30 -0
  143. package/dist/workflow/serialize.d.ts.map +1 -0
  144. package/dist/workflow/serialize.js +37 -0
  145. package/dist/workflow/serialize.js.map +1 -0
  146. package/dist/workflow/stale-keys.d.ts +16 -0
  147. package/dist/workflow/stale-keys.d.ts.map +1 -0
  148. package/dist/workflow/stale-keys.js +43 -0
  149. package/dist/workflow/stale-keys.js.map +1 -0
  150. package/dist/workflow/state-merge.d.ts +15 -32
  151. package/dist/workflow/state-merge.d.ts.map +1 -1
  152. package/dist/workflow/state-merge.js +31 -225
  153. package/dist/workflow/state-merge.js.map +1 -1
  154. package/dist/workflow/stateful-convert.d.ts +47 -0
  155. package/dist/workflow/stateful-convert.d.ts.map +1 -0
  156. package/dist/workflow/stateful-convert.js +151 -0
  157. package/dist/workflow/stateful-convert.js.map +1 -0
  158. package/dist/workflow/stateful-validate.d.ts +67 -0
  159. package/dist/workflow/stateful-validate.d.ts.map +1 -0
  160. package/dist/workflow/stateful-validate.js +123 -0
  161. package/dist/workflow/stateful-validate.js.map +1 -0
  162. package/dist/workflow/strict-checks.d.ts +22 -0
  163. package/dist/workflow/strict-checks.d.ts.map +1 -0
  164. package/dist/workflow/strict-checks.js +95 -0
  165. package/dist/workflow/strict-checks.js.map +1 -0
  166. package/dist/workflow/tool-state-io.d.ts +14 -0
  167. package/dist/workflow/tool-state-io.d.ts.map +1 -0
  168. package/dist/workflow/tool-state-io.js +33 -0
  169. package/dist/workflow/tool-state-io.js.map +1 -0
  170. package/dist/workflow/validators.d.ts +34 -0
  171. package/dist/workflow/validators.d.ts.map +1 -0
  172. package/dist/workflow/validators.js +83 -0
  173. package/dist/workflow/validators.js.map +1 -0
  174. package/dist/workflow/walk-helpers.d.ts +29 -0
  175. package/dist/workflow/walk-helpers.d.ts.map +1 -0
  176. package/dist/workflow/walk-helpers.js +89 -0
  177. package/dist/workflow/walk-helpers.js.map +1 -0
  178. package/dist/workflow/walker.d.ts +55 -0
  179. package/dist/workflow/walker.d.ts.map +1 -0
  180. package/dist/workflow/walker.js +199 -0
  181. package/dist/workflow/walker.js.map +1 -0
  182. package/package.json +21 -16
@@ -1,248 +1,54 @@
1
1
  /**
2
- * Inject ConnectedValue markers into workflow state dicts.
2
+ * ConnectedValue injection and stripping for workflow state dicts.
3
3
  *
4
- * Port of Python galaxy.tool_util.workflow_state._state_merge +
5
- * helper functions from galaxy.tool_util.parameters.visitor.
4
+ * Thin wrappers around walkNativeState that inject or strip
5
+ * ConnectedValue markers. Mutate state in-place for caller compat.
6
6
  *
7
- * Walks the parameter tree to match pipe-separated connection paths
8
- * (e.g. "queries_0|input2") to tool parameters. Handles conditionals,
9
- * repeats, and sections. Used by validate-workflow for both native
10
- * and format2 validation paths.
7
+ * Port of Python galaxy.tool_util.workflow_state._state_merge.
8
+ * Tree-walking helpers live in walk-helpers.ts; re-exported here
9
+ * for backward compatibility.
11
10
  */
12
- // --- Helpers (ported from Python visitor.py) ---
13
- /** Build flat pipe-separated state path: `name` or `prefix|name`. */
14
- export function flatStatePath(name, prefix) {
15
- return prefix != null ? `${prefix}|${name}` : name;
16
- }
17
- /** Filter a flat key→value map to keys starting with a given prefix. */
18
- export function keysStartingWith(map, prefix) {
19
- const result = {};
20
- for (const [key, value] of Object.entries(map)) {
21
- if (key.startsWith(prefix)) {
22
- result[key] = value;
23
- }
24
- }
25
- return result;
26
- }
27
- /**
28
- * Split flat connection keys for a repeat into per-instance arrays.
29
- *
30
- * Connection keys use the pattern `repeatName_N|paramName`.
31
- * Returns an array of per-instance connection dicts.
32
- */
33
- export function repeatInputsToArray(statePath, inputs) {
34
- const repeatInputs = keysStartingWith(inputs, statePath + "_");
35
- let highestCount = -1;
36
- for (const key of Object.keys(repeatInputs)) {
37
- const numStr = key.slice(statePath.length + 1).split("|")[0];
38
- const num = parseInt(numStr, 10);
39
- if (!isNaN(num) && num > highestCount) {
40
- highestCount = num;
41
- }
42
- }
43
- const params = [];
44
- for (let i = 0; i <= highestCount; i++) {
45
- params.push({});
46
- }
47
- for (const [key, value] of Object.entries(repeatInputs)) {
48
- const numStr = key.slice(statePath.length + 1).split("|")[0];
49
- const num = parseInt(numStr, 10);
50
- if (!isNaN(num)) {
51
- params[num][key] = value;
52
- }
53
- }
54
- return params;
55
- }
56
- /**
57
- * Select the matching ConditionalWhen for a conditional state dict.
58
- *
59
- * Matches the test parameter's value in state against each when's
60
- * discriminator. Falls back to the default when if no match found.
61
- * Returns null if no match at all (graceful degradation).
62
- */
63
- export function selectWhichWhen(conditional, state) {
64
- const testParam = conditional.test_parameter;
65
- const testValue = state[testParam.name];
66
- // Try exact match first
67
- for (const when of conditional.whens) {
68
- if (_testValueMatchesDiscriminator(testParam, testValue, when.discriminator)) {
69
- return when;
70
- }
71
- }
72
- // Fall back to default when
73
- for (const when of conditional.whens) {
74
- if (when.is_default_when) {
75
- return when;
76
- }
77
- }
78
- return null;
79
- }
80
- function _testValueMatchesDiscriminator(testParam, testValue, discriminator) {
81
- if (testParam.parameter_type === "gx_boolean") {
82
- // Boolean coercion: handle string "true"/"false"/"True"/"False" and actual booleans
83
- const boolValue = _coerceToBool(testValue);
84
- const discBool = typeof discriminator === "boolean" ? discriminator : _coerceToBool(discriminator);
85
- return boolValue === discBool;
86
- }
87
- // Select: string comparison
88
- return String(testValue) === String(discriminator);
89
- }
90
- function _coerceToBool(value) {
91
- if (typeof value === "boolean")
92
- return value;
93
- if (typeof value === "string") {
94
- const lower = value.toLowerCase();
95
- if (lower === "true")
96
- return true;
97
- if (lower === "false")
98
- return false;
99
- }
100
- return null;
101
- }
11
+ import { CONNECTED_VALUE, isConnectedValue } from "./runtime-markers.js";
12
+ import { walkNativeState, SKIP_VALUE } from "./walker.js";
13
+ import { flatStatePath, keysStartingWith, repeatInputsToArray, selectWhichWhen, } from "./walk-helpers.js";
14
+ // Re-export helpers so existing importers don't break
15
+ export { flatStatePath, keysStartingWith, repeatInputsToArray, selectWhichWhen };
102
16
  // --- Main injection function ---
103
- const CONNECTED_VALUE = { __class__: "ConnectedValue" };
104
17
  /**
105
18
  * Inject ConnectedValue markers into a state dict for all connections.
106
19
  *
107
- * Walks the parameter tree to match connection paths to tool parameters,
108
- * setting matched leaves to `{"__class__": "ConnectedValue"}`.
109
- * Mutates `state` in-place.
20
+ * Uses walkNativeState with a leaf callback that replaces connected
21
+ * leaves with ConnectedValue markers, then reassigns the input state
22
+ * in-place to preserve the mutation contract callers expect.
110
23
  *
111
24
  * @returns remaining unmatched connection paths (empty if all consumed)
112
25
  */
113
26
  export function injectConnectionsIntoState(toolInputs, state, connections) {
114
27
  const remaining = { ...connections };
115
- for (const toolInput of toolInputs) {
116
- _mergeParam(remaining, toolInput, state);
117
- }
28
+ const result = walkNativeState(connections, toolInputs, state, (_input, value, statePath) => {
29
+ if (statePath in remaining) {
30
+ delete remaining[statePath];
31
+ return { ...CONNECTED_VALUE };
32
+ }
33
+ return value === undefined ? SKIP_VALUE : value;
34
+ }, { preserveUnknownKeys: true });
35
+ for (const key of Object.keys(state))
36
+ delete state[key];
37
+ Object.assign(state, result);
118
38
  return remaining;
119
39
  }
120
- function _mergeParam(connections, toolInput, state, prefix, branchConnections) {
121
- if (branchConnections == null) {
122
- branchConnections = connections;
123
- }
124
- const name = toolInput.name;
125
- const parameterType = toolInput.parameter_type;
126
- const statePath = flatStatePath(name, prefix);
127
- if (parameterType === "gx_conditional") {
128
- const conditional = toolInput;
129
- let conditionalState = state[name];
130
- if (conditionalState == null) {
131
- conditionalState = {};
132
- state[name] = conditionalState;
133
- }
134
- const when = selectWhichWhen(conditional, conditionalState);
135
- const conditionalConnections = keysStartingWith(branchConnections, statePath);
136
- _mergeParam(connections, conditional.test_parameter, conditionalState, statePath, conditionalConnections);
137
- if (when != null) {
138
- for (const whenParameter of when.parameters) {
139
- _mergeParam(connections, whenParameter, conditionalState, statePath, conditionalConnections);
140
- }
141
- }
142
- }
143
- else if (parameterType === "gx_repeat") {
144
- const repeat = toolInput;
145
- let repeatStateArray = state[name];
146
- if (repeatStateArray == null) {
147
- repeatStateArray = [];
148
- }
149
- const repeatInstanceConnects = repeatInputsToArray(statePath, connections);
150
- for (let i = 0; i < repeatInstanceConnects.length; i++) {
151
- while (repeatStateArray.length <= i) {
152
- repeatStateArray.push({});
153
- }
154
- const instancePrefix = `${statePath}_${i}`;
155
- for (const repeatParameter of repeat.parameters) {
156
- _mergeParam(connections, repeatParameter, repeatStateArray[i], instancePrefix, repeatInstanceConnects[i]);
157
- }
158
- }
159
- if (repeatStateArray.length > 0 && !(name in state)) {
160
- state[name] = repeatStateArray;
161
- }
162
- }
163
- else if (parameterType === "gx_section") {
164
- const section = toolInput;
165
- let sectionState = state[name];
166
- if (sectionState == null) {
167
- sectionState = {};
168
- state[name] = sectionState;
169
- }
170
- const sectionConnections = keysStartingWith(branchConnections, statePath);
171
- for (const sectionParameter of section.parameters) {
172
- _mergeParam(connections, sectionParameter, sectionState, statePath, sectionConnections);
173
- }
174
- }
175
- else {
176
- // Leaf parameter
177
- if (statePath in branchConnections) {
178
- state[name] = { ...CONNECTED_VALUE };
179
- delete connections[statePath];
180
- }
181
- }
182
- }
183
40
  // --- ConnectedValue stripping ---
184
- function _isConnectedValue(value) {
185
- return (value != null &&
186
- typeof value === "object" &&
187
- !Array.isArray(value) &&
188
- value.__class__ === "ConnectedValue");
189
- }
190
41
  /**
191
42
  * Strip ConnectedValue markers from a state dict using the parameter tree.
192
43
  *
193
- * Walks conditionals, repeats, and sections so nested markers inside
194
- * container parameters are removed. Mutates `state` in-place.
44
+ * Uses walkNativeState with a leaf callback that omits ConnectedValue
45
+ * entries via SKIP_VALUE, then reassigns the input state in-place to
46
+ * preserve the mutation contract callers expect.
195
47
  */
196
48
  export function stripConnectedValues(toolInputs, state) {
197
- for (const toolInput of toolInputs) {
198
- _stripParam(toolInput, state);
199
- }
200
- }
201
- function _stripParam(toolInput, state, prefix) {
202
- const name = toolInput.name;
203
- const parameterType = toolInput.parameter_type;
204
- if (parameterType === "gx_conditional") {
205
- const conditional = toolInput;
206
- const conditionalState = state[name];
207
- if (conditionalState == null)
208
- return;
209
- const statePath = flatStatePath(name, prefix);
210
- _stripParam(conditional.test_parameter, conditionalState, statePath);
211
- const when = selectWhichWhen(conditional, conditionalState);
212
- if (when != null) {
213
- for (const whenParameter of when.parameters) {
214
- _stripParam(whenParameter, conditionalState, statePath);
215
- }
216
- }
217
- }
218
- else if (parameterType === "gx_repeat") {
219
- const repeat = toolInput;
220
- const repeatStateArray = state[name];
221
- if (!Array.isArray(repeatStateArray))
222
- return;
223
- const statePath = flatStatePath(name, prefix);
224
- for (let i = 0; i < repeatStateArray.length; i++) {
225
- const instancePrefix = `${statePath}_${i}`;
226
- for (const repeatParameter of repeat.parameters) {
227
- _stripParam(repeatParameter, repeatStateArray[i], instancePrefix);
228
- }
229
- }
230
- }
231
- else if (parameterType === "gx_section") {
232
- const section = toolInput;
233
- const sectionState = state[name];
234
- if (sectionState == null)
235
- return;
236
- const statePath = flatStatePath(name, prefix);
237
- for (const sectionParameter of section.parameters) {
238
- _stripParam(sectionParameter, sectionState, statePath);
239
- }
240
- }
241
- else {
242
- // Leaf parameter
243
- if (_isConnectedValue(state[name])) {
244
- delete state[name];
245
- }
246
- }
49
+ const cleaned = walkNativeState({}, toolInputs, state, (_input, value) => isConnectedValue(value) ? SKIP_VALUE : value === undefined ? SKIP_VALUE : value, { preserveUnknownKeys: true });
50
+ for (const key of Object.keys(state))
51
+ delete state[key];
52
+ Object.assign(state, cleaned);
247
53
  }
248
54
  //# sourceMappingURL=state-merge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-merge.js","sourceRoot":"","sources":["../../src/workflow/state-merge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state-merge.js","sourceRoot":"","sources":["../../src/workflow/state-merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,sDAAsD;AACtD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC;AAEjF,kCAAkC;AAElC;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAAgC,EAChC,KAA8B,EAC9B,WAAoC;IAEpC,MAAM,SAAS,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,eAAe,CAC5B,WAAW,EACX,UAAU,EACV,KAAK,EACL,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC3B,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;YAC5B,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,CAAC,EACD,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAC9B,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,mCAAmC;AAEnC;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAgC,EAChC,KAA8B;IAE9B,MAAM,OAAO,GAAG,eAAe,CAC7B,EAAE,EACF,UAAU,EACV,KAAK,EACL,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAChB,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EACjF,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAC9B,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Schema-aware (stateful) state conversion between native and format2 formats.
3
+ *
4
+ * Uses the walker to traverse tool_state with parameter definitions,
5
+ * coercing scalar types and separating connections/runtime values.
6
+ *
7
+ * Design: no double encoding, no legacy decode, clean dicts throughout.
8
+ */
9
+ import type { ToolParameterModel } from "../schema/bundle-types.js";
10
+ import type { NormalizedNativeStep } from "./normalized/native.js";
11
+ /**
12
+ * Coerce a native scalar value to its format2 representation.
13
+ *
14
+ * Native tool_state may have string-typed numbers, booleans, or
15
+ * comma-delimited multi-selects. Format2 uses proper JS types.
16
+ */
17
+ export declare function convertScalarValue(toolInput: ToolParameterModel, value: unknown): unknown;
18
+ /**
19
+ * Reverse-coerce a format2 scalar value back to native representation.
20
+ *
21
+ * Format2 uses proper JS types; native may need string coercions for
22
+ * multi-select and data_column values.
23
+ */
24
+ export declare function reverseScalarValue(toolInput: ToolParameterModel, value: unknown): unknown;
25
+ export interface Format2ConvertedState {
26
+ state: Record<string, unknown>;
27
+ in: Record<string, string>;
28
+ }
29
+ /**
30
+ * Convert a native step's tool_state to format2 state + in block.
31
+ *
32
+ * Walks the parameter tree:
33
+ * - Data params → `in` block (connected/runtime) or SKIP
34
+ * - ConnectedValue/RuntimeValue markers → `in` block
35
+ * - gx_rules → parse JSON string, SKIP if null/connected
36
+ * - Null/"null" values → SKIP
37
+ * - Scalars → coerce via convertScalarValue()
38
+ */
39
+ export declare function convertStateToFormat2(nativeStep: NormalizedNativeStep, toolInputs: ToolParameterModel[]): Format2ConvertedState;
40
+ /**
41
+ * Encode format2 state back to native tool_state.
42
+ *
43
+ * Walks format2 state reversing coercions (e.g. number arrays → string arrays
44
+ * for multi-select/data_column). Returns a clean dict — no JSON.stringify per key.
45
+ */
46
+ export declare function encodeStateToNative(toolInputs: ToolParameterModel[], state: Record<string, unknown>): Record<string, unknown>;
47
+ //# sourceMappingURL=stateful-convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateful-convert.d.ts","sourceRoot":"","sources":["../../src/workflow/stateful-convert.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAGnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAQnE;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CA8BzF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAqBzF;AAID,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAKD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,oBAAoB,EAChC,UAAU,EAAE,kBAAkB,EAAE,GAC/B,qBAAqB,CA+DvB;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,kBAAkB,EAAE,EAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Schema-aware (stateful) state conversion between native and format2 formats.
3
+ *
4
+ * Uses the walker to traverse tool_state with parameter definitions,
5
+ * coercing scalar types and separating connections/runtime values.
6
+ *
7
+ * Design: no double encoding, no legacy decode, clean dicts throughout.
8
+ */
9
+ import { walkNativeState, walkFormat2State, SKIP_VALUE } from "./walker.js";
10
+ import { isConnectedValue, isRuntimeValue } from "./runtime-markers.js";
11
+ import { parseBool, parseNumber, parseStringArray, parseNumberArray } from "./coercions.js";
12
+ // --- Scalar coercions ---
13
+ /**
14
+ * Coerce a native scalar value to its format2 representation.
15
+ *
16
+ * Native tool_state may have string-typed numbers, booleans, or
17
+ * comma-delimited multi-selects. Format2 uses proper JS types.
18
+ */
19
+ export function convertScalarValue(toolInput, value) {
20
+ const paramType = toolInput.parameter_type;
21
+ if (paramType === "gx_integer" || paramType === "gx_float") {
22
+ return parseNumber(value) ?? value;
23
+ }
24
+ if (paramType === "gx_boolean") {
25
+ return parseBool(value) ?? value;
26
+ }
27
+ if (paramType === "gx_select") {
28
+ const select = toolInput;
29
+ if (select.multiple) {
30
+ return parseStringArray(value) ?? value;
31
+ }
32
+ return value;
33
+ }
34
+ if (paramType === "gx_data_column") {
35
+ const col = toolInput;
36
+ if (col.multiple) {
37
+ return parseNumberArray(value) ?? value;
38
+ }
39
+ return parseNumber(value) ?? value;
40
+ }
41
+ // Passthrough for text, color, hidden, directory_uri, genomebuild,
42
+ // baseurl, drill_down, group_tag, and CWL types
43
+ return value;
44
+ }
45
+ /**
46
+ * Reverse-coerce a format2 scalar value back to native representation.
47
+ *
48
+ * Format2 uses proper JS types; native may need string coercions for
49
+ * multi-select and data_column values.
50
+ */
51
+ export function reverseScalarValue(toolInput, value) {
52
+ const paramType = toolInput.parameter_type;
53
+ if (paramType === "gx_select") {
54
+ const select = toolInput;
55
+ if (select.multiple && Array.isArray(value)) {
56
+ return value.map(String);
57
+ }
58
+ return value;
59
+ }
60
+ if (paramType === "gx_data_column") {
61
+ const col = toolInput;
62
+ if (col.multiple && Array.isArray(value)) {
63
+ return value.map(String);
64
+ }
65
+ return typeof value === "number" ? String(value) : value;
66
+ }
67
+ // Most types pass through unchanged
68
+ return value;
69
+ }
70
+ /** Data parameter types — always go to `in` block, never to state. */
71
+ const DATA_PARAM_TYPES = new Set(["gx_data", "gx_data_collection"]);
72
+ /**
73
+ * Convert a native step's tool_state to format2 state + in block.
74
+ *
75
+ * Walks the parameter tree:
76
+ * - Data params → `in` block (connected/runtime) or SKIP
77
+ * - ConnectedValue/RuntimeValue markers → `in` block
78
+ * - gx_rules → parse JSON string, SKIP if null/connected
79
+ * - Null/"null" values → SKIP
80
+ * - Scalars → coerce via convertScalarValue()
81
+ */
82
+ export function convertStateToFormat2(nativeStep, toolInputs) {
83
+ const toolState = nativeStep.tool_state;
84
+ // Widen readonly tuples to unknown for the walker's connection lookup.
85
+ const inputConnections = nativeStep.input_connections;
86
+ const connectedPaths = nativeStep.connected_paths;
87
+ const inBlock = {};
88
+ const leafCallback = (toolInput, value, statePath) => {
89
+ const paramType = toolInput.parameter_type;
90
+ // Data parameters: always to `in` block
91
+ if (DATA_PARAM_TYPES.has(paramType)) {
92
+ if (isConnectedValue(value) || connectedPaths.has(statePath)) {
93
+ // Connected data param — recorded via input_connections, handled by structural conversion
94
+ }
95
+ if (isRuntimeValue(value)) {
96
+ inBlock[statePath] = "runtime_value";
97
+ }
98
+ return SKIP_VALUE;
99
+ }
100
+ // Rules parameter: parse JSON string
101
+ if (paramType === "gx_rules") {
102
+ if (value == null || isConnectedValue(value)) {
103
+ if (isConnectedValue(value) || connectedPaths.has(statePath)) {
104
+ // Will be in `in` block via structural conversion
105
+ }
106
+ return SKIP_VALUE;
107
+ }
108
+ if (typeof value === "string") {
109
+ try {
110
+ return JSON.parse(value);
111
+ }
112
+ catch {
113
+ return value;
114
+ }
115
+ }
116
+ return value;
117
+ }
118
+ // ConnectedValue → record in `in` block, skip from state
119
+ if (isConnectedValue(value)) {
120
+ // Connection source handled by structural conversion's input_connections
121
+ return SKIP_VALUE;
122
+ }
123
+ // RuntimeValue → record in `in` block, skip from state
124
+ if (isRuntimeValue(value)) {
125
+ inBlock[statePath] = "runtime_value";
126
+ return SKIP_VALUE;
127
+ }
128
+ // Null / "null" values → skip
129
+ if (value === null || value === undefined || value === "null") {
130
+ return SKIP_VALUE;
131
+ }
132
+ // Scalar coercion
133
+ return convertScalarValue(toolInput, value);
134
+ };
135
+ const state = walkNativeState(inputConnections, toolInputs, toolState, leafCallback);
136
+ return { state, in: inBlock };
137
+ }
138
+ // --- Format2 → Native conversion ---
139
+ /**
140
+ * Encode format2 state back to native tool_state.
141
+ *
142
+ * Walks format2 state reversing coercions (e.g. number arrays → string arrays
143
+ * for multi-select/data_column). Returns a clean dict — no JSON.stringify per key.
144
+ */
145
+ export function encodeStateToNative(toolInputs, state) {
146
+ const leafCallback = (toolInput, value) => {
147
+ return reverseScalarValue(toolInput, value);
148
+ };
149
+ return walkFormat2State(toolInputs, state, leafCallback);
150
+ }
151
+ //# sourceMappingURL=stateful-convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateful-convert.js","sourceRoot":"","sources":["../../src/workflow/stateful-convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Schema validation wrappers for stateful conversion.
3
+ *
4
+ * Runs the generated Effect Schema (`createFieldModel`) against native
5
+ * tool_state (pre-conversion) and format2 state (post-conversion), throwing
6
+ * a tagged `ConversionValidationFailure` on mismatch. The stateful wrappers
7
+ * catch this and push a structured fallback entry so callers can
8
+ * distinguish validation failures from walker errors.
9
+ *
10
+ * Deferred from Step 2 of TS_STATEFUL_CONVERSION_PLAN — integration point
11
+ * is the stateful runner, which calls these pre/post `convert`.
12
+ */
13
+ import "../schema/parameters/index.js";
14
+ import type { ToolParameterModel } from "../schema/bundle-types.js";
15
+ export type ValidationPhase = "pre" | "post";
16
+ /**
17
+ * Thrown when tool_state fails Effect Schema validation before or after
18
+ * stateful conversion. Carries the phase and formatted issue list so the
19
+ * runner can emit a structured fallback status.
20
+ */
21
+ export declare class ConversionValidationFailure extends Error {
22
+ readonly phase: ValidationPhase;
23
+ readonly issues: string[];
24
+ readonly _tag: "ConversionValidationFailure";
25
+ constructor(phase: ValidationPhase, issues: string[]);
26
+ }
27
+ /**
28
+ * Validate native tool_state against `workflow_step_native`. Connection
29
+ * paths are merged as `ConnectedValue` markers before validation so linked
30
+ * fields don't trip the schema.
31
+ *
32
+ * Returns silently if the schema cannot be built (unsupported parameter
33
+ * types) or if validation passes. Throws `ConversionValidationFailure`
34
+ * with phase="pre" on validation failure.
35
+ */
36
+ export declare function validateNativeStepState(inputs: ToolParameterModel[], toolState: Record<string, unknown>, inputConnections?: Record<string, unknown>): void;
37
+ /**
38
+ * Validate format2 tool_state against `workflow_step`. Any stray
39
+ * `ConnectedValue` markers left over from normalization are stripped
40
+ * before validation (they belong in the `in` block, not the state).
41
+ *
42
+ * Returns silently on success or if the schema cannot be built. Throws
43
+ * `ConversionValidationFailure` with phase="post" on validation failure.
44
+ */
45
+ export declare function validateFormat2StepState(inputs: ToolParameterModel[], format2State: Record<string, unknown>): void;
46
+ /**
47
+ * A single diagnostic produced by tool-state validation.
48
+ *
49
+ * Defined here (lower-level module) so both {@link validateFormat2StepStateStrict}
50
+ * and the higher-level {@link ToolStateValidator} share one canonical type.
51
+ */
52
+ export interface ToolStateDiagnostic {
53
+ /** Dot-separated parameter path, or "" for top-level / unlocated issues. */
54
+ path: string;
55
+ message: string;
56
+ severity: "error" | "warning";
57
+ }
58
+ /**
59
+ * Strict variant of {@link validateFormat2StepState}: reports unknown keys as
60
+ * diagnostics rather than silently ignoring them.
61
+ *
62
+ * Uses `onExcessProperty: "error"` so Effect Schema flags any key that has no
63
+ * corresponding parameter definition. Returns an empty array if the schema
64
+ * cannot be built or validation passes.
65
+ */
66
+ export declare function validateFormat2StepStateStrict(inputs: ToolParameterModel[], format2State: Record<string, unknown>): ToolStateDiagnostic[];
67
+ //# sourceMappingURL=stateful-validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateful-validate.d.ts","sourceRoot":"","sources":["../../src/workflow/stateful-validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EAA4B,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG9F,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;aAGlC,KAAK,EAAE,eAAe;aACtB,MAAM,EAAE,MAAM,EAAE;IAHlC,QAAQ,CAAC,IAAI,EAAG,6BAA6B,CAAU;gBAErC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,MAAM,EAAE;CAKnC;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,kBAAkB,EAAE,EAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAC7C,IAAI,CAiBN;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,kBAAkB,EAAE,EAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,IAAI,CAaN;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,kBAAkB,EAAE,EAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,mBAAmB,EAAE,CAqBvB"}