Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 15 additions & 16 deletions crates/native-sidecar/src/language_execution.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const TTY_ENV: &str = "AGENTOS_EXEC_TTY";
const TTY_COLS_ENV: &str = "AGENTOS_EXEC_TTY_COLS";
const TTY_ROWS_ENV: &str = "AGENTOS_EXEC_TTY_ROWS";
const RETAIN_LANGUAGE_CONTEXT_ENV: &str = "AGENTOS_RETAIN_LANGUAGE_CONTEXT";
const GUEST_ENTRYPOINT_MODULE_MODE_ENV: &str = "AGENTOS_GUEST_ENTRYPOINT_MODULE_MODE";
const INLINE_FILE_PATH_ENV: &str = "AGENTOS_INLINE_FILE_PATH";
const USE_BUNDLED_TYPESCRIPT_ENV: &str = "AGENTOS_USE_BUNDLED_TYPESCRIPT";
const SEMANTIC_RESULT_PATH_PREFIX: &str = "/tmp/.agentos-semantic-result-";
Expand Down Expand Up @@ -336,14 +337,6 @@ fn transpile_typescript(
transform_source(source, file_path, true, common_js)
}

fn transform_retained_javascript_module(
source: &str,
file_path: &str,
) -> Result<String, SidecarError> {
let source = rewrite_static_imports(source, file_path, false)?;
transform_source(&source, file_path, false, true)
}

fn transform_retained_typescript_module(
source: &str,
file_path: &str,
Expand Down Expand Up @@ -528,16 +521,19 @@ fn lower_operation(payload: RequestPayload) -> Result<LoweredOperation, SidecarE
let module = payload.format == Some(JavaScriptModuleFormat::Module);
let mut source = inline_inputs_prefix(payload.inputs, false);
source.push_str(&payload.source);
if module {
source = transform_retained_javascript_module(&source, &file_path)?;
}
let retained_source = source.clone();
let mut operation =
lowered_process(payload.process, "node", vec![String::from("-e"), source]);
operation.retained_language = Some(RetainedExecutionLanguage::JavaScript);
operation.retained_source = Some(retained_source);
operation.retained_file_path = Some(file_path.clone());
operation.retained_module = false;
operation.retained_module = module;
if module {
operation.env.insert(
String::from(GUEST_ENTRYPOINT_MODULE_MODE_ENV),
String::from("1"),
);
}
operation
.env
.insert(String::from(INLINE_FILE_PATH_ENV), file_path);
Expand All @@ -556,15 +552,18 @@ fn lower_operation(payload: RequestPayload) -> Result<LoweredOperation, SidecarE
serde_json::to_string(&result_path)
.expect("semantic result path serialization cannot fail")
));
if module {
source = transform_retained_javascript_module(&source, &file_path)?;
}
let mut operation =
lowered_process(payload.process, "node", vec![String::from("-e"), source]);
operation.retained_language = Some(RetainedExecutionLanguage::JavaScript);
operation.retained_source = operation.args.get(1).cloned();
operation.retained_file_path = Some(file_path.clone());
operation.retained_module = false;
operation.retained_module = module;
if module {
operation.env.insert(
String::from(GUEST_ENTRYPOINT_MODULE_MODE_ENV),
String::from("1"),
);
}
operation
.env
.insert(String::from(INLINE_FILE_PATH_ENV), file_path);
Expand Down
62 changes: 59 additions & 3 deletions crates/native-sidecar/tests/language_execution.rs
Original file line number Diff line number Diff line change
Expand Up @@ -559,9 +559,9 @@ fn javascript_execution_reuses_retained_context() {
wire::RequestPayload::JavaScriptExecutionRequest(wire::JavaScriptExecutionRequest {
process: context_process_options("test-execution"),
source: String::from(
"import { sep } from 'node:path'; let retainedAnswer = sep === '/' ? 41 : 0;",
"const { sep } = require('node:path'); let retainedAnswer = sep === '/' ? 41 : 0;",
),
format: Some(wire::JavaScriptModuleFormat::Module),
format: Some(wire::JavaScriptModuleFormat::CommonJs),
file_path: None,
inputs: None,
}),
Expand Down Expand Up @@ -637,7 +637,7 @@ fn javascript_execution_reuses_retained_context() {
wire::RequestPayload::JavaScriptEvaluationRequest(wire::JavaScriptEvaluationRequest {
process: context_process_options(&execution_id),
expression: String::from("typedAnswer"),
format: Some(wire::JavaScriptModuleFormat::Module),
format: Some(wire::JavaScriptModuleFormat::CommonJs),
file_path: None,
inputs: None,
}),
Expand All @@ -664,6 +664,62 @@ fn javascript_execution_reuses_retained_context() {
dispose_vm_and_close_session_wire(&mut sidecar, &connection_id, &session_id, &vm_id);
}

#[test]
fn javascript_module_execution_accepts_inline_exports_in_a_context() {
let mut sidecar = new_sidecar("language-execution-inline-esm");
let connection_id = authenticate_wire(&mut sidecar, "language-execution-inline-esm");
let session_id = open_session_wire(&mut sidecar, 2, &connection_id);
let cwd = temp_dir("language-execution-inline-esm-cwd");
let (vm_id, _) = create_vm_wire(
&mut sidecar,
3,
&connection_id,
&session_id,
wire::GuestRuntimeKind::JavaScript,
&cwd,
);
create_context(
&mut sidecar,
&connection_id,
&session_id,
&vm_id,
"module-context",
);

let started = sidecar
.dispatch_wire_blocking(wire_request(
4,
wire_vm(&connection_id, &session_id, &vm_id),
wire::RequestPayload::JavaScriptExecutionRequest(wire::JavaScriptExecutionRequest {
process: context_process_options("module-context"),
source: String::from("export const y = 1;"),
format: Some(wire::JavaScriptModuleFormat::Module),
file_path: None,
inputs: None,
}),
))
.expect("start inline ES module");
let execution_id = accepted_execution_id(started);
let result = wait_for_execution(
&mut sidecar,
&connection_id,
&session_id,
&vm_id,
&execution_id,
);
assert_eq!(result.outcome, wire::ExecutionOutcome::Succeeded);
assert_eq!(result.exit_code, Some(0));

reset_execution(
&mut sidecar,
&connection_id,
&session_id,
&vm_id,
&execution_id,
);
dispose_vm_and_close_session_wire(&mut sidecar, &connection_id, &session_id, &vm_id);
}

#[test]
fn typescript_check_reports_semantic_diagnostics() {
let mut sidecar = new_sidecar("language-execution-typescript-check");
Expand Down
Loading