@tracecode/harness 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 (55) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/LICENSE +674 -0
  3. package/README.md +266 -0
  4. package/dist/browser.cjs +1352 -0
  5. package/dist/browser.cjs.map +1 -0
  6. package/dist/browser.d.cts +49 -0
  7. package/dist/browser.d.ts +49 -0
  8. package/dist/browser.js +1317 -0
  9. package/dist/browser.js.map +1 -0
  10. package/dist/cli.cjs +70 -0
  11. package/dist/cli.cjs.map +1 -0
  12. package/dist/cli.d.cts +1 -0
  13. package/dist/cli.d.ts +1 -0
  14. package/dist/cli.js +70 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/core.cjs +286 -0
  17. package/dist/core.cjs.map +1 -0
  18. package/dist/core.d.cts +69 -0
  19. package/dist/core.d.ts +69 -0
  20. package/dist/core.js +254 -0
  21. package/dist/core.js.map +1 -0
  22. package/dist/index.cjs +2603 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d.cts +6 -0
  25. package/dist/index.d.ts +6 -0
  26. package/dist/index.js +2538 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/internal/browser.cjs +647 -0
  29. package/dist/internal/browser.cjs.map +1 -0
  30. package/dist/internal/browser.d.cts +143 -0
  31. package/dist/internal/browser.d.ts +143 -0
  32. package/dist/internal/browser.js +617 -0
  33. package/dist/internal/browser.js.map +1 -0
  34. package/dist/javascript.cjs +549 -0
  35. package/dist/javascript.cjs.map +1 -0
  36. package/dist/javascript.d.cts +11 -0
  37. package/dist/javascript.d.ts +11 -0
  38. package/dist/javascript.js +518 -0
  39. package/dist/javascript.js.map +1 -0
  40. package/dist/python.cjs +744 -0
  41. package/dist/python.cjs.map +1 -0
  42. package/dist/python.d.cts +97 -0
  43. package/dist/python.d.ts +97 -0
  44. package/dist/python.js +698 -0
  45. package/dist/python.js.map +1 -0
  46. package/dist/runtime-types-C7d1LFbx.d.ts +85 -0
  47. package/dist/runtime-types-Dvgn07z9.d.cts +85 -0
  48. package/dist/types-Bzr1Ohcf.d.cts +96 -0
  49. package/dist/types-Bzr1Ohcf.d.ts +96 -0
  50. package/package.json +89 -0
  51. package/workers/javascript/javascript-worker.js +2918 -0
  52. package/workers/python/generated-python-harness-snippets.js +20 -0
  53. package/workers/python/pyodide-worker.js +1197 -0
  54. package/workers/python/runtime-core.js +1529 -0
  55. package/workers/vendor/typescript.js +200276 -0
