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
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Significance: minor
Type: added

Agents Manager: Add dedicated CIAB variant. CIAB environments always load Agents Manager regardless of the unified experience setting, using the new 'ciab' variant for connected sites and 'ciab-disconnected' for disconnected sites.
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,11 @@ public function enqueue_scripts() {
wp_dequeue_style( 'help-center-style' );
}

// For non-Gutenberg environments, add to admin bar
// Gutenberg doesn't have an admin bar, so JS will handle UI insertion
if ( ! $is_gutenberg ) {
// For non-Gutenberg, non-CIAB environments, add to admin bar.
// Gutenberg doesn't have an admin bar, so JS will handle UI insertion.
// CIAB hides the classic admin bar and uses its own Site Hub — the JS variant handles UI there.
$is_ciab = $this->is_ciab_environment();
if ( ! $is_gutenberg && ! $is_ciab ) {
add_action(
'admin_bar_menu',
function ( $wp_admin_bar ) use ( $use_disconnected ) {
Expand Down Expand Up @@ -271,12 +273,9 @@ function ( $wp_admin_bar ) use ( $use_disconnected ) {
* @return string|null The variant name, or null if scripts should not be loaded.
*/
private function get_variant() {
// CIAB/Next Admin: only load when disconnected (connected CIAB is handled by Help Center).
if ( $this->is_ciab_environment() ) {
if ( $this->is_enabled() && $this->is_jetpack_disconnected() ) {
return 'ciab-disconnected';
}
return null;
// CIAB: Load either the connected or disconnected variants if enabled.
if ( $this->is_ciab_environment() && $this->is_enabled() ) {
return $this->is_jetpack_disconnected() ? 'ciab-disconnected' : 'ciab';
}

// Frontend: load disconnected variant for eligible logged-in editors.
Expand Down Expand Up @@ -311,6 +310,17 @@ private function get_variant() {
* @return bool
*/
private function is_enabled() {
// CIAB: Agents Manager is the default AI experience — enabled unless explicitly
// disabled via filter (e.g. for debugging or gradual rollout).
if ( $this->is_ciab_environment() ) {
/**
* Filter whether Agents Manager is enabled in CIAB (Next Admin) environments.
*
* @param bool $enabled Whether Agents Manager should load. Default true.
*/
return apply_filters( 'agents_manager_enabled_in_ciab', true );
}

// Full unified experience: Agents Manager with support guides, Help Center takeover, etc.
if ( apply_filters( 'agents_manager_use_unified_experience', false ) ) {
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1740,7 +1740,7 @@ public function test_enqueue_scripts_includes_section_name_gutenberg_disconnecte

/**
* Tests that enqueue_scripts includes sectionName as ciab-disconnected in CIAB environment
* when unified experience is enabled but Jetpack is disconnected.
* when Jetpack is disconnected.
*/
public function test_enqueue_scripts_includes_section_name_ciab_disconnected() {
// Set admin context - scripts only enqueue in admin.
Expand All @@ -1750,17 +1750,17 @@ public function test_enqueue_scripts_includes_section_name_ciab_disconnected() {
global $wp_actions;
$original_action_count = $wp_actions['next_admin_init'] ?? 0;

// Simulate CIAB environment by firing the next_admin_init action.
do_action( 'next_admin_init' );
// Simulate CIAB environment by incrementing the action counter directly
// (avoids side effects from firing the action, which would trigger enqueue_scripts).
$wp_actions['next_admin_init'] = ( $wp_actions['next_admin_init'] ?? 0 ) + 1;

// Reset the script registry.
global $wp_scripts;
$wp_scripts = null;

wp_register_script( 'agents-manager', 'https://example.com/agents-manager.js', array(), '1.0', true );

// Enable unified experience and simulate a Jetpack site with a disconnected user.
add_filter( 'agents_manager_use_unified_experience', '__return_true', 20 );
// Simulate a Jetpack site with a disconnected user.
add_filter( 'is_jetpack_site', '__return_true', 20 );
// Do not connect the user - is_user_connected() will return false by default.

Expand All @@ -1772,7 +1772,6 @@ public function test_enqueue_scripts_includes_section_name_ciab_disconnected() {

$this->assertStringContainsString( '"sectionName":"ciab-disconnected"', $inline_script );

remove_filter( 'agents_manager_use_unified_experience', '__return_true', 20 );
remove_filter( 'is_jetpack_site', '__return_true', 20 );

// Restore the original did_action counter to prevent test order dependencies.
Expand All @@ -1783,6 +1782,47 @@ public function test_enqueue_scripts_includes_section_name_ciab_disconnected() {
}
}

/**
* Tests that enqueue_scripts includes sectionName as ciab in CIAB environment
* when is_jetpack_disconnected() returns false (non-Jetpack site or connected user).
*/
public function test_enqueue_scripts_includes_section_name_ciab_connected() {
// Set admin context - scripts only enqueue in admin.
$this->set_admin_context();

// Save the current did_action counter for next_admin_init to restore later.
global $wp_actions;
$original_action_count = $wp_actions['next_admin_init'] ?? 0;

// Simulate CIAB environment by incrementing the action counter directly
// (avoids side effects from firing the action, which would trigger enqueue_scripts).
$wp_actions['next_admin_init'] = ( $wp_actions['next_admin_init'] ?? 0 ) + 1;

// Reset the script registry.
global $wp_scripts;
$wp_scripts = null;

wp_register_script( 'agents-manager', 'https://example.com/agents-manager.js', array(), '1.0', true );

// Do NOT simulate a Jetpack disconnected site.
// is_jetpack_disconnected() returns false for non-Jetpack sites.

$this->agents_manager->enqueue_scripts();

$this->assertNotNull( $wp_scripts, 'wp_scripts should be initialized after enqueue_scripts' );
$inline_scripts = $wp_scripts->registered['agents-manager']->extra['before'] ?? array();
$inline_script = implode( "\n", array_filter( $inline_scripts ) );

$this->assertStringContainsString( '"sectionName":"ciab"', $inline_script );

// Restore the original did_action counter to prevent test order dependencies.
if ( $original_action_count === 0 ) {
unset( $wp_actions['next_admin_init'] );
} else {
$wp_actions['next_admin_init'] = $original_action_count;
}
}

/**
* Tests that should_enqueue_script returns true when unified experience is enabled but Jetpack is disconnected (in wp-admin).
*/
Expand Down Expand Up @@ -1952,25 +1992,47 @@ public function test_scripts_not_enqueued_on_p2_frontend() {
}

/**
* Tests that should_enqueue_script returns false in CIAB environment when Jetpack is connected.
*
* Connected CIAB is handled by Help Center; Agents Manager should not load.
* Tests that get_variant returns ciab in CIAB environment
* when is_jetpack_disconnected() returns false (non-Jetpack site or connected user).
*/
public function test_should_enqueue_script_returns_false_in_ciab_when_connected() {
public function test_get_variant_returns_ciab_in_ciab_when_connected() {
$this->set_admin_context();

// Save and simulate CIAB environment.
global $wp_actions;
$original_action_count = $wp_actions['next_admin_init'] ?? 0;
do_action( 'next_admin_init' );
$original_action_count = $wp_actions['next_admin_init'] ?? 0;
$wp_actions['next_admin_init'] = ( $wp_actions['next_admin_init'] ?? 0 ) + 1;

// Enable unified experience but do NOT simulate a Jetpack disconnected site.
// is_jetpack_disconnected() returns false for non-Jetpack sites.
add_filter( 'agents_manager_use_unified_experience', '__return_true', 20 );
$result = $this->call_get_variant();

$result = $this->call_should_enqueue_script();
// Restore did_action counter.
if ( $original_action_count === 0 ) {
unset( $wp_actions['next_admin_init'] );
} else {
$wp_actions['next_admin_init'] = $original_action_count;
}

remove_filter( 'agents_manager_use_unified_experience', '__return_true', 20 );
$this->assertSame( 'ciab', $result );
}

/**
* Tests that get_variant returns null in CIAB when agents_manager_enabled_in_ciab filter returns false.
*/
public function test_get_variant_returns_null_in_ciab_when_disabled_by_filter() {
$this->set_admin_context();

// Save and simulate CIAB environment.
global $wp_actions;
$original_action_count = $wp_actions['next_admin_init'] ?? 0;
$wp_actions['next_admin_init'] = ( $wp_actions['next_admin_init'] ?? 0 ) + 1;

// Disable AM in CIAB via filter.
add_filter( 'agents_manager_enabled_in_ciab', '__return_false', 20 );

$result = $this->call_get_variant();

remove_filter( 'agents_manager_enabled_in_ciab', '__return_false', 20 );

// Restore did_action counter.
if ( $original_action_count === 0 ) {
Expand All @@ -1979,7 +2041,7 @@ public function test_should_enqueue_script_returns_false_in_ciab_when_connected(
$wp_actions['next_admin_init'] = $original_action_count;
}

$this->assertFalse( $result );
$this->assertNull( $result );
}

/**
Expand Down