@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
@@ -0,0 +1,597 @@
1
+ import { ensureNative } from "./normalized/ensure.js";
2
+ import { toFormat2Stateful } from "./normalized/toFormat2Stateful.js";
3
+ import { toNativeStateful } from "./normalized/toNativeStateful.js";
4
+ import { isConnectedValue, isRuntimeValue } from "./runtime-markers.js";
5
+ import { STALE_KEYS as SKIP_KEYS, isRuntimeLeakKey } from "./stale-keys.js";
6
+ import { stripStaleKeysToolAware } from "./clean.js";
7
+ import { checkStrictEncoding, checkStrictStructure } from "./strict-checks.js";
8
+ /** Construct a BenignArtifact from an internal artifact kind. */
9
+ function makeBenignArtifact(kind) {
10
+ return { reason: kind, proven_by: [] };
11
+ }
12
+ // --- Bookkeeping / internal helpers ---
13
+ /** Compare two scalar values with format2↔native type-equivalence. */
14
+ function scalarsEquivalent(a, b) {
15
+ if (a === b)
16
+ return true;
17
+ // Nullish equivalence: null, undefined, and the string "null" all
18
+ // represent "no value" in serialized workflow state. JSON has no
19
+ // undefined, so a JS undefined reaching the differ means a key was
20
+ // present-but-unset or missing entirely — equivalent to an explicit
21
+ // null on the other side. Matches Python roundtrip.py's
22
+ // `orig_val in (None, "null")` treatment.
23
+ const isNullish = (v) => v === null || v === undefined || v === "null";
24
+ if (isNullish(a) && isNullish(b))
25
+ return true;
26
+ if (a == null || b == null)
27
+ return false;
28
+ // Booleans ↔ "true"/"false"/"yes"/"no"
29
+ const asBool = (v) => {
30
+ if (typeof v === "boolean")
31
+ return v;
32
+ if (typeof v === "string") {
33
+ const s = v.toLowerCase();
34
+ if (s === "true" || s === "yes")
35
+ return true;
36
+ if (s === "false" || s === "no")
37
+ return false;
38
+ }
39
+ return undefined;
40
+ };
41
+ const ab = asBool(a);
42
+ const bb = asBool(b);
43
+ if (ab !== undefined && bb !== undefined)
44
+ return ab === bb;
45
+ // Numbers ↔ strings
46
+ const asNum = (v) => {
47
+ if (typeof v === "number")
48
+ return v;
49
+ if (typeof v === "string" && v.trim() !== "") {
50
+ const n = Number(v);
51
+ return Number.isFinite(n) ? n : undefined;
52
+ }
53
+ return undefined;
54
+ };
55
+ const an = asNum(a);
56
+ const bn = asNum(b);
57
+ if (an !== undefined && bn !== undefined)
58
+ return an === bn;
59
+ return false;
60
+ }
61
+ function isPlainObject(v) {
62
+ return v != null && typeof v === "object" && !Array.isArray(v);
63
+ }
64
+ /**
65
+ * All leaf values are null / "null". Format2 export drops these sections,
66
+ * so their absence in the reimported state is benign.
67
+ */
68
+ function isAllNullDict(v) {
69
+ if (v === null || v === "null")
70
+ return true;
71
+ if (Array.isArray(v))
72
+ return v.every(isAllNullDict);
73
+ if (isPlainObject(v)) {
74
+ for (const [k, val] of Object.entries(v)) {
75
+ if (SKIP_KEYS.has(k))
76
+ continue;
77
+ if (!isAllNullDict(val))
78
+ return false;
79
+ }
80
+ return true;
81
+ }
82
+ return false;
83
+ }
84
+ /**
85
+ * Empty-repeat placeholder: empty arrays + null leaves. Requires at least
86
+ * one empty list to be present, matching Python's `_is_empty_container_dict`
87
+ * in `roundtrip.py` — otherwise a plain `{}` would be classified as this
88
+ * kind when `all_null_section_omitted` is more accurate.
89
+ */
90
+ function isEmptyContainerDict(v) {
91
+ let sawEmptyList = false;
92
+ const walk = (x) => {
93
+ if (x === null)
94
+ return true;
95
+ if (Array.isArray(x)) {
96
+ if (x.length === 0) {
97
+ sawEmptyList = true;
98
+ return true;
99
+ }
100
+ return x.every(walk);
101
+ }
102
+ if (isPlainObject(x)) {
103
+ for (const [k, val] of Object.entries(x)) {
104
+ if (SKIP_KEYS.has(k))
105
+ continue;
106
+ if (!walk(val))
107
+ return false;
108
+ }
109
+ return true;
110
+ }
111
+ return false;
112
+ };
113
+ const ok = walk(v);
114
+ return ok && sawEmptyList;
115
+ }
116
+ /** Contains only connection/runtime markers (moved to `in` block). */
117
+ function isConnectionOnlyDict(v) {
118
+ if (v == null)
119
+ return true;
120
+ if (isConnectedValue(v) || isRuntimeValue(v))
121
+ return true;
122
+ if (Array.isArray(v))
123
+ return v.every(isConnectionOnlyDict);
124
+ if (isPlainObject(v)) {
125
+ let sawMarker = false;
126
+ for (const [k, val] of Object.entries(v)) {
127
+ if (SKIP_KEYS.has(k))
128
+ continue;
129
+ if (val == null)
130
+ continue;
131
+ if (!isConnectionOnlyDict(val))
132
+ return false;
133
+ sawMarker = true;
134
+ }
135
+ return sawMarker;
136
+ }
137
+ return false;
138
+ }
139
+ function classifyMissing(value) {
140
+ if (value === null || value === undefined || value === "null") {
141
+ return "all_null_section_omitted";
142
+ }
143
+ if (isConnectedValue(value) || isRuntimeValue(value)) {
144
+ return "connection_only_section_omitted";
145
+ }
146
+ if (isConnectionOnlyDict(value))
147
+ return "connection_only_section_omitted";
148
+ if (isAllNullDict(value))
149
+ return "all_null_section_omitted";
150
+ if (isEmptyContainerDict(value))
151
+ return "empty_container_omitted";
152
+ return undefined;
153
+ }
154
+ /**
155
+ * Multi-select equivalence: `"a,b"`, `["a","b"]`, and a bare scalar
156
+ * compared against a 1-element list are all considered equivalent.
157
+ */
158
+ function multiSelectEquivalent(a, b) {
159
+ const norm = (v) => {
160
+ if (Array.isArray(v))
161
+ return v.map((x) => String(x));
162
+ if (typeof v === "string")
163
+ return v.split(",").map((s) => s.trim());
164
+ if (typeof v === "number" || typeof v === "boolean")
165
+ return [String(v)];
166
+ return undefined;
167
+ };
168
+ const na = norm(a);
169
+ const nb = norm(b);
170
+ if (!na || !nb)
171
+ return false;
172
+ if (na.length !== nb.length)
173
+ return false;
174
+ for (let i = 0; i < na.length; i++)
175
+ if (na[i] !== nb[i])
176
+ return false;
177
+ return true;
178
+ }
179
+ // --- Recursive diff ---
180
+ /**
181
+ * Recursive lockstep diff of two `tool_state` trees. Intentionally does
182
+ * not use `walker.ts` — that module is a single-tree leaf-callback walker
183
+ * keyed by parameter model, whereas this traverses two plain dicts in
184
+ * parallel without a tool-inputs context. Also intentionally does NOT
185
+ * JSON-decode string leaves (cf. Python's `_try_json_decode`): this port
186
+ * treats containers as proper dicts/lists end-to-end, matching the
187
+ * walker's "no legacy decode" principle.
188
+ */
189
+ function compareTree(orig, after, path, diffs) {
190
+ // Exact equivalence
191
+ if (scalarsEquivalent(orig, after))
192
+ return;
193
+ // Multi-select normalization: only when exactly one side is an array
194
+ // (scalar ↔ list, comma-string ↔ list). Two arrays fall through to the
195
+ // element-wise recursion below so identical arrays don't get flagged.
196
+ if (Array.isArray(orig) !== Array.isArray(after) && multiSelectEquivalent(orig, after)) {
197
+ diffs.push({
198
+ step_path: "",
199
+ key_path: path,
200
+ diff_type: "value_mismatch",
201
+ severity: "benign",
202
+ description: `multi-select representation differs: ${JSON.stringify(orig)} vs ${JSON.stringify(after)}`,
203
+ original_value: orig,
204
+ roundtrip_value: after,
205
+ benign_artifact: makeBenignArtifact("multi_select_normalized"),
206
+ });
207
+ return;
208
+ }
209
+ // Scalar mismatch after coercion rules → error
210
+ if (!isPlainObject(orig) &&
211
+ !isPlainObject(after) &&
212
+ !Array.isArray(orig) &&
213
+ !Array.isArray(after)) {
214
+ diffs.push({
215
+ step_path: "",
216
+ key_path: path,
217
+ diff_type: "value_mismatch",
218
+ severity: "error",
219
+ description: `value changed: ${JSON.stringify(orig)} → ${JSON.stringify(after)}`,
220
+ original_value: orig,
221
+ roundtrip_value: after,
222
+ benign_artifact: null,
223
+ });
224
+ return;
225
+ }
226
+ // Arrays: compare lengths, recurse element-wise
227
+ if (Array.isArray(orig) && Array.isArray(after)) {
228
+ if (orig.length !== after.length) {
229
+ diffs.push({
230
+ step_path: "",
231
+ key_path: path,
232
+ diff_type: "value_mismatch",
233
+ severity: "error",
234
+ description: `array length ${orig.length} → ${after.length}`,
235
+ original_value: orig,
236
+ roundtrip_value: after,
237
+ benign_artifact: null,
238
+ });
239
+ return;
240
+ }
241
+ for (let i = 0; i < orig.length; i++) {
242
+ compareTree(orig[i], after[i], `${path}[${i}]`, diffs);
243
+ }
244
+ return;
245
+ }
246
+ // Dict mismatch with non-dict other side
247
+ if (!isPlainObject(orig) || !isPlainObject(after)) {
248
+ // One side might be an omitted section represented by null/absent on the other
249
+ const benign = classifyMissing(orig) ?? classifyMissing(after);
250
+ if (benign) {
251
+ diffs.push({
252
+ step_path: "",
253
+ key_path: path,
254
+ diff_type: "value_mismatch",
255
+ severity: "benign",
256
+ description: `type change tolerated as ${benign}`,
257
+ original_value: orig,
258
+ roundtrip_value: after,
259
+ benign_artifact: makeBenignArtifact(benign),
260
+ });
261
+ return;
262
+ }
263
+ diffs.push({
264
+ step_path: "",
265
+ key_path: path,
266
+ diff_type: "value_mismatch",
267
+ severity: "error",
268
+ description: `structural mismatch: ${typeof orig} vs ${typeof after}`,
269
+ original_value: orig,
270
+ roundtrip_value: after,
271
+ benign_artifact: null,
272
+ });
273
+ return;
274
+ }
275
+ // Both plain objects → key-wise compare
276
+ const keys = new Set([...Object.keys(orig), ...Object.keys(after)]);
277
+ for (const key of keys) {
278
+ if (SKIP_KEYS.has(key)) {
279
+ // Presence on either side is benign bookkeeping (only report if orig had
280
+ // it — avoids noise from reimported state never having it)
281
+ if (key in orig && !(key in after)) {
282
+ diffs.push({
283
+ step_path: "",
284
+ key_path: `${path}.${key}`,
285
+ diff_type: "missing_in_roundtrip",
286
+ severity: "benign",
287
+ description: `stale key ${key} stripped`,
288
+ original_value: orig[key],
289
+ roundtrip_value: undefined,
290
+ benign_artifact: makeBenignArtifact("bookkeeping_stripped"),
291
+ });
292
+ }
293
+ continue;
294
+ }
295
+ if (isRuntimeLeakKey(key)) {
296
+ // Walker drops runtime-leak keys (`__workflow_invocation_uuid__`,
297
+ // `*|__identifier__`) during stateful conversion — neither side of the
298
+ // roundtrip keeps them. Mirrors Galaxy's `RUNTIME_LEAK` classification
299
+ // in `stale_keys.py`; `for_export` allows them but they don't survive
300
+ // format2 round-trip. Treat any drop/appearance as benign.
301
+ const hasOrig = key in orig;
302
+ const hasAfter = key in after;
303
+ if (hasOrig !== hasAfter) {
304
+ diffs.push({
305
+ step_path: "",
306
+ key_path: path ? `${path}.${key}` : key,
307
+ diff_type: hasOrig ? "missing_in_roundtrip" : "missing_in_original",
308
+ severity: "benign",
309
+ description: `runtime leak ${key} ${hasOrig ? "stripped" : "appeared"}`,
310
+ original_value: hasOrig ? orig[key] : undefined,
311
+ roundtrip_value: hasAfter ? after[key] : undefined,
312
+ benign_artifact: makeBenignArtifact("runtime_leak_stripped"),
313
+ });
314
+ }
315
+ continue;
316
+ }
317
+ const subPath = path ? `${path}.${key}` : key;
318
+ const hasOrig = key in orig;
319
+ const hasAfter = key in after;
320
+ if (hasOrig && hasAfter) {
321
+ compareTree(orig[key], after[key], subPath, diffs);
322
+ continue;
323
+ }
324
+ // Missing on one side — classify
325
+ const presentValue = hasOrig ? orig[key] : after[key];
326
+ // Null/"null" leaves: matches Python roundtrip.py where
327
+ // `orig_val in (None, "null", [])` short-circuits with no diff. This
328
+ // keeps `clean=true` aligned with the Python reference's "ok" status.
329
+ if (presentValue === null ||
330
+ presentValue === undefined ||
331
+ presentValue === "null" ||
332
+ (Array.isArray(presentValue) && presentValue.length === 0)) {
333
+ continue;
334
+ }
335
+ const benign = classifyMissing(presentValue);
336
+ if (benign) {
337
+ diffs.push({
338
+ step_path: "",
339
+ key_path: subPath,
340
+ diff_type: hasOrig ? "missing_in_roundtrip" : "missing_in_original",
341
+ severity: "benign",
342
+ description: `key ${hasOrig ? "dropped" : "added"} (${benign})`,
343
+ original_value: hasOrig ? orig[key] : undefined,
344
+ roundtrip_value: hasAfter ? after[key] : undefined,
345
+ benign_artifact: makeBenignArtifact(benign),
346
+ });
347
+ }
348
+ else {
349
+ diffs.push({
350
+ step_path: "",
351
+ key_path: subPath,
352
+ diff_type: hasOrig ? "missing_in_roundtrip" : "missing_in_original",
353
+ severity: "error",
354
+ description: `key ${hasOrig ? "missing after roundtrip" : "appeared after roundtrip"}`,
355
+ original_value: hasOrig ? orig[key] : undefined,
356
+ roundtrip_value: hasAfter ? after[key] : undefined,
357
+ benign_artifact: null,
358
+ });
359
+ }
360
+ }
361
+ }
362
+ /**
363
+ * Walk a native workflow collecting tool steps and subworkflow references.
364
+ *
365
+ * Tool step ids are prefixed with their parent chain separated by `.` so
366
+ * nested ids don't collide with top-level ids (e.g. `3.0` = step 0 inside
367
+ * the subworkflow at top-level id 3). Depth tracks nesting for reporters.
368
+ * External (URL/TRS) subworkflow refs are recorded but not recursed into.
369
+ */
370
+ function collectSteps(wf, prefix = "", depth = 0) {
371
+ const tools = new Map();
372
+ const subworkflows = [];
373
+ for (const [key, step] of Object.entries(wf.steps)) {
374
+ const localId = String(step.id ?? key);
375
+ const fullId = prefix ? `${prefix}.${localId}` : localId;
376
+ if (step.type === "tool") {
377
+ tools.set(fullId, { step, depth });
378
+ }
379
+ else if (step.type === "subworkflow") {
380
+ subworkflows.push({ stepId: fullId, depth, workflow: step.subworkflow ?? null });
381
+ if (step.subworkflow != null) {
382
+ const nested = collectSteps(step.subworkflow, fullId, depth + 1);
383
+ for (const [k, v] of nested.tools)
384
+ tools.set(k, v);
385
+ subworkflows.push(...nested.subworkflows);
386
+ }
387
+ }
388
+ }
389
+ return { tools, subworkflows };
390
+ }
391
+ // --- Public entry point ---
392
+ /**
393
+ * Roundtrip a native workflow through format2 and back, diffing each
394
+ * tool step's `tool_state`. Benign diffs (type coercion, connection
395
+ * moves, stale-key stripping) are reported but don't count as failures.
396
+ *
397
+ * Returns `success=true` iff no error-severity diffs and no conversion
398
+ * failures. `clean=true` iff there are zero diffs of any severity.
399
+ */
400
+ export function roundtripValidate(nativeRaw, toolInputsResolver, strictOpts) {
401
+ const strict = strictOpts ?? {};
402
+ const encodingErrors = [];
403
+ const structureErrors = [];
404
+ // Stage 1: strict checks on raw native input
405
+ const rawDict = nativeRaw;
406
+ if (strict.strictEncoding) {
407
+ encodingErrors.push(...checkStrictEncoding(rawDict, "native").map((e) => `input: ${e}`));
408
+ }
409
+ if (strict.strictStructure) {
410
+ structureErrors.push(...checkStrictStructure(rawDict, "native").map((e) => `input: ${e}`));
411
+ }
412
+ const original = ensureNative(nativeRaw);
413
+ const { tools: originalSteps, subworkflows: originalSubworkflows } = collectSteps(original);
414
+ // Pre-clean: strip undeclared keys from each tool step's `tool_state`
415
+ // using the tool definition. Mirrors Galaxy's
416
+ // `roundtrip_validate(clean_stale=True)` default, which runs
417
+ // `clean_stale_state` before diffing so runtime leaks, stale-branch
418
+ // params, and tool-upgrade residue are removed from the original.
419
+ // Without this pass, the diff flags asymmetries between the raw
420
+ // original and the walker-produced reimport as errors.
421
+ for (const entry of originalSteps.values()) {
422
+ const step = entry.step;
423
+ if (step.type !== "tool" || !step.tool_id)
424
+ continue;
425
+ const inputs = toolInputsResolver(step.tool_id, step.tool_version ?? null);
426
+ if (!inputs)
427
+ continue;
428
+ // Deep clone via JSON round-trip — tool_state is JSON-compatible by
429
+ // design (parsed from a JSON string), and ES2022 lib doesn't include
430
+ // structuredClone.
431
+ const stateClone = JSON.parse(JSON.stringify(step.tool_state));
432
+ const cleaned = stripStaleKeysToolAware(stateClone, inputs, (step.input_connections ?? {}));
433
+ // Mutate the collected step's tool_state in place. `original` was
434
+ // produced fresh by `ensureNative(nativeRaw)` so mutation is local.
435
+ step.tool_state = cleaned;
436
+ }
437
+ let forwardSteps = [];
438
+ let reverseSteps = [];
439
+ let reimported;
440
+ const stepResults = [];
441
+ // Forward: native → format2
442
+ let forward;
443
+ try {
444
+ forward = toFormat2Stateful(nativeRaw, toolInputsResolver);
445
+ }
446
+ catch (err) {
447
+ // Total failure — attribute to all tool steps (including nested)
448
+ const error = err instanceof Error ? err.message : String(err);
449
+ for (const [stepId, { step, depth }] of originalSteps) {
450
+ stepResults.push({
451
+ stepId,
452
+ toolId: step.tool_id ?? undefined,
453
+ success: false,
454
+ failureClass: "conversion_error",
455
+ error,
456
+ diffs: [],
457
+ depth,
458
+ });
459
+ }
460
+ return {
461
+ stepResults,
462
+ forwardSteps,
463
+ reverseSteps,
464
+ success: false,
465
+ clean: false,
466
+ encodingErrors,
467
+ structureErrors,
468
+ };
469
+ }
470
+ forwardSteps = forward.steps;
471
+ // Stage 2: strict checks on forward (format2) output
472
+ if (strict.strictEncoding) {
473
+ encodingErrors.push(...checkStrictEncoding(forward.workflow, "format2").map((e) => `forward: ${e}`));
474
+ }
475
+ if (strict.strictStructure) {
476
+ structureErrors.push(...checkStrictStructure(forward.workflow, "format2").map((e) => `forward: ${e}`));
477
+ }
478
+ // Reverse: format2 → native
479
+ try {
480
+ const reverse = toNativeStateful(forward.workflow, toolInputsResolver);
481
+ reverseSteps = reverse.steps;
482
+ reimported = reverse.workflow;
483
+ }
484
+ catch (err) {
485
+ const error = err instanceof Error ? err.message : String(err);
486
+ for (const [stepId, { step, depth }] of originalSteps) {
487
+ stepResults.push({
488
+ stepId,
489
+ toolId: step.tool_id ?? undefined,
490
+ success: false,
491
+ failureClass: "reimport_error",
492
+ error,
493
+ diffs: [],
494
+ depth,
495
+ });
496
+ }
497
+ return {
498
+ stepResults,
499
+ forwardSteps,
500
+ reverseSteps,
501
+ success: false,
502
+ clean: false,
503
+ encodingErrors,
504
+ structureErrors,
505
+ };
506
+ }
507
+ // Stage 3: strict checks on reverse (reimported native) output
508
+ if (strict.strictEncoding) {
509
+ encodingErrors.push(...checkStrictEncoding(reimported, "native").map((e) => `reverse: ${e}`));
510
+ }
511
+ if (strict.strictStructure) {
512
+ structureErrors.push(...checkStrictStructure(reimported, "native").map((e) => `reverse: ${e}`));
513
+ }
514
+ const { tools: reimportedSteps } = collectSteps(reimported);
515
+ // Per-step comparison (top-level + recursively-collected nested tools)
516
+ for (const [stepId, { step: origStep, depth }] of originalSteps) {
517
+ const afterEntry = reimportedSteps.get(stepId);
518
+ if (!afterEntry) {
519
+ stepResults.push({
520
+ stepId,
521
+ toolId: origStep.tool_id ?? undefined,
522
+ success: false,
523
+ failureClass: "roundtrip_mismatch",
524
+ error: `step ${stepId} missing after roundtrip`,
525
+ diffs: [],
526
+ depth,
527
+ });
528
+ continue;
529
+ }
530
+ // Per-step forward failure → propagate. Note: forwardSteps from
531
+ // `makeStepConversionRunner` uses unprefixed step ids. Nested steps
532
+ // with the same local id as a top-level step can collide; we match
533
+ // by suffix (localId) and tool_id as a best-effort disambiguation.
534
+ const localId = stepId.includes(".") ? stepId.slice(stepId.lastIndexOf(".") + 1) : stepId;
535
+ const forwardFailure = forwardSteps.find((s) => s.stepId === localId && !s.converted && s.toolId === (origStep.tool_id ?? undefined));
536
+ if (forwardFailure) {
537
+ stepResults.push({
538
+ stepId,
539
+ toolId: origStep.tool_id ?? undefined,
540
+ success: false,
541
+ failureClass: "conversion_error",
542
+ error: forwardFailure.error,
543
+ diffs: [],
544
+ depth,
545
+ });
546
+ continue;
547
+ }
548
+ const diffs = [];
549
+ compareTree(origStep.tool_state, afterEntry.step.tool_state, "", diffs);
550
+ for (const diff of diffs) {
551
+ diff.step_path = stepId;
552
+ }
553
+ const hasError = diffs.some((d) => d.severity === "error");
554
+ stepResults.push({
555
+ stepId,
556
+ toolId: origStep.tool_id ?? undefined,
557
+ success: !hasError,
558
+ failureClass: hasError ? "roundtrip_mismatch" : undefined,
559
+ diffs,
560
+ depth,
561
+ });
562
+ }
563
+ // External (URL/TRS) subworkflow refs: surface an informational entry
564
+ // so callers can see the step exists and was deliberately skipped.
565
+ // Inline subworkflows are handled by the recursive collection above.
566
+ for (const sw of originalSubworkflows) {
567
+ if (sw.workflow != null)
568
+ continue;
569
+ stepResults.push({
570
+ stepId: sw.stepId,
571
+ toolId: undefined,
572
+ success: true,
573
+ failureClass: "subworkflow_external_ref",
574
+ error: "external subworkflow reference (URL/TRS) — inline steps not available for diff",
575
+ diffs: [],
576
+ depth: sw.depth,
577
+ });
578
+ }
579
+ // Only tool-step results contribute to overall verdicts; external-ref
580
+ // entries are informational.
581
+ const toolResults = stepResults.filter((s) => s.failureClass !== "subworkflow_external_ref");
582
+ const anyError = toolResults.some((s) => !s.success);
583
+ const anyDiff = toolResults.some((s) => s.diffs.length > 0);
584
+ const hasStrictErrors = encodingErrors.length > 0 || structureErrors.length > 0;
585
+ return {
586
+ workflowName: (original.name ?? undefined) || undefined,
587
+ stepResults,
588
+ forwardSteps,
589
+ reverseSteps,
590
+ success: !anyError && !hasStrictErrors,
591
+ clean: !anyDiff && !anyError && !hasStrictErrors,
592
+ encodingErrors,
593
+ structureErrors,
594
+ reimportedWorkflow: reimported,
595
+ };
596
+ }
597
+ //# sourceMappingURL=roundtrip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roundtrip.js","sourceRoot":"","sources":["../../src/workflow/roundtrip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Runtime value markers used inside workflow tool_state.
3
+ *
4
+ * Galaxy has two in-band markers indicating a parameter value is not a
5
+ * literal but will be supplied at invocation time:
6
+ * - `ConnectedValue`: value comes from an upstream step output
7
+ * - `RuntimeValue`: value is supplied by the user at workflow runtime
8
+ *
9
+ * Both are encoded as `{ __class__: "ConnectedValue" | "RuntimeValue" }`
10
+ * inside native tool_state dicts. Matches Galaxy Python terminology.
11
+ */
12
+ export declare const CONNECTED_VALUE: {
13
+ readonly __class__: "ConnectedValue";
14
+ };
15
+ export declare const RUNTIME_VALUE: {
16
+ readonly __class__: "RuntimeValue";
17
+ };
18
+ export declare function isConnectedValue(value: unknown): boolean;
19
+ export declare function isRuntimeValue(value: unknown): boolean;
20
+ //# sourceMappingURL=runtime-markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-markers.d.ts","sourceRoot":"","sources":["../../src/workflow/runtime-markers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,eAAe;;CAA2C,CAAC;AACxE,eAAO,MAAM,aAAa;;CAAyC,CAAC;AAEpE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAOxD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAOtD"}