@@ -5,7 +5,7 @@ export const EXECUTOR_BACKEND = "oolong-javascript";
55export const RLM_BACKEND = "oolong-rlm-javascript" ;
66
77type ExecWorkspace = Parameters < typeof createExecTool > [ 0 ] [ "workspace" ] ;
8- const MAX_SAFE_ANSWER_BYTES = 16 * 1024 ;
8+ const MAX_SAFE_RESULT_BYTES = 16 * 1024 ;
99
1010export function createExecutorTool (
1111 workspace : ExecWorkspace ,
@@ -45,17 +45,16 @@ export function sanitizeExecutorOutput(output: ExecToolOutput): ExecToolOutput {
4545 const base = { command : output . command , cwd : output . cwd , backend : output . backend } ;
4646 if ( "error" in output ) return { ...base , error : "Generated execution failed." } ;
4747
48- const answer = safeAnswer ( output . result ) ;
4948 return {
5049 ...base ,
5150 exitCode : output . exitCode ,
5251 stdout : "" ,
5352 stderr : "" ,
54- ... ( answer === undefined ? { } : { result : { answer } } ) ,
53+ result : safeResult ( output . result ) ,
5554 } ;
5655}
5756
58- function safeAnswer ( value : unknown ) : string | number | Array < string | number > | undefined {
57+ function safeResult ( value : unknown ) : Record < string , unknown > {
5958 const answer = isRecord ( value ) && Object . hasOwn ( value , "answer" ) ? value . answer : value ;
6059 const valid =
6160 typeof answer === "string" ||
@@ -65,8 +64,23 @@ function safeAnswer(value: unknown): string | number | Array<string | number> |
6564 ( item ) : item is string | number =>
6665 typeof item === "string" || ( typeof item === "number" && Number . isFinite ( item ) ) ,
6766 ) ) ;
68- if ( ! valid || encodedBytes ( answer ) > MAX_SAFE_ANSWER_BYTES ) return undefined ;
69- return answer ;
67+
68+ if ( valid && encodedBytes ( answer ) <= MAX_SAFE_RESULT_BYTES ) return { answer } ;
69+
70+ return {
71+ accepted : false ,
72+ reason : "Expected a bounded scalar/list or an object containing answer." ,
73+ received : describeResult ( value ) ,
74+ } ;
75+ }
76+
77+ function describeResult ( value : unknown ) : string {
78+ if ( Array . isArray ( value ) ) return `array with ${ value . length } items` ;
79+ if ( isRecord ( value ) ) {
80+ return Object . hasOwn ( value , "answer" ) ? "object with answer" : "object without answer" ;
81+ }
82+ if ( value === null ) return "null" ;
83+ return typeof value ;
7084}
7185
7286function isAsyncIterable ( value : unknown ) : value is AsyncIterable < ExecToolOutput > {
0 commit comments