@tracecode/harness 0.6.1 → 0.6.5

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.
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { L as Language, a as LanguageRuntimeProfile, R as RuntimeCapabilities, b as RuntimeClient, c as RuntimeExecutionStyle, d as RuntimeMaturity, T as TraceBudget, e as TraceExecutionOptions } from './runtime-types-89nchXlY.cjs';
2
2
  export { C as CallStackFrame, a as CodeExecutionResult, E as ExecutionResult, b as ExecutionStatus, P as ProcessedStep, c as PyodideState, R as RawTraceStep, d as RuntimeHashMapEntry, e as RuntimeHashMapVisualization, f as RuntimeObjectKind, g as RuntimeTraceAccessEvent, h as RuntimeTraceAccessKind, i as RuntimeVisualizationPayload, T as TestResult } from './types-zyvpJKCi.cjs';
3
- export { JavaSpikeTraceContractResult, JavaSpikeTraceResult, JavaSpikeTraceContractResult as JavaTraceContractResult, JavaSpikeTraceResult as JavaTraceResult, RUNTIME_TRACE_CONTRACT_SCHEMA_VERSION, RuntimeTraceContractCallStackFrame, RuntimeTraceContractEvent, RuntimeTraceContractHashMap, RuntimeTraceContractHashMapEntry, RuntimeTraceContractResult, RuntimeTraceContractStep, RuntimeTraceContractVisualization, adaptJavaScriptTraceExecutionResult, adaptJavaSpikeTraceExecutionResult, adaptJavaSpikeTraceExecutionResult as adaptJavaTraceExecutionResult, adaptPythonTraceExecutionResult, adaptTraceExecutionResult, buildJavaExecutionResult, buildJavaExecutionResult as buildJavaSpikeExecutionResult, normalizeJavaSpikeTraceContract, normalizeJavaSpikeTraceContract as normalizeJavaTraceContract, normalizeRuntimeTraceContract, stableStringifyRuntimeTraceContract } from './core.cjs';
3
+ export { JavaSpikeTraceContractResult, JavaSpikeTraceResult, JavaSpikeTraceContractResult as JavaTraceContractResult, JavaSpikeTraceResult as JavaTraceResult, RUNTIME_TRACE_CONTRACT_SCHEMA_VERSION, RuntimeTraceContractCallStackFrame, RuntimeTraceContractEvent, RuntimeTraceContractHashMap, RuntimeTraceContractHashMapEntry, RuntimeTraceContractResult, RuntimeTraceContractStep, RuntimeTraceContractVisualization, adaptJavaScriptTraceExecutionResult, adaptJavaSpikeTraceExecutionResult, adaptJavaSpikeTraceExecutionResult as adaptJavaTraceExecutionResult, adaptPythonTraceExecutionResult, adaptTraceExecutionResult, buildJavaExecutionResult, buildJavaExecutionResult as buildJavaSpikeExecutionResult, normalizeJavaSerializedResult, normalizeJavaSpikeTraceContract, normalizeJavaSpikeTraceContract as normalizeJavaTraceContract, normalizeRuntimeTraceContract, stableStringifyRuntimeTraceContract } from './core.cjs';
4
4
  export { BrowserHarness, BrowserHarnessAssetOverrides, BrowserHarnessAssets, CreateBrowserHarnessOptions, DEFAULT_BROWSER_HARNESS_ASSET_RELATIVE_PATHS, LANGUAGE_RUNTIME_PROFILES, SUPPORTED_LANGUAGES, assertRuntimeRequestSupported, createBrowserHarness, getLanguageRuntimeProfile, getSupportedLanguageProfiles, isLanguageSupported, resolveBrowserHarnessAssets } from './browser.cjs';
5
5
  export { PYTHON_CLASS_DEFINITIONS, PYTHON_CONVERSION_HELPERS, PYTHON_EXECUTE_SERIALIZE_FUNCTION, PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION, PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION, PYTHON_SERIALIZE_FUNCTION, PYTHON_TRACE_SERIALIZE_FUNCTION, TEMPLATE_PYTHON_CLASS_DEFINITIONS, TEMPLATE_PYTHON_CONVERSION_HELPERS, TEMPLATE_PYTHON_EXECUTE_SERIALIZE_FUNCTION, TEMPLATE_PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION, TEMPLATE_PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION, TEMPLATE_PYTHON_SERIALIZE_FUNCTION, TEMPLATE_PYTHON_TRACE_SERIALIZE_FUNCTION, generateConversionCode, generateInputSetup, generateSolutionScript, identifyConversions, templateToPythonLiteral, toPythonLiteral } from './python.cjs';
6
6
  export { TYPESCRIPT_RUNTIME_DECLARATIONS, executeJavaScriptCode, executeJavaScriptWithTracing, executeTypeScriptCode, withTypeScriptRuntimeDeclarations } from './javascript.cjs';
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { L as Language, a as LanguageRuntimeProfile, R as RuntimeCapabilities, b as RuntimeClient, c as RuntimeExecutionStyle, d as RuntimeMaturity, T as TraceBudget, e as TraceExecutionOptions } from './runtime-types-CCQ-ZLc9.js';
2
2
  export { C as CallStackFrame, a as CodeExecutionResult, E as ExecutionResult, b as ExecutionStatus, P as ProcessedStep, c as PyodideState, R as RawTraceStep, d as RuntimeHashMapEntry, e as RuntimeHashMapVisualization, f as RuntimeObjectKind, g as RuntimeTraceAccessEvent, h as RuntimeTraceAccessKind, i as RuntimeVisualizationPayload, T as TestResult } from './types-zyvpJKCi.js';
3
- export { JavaSpikeTraceContractResult, JavaSpikeTraceResult, JavaSpikeTraceContractResult as JavaTraceContractResult, JavaSpikeTraceResult as JavaTraceResult, RUNTIME_TRACE_CONTRACT_SCHEMA_VERSION, RuntimeTraceContractCallStackFrame, RuntimeTraceContractEvent, RuntimeTraceContractHashMap, RuntimeTraceContractHashMapEntry, RuntimeTraceContractResult, RuntimeTraceContractStep, RuntimeTraceContractVisualization, adaptJavaScriptTraceExecutionResult, adaptJavaSpikeTraceExecutionResult, adaptJavaSpikeTraceExecutionResult as adaptJavaTraceExecutionResult, adaptPythonTraceExecutionResult, adaptTraceExecutionResult, buildJavaExecutionResult, buildJavaExecutionResult as buildJavaSpikeExecutionResult, normalizeJavaSpikeTraceContract, normalizeJavaSpikeTraceContract as normalizeJavaTraceContract, normalizeRuntimeTraceContract, stableStringifyRuntimeTraceContract } from './core.js';
3
+ export { JavaSpikeTraceContractResult, JavaSpikeTraceResult, JavaSpikeTraceContractResult as JavaTraceContractResult, JavaSpikeTraceResult as JavaTraceResult, RUNTIME_TRACE_CONTRACT_SCHEMA_VERSION, RuntimeTraceContractCallStackFrame, RuntimeTraceContractEvent, RuntimeTraceContractHashMap, RuntimeTraceContractHashMapEntry, RuntimeTraceContractResult, RuntimeTraceContractStep, RuntimeTraceContractVisualization, adaptJavaScriptTraceExecutionResult, adaptJavaSpikeTraceExecutionResult, adaptJavaSpikeTraceExecutionResult as adaptJavaTraceExecutionResult, adaptPythonTraceExecutionResult, adaptTraceExecutionResult, buildJavaExecutionResult, buildJavaExecutionResult as buildJavaSpikeExecutionResult, normalizeJavaSerializedResult, normalizeJavaSpikeTraceContract, normalizeJavaSpikeTraceContract as normalizeJavaTraceContract, normalizeRuntimeTraceContract, stableStringifyRuntimeTraceContract } from './core.js';
4
4
  export { BrowserHarness, BrowserHarnessAssetOverrides, BrowserHarnessAssets, CreateBrowserHarnessOptions, DEFAULT_BROWSER_HARNESS_ASSET_RELATIVE_PATHS, LANGUAGE_RUNTIME_PROFILES, SUPPORTED_LANGUAGES, assertRuntimeRequestSupported, createBrowserHarness, getLanguageRuntimeProfile, getSupportedLanguageProfiles, isLanguageSupported, resolveBrowserHarnessAssets } from './browser.js';
5
5
  export { PYTHON_CLASS_DEFINITIONS, PYTHON_CONVERSION_HELPERS, PYTHON_EXECUTE_SERIALIZE_FUNCTION, PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION, PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION, PYTHON_SERIALIZE_FUNCTION, PYTHON_TRACE_SERIALIZE_FUNCTION, TEMPLATE_PYTHON_CLASS_DEFINITIONS, TEMPLATE_PYTHON_CONVERSION_HELPERS, TEMPLATE_PYTHON_EXECUTE_SERIALIZE_FUNCTION, TEMPLATE_PYTHON_INTERVIEW_MATERIALIZE_SERIALIZE_FUNCTION, TEMPLATE_PYTHON_PRACTICE_MATERIALIZE_SERIALIZE_FUNCTION, TEMPLATE_PYTHON_SERIALIZE_FUNCTION, TEMPLATE_PYTHON_TRACE_SERIALIZE_FUNCTION, generateConversionCode, generateInputSetup, generateSolutionScript, identifyConversions, templateToPythonLiteral, toPythonLiteral } from './python.js';
6
6
  export { TYPESCRIPT_RUNTIME_DECLARATIONS, executeJavaScriptCode, executeJavaScriptWithTracing, executeTypeScriptCode, withTypeScriptRuntimeDeclarations } from './javascript.js';
package/dist/index.js CHANGED
@@ -359,6 +359,16 @@ function parseScalar(raw) {
359
359
  }
360
360
  return raw;
361
361
  }
362
+ function normalizeJavaSerializedResult(output) {
363
+ if (typeof output !== "string") {
364
+ return output;
365
+ }
366
+ try {
367
+ return JSON.parse(output);
368
+ } catch {
369
+ return output;
370
+ }
371
+ }
362
372
  function parseKeyValuePairs(fragment) {
363
373
  const variables = {};
364
374
  const matches = Array.from(fragment.matchAll(/\b([A-Za-z_][A-Za-z0-9_.]*)=/g));
@@ -539,10 +549,29 @@ function parseAccessEvent(payload) {
539
549
  pathDepth: 1
540
550
  }];
541
551
  }
552
+ const indexedMutatingCall = payload.match(/^mutate-indexed ([A-Za-z_][A-Za-z0-9_]*)\[(\d+)\] method=([A-Za-z_][A-Za-z0-9_]*)$/);
553
+ if (indexedMutatingCall) {
554
+ return [{
555
+ variable: indexedMutatingCall[1],
556
+ kind: "mutating-call",
557
+ indices: [Number.parseInt(indexedMutatingCall[2], 10)],
558
+ method: indexedMutatingCall[3],
559
+ pathDepth: 1
560
+ }];
561
+ }
562
+ const keyedCall = payload.match(/^keyed-call ([A-Za-z_][A-Za-z0-9_]*) method=([A-Za-z_][A-Za-z0-9_]*)(?:\s+.*)?$/);
563
+ if (keyedCall) {
564
+ return [{
565
+ variable: keyedCall[1],
566
+ kind: "mutating-call",
567
+ method: keyedCall[2],
568
+ pathDepth: 1
569
+ }];
570
+ }
542
571
  return void 0;
543
572
  }
544
573
  function parseStructureState(payload) {
545
- const match = payload.match(/^state (linked-list|tree) ([A-Za-z_][A-Za-z0-9_]*)=(.+)$/);
574
+ const match = payload.match(/^state (linked-list|tree|graph-adjacency) ([A-Za-z_][A-Za-z0-9_]*)=(.+)$/);
546
575
  if (!match) return null;
547
576
  return {
548
577
  structure: match[1],
@@ -558,6 +587,22 @@ function parseObjectState(payload) {
558
587
  visualization: JSON.parse(match[2])
559
588
  };
560
589
  }
590
+ function parseMapState(payload) {
591
+ const match = payload.match(/^map-state ([A-Za-z_][A-Za-z0-9_]*)=(.+)$/);
592
+ if (!match) return null;
593
+ return {
594
+ variable: match[1],
595
+ visualization: JSON.parse(match[2])
596
+ };
597
+ }
598
+ function parseSetState(payload) {
599
+ const match = payload.match(/^set-state ([A-Za-z_][A-Za-z0-9_]*)=(.+)$/);
600
+ if (!match) return null;
601
+ return {
602
+ variable: match[1],
603
+ visualization: JSON.parse(match[2])
604
+ };
605
+ }
561
606
  function parseObjectFieldEvent(payload) {
562
607
  const match = payload.match(/^(access|write) ([A-Za-z_][A-Za-z0-9_]*)\.([A-Za-z_][A-Za-z0-9_]*)=(.+)$/);
563
608
  if (!match) return null;
@@ -567,6 +612,9 @@ function parseObjectFieldEvent(payload) {
567
612
  value: parseScalar(match[4])
568
613
  };
569
614
  }
615
+ function isArrayLengthAccessEvent(payload) {
616
+ return /^access [A-Za-z_][A-Za-z0-9_]*\.length=\d+$/.test(payload);
617
+ }
570
618
  function buildFieldVisualization(event) {
571
619
  return {
572
620
  objectKinds: {
@@ -646,12 +694,13 @@ function filterStructuredVariables(variables) {
646
694
  }
647
695
  return Object.fromEntries(entries);
648
696
  }
649
- function appendJavaTraceStep(trace, step, pendingAccesses) {
697
+ function appendJavaTraceStep(trace, step, pendingAccesses, options = {}) {
650
698
  const nextStep = pendingAccesses.length > 0 ? { ...step, accesses: [...pendingAccesses] } : step;
651
699
  pendingAccesses.length = 0;
652
- if (!maybeMergeConsecutiveLineStep(trace, nextStep)) {
653
- trace.push(nextStep);
700
+ if (options.allowMerge !== false && maybeMergeConsecutiveLineStep(trace, nextStep)) {
701
+ return;
654
702
  }
703
+ trace.push(nextStep);
655
704
  }
656
705
  function mergeIntoPreviousMatchingLineStep(trace, line, currentFunction, currentCallStack, patch) {
657
706
  const candidate = trace.at(-1);
@@ -685,11 +734,14 @@ function eventsToRawTrace(events, sourceText) {
685
734
  const stack = [];
686
735
  const pendingAccesses = [];
687
736
  let currentFunction = "<module>";
737
+ let previousRawLine = null;
688
738
  const lineRemap = buildLineRemap(sourceText);
689
739
  const declarationLines = buildMethodDeclarationLineSet(sourceText);
690
740
  for (const rawEvent of events) {
691
741
  if (rawEvent === "clear" || rawEvent === "reset") continue;
692
742
  const metadata = extractLineMetadata(rawEvent);
743
+ const previousEventRawLine = previousRawLine;
744
+ previousRawLine = metadata.line;
693
745
  const line = lineRemap?.get(metadata.line) ?? metadata.line;
694
746
  const payload = metadata.payload;
695
747
  const isDeclarationLine = declarationLines?.has(line) === true;
@@ -697,28 +749,31 @@ function eventsToRawTrace(events, sourceText) {
697
749
  const match = payload.match(/^call\s+(\S+)(?:\s+(.*))?$/);
698
750
  const functionName = match?.[1] ?? currentFunction;
699
751
  const argsFragment = match?.[2] ?? "";
700
- Object.assign(variables, parseKeyValuePairs(argsFragment));
752
+ const args = parseKeyValuePairs(argsFragment);
753
+ Object.assign(variables, args);
701
754
  currentFunction = functionName || currentFunction;
702
- stack.push({ function: currentFunction, line });
755
+ stack.push({ function: currentFunction, line, args });
703
756
  appendJavaTraceStep(trace, {
704
757
  line,
705
758
  event: "call",
706
759
  function: currentFunction,
707
760
  variables: { ...variables },
708
- callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} }))
761
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } }))
709
762
  }, pendingAccesses);
710
763
  continue;
711
764
  }
712
765
  if (payload.startsWith("return ")) {
713
- const match = payload.match(/^return\s+(\S+)$/);
766
+ const match = payload.match(/^return\s+(\S+)(?:\s+value=(.*))?$/);
714
767
  const functionName = match?.[1] ?? currentFunction;
768
+ const returnValue = match?.[2] !== void 0 ? parseScalar(match[2].trim()) : void 0;
715
769
  const returnVariables = functionName === "<module>" ? { ...variables } : filterStructuredVariables(variables) ?? {};
716
770
  appendJavaTraceStep(trace, {
717
771
  line,
718
772
  event: "return",
719
773
  function: functionName || currentFunction,
720
774
  variables: returnVariables,
721
- callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} }))
775
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
776
+ ...returnValue !== void 0 ? { returnValue } : {}
722
777
  }, pendingAccesses);
723
778
  stack.pop();
724
779
  currentFunction = stack[stack.length - 1]?.function ?? "<module>";
@@ -733,8 +788,8 @@ function eventsToRawTrace(events, sourceText) {
733
788
  event: "line",
734
789
  function: currentFunction,
735
790
  variables: { ...variables },
736
- ...stack.length > 0 ? { callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })) } : {}
737
- }, pendingAccesses);
791
+ ...stack.length > 0 ? { callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })) } : {}
792
+ }, pendingAccesses, { allowMerge: previousEventRawLine !== metadata.line });
738
793
  continue;
739
794
  }
740
795
  const structureState = parseStructureState(payload);
@@ -746,7 +801,7 @@ function eventsToRawTrace(events, sourceText) {
746
801
  event: "line",
747
802
  function: currentFunction,
748
803
  variables: { ...variables },
749
- callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })),
804
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
750
805
  visualization: {
751
806
  objectKinds: { ...objectKinds }
752
807
  }
@@ -761,7 +816,7 @@ function eventsToRawTrace(events, sourceText) {
761
816
  event: "line",
762
817
  function: currentFunction,
763
818
  variables: { ...variables },
764
- callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })),
819
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
765
820
  visualization: {
766
821
  objectKinds: { [objectState.variable]: "object" },
767
822
  hashMaps: [objectState.visualization]
@@ -769,10 +824,56 @@ function eventsToRawTrace(events, sourceText) {
769
824
  }, pendingAccesses);
770
825
  continue;
771
826
  }
827
+ const mapState = parseMapState(payload);
828
+ if (mapState) {
829
+ const entries = mapState.visualization.entries.map((entry) => [entry.key, entry.value]);
830
+ variables[mapState.variable] = { __type__: "map", entries };
831
+ appendJavaTraceStep(trace, {
832
+ line,
833
+ event: "line",
834
+ function: currentFunction,
835
+ variables: { ...variables },
836
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
837
+ visualization: {
838
+ objectKinds: { [mapState.variable]: "map" },
839
+ hashMaps: [mapState.visualization]
840
+ }
841
+ }, pendingAccesses);
842
+ continue;
843
+ }
844
+ const setState = parseSetState(payload);
845
+ if (setState) {
846
+ const values = setState.visualization.entries.map((entry) => entry.key);
847
+ variables[setState.variable] = { __type__: "set", values };
848
+ appendJavaTraceStep(trace, {
849
+ line,
850
+ event: "line",
851
+ function: currentFunction,
852
+ variables: { ...variables },
853
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
854
+ visualization: {
855
+ objectKinds: { [setState.variable]: "set" },
856
+ hashMaps: [setState.visualization]
857
+ }
858
+ }, pendingAccesses);
859
+ continue;
860
+ }
861
+ if (isArrayLengthAccessEvent(payload)) {
862
+ continue;
863
+ }
864
+ const accesses = parseAccessEvent(payload);
865
+ if (accesses) {
866
+ const currentCallStack = stack.length > 0 ? stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })) : void 0;
867
+ if (mergeAccessesIntoPreviousMatchingLineStep(trace, line, currentFunction, currentCallStack, accesses)) {
868
+ continue;
869
+ }
870
+ pendingAccesses.push(...accesses);
871
+ continue;
872
+ }
772
873
  const objectField = parseObjectFieldEvent(payload);
773
874
  if (objectField) {
774
875
  variables[objectField.variable] = { __ref__: `${objectField.variable}-object` };
775
- const currentCallStack = stack.length > 0 ? stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })) : void 0;
876
+ const currentCallStack = stack.length > 0 ? stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })) : void 0;
776
877
  if (mergeIntoPreviousMatchingLineStep(trace, line, currentFunction, currentCallStack, {
777
878
  variables: { ...variables },
778
879
  accesses: void 0,
@@ -785,27 +886,18 @@ function eventsToRawTrace(events, sourceText) {
785
886
  event: "line",
786
887
  function: currentFunction,
787
888
  variables: { ...variables },
788
- callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })),
889
+ callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })),
789
890
  visualization: buildFieldVisualization(objectField)
790
891
  }, pendingAccesses);
791
892
  continue;
792
893
  }
793
894
  Object.assign(variables, parseKeyValuePairs(payload));
794
- const accesses = parseAccessEvent(payload);
795
- if (accesses) {
796
- const currentCallStack = stack.length > 0 ? stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })) : void 0;
797
- if (mergeAccessesIntoPreviousMatchingLineStep(trace, line, currentFunction, currentCallStack, accesses)) {
798
- continue;
799
- }
800
- pendingAccesses.push(...accesses);
801
- continue;
802
- }
803
895
  appendJavaTraceStep(trace, {
804
896
  line,
805
897
  event: "line",
806
898
  function: currentFunction,
807
899
  variables: { ...variables },
808
- ...stack.length > 0 ? { callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: {} })) } : {}
900
+ ...stack.length > 0 ? { callStack: stack.map((frame) => ({ function: frame.function, line: frame.line, args: { ...frame.args } })) } : {}
809
901
  }, pendingAccesses);
810
902
  }
811
903
  if (pendingAccesses.length > 0 && trace.length > 0) {
@@ -814,11 +906,11 @@ function eventsToRawTrace(events, sourceText) {
814
906
  }
815
907
  return trace;
816
908
  }
817
- function buildJavaExecutionResult(output, events, executionTimeMs = 0, traceLimitExceeded, timeoutReason, maxTraceSteps, sourceText) {
909
+ function buildJavaExecutionResult(output, events, executionTimeMs = 0, traceLimitExceeded, timeoutReason, maxTraceSteps, sourceText, options = {}) {
818
910
  const trace = eventsToRawTrace(events, sourceText);
819
911
  return {
820
912
  success: true,
821
- output,
913
+ output: options.outputIsSerialized === false ? output : normalizeJavaSerializedResult(output),
822
914
  trace,
823
915
  executionTimeMs,
824
916
  consoleOutput: [],
@@ -1341,7 +1433,7 @@ var JAVA_RUNTIME_PROFILE = {
1341
1433
  function: true,
1342
1434
  solutionMethod: true,
1343
1435
  opsClass: true,
1344
- script: false,
1436
+ script: true,
1345
1437
  interviewMode: true
1346
1438
  },
1347
1439
  timeouts: {
@@ -1394,9 +1486,9 @@ var JAVA_RUNTIME_PROFILE = {
1394
1486
  }
1395
1487
  },
1396
1488
  notes: [
1397
- "Java currently supports the browser-local Java 17 lane for function, solution-method, and ops-class execution.",
1398
- "Interview-mode Java reuses the same browser-local execution path and remains experimental in the first harness slice.",
1399
- "Script-style Java is not enabled yet."
1489
+ "Java currently supports the browser-local Java 17 lane for function, solution-method, ops-class, and script-style execution.",
1490
+ "Interview-mode Java reuses the same browser-local execution path and remains experimental.",
1491
+ 'Script-style Java uses an empty function name with executionStyle="function" and reads the top-level result variable.'
1400
1492
  ]
1401
1493
  };
1402
1494
  var LANGUAGE_RUNTIME_PROFILES = {
@@ -1732,7 +1824,8 @@ var JavaRuntimeClient = class {
1732
1824
  rawResult.traceLimitExceeded,
1733
1825
  rawResult.timeoutReason,
1734
1826
  void 0,
1735
- rawResult.sourceText
1827
+ rawResult.sourceText,
1828
+ { outputIsSerialized: false }
1736
1829
  )
1737
1830
  );
1738
1831
  return {
@@ -2665,6 +2758,7 @@ function generateSolutionScript(solutionCode, functionName, inputs) {
2665
2758
  return `
2666
2759
  import json
2667
2760
  import sys
2761
+ from typing import *
2668
2762
 
2669
2763
  ${PYTHON_CLASS_DEFINITIONS}
2670
2764
 
@@ -3815,6 +3909,7 @@ export {
3815
3909
  getSupportedLanguageProfiles,
3816
3910
  identifyConversions,
3817
3911
  isLanguageSupported,
3912
+ normalizeJavaSerializedResult,
3818
3913
  normalizeJavaTraceContract as normalizeJavaSpikeTraceContract,
3819
3914
  normalizeJavaTraceContract,
3820
3915
  normalizeRuntimeTraceContract,