@@ -0,0 +1,744 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // packages/harness-python/src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ PYTHON_CLASS_DEFINITIONS: () => PYTHON_CLASS_DEFINITIONS,
24
+ PYTHON_CONVERSION_HELPERS: () => PYTHON_CONVERSION_HELPERS,
25
+ PYTHON_EXECUTE_SERIALIZE_FUNCTION: () => PYTHON_EXECUTE_SERIALIZE_FUNCTION,
26
+ PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION: () => PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION,
27
+ PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION: () => PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION,
28
+ PYTHON_SERIALIZE_FUNCTION: () => PYTHON_SERIALIZE_FUNCTION,
29
+ PYTHON_TRACE_SERIALIZE_FUNCTION: () => PYTHON_TRACE_SERIALIZE_FUNCTION,
30
+ TEMPLATE_PYTHON_CLASS_DEFINITIONS: () => TEMPLATE_PYTHON_CLASS_DEFINITIONS,
31
+ TEMPLATE_PYTHON_CONVERSION_HELPERS: () => TEMPLATE_PYTHON_CONVERSION_HELPERS,
32
+ TEMPLATE_PYTHON_EXECUTE_SERIALIZE_FUNCTION: () => TEMPLATE_PYTHON_EXECUTE_SERIALIZE_FUNCTION,
33
+ TEMPLATE_PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION: () => TEMPLATE_PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION,
34
+ TEMPLATE_PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION: () => TEMPLATE_PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION,
35
+ TEMPLATE_PYTHON_SERIALIZE_FUNCTION: () => TEMPLATE_PYTHON_SERIALIZE_FUNCTION,
36
+ TEMPLATE_PYTHON_TRACE_SERIALIZE_FUNCTION: () => TEMPLATE_PYTHON_TRACE_SERIALIZE_FUNCTION,
37
+ generateConversionCode: () => generateConversionCode,
38
+ generateInputSetup: () => generateInputSetup,
39
+ generateSolutionScript: () => generateSolutionScript,
40
+ identifyConversions: () => identifyConversions,
41
+ templateToPythonLiteral: () => templateToPythonLiteral,
42
+ toPythonLiteral: () => toPythonLiteral
43
+ });
44
+ module.exports = __toCommonJS(src_exports);
45
+
46
+ // packages/harness-python/src/generated/python-harness-snippets.ts
47
+ function toPythonLiteral(value) {
48
+ if (value === null || value === void 0) {
49
+ return "None";
50
+ }
51
+ if (typeof value === "boolean") {
52
+ return value ? "True" : "False";
53
+ }
54
+ if (typeof value === "number") {
55
+ return String(value);
56
+ }
57
+ if (typeof value === "string") {
58
+ return JSON.stringify(value);
59
+ }
60
+ if (Array.isArray(value)) {
61
+ return "[" + value.map(toPythonLiteral).join(", ") + "]";
62
+ }
63
+ if (typeof value === "object") {
64
+ const entries = Object.entries(value).map(([k, v]) => `${JSON.stringify(k)}: ${toPythonLiteral(v)}`).join(", ");
65
+ return "{" + entries + "}";
66
+ }
67
+ return JSON.stringify(value);
68
+ }
69
+ var PYTHON_CLASS_DEFINITIONS = `
70
+ class TreeNode:
71
+ def __init__(self, val=0, left=None, right=None):
72
+ self.val = val
73
+ self.value = val
74
+ self.left = left
75
+ self.right = right
76
+ def __getitem__(self, key):
77
+ if key == 'val': return getattr(self, 'val', getattr(self, 'value', None))
78
+ if key == 'value': return getattr(self, 'value', getattr(self, 'val', None))
79
+ if key == 'left': return self.left
80
+ if key == 'right': return self.right
81
+ raise KeyError(key)
82
+ def get(self, key, default=None):
83
+ if key == 'val': return getattr(self, 'val', getattr(self, 'value', default))
84
+ if key == 'value': return getattr(self, 'value', getattr(self, 'val', default))
85
+ if key == 'left': return self.left
86
+ if key == 'right': return self.right
87
+ return default
88
+ def __repr__(self):
89
+ return f"TreeNode({getattr(self, 'val', getattr(self, 'value', None))})"
90
+
91
+ class ListNode:
92
+ def __init__(self, val=0, next=None):
93
+ self.val = val
94
+ self.value = val
95
+ self.next = next
96
+ def __getitem__(self, key):
97
+ if key == 'val': return getattr(self, 'val', getattr(self, 'value', None))
98
+ if key == 'value': return getattr(self, 'value', getattr(self, 'val', None))
99
+ if key == 'next': return self.next
100
+ raise KeyError(key)
101
+ def get(self, key, default=None):
102
+ if key == 'val': return getattr(self, 'val', getattr(self, 'value', default))
103
+ if key == 'value': return getattr(self, 'value', getattr(self, 'val', default))
104
+ if key == 'next': return self.next
105
+ return default
106
+ def __repr__(self):
107
+ return f"ListNode({getattr(self, 'val', getattr(self, 'value', None))})"
108
+ `;
109
+ var PYTHON_CONVERSION_HELPERS = "\ndef _ensure_node_value_aliases(node):\n if node is None:\n return node\n try:\n has_val = hasattr(node, 'val')\n has_value = hasattr(node, 'value')\n if has_value and not has_val:\n try:\n setattr(node, 'val', getattr(node, 'value'))\n except Exception:\n pass\n elif has_val and not has_value:\n try:\n setattr(node, 'value', getattr(node, 'val'))\n except Exception:\n pass\n except Exception:\n pass\n return node\n\ndef _dict_to_tree(d):\n if d is None:\n return None\n if not isinstance(d, dict):\n return d\n if 'val' not in d and 'value' not in d:\n return d\n node = TreeNode(d.get('val', d.get('value', 0)))\n _ensure_node_value_aliases(node)\n node.left = _dict_to_tree(d.get('left'))\n node.right = _dict_to_tree(d.get('right'))\n return node\n\ndef _dict_to_list(d, _refs=None):\n if _refs is None:\n _refs = {}\n if d is None:\n return None\n if not isinstance(d, dict):\n return d\n if '__ref__' in d:\n return _refs.get(d.get('__ref__'))\n if 'val' not in d and 'value' not in d:\n return d\n node = ListNode(d.get('val', d.get('value', 0)))\n _ensure_node_value_aliases(node)\n node_id = d.get('__id__')\n if isinstance(node_id, str) and node_id:\n _refs[node_id] = node\n node.next = _dict_to_list(d.get('next'), _refs)\n return node\n";
110
+ var PYTHON_TRACE_SERIALIZE_FUNCTION = `
111
+ # Sentinel to mark skipped values (functions, etc.) - distinct from None
112
+ _SKIP_SENTINEL = "__TRACECODE_SKIP__"
113
+ _MAX_SERIALIZE_DEPTH = 48
114
+
115
+ def _serialize(obj, depth=0, node_refs=None):
116
+ if node_refs is None:
117
+ node_refs = {}
118
+ if isinstance(obj, (bool, int, str, type(None))):
119
+ return obj
120
+ elif isinstance(obj, float):
121
+ if not math.isfinite(obj):
122
+ if math.isnan(obj):
123
+ return "NaN"
124
+ return "Infinity" if obj > 0 else "-Infinity"
125
+ return obj
126
+ if depth > _MAX_SERIALIZE_DEPTH:
127
+ return "<max depth>"
128
+ elif isinstance(obj, (list, tuple)):
129
+ return [_serialize(x, depth + 1, node_refs) for x in obj]
130
+ elif getattr(obj, '__class__', None) and getattr(obj.__class__, '__name__', '') == 'deque':
131
+ return [_serialize(x, depth + 1, node_refs) for x in obj]
132
+ elif isinstance(obj, dict):
133
+ return {str(k): _serialize(v, depth + 1, node_refs) for k, v in obj.items()}
134
+ elif isinstance(obj, set):
135
+ # Use try/except for sorting to handle heterogeneous sets
136
+ try:
137
+ sorted_vals = sorted([_serialize(x, depth + 1, node_refs) for x in obj])
138
+ except TypeError:
139
+ sorted_vals = [_serialize(x, depth + 1, node_refs) for x in obj]
140
+ return {"__type__": "set", "values": sorted_vals}
141
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and (hasattr(obj, 'left') or hasattr(obj, 'right')):
142
+ obj_ref = id(obj)
143
+ if obj_ref in node_refs:
144
+ return {"__ref__": node_refs[obj_ref]}
145
+ node_id = f"tree-{obj_ref}"
146
+ node_refs[obj_ref] = node_id
147
+ result = {
148
+ "__type__": "TreeNode",
149
+ "__id__": node_id,
150
+ "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1, node_refs),
151
+ }
152
+ if hasattr(obj, 'left'):
153
+ result["left"] = _serialize(obj.left, depth + 1, node_refs)
154
+ if hasattr(obj, 'right'):
155
+ result["right"] = _serialize(obj.right, depth + 1, node_refs)
156
+ return result
157
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and hasattr(obj, 'next'):
158
+ obj_ref = id(obj)
159
+ if obj_ref in node_refs:
160
+ return {"__ref__": node_refs[obj_ref]}
161
+ node_id = f"list-{obj_ref}"
162
+ node_refs[obj_ref] = node_id
163
+ result = {
164
+ "__type__": "ListNode",
165
+ "__id__": node_id,
166
+ "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1, node_refs),
167
+ }
168
+ result["next"] = _serialize(obj.next, depth + 1, node_refs)
169
+ return result
170
+ elif callable(obj):
171
+ # Skip functions entirely - return sentinel
172
+ return _SKIP_SENTINEL
173
+ else:
174
+ repr_str = repr(obj)
175
+ # Filter out function-like representations (e.g., <function foo at 0x...>)
176
+ if repr_str.startswith('<') and repr_str.endswith('>'):
177
+ return _SKIP_SENTINEL
178
+ return repr_str
179
+ `;
180
+ var PYTHON_EXECUTE_SERIALIZE_FUNCTION = `
181
+ _MAX_SERIALIZE_DEPTH = 48
182
+
183
+ def _serialize(obj, depth=0):
184
+ if isinstance(obj, (bool, int, str, type(None))):
185
+ return obj
186
+ elif isinstance(obj, float):
187
+ if not math.isfinite(obj):
188
+ if math.isnan(obj):
189
+ return "NaN"
190
+ return "Infinity" if obj > 0 else "-Infinity"
191
+ return obj
192
+ if depth > _MAX_SERIALIZE_DEPTH:
193
+ return "<max depth>"
194
+ elif isinstance(obj, (list, tuple)):
195
+ return [_serialize(x, depth + 1) for x in obj]
196
+ elif getattr(obj, '__class__', None) and getattr(obj.__class__, '__name__', '') == 'deque':
197
+ return [_serialize(x, depth + 1) for x in obj]
198
+ elif isinstance(obj, dict):
199
+ return {str(k): _serialize(v, depth + 1) for k, v in obj.items()}
200
+ elif isinstance(obj, set):
201
+ try:
202
+ return {"__type__": "set", "values": sorted([_serialize(x, depth + 1) for x in obj])}
203
+ except TypeError:
204
+ return {"__type__": "set", "values": [_serialize(x, depth + 1) for x in obj]}
205
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and (hasattr(obj, 'left') or hasattr(obj, 'right')):
206
+ result = {"__type__": "TreeNode", "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1)}
207
+ if hasattr(obj, 'left'):
208
+ result["left"] = _serialize(obj.left, depth + 1)
209
+ if hasattr(obj, 'right'):
210
+ result["right"] = _serialize(obj.right, depth + 1)
211
+ return result
212
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and hasattr(obj, 'next'):
213
+ result = {"__type__": "ListNode", "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1)}
214
+ result["next"] = _serialize(obj.next, depth + 1)
215
+ return result
216
+ elif callable(obj):
217
+ return None
218
+ else:
219
+ repr_str = repr(obj)
220
+ if repr_str.startswith('<') and repr_str.endswith('>'):
221
+ return None
222
+ return repr_str
223
+ `;
224
+ var PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION = `
225
+ def _serialize(obj, depth=0, state=None):
226
+ if state is None:
227
+ state = {"nodes": 0, "seen": set()}
228
+ if depth > 64:
229
+ return "__MAX_DEPTH__"
230
+ if isinstance(obj, (int, float, str, bool, type(None))):
231
+ return obj
232
+
233
+ state["nodes"] += 1
234
+ if state["nodes"] > 600:
235
+ return "__MAX_NODES__"
236
+
237
+ if isinstance(obj, (list, tuple)):
238
+ return [_serialize(x, depth + 1, state) for x in obj]
239
+ elif isinstance(obj, dict):
240
+ return {str(k): _serialize(v, depth + 1, state) for k, v in obj.items()}
241
+ elif isinstance(obj, set):
242
+ serialized = [_serialize(x, depth + 1, state) for x in obj]
243
+ try:
244
+ serialized = sorted(serialized)
245
+ except TypeError:
246
+ pass
247
+ return {"__type__": "set", "values": serialized}
248
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and (hasattr(obj, 'left') or hasattr(obj, 'right')):
249
+ obj_id = id(obj)
250
+ if obj_id in state["seen"]:
251
+ return "__CYCLE__"
252
+ state["seen"].add(obj_id)
253
+ result = {"__type__": "TreeNode", "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1, state)}
254
+ if hasattr(obj, 'left'):
255
+ result["left"] = _serialize(obj.left, depth + 1, state)
256
+ if hasattr(obj, 'right'):
257
+ result["right"] = _serialize(obj.right, depth + 1, state)
258
+ state["seen"].remove(obj_id)
259
+ return result
260
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and hasattr(obj, 'next'):
261
+ obj_id = id(obj)
262
+ if obj_id in state["seen"]:
263
+ return "__CYCLE__"
264
+ state["seen"].add(obj_id)
265
+ result = {"__type__": "ListNode", "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1, state)}
266
+ result["next"] = _serialize(obj.next, depth + 1, state)
267
+ state["seen"].remove(obj_id)
268
+ return result
269
+ else:
270
+ return repr(obj)
271
+ `;
272
+ var PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION = `
273
+ def _serialize(obj, depth=0):
274
+ if depth > 10:
275
+ return "<max depth>"
276
+ if isinstance(obj, (int, float, str, bool, type(None))):
277
+ return obj
278
+ elif isinstance(obj, (list, tuple)):
279
+ return [_serialize(x, depth + 1) for x in obj]
280
+ elif isinstance(obj, dict):
281
+ return {str(k): _serialize(v, depth + 1) for k, v in obj.items()}
282
+ elif isinstance(obj, set):
283
+ try:
284
+ return {"__type__": "set", "values": sorted([_serialize(x, depth + 1) for x in obj])}
285
+ except TypeError:
286
+ return {"__type__": "set", "values": [_serialize(x, depth + 1) for x in obj]}
287
+ elif hasattr(obj, 'val') and (hasattr(obj, 'left') or hasattr(obj, 'right')):
288
+ result = {"__type__": "TreeNode", "val": _serialize(getattr(obj, 'val', None), depth + 1)}
289
+ if hasattr(obj, 'left'):
290
+ result["left"] = _serialize(obj.left, depth + 1)
291
+ if hasattr(obj, 'right'):
292
+ result["right"] = _serialize(obj.right, depth + 1)
293
+ return result
294
+ elif hasattr(obj, 'val') and hasattr(obj, 'next'):
295
+ result = {"__type__": "ListNode", "val": _serialize(getattr(obj, 'val', None), depth + 1)}
296
+ result["next"] = _serialize(obj.next, depth + 1)
297
+ return result
298
+ else:
299
+ return repr(obj)
300
+ `;
301
+ var PYTHON_SERIALIZE_FUNCTION = `
302
+ _MAX_SERIALIZE_DEPTH = 48
303
+
304
+ def _serialize(obj, depth=0):
305
+ if isinstance(obj, (bool, int, str, type(None))):
306
+ return obj
307
+ elif isinstance(obj, float):
308
+ if not math.isfinite(obj):
309
+ if math.isnan(obj):
310
+ return "NaN"
311
+ return "Infinity" if obj > 0 else "-Infinity"
312
+ return obj
313
+ if depth > _MAX_SERIALIZE_DEPTH:
314
+ return "<max depth>"
315
+ elif isinstance(obj, (list, tuple)):
316
+ return [_serialize(x, depth + 1) for x in obj]
317
+ elif getattr(obj, '__class__', None) and getattr(obj.__class__, '__name__', '') == 'deque':
318
+ return [_serialize(x, depth + 1) for x in obj]
319
+ elif isinstance(obj, dict):
320
+ return {str(k): _serialize(v, depth + 1) for k, v in obj.items()}
321
+ elif isinstance(obj, set):
322
+ try:
323
+ return {"__type__": "set", "values": sorted([_serialize(x, depth + 1) for x in obj])}
324
+ except TypeError:
325
+ return {"__type__": "set", "values": [_serialize(x, depth + 1) for x in obj]}
326
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and (hasattr(obj, 'left') or hasattr(obj, 'right')):
327
+ result = {"__type__": "TreeNode", "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1)}
328
+ if hasattr(obj, 'left'):
329
+ result["left"] = _serialize(obj.left, depth + 1)
330
+ if hasattr(obj, 'right'):
331
+ result["right"] = _serialize(obj.right, depth + 1)
332
+ return result
333
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and hasattr(obj, 'next'):
334
+ result = {"__type__": "ListNode", "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1)}
335
+ result["next"] = _serialize(obj.next, depth + 1)
336
+ return result
337
+ elif callable(obj):
338
+ return None
339
+ else:
340
+ repr_str = repr(obj)
341
+ if repr_str.startswith('<') and repr_str.endswith('>'):
342
+ return None
343
+ return repr_str
344
+ `;
345
+
346
+ // packages/harness-python/src/python-harness.ts
347
+ function identifyConversions(inputs) {
348
+ const treeKeys = [];
349
+ const listKeys = [];
350
+ for (const [key, value] of Object.entries(inputs)) {
351
+ if (value && typeof value === "object" && !Array.isArray(value) && ("val" in value || "value" in value)) {
352
+ const obj = value;
353
+ const hasLeft = "left" in obj;
354
+ const hasRight = "right" in obj;
355
+ const hasNext = "next" in obj;
356
+ if (hasLeft || hasRight) {
357
+ treeKeys.push(key);
358
+ } else if (hasNext) {
359
+ listKeys.push(key);
360
+ } else {
361
+ treeKeys.push(key);
362
+ }
363
+ }
364
+ }
365
+ return { treeKeys, listKeys };
366
+ }
367
+ function generateConversionCode(inputs) {
368
+ const { treeKeys, listKeys } = identifyConversions(inputs);
369
+ const lines = [];
370
+ for (const key of treeKeys) {
371
+ lines.push(`${key} = _dict_to_tree(${key})`);
372
+ }
373
+ for (const key of listKeys) {
374
+ lines.push(`${key} = _dict_to_list(${key})`);
375
+ }
376
+ return lines.join("\n");
377
+ }
378
+ function generateInputSetup(inputs) {
379
+ return Object.entries(inputs).map(([key, value]) => `${key} = ${toPythonLiteral(value)}`).join("\n");
380
+ }
381
+ function generateSolutionScript(solutionCode, functionName, inputs) {
382
+ const inputSetup = generateInputSetup(inputs);
383
+ const conversionCode = generateConversionCode(inputs);
384
+ const paramList = Object.keys(inputs).map((key) => `${key}=${key}`).join(", ");
385
+ return `
386
+ import json
387
+ import sys
388
+
389
+ ${PYTHON_CLASS_DEFINITIONS}
390
+
391
+ ${PYTHON_CONVERSION_HELPERS}
392
+
393
+ ${PYTHON_SERIALIZE_FUNCTION}
394
+
395
+ # Solution code
396
+ ${solutionCode}
397
+
398
+ # Set up inputs
399
+ ${inputSetup}
400
+
401
+ # Convert tree/list inputs
402
+ ${conversionCode}
403
+
404
+ # Run the function
405
+ try:
406
+ _result = ${functionName}(${paramList})
407
+ print(json.dumps({"success": True, "output": _serialize(_result)}))
408
+ except Exception as e:
409
+ print(json.dumps({"success": False, "error": f"{type(e).__name__}: {str(e)}"}))
410
+ `;
411
+ }
412
+
413
+ // packages/harness-python/src/python-harness-template.ts
414
+ function templateToPythonLiteral(value) {
415
+ if (value === null || value === void 0) {
416
+ return "None";
417
+ }
418
+ if (typeof value === "boolean") {
419
+ return value ? "True" : "False";
420
+ }
421
+ if (typeof value === "number") {
422
+ return String(value);
423
+ }
424
+ if (typeof value === "string") {
425
+ return JSON.stringify(value);
426
+ }
427
+ if (Array.isArray(value)) {
428
+ return "[" + value.map(templateToPythonLiteral).join(", ") + "]";
429
+ }
430
+ if (typeof value === "object") {
431
+ const entries = Object.entries(value).map(([k, v]) => `${JSON.stringify(k)}: ${templateToPythonLiteral(v)}`).join(", ");
432
+ return "{" + entries + "}";
433
+ }
434
+ return JSON.stringify(value);
435
+ }
436
+ var TEMPLATE_PYTHON_CLASS_DEFINITIONS = `
437
+ class TreeNode:
438
+ def __init__(self, val=0, left=None, right=None):
439
+ self.val = val
440
+ self.value = val
441
+ self.left = left
442
+ self.right = right
443
+ def __getitem__(self, key):
444
+ if key == 'val': return getattr(self, 'val', getattr(self, 'value', None))
445
+ if key == 'value': return getattr(self, 'value', getattr(self, 'val', None))
446
+ if key == 'left': return self.left
447
+ if key == 'right': return self.right
448
+ raise KeyError(key)
449
+ def get(self, key, default=None):
450
+ if key == 'val': return getattr(self, 'val', getattr(self, 'value', default))
451
+ if key == 'value': return getattr(self, 'value', getattr(self, 'val', default))
452
+ if key == 'left': return self.left
453
+ if key == 'right': return self.right
454
+ return default
455
+ def __repr__(self):
456
+ return f"TreeNode({getattr(self, 'val', getattr(self, 'value', None))})"
457
+
458
+ class ListNode:
459
+ def __init__(self, val=0, next=None):
460
+ self.val = val
461
+ self.value = val
462
+ self.next = next
463
+ def __getitem__(self, key):
464
+ if key == 'val': return getattr(self, 'val', getattr(self, 'value', None))
465
+ if key == 'value': return getattr(self, 'value', getattr(self, 'val', None))
466
+ if key == 'next': return self.next
467
+ raise KeyError(key)
468
+ def get(self, key, default=None):
469
+ if key == 'val': return getattr(self, 'val', getattr(self, 'value', default))
470
+ if key == 'value': return getattr(self, 'value', getattr(self, 'val', default))
471
+ if key == 'next': return self.next
472
+ return default
473
+ def __repr__(self):
474
+ return f"ListNode({getattr(self, 'val', getattr(self, 'value', None))})"
475
+ `;
476
+ var TEMPLATE_PYTHON_CONVERSION_HELPERS = `
477
+ def _ensure_node_value_aliases(node):
478
+ if node is None:
479
+ return node
480
+ try:
481
+ has_val = hasattr(node, 'val')
482
+ has_value = hasattr(node, 'value')
483
+ if has_value and not has_val:
484
+ try:
485
+ setattr(node, 'val', getattr(node, 'value'))
486
+ except Exception:
487
+ pass
488
+ elif has_val and not has_value:
489
+ try:
490
+ setattr(node, 'value', getattr(node, 'val'))
491
+ except Exception:
492
+ pass
493
+ except Exception:
494
+ pass
495
+ return node
496
+
497
+ def _dict_to_tree(d):
498
+ if d is None:
499
+ return None
500
+ if not isinstance(d, dict):
501
+ return d
502
+ if 'val' not in d and 'value' not in d:
503
+ return d
504
+ node = TreeNode(d.get('val', d.get('value', 0)))
505
+ _ensure_node_value_aliases(node)
506
+ node.left = _dict_to_tree(d.get('left'))
507
+ node.right = _dict_to_tree(d.get('right'))
508
+ return node
509
+
510
+ def _dict_to_list(d, _refs=None):
511
+ if _refs is None:
512
+ _refs = {}
513
+ if d is None:
514
+ return None
515
+ if not isinstance(d, dict):
516
+ return d
517
+ if '__ref__' in d:
518
+ return _refs.get(d.get('__ref__'))
519
+ if 'val' not in d and 'value' not in d:
520
+ return d
521
+ node = ListNode(d.get('val', d.get('value', 0)))
522
+ _ensure_node_value_aliases(node)
523
+ node_id = d.get('__id__')
524
+ if isinstance(node_id, str) and node_id:
525
+ _refs[node_id] = node
526
+ node.next = _dict_to_list(d.get('next'), _refs)
527
+ return node
528
+ `;
529
+ var TEMPLATE_PYTHON_TRACE_SERIALIZE_FUNCTION = `
530
+ # Sentinel to mark skipped values (functions, etc.) - distinct from None
531
+ _SKIP_SENTINEL = "__TRACECODE_SKIP__"
532
+ _MAX_SERIALIZE_DEPTH = 48
533
+
534
+ def _serialize(obj, depth=0, node_refs=None):
535
+ if node_refs is None:
536
+ node_refs = {}
537
+ if isinstance(obj, (bool, int, str, type(None))):
538
+ return obj
539
+ elif isinstance(obj, float):
540
+ if not math.isfinite(obj):
541
+ if math.isnan(obj):
542
+ return "NaN"
543
+ return "Infinity" if obj > 0 else "-Infinity"
544
+ return obj
545
+ if depth > _MAX_SERIALIZE_DEPTH:
546
+ return "<max depth>"
547
+ elif isinstance(obj, (list, tuple)):
548
+ return [_serialize(x, depth + 1, node_refs) for x in obj]
549
+ elif getattr(obj, '__class__', None) and getattr(obj.__class__, '__name__', '') == 'deque':
550
+ return [_serialize(x, depth + 1, node_refs) for x in obj]
551
+ elif isinstance(obj, dict):
552
+ return {str(k): _serialize(v, depth + 1, node_refs) for k, v in obj.items()}
553
+ elif isinstance(obj, set):
554
+ # Use try/except for sorting to handle heterogeneous sets
555
+ try:
556
+ sorted_vals = sorted([_serialize(x, depth + 1, node_refs) for x in obj])
557
+ except TypeError:
558
+ sorted_vals = [_serialize(x, depth + 1, node_refs) for x in obj]
559
+ return {"__type__": "set", "values": sorted_vals}
560
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and (hasattr(obj, 'left') or hasattr(obj, 'right')):
561
+ obj_ref = id(obj)
562
+ if obj_ref in node_refs:
563
+ return {"__ref__": node_refs[obj_ref]}
564
+ node_id = f"tree-{obj_ref}"
565
+ node_refs[obj_ref] = node_id
566
+ result = {
567
+ "__type__": "TreeNode",
568
+ "__id__": node_id,
569
+ "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1, node_refs),
570
+ }
571
+ if hasattr(obj, 'left'):
572
+ result["left"] = _serialize(obj.left, depth + 1, node_refs)
573
+ if hasattr(obj, 'right'):
574
+ result["right"] = _serialize(obj.right, depth + 1, node_refs)
575
+ return result
576
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and hasattr(obj, 'next'):
577
+ obj_ref = id(obj)
578
+ if obj_ref in node_refs:
579
+ return {"__ref__": node_refs[obj_ref]}
580
+ node_id = f"list-{obj_ref}"
581
+ node_refs[obj_ref] = node_id
582
+ result = {
583
+ "__type__": "ListNode",
584
+ "__id__": node_id,
585
+ "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1, node_refs),
586
+ }
587
+ result["next"] = _serialize(obj.next, depth + 1, node_refs)
588
+ return result
589
+ elif callable(obj):
590
+ # Skip functions entirely - return sentinel
591
+ return _SKIP_SENTINEL
592
+ else:
593
+ repr_str = repr(obj)
594
+ # Filter out function-like representations (e.g., <function foo at 0x...>)
595
+ if repr_str.startswith('<') and repr_str.endswith('>'):
596
+ return _SKIP_SENTINEL
597
+ return repr_str
598
+ `;
599
+ var TEMPLATE_PYTHON_EXECUTE_SERIALIZE_FUNCTION = `
600
+ _MAX_SERIALIZE_DEPTH = 48
601
+
602
+ def _serialize(obj, depth=0):
603
+ if isinstance(obj, (bool, int, str, type(None))):
604
+ return obj
605
+ elif isinstance(obj, float):
606
+ if not math.isfinite(obj):
607
+ if math.isnan(obj):
608
+ return "NaN"
609
+ return "Infinity" if obj > 0 else "-Infinity"
610
+ return obj
611
+ if depth > _MAX_SERIALIZE_DEPTH:
612
+ return "<max depth>"
613
+ elif isinstance(obj, (list, tuple)):
614
+ return [_serialize(x, depth + 1) for x in obj]
615
+ elif getattr(obj, '__class__', None) and getattr(obj.__class__, '__name__', '') == 'deque':
616
+ return [_serialize(x, depth + 1) for x in obj]
617
+ elif isinstance(obj, dict):
618
+ return {str(k): _serialize(v, depth + 1) for k, v in obj.items()}
619
+ elif isinstance(obj, set):
620
+ try:
621
+ return {"__type__": "set", "values": sorted([_serialize(x, depth + 1) for x in obj])}
622
+ except TypeError:
623
+ return {"__type__": "set", "values": [_serialize(x, depth + 1) for x in obj]}
624
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and (hasattr(obj, 'left') or hasattr(obj, 'right')):
625
+ result = {"__type__": "TreeNode", "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1)}
626
+ if hasattr(obj, 'left'):
627
+ result["left"] = _serialize(obj.left, depth + 1)
628
+ if hasattr(obj, 'right'):
629
+ result["right"] = _serialize(obj.right, depth + 1)
630
+ return result
631
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and hasattr(obj, 'next'):
632
+ result = {"__type__": "ListNode", "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1)}
633
+ result["next"] = _serialize(obj.next, depth + 1)
634
+ return result
635
+ elif callable(obj):
636
+ return None
637
+ else:
638
+ repr_str = repr(obj)
639
+ if repr_str.startswith('<') and repr_str.endswith('>'):
640
+ return None
641
+ return repr_str
642
+ `;
643
+ var TEMPLATE_PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION = `
644
+ def _serialize(obj, depth=0, state=None):
645
+ if state is None:
646
+ state = {"nodes": 0, "seen": set()}
647
+ if depth > 64:
648
+ return "__MAX_DEPTH__"
649
+ if isinstance(obj, (int, float, str, bool, type(None))):
650
+ return obj
651
+
652
+ state["nodes"] += 1
653
+ if state["nodes"] > 600:
654
+ return "__MAX_NODES__"
655
+
656
+ if isinstance(obj, (list, tuple)):
657
+ return [_serialize(x, depth + 1, state) for x in obj]
658
+ elif isinstance(obj, dict):
659
+ return {str(k): _serialize(v, depth + 1, state) for k, v in obj.items()}
660
+ elif isinstance(obj, set):
661
+ serialized = [_serialize(x, depth + 1, state) for x in obj]
662
+ try:
663
+ serialized = sorted(serialized)
664
+ except TypeError:
665
+ pass
666
+ return {"__type__": "set", "values": serialized}
667
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and (hasattr(obj, 'left') or hasattr(obj, 'right')):
668
+ obj_id = id(obj)
669
+ if obj_id in state["seen"]:
670
+ return "__CYCLE__"
671
+ state["seen"].add(obj_id)
672
+ result = {"__type__": "TreeNode", "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1, state)}
673
+ if hasattr(obj, 'left'):
674
+ result["left"] = _serialize(obj.left, depth + 1, state)
675
+ if hasattr(obj, 'right'):
676
+ result["right"] = _serialize(obj.right, depth + 1, state)
677
+ state["seen"].remove(obj_id)
678
+ return result
679
+ elif (hasattr(obj, 'val') or hasattr(obj, 'value')) and hasattr(obj, 'next'):
680
+ obj_id = id(obj)
681
+ if obj_id in state["seen"]:
682
+ return "__CYCLE__"
683
+ state["seen"].add(obj_id)
684
+ result = {"__type__": "ListNode", "val": _serialize(getattr(obj, 'val', getattr(obj, 'value', None)), depth + 1, state)}
685
+ result["next"] = _serialize(obj.next, depth + 1, state)
686
+ state["seen"].remove(obj_id)
687
+ return result
688
+ else:
689
+ return repr(obj)
690
+ `;
691
+ var TEMPLATE_PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION = `
692
+ def _serialize(obj, depth=0):
693
+ if depth > 10:
694
+ return "<max depth>"
695
+ if isinstance(obj, (int, float, str, bool, type(None))):
696
+ return obj
697
+ elif isinstance(obj, (list, tuple)):
698
+ return [_serialize(x, depth + 1) for x in obj]
699
+ elif isinstance(obj, dict):
700
+ return {str(k): _serialize(v, depth + 1) for k, v in obj.items()}
701
+ elif isinstance(obj, set):
702
+ try:
703
+ return {"__type__": "set", "values": sorted([_serialize(x, depth + 1) for x in obj])}
704
+ except TypeError:
705
+ return {"__type__": "set", "values": [_serialize(x, depth + 1) for x in obj]}
706
+ elif hasattr(obj, 'val') and (hasattr(obj, 'left') or hasattr(obj, 'right')):
707
+ result = {"__type__": "TreeNode", "val": _serialize(getattr(obj, 'val', None), depth + 1)}
708
+ if hasattr(obj, 'left'):
709
+ result["left"] = _serialize(obj.left, depth + 1)
710
+ if hasattr(obj, 'right'):
711
+ result["right"] = _serialize(obj.right, depth + 1)
712
+ return result
713
+ elif hasattr(obj, 'val') and hasattr(obj, 'next'):
714
+ result = {"__type__": "ListNode", "val": _serialize(getattr(obj, 'val', None), depth + 1)}
715
+ result["next"] = _serialize(obj.next, depth + 1)
716
+ return result
717
+ else:
718
+ return repr(obj)
719
+ `;
720
+ var TEMPLATE_PYTHON_SERIALIZE_FUNCTION = TEMPLATE_PYTHON_EXECUTE_SERIALIZE_FUNCTION;
721
+ // Annotate the CommonJS export names for ESM import in node:
722
+ 0 && (module.exports = {
723
+ PYTHON_CLASS_DEFINITIONS,
724
+ PYTHON_CONVERSION_HELPERS,
725
+ PYTHON_EXECUTE_SERIALIZE_FUNCTION,
726
+ PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION,
727
+ PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION,
728
+ PYTHON_SERIALIZE_FUNCTION,
729
+ PYTHON_TRACE_SERIALIZE_FUNCTION,
730
+ TEMPLATE_PYTHON_CLASS_DEFINITIONS,
731
+ TEMPLATE_PYTHON_CONVERSION_HELPERS,
732
+ TEMPLATE_PYTHON_EXECUTE_SERIALIZE_FUNCTION,
733
+ TEMPLATE_PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION,
734
+ TEMPLATE_PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION,
735
+ TEMPLATE_PYTHON_SERIALIZE_FUNCTION,
736
+ TEMPLATE_PYTHON_TRACE_SERIALIZE_FUNCTION,
737
+ generateConversionCode,
738
+ generateInputSetup,
739
+ generateSolutionScript,
740
+ identifyConversions,
741
+ templateToPythonLiteral,
742
+ toPythonLiteral
743
+ });
744
+ //# sourceMappingURL=python.cjs.map