diff --git a/DISASMER_PUBLIC_TREE.json b/DISASMER_PUBLIC_TREE.json index 3d8d6ca..ec0bcbf 100644 --- a/DISASMER_PUBLIC_TREE.json +++ b/DISASMER_PUBLIC_TREE.json @@ -1,7 +1,7 @@ { "kind": "disasmer-filtered-public-tree", - "source_commit": "b2b2e4a1b7c94ccc39c4d8cdfca6e98928fe2185", - "release_name": "dryrun-b2b2e4a1b7c9", + "source_commit": "276fb9d6bd1d5a8d5f38df37ccf104664f6f5043", + "release_name": "dryrun-276fb9d6bd1d", "filtered_out": [ "private/**", "experiments/**", diff --git a/crates/disasmer-cli/src/main.rs b/crates/disasmer-cli/src/main.rs index aceaf6c..8613898 100644 --- a/crates/disasmer-cli/src/main.rs +++ b/crates/disasmer-cli/src/main.rs @@ -6068,6 +6068,35 @@ mod tests { assert!(inspection.metadata.debug_metadata.available); assert!(inspection.metadata.debug_metadata.source_level_breakpoints); assert!(inspection.metadata.debug_metadata.variables_pane_supported); + assert!( + inspection + .metadata + .large_input_policy + .selected_inputs_are_content_digests + ); + assert!( + !inspection + .metadata + .large_input_policy + .selected_input_bytes_included + ); + assert!( + !inspection + .metadata + .large_input_policy + .full_repository_bytes_included + ); + assert!( + !inspection + .metadata + .large_input_policy + .silent_task_argument_serialization + ); + assert!(inspection + .metadata + .large_input_policy + .supported_handle_types + .contains(&"SourceSnapshot".to_owned())); assert!(!inspection.metadata.embeds_full_container_images); assert!(inspection .metadata @@ -7658,6 +7687,31 @@ mod tests { report["bundle"]["metadata"]["debug_metadata"]["dap_virtual_process"], true ); + assert_eq!( + report["bundle"]["metadata"]["large_input_policy"] + ["selected_inputs_are_content_digests"], + true + ); + assert_eq!( + report["bundle"]["metadata"]["large_input_policy"]["selected_input_bytes_included"], + false + ); + assert_eq!( + report["bundle"]["metadata"]["large_input_policy"]["full_repository_bytes_included"], + false + ); + assert_eq!( + report["bundle"]["metadata"]["large_input_policy"] + ["silent_task_argument_serialization"], + false + ); + assert!( + report["bundle"]["metadata"]["large_input_policy"]["supported_handle_types"] + .as_array() + .unwrap() + .iter() + .any(|handle| handle == "Artifact") + ); assert_eq!(report["status"], "built"); assert_eq!(report["scheduled_work"], false); } diff --git a/crates/disasmer-core/src/bundle.rs b/crates/disasmer-core/src/bundle.rs index 2b98727..d40e6de 100644 --- a/crates/disasmer-core/src/bundle.rs +++ b/crates/disasmer-core/src/bundle.rs @@ -27,6 +27,7 @@ pub struct BundleMetadata { pub task_metadata: BundleTaskMetadata, pub source_metadata: BundleSourceMetadata, pub debug_metadata: BundleDebugMetadata, + pub large_input_policy: BundleLargeInputPolicy, pub environments: Vec, pub selected_inputs: Vec, pub embeds_full_container_images: bool, @@ -55,6 +56,15 @@ pub struct BundleDebugMetadata { pub variables_pane_supported: bool, } +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct BundleLargeInputPolicy { + pub selected_inputs_are_content_digests: bool, + pub selected_input_bytes_included: bool, + pub full_repository_bytes_included: bool, + pub silent_task_argument_serialization: bool, + pub supported_handle_types: Vec, +} + impl BundleIdentityInputs { pub fn identity(&self) -> Digest { let mut parts = vec![ @@ -114,6 +124,18 @@ impl BundleIdentityInputs { dap_virtual_process: true, variables_pane_supported: true, }, + large_input_policy: BundleLargeInputPolicy { + selected_inputs_are_content_digests: true, + selected_input_bytes_included: false, + full_repository_bytes_included: false, + silent_task_argument_serialization: false, + supported_handle_types: vec![ + "SourceSnapshot".to_owned(), + "Blob".to_owned(), + "Artifact".to_owned(), + "VFS".to_owned(), + ], + }, environments: self.environments.clone(), selected_inputs: self.selected_inputs.clone(), embeds_full_container_images: false, @@ -189,6 +211,22 @@ mod tests { .transfer_policy .local_source_bytes_remain_node_local ); + assert!( + metadata + .large_input_policy + .selected_inputs_are_content_digests + ); + assert!(!metadata.large_input_policy.selected_input_bytes_included); + assert!(!metadata.large_input_policy.full_repository_bytes_included); + assert!( + !metadata + .large_input_policy + .silent_task_argument_serialization + ); + assert!(metadata + .large_input_policy + .supported_handle_types + .contains(&"Artifact".to_owned())); assert_eq!(metadata.environments.len(), 1); assert!(!metadata.embeds_full_container_images); } diff --git a/crates/disasmer-core/src/lib.rs b/crates/disasmer-core/src/lib.rs index 36f213d..64f3a3d 100644 --- a/crates/disasmer-core/src/lib.rs +++ b/crates/disasmer-core/src/lib.rs @@ -27,8 +27,8 @@ pub use auth::{ PublicKeyIdentity, Scope, }; pub use bundle::{ - BundleDebugMetadata, BundleIdentityInputs, BundleMetadata, BundleSourceMetadata, - BundleTaskMetadata, SelectedInput, + BundleDebugMetadata, BundleIdentityInputs, BundleLargeInputPolicy, BundleMetadata, + BundleSourceMetadata, BundleTaskMetadata, SelectedInput, }; pub use capability::{Capability, CapabilityReportError, EnvironmentBackend, NodeCapabilities, Os}; pub use checkpoint::{ diff --git a/scripts/cli-first-contract-smoke.js b/scripts/cli-first-contract-smoke.js index a019de4..db26bb6 100644 --- a/scripts/cli-first-contract-smoke.js +++ b/scripts/cli-first-contract-smoke.js @@ -391,6 +391,11 @@ expect( "CLI build coverage verifies inspectable metadata", /fn build_command_reuses_bundle_inspection_without_full_repo_upload\(\)[\s\S]*wasm_code[\s\S]*task_metadata[\s\S]*source_metadata[\s\S]*debug_metadata/ ); +expect( + cli, + "CLI build coverage verifies large input handle posture", + /large_input_policy[\s\S]*selected_inputs_are_content_digests[\s\S]*selected_input_bytes_included[\s\S]*silent_task_argument_serialization[\s\S]*supported_handle_types/ +); expect( cli, "CLI blocks build before scheduling unsafe inputs", @@ -430,6 +435,7 @@ for (const [name, pattern] of [ ["doctor human mode", /\["doctor"\]/], ["doctor reachability JSON mode", /doctorJson\.coordinator_reachability\.status/], ["bundle inspect JSON mode", /\["bundle", "inspect", "--project", project, "--json"\]/], + ["bundle inspect large input JSON mode", /large_input_policy[\s\S]*SourceSnapshot/], ["auth expiry posture", /token_expiry_posture[\s\S]*expires_at/], ]) { expect(outputModeSmoke, name, pattern); diff --git a/scripts/cli-output-mode-smoke.js b/scripts/cli-output-mode-smoke.js index a73879b..a34bf4b 100644 --- a/scripts/cli-output-mode-smoke.js +++ b/scripts/cli-output-mode-smoke.js @@ -101,5 +101,16 @@ assert.strictEqual( false ); assert.strictEqual(inspectJson.metadata.debug_metadata.dap_virtual_process, true); +assert.strictEqual( + inspectJson.metadata.large_input_policy.selected_inputs_are_content_digests, + true +); +assert.strictEqual(inspectJson.metadata.large_input_policy.selected_input_bytes_included, false); +assert.strictEqual(inspectJson.metadata.large_input_policy.full_repository_bytes_included, false); +assert.strictEqual( + inspectJson.metadata.large_input_policy.silent_task_argument_serialization, + false +); +assert(inspectJson.metadata.large_input_policy.supported_handle_types.includes("SourceSnapshot")); console.log("CLI output mode smoke passed");