diff --git a/packages/coding-agent/src/eval/js/shared/rewrite-imports.ts b/packages/coding-agent/src/eval/js/shared/rewrite-imports.ts index 0d472a7da..f4b592370 100644 --- a/packages/coding-agent/src/eval/js/shared/rewrite-imports.ts +++ b/packages/coding-agent/src/eval/js/shared/rewrite-imports.ts @@ -29,6 +29,7 @@ type BabelExpressionStatement = { type: "ExpressionStatement"; start: number; end: number; + expression?: { type?: string }; }; type BabelProgramNode = BabelImportDeclaration | BabelLexicalDecl | BabelExpressionStatement | { type: string }; @@ -186,7 +187,10 @@ function returnFinalExpression(code: string): { source: string; returned: boolea const suffix = code.slice(expression.end); const semicolonMatch = statement.match(/;\s*$/); const trimmedStatement = semicolonMatch ? statement.slice(0, semicolonMatch.index) : statement; - return { source: `${prefix}__omp_display__(${trimmedStatement});${suffix}`, returned: true }; + const needsAwait = + expression.expression?.type === "AwaitExpression" || expression.expression?.type === "CallExpression"; + const displayExpression = needsAwait ? `await (${trimmedStatement})` : trimmedStatement; + return { source: `${prefix}__omp_display__(${displayExpression});${suffix}`, returned: true }; } /** diff --git a/packages/coding-agent/test/core/js-executor.test.ts b/packages/coding-agent/test/core/js-executor.test.ts index 93d717e3f..f10aae61f 100644 --- a/packages/coding-agent/test/core/js-executor.test.ts +++ b/packages/coding-agent/test/core/js-executor.test.ts @@ -270,6 +270,17 @@ describe("executeJs", () => { }); }); + it("awaits promise-valued final expressions before displaying", async () => { + const result = await executeJs("read('config.json');", { + sessionId, + session, + sessionFile, + }); + + expect(result.exitCode).toBe(0); + expect(result.output.trim()).toBe('{\n "name": "demo",\n "enabled": true\n}'); + }); + it("auto-displays returned objects as structured output", async () => { const result = await executeJs("return { answer: 42, nested: { ok: true } };", { sessionId,