Skip to content

Commit 7558810

Browse files
committed
fix(execution): honor inline JavaScript module format
1 parent 65dc5e6 commit 7558810

2 files changed

Lines changed: 74 additions & 19 deletions

File tree

crates/native-sidecar/src/language_execution.rs

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const TTY_ENV: &str = "AGENTOS_EXEC_TTY";
3535
const TTY_COLS_ENV: &str = "AGENTOS_EXEC_TTY_COLS";
3636
const TTY_ROWS_ENV: &str = "AGENTOS_EXEC_TTY_ROWS";
3737
const RETAIN_LANGUAGE_CONTEXT_ENV: &str = "AGENTOS_RETAIN_LANGUAGE_CONTEXT";
38+
const GUEST_ENTRYPOINT_MODULE_MODE_ENV: &str = "AGENTOS_GUEST_ENTRYPOINT_MODULE_MODE";
3839
const INLINE_FILE_PATH_ENV: &str = "AGENTOS_INLINE_FILE_PATH";
3940
const USE_BUNDLED_TYPESCRIPT_ENV: &str = "AGENTOS_USE_BUNDLED_TYPESCRIPT";
4041
const SEMANTIC_RESULT_PATH_PREFIX: &str = "/tmp/.agentos-semantic-result-";
@@ -336,14 +337,6 @@ fn transpile_typescript(
336337
transform_source(source, file_path, true, common_js)
337338
}
338339

339-
fn transform_retained_javascript_module(
340-
source: &str,
341-
file_path: &str,
342-
) -> Result<String, SidecarError> {
343-
let source = rewrite_static_imports(source, file_path, false)?;
344-
transform_source(&source, file_path, false, true)
345-
}
346-
347340
fn transform_retained_typescript_module(
348341
source: &str,
349342
file_path: &str,
@@ -528,16 +521,19 @@ fn lower_operation(payload: RequestPayload) -> Result<LoweredOperation, SidecarE
528521
let module = payload.format == Some(JavaScriptModuleFormat::Module);
529522
let mut source = inline_inputs_prefix(payload.inputs, false);
530523
source.push_str(&payload.source);
531-
if module {
532-
source = transform_retained_javascript_module(&source, &file_path)?;
533-
}
534524
let retained_source = source.clone();
535525
let mut operation =
536526
lowered_process(payload.process, "node", vec![String::from("-e"), source]);
537527
operation.retained_language = Some(RetainedExecutionLanguage::JavaScript);
538528
operation.retained_source = Some(retained_source);
539529
operation.retained_file_path = Some(file_path.clone());
540-
operation.retained_module = false;
530+
operation.retained_module = module;
531+
if module {
532+
operation.env.insert(
533+
String::from(GUEST_ENTRYPOINT_MODULE_MODE_ENV),
534+
String::from("1"),
535+
);
536+
}
541537
operation
542538
.env
543539
.insert(String::from(INLINE_FILE_PATH_ENV), file_path);
@@ -556,15 +552,18 @@ fn lower_operation(payload: RequestPayload) -> Result<LoweredOperation, SidecarE
556552
serde_json::to_string(&result_path)
557553
.expect("semantic result path serialization cannot fail")
558554
));
559-
if module {
560-
source = transform_retained_javascript_module(&source, &file_path)?;
561-
}
562555
let mut operation =
563556
lowered_process(payload.process, "node", vec![String::from("-e"), source]);
564557
operation.retained_language = Some(RetainedExecutionLanguage::JavaScript);
565558
operation.retained_source = operation.args.get(1).cloned();
566559
operation.retained_file_path = Some(file_path.clone());
567-
operation.retained_module = false;
560+
operation.retained_module = module;
561+
if module {
562+
operation.env.insert(
563+
String::from(GUEST_ENTRYPOINT_MODULE_MODE_ENV),
564+
String::from("1"),
565+
);
566+
}
568567
operation
569568
.env
570569
.insert(String::from(INLINE_FILE_PATH_ENV), file_path);

crates/native-sidecar/tests/language_execution.rs

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -559,9 +559,9 @@ fn javascript_execution_reuses_retained_context() {
559559
wire::RequestPayload::JavaScriptExecutionRequest(wire::JavaScriptExecutionRequest {
560560
process: context_process_options("test-execution"),
561561
source: String::from(
562-
"import { sep } from 'node:path'; let retainedAnswer = sep === '/' ? 41 : 0;",
562+
"const { sep } = require('node:path'); let retainedAnswer = sep === '/' ? 41 : 0;",
563563
),
564-
format: Some(wire::JavaScriptModuleFormat::Module),
564+
format: Some(wire::JavaScriptModuleFormat::CommonJs),
565565
file_path: None,
566566
inputs: None,
567567
}),
@@ -637,7 +637,7 @@ fn javascript_execution_reuses_retained_context() {
637637
wire::RequestPayload::JavaScriptEvaluationRequest(wire::JavaScriptEvaluationRequest {
638638
process: context_process_options(&execution_id),
639639
expression: String::from("typedAnswer"),
640-
format: Some(wire::JavaScriptModuleFormat::Module),
640+
format: Some(wire::JavaScriptModuleFormat::CommonJs),
641641
file_path: None,
642642
inputs: None,
643643
}),
@@ -664,6 +664,62 @@ fn javascript_execution_reuses_retained_context() {
664664
dispose_vm_and_close_session_wire(&mut sidecar, &connection_id, &session_id, &vm_id);
665665
}
666666

667+
#[test]
668+
fn javascript_module_execution_accepts_inline_exports_in_a_context() {
669+
let mut sidecar = new_sidecar("language-execution-inline-esm");
670+
let connection_id = authenticate_wire(&mut sidecar, "language-execution-inline-esm");
671+
let session_id = open_session_wire(&mut sidecar, 2, &connection_id);
672+
let cwd = temp_dir("language-execution-inline-esm-cwd");
673+
let (vm_id, _) = create_vm_wire(
674+
&mut sidecar,
675+
3,
676+
&connection_id,
677+
&session_id,
678+
wire::GuestRuntimeKind::JavaScript,
679+
&cwd,
680+
);
681+
create_context(
682+
&mut sidecar,
683+
&connection_id,
684+
&session_id,
685+
&vm_id,
686+
"module-context",
687+
);
688+
689+
let started = sidecar
690+
.dispatch_wire_blocking(wire_request(
691+
4,
692+
wire_vm(&connection_id, &session_id, &vm_id),
693+
wire::RequestPayload::JavaScriptExecutionRequest(wire::JavaScriptExecutionRequest {
694+
process: context_process_options("module-context"),
695+
source: String::from("export const y = 1;"),
696+
format: Some(wire::JavaScriptModuleFormat::Module),
697+
file_path: None,
698+
inputs: None,
699+
}),
700+
))
701+
.expect("start inline ES module");
702+
let execution_id = accepted_execution_id(started);
703+
let result = wait_for_execution(
704+
&mut sidecar,
705+
&connection_id,
706+
&session_id,
707+
&vm_id,
708+
&execution_id,
709+
);
710+
assert_eq!(result.outcome, wire::ExecutionOutcome::Succeeded);
711+
assert_eq!(result.exit_code, Some(0));
712+
713+
reset_execution(
714+
&mut sidecar,
715+
&connection_id,
716+
&session_id,
717+
&vm_id,
718+
&execution_id,
719+
);
720+
dispose_vm_and_close_session_wire(&mut sidecar, &connection_id, &session_id, &vm_id);
721+
}
722+
667723
#[test]
668724
fn typescript_check_reports_semantic_diagnostics() {
669725
let mut sidecar = new_sidecar("language-execution-typescript-check");

0 commit comments

Comments
 (0)