From 5ee69b439a98e01a42cca664c17a418876e0fc82 Mon Sep 17 00:00:00 2001 From: Shibo Sheng Date: Tue, 1 Sep 2026 20:46:29 +0800 Subject: [PATCH 1/2] fix(session): exclude orphan members from pinned pages Filter membership-marked native rows before pinned page limits unless a persisted Agent Org runtime run proves the row is a valid root. Preserve the standalone behavior supplied by the PR 1190 base and cover page capacity, cursors, valid roots, and indexed query plans. Verification: agent-core sidebar tests (4 passed); org2 native-sidebar tests (5 passed); cargo check and clippy for agent_core/org2; BuildFast packaged-app pagination and restart checks. --- .../core/session/persistence/crud/record.rs | 7 +- .../aggregation/native_sidebar.rs | 130 +++++++++++++++++- 2 files changed, 129 insertions(+), 8 deletions(-) diff --git a/src-tauri/crates/agent-core/src/core/session/persistence/crud/record.rs b/src-tauri/crates/agent-core/src/core/session/persistence/crud/record.rs index 07c8860522..ff9e040e92 100644 --- a/src-tauri/crates/agent-core/src/core/session/persistence/crud/record.rs +++ b/src-tauri/crates/agent-core/src/core/session/persistence/crud/record.rs @@ -84,9 +84,10 @@ pub struct UnifiedSessionRecord { pub merge_status: Option, pub project_slug: Option, pub agent_definition_id: Option, - /// Agent Org roster member id for `session_type::ORG_MEMBER` rows. - /// This identifies the member instance, while `agent_definition_id` - /// identifies which AgentDefinition that member runs. + /// Agent Org roster member id. Worker rows use `session_type::ORG_MEMBER`; + /// a coordinator root keeps its primary session type and uses the + /// coordinator member id. `agent_definition_id` identifies which + /// AgentDefinition that member runs. pub org_member_id: Option, pub parent_session_id: Option, diff --git a/src-tauri/src/agent_sessions/session_directory/aggregation/native_sidebar.rs b/src-tauri/src/agent_sessions/session_directory/aggregation/native_sidebar.rs index 1e6813387d..ad2927f971 100644 --- a/src-tauri/src/agent_sessions/session_directory/aggregation/native_sidebar.rs +++ b/src-tauri/src/agent_sessions/session_directory/aggregation/native_sidebar.rs @@ -140,6 +140,14 @@ fn list_pinned_native_sidebar_sessions( AND s.status != ?1 AND s.parent_session_id IS NULL AND s.session_type IN (?2, ?3, ?4) + AND ( + s.org_member_id IS NULL + OR EXISTS ( + SELECT 1 + FROM agent_org_runtime_runs r + WHERE r.root_session_id = s.session_id + ) + ) {agent_cursor} UNION ALL SELECT c.session_id, c.updated_at, 'cli' AS source_kind @@ -387,11 +395,29 @@ mod tests { } #[test] - fn pinned_native_page_merges_agent_and_cli_roots_in_stable_order() { + fn pinned_native_page_excludes_orphan_members_before_capacity() { let _sandbox = crate::test_utils::test_env::sandbox(); let conn = get_connection().expect("sandbox database"); - for (session_id, session_type, updated_at, pinned, parent, status) in [ + for (session_id, session_type, updated_at, pinned, parent, status, member) in [ + ( + "orphan-coordinator-pinned", + session_type::CODING, + "2026-07-30T18:00:00Z", + true, + None, + "idle", + Some("coordinator"), + ), + ( + "agent-org-root-pinned", + session_type::CODING, + "2026-07-30T17:00:00Z", + true, + None, + "idle", + Some("coordinator"), + ), ( "sdeagent-pinned", session_type::CODING, @@ -399,6 +425,7 @@ mod tests { true, None, "idle", + None, ), ( "osagent-pinned", @@ -407,6 +434,7 @@ mod tests { true, None, "idle", + None, ), ( "humansession-pinned", @@ -415,6 +443,7 @@ mod tests { true, None, "completed", + None, ), ( "sdeagent-unpinned", @@ -423,6 +452,7 @@ mod tests { false, None, "idle", + None, ), ( "sdeagent-worker", @@ -431,6 +461,7 @@ mod tests { true, Some("sdeagent-pinned"), "running", + None, ), ( "sdeagent-archived", @@ -439,6 +470,7 @@ mod tests { true, None, "archived", + None, ), ] { session_persistence::upsert_session(&UnifiedSessionRecord { @@ -447,6 +479,7 @@ mod tests { status: status.to_string(), session_type: session_type.to_string(), parent_session_id: parent.map(str::to_string), + org_member_id: member.map(str::to_string), created_at: updated_at.to_string(), updated_at: updated_at.to_string(), pinned, @@ -454,6 +487,18 @@ mod tests { }) .expect("seed native session"); } + conn.execute( + "INSERT INTO agent_org_runtime_runs ( + id, org_id, coordinator_agent_id, root_session_id, + entry_mode, status, created_at, updated_at + ) VALUES ( + 'run-agent-org-root-pinned', 'org-pinned', 'builtin:sde', + 'agent-org-root-pinned', 'standalone_session', 'running', + '2026-07-30T17:00:00Z', '2026-07-30T17:00:00Z' + )", + [], + ) + .expect("seed pinned Agent Org run"); for (session_id, updated_at, pinned, parent) in [ ("cliagent-pinned", "2026-07-30T13:00:00Z", true, None), @@ -475,7 +520,7 @@ mod tests { .expect("seed CLI session"); } - let page = list_native_sidebar_sessions(NativeSidebarSessionStream::PinnedNative, None, 10) + let page = list_native_sidebar_sessions(NativeSidebarSessionStream::PinnedNative, None, 4) .expect("load global pinned page"); assert_eq!( @@ -484,14 +529,89 @@ mod tests { .map(|session| session.session_id.as_str()) .collect::>(), vec![ + "agent-org-root-pinned", "sdeagent-pinned", "cliagent-pinned", "osagent-pinned", - "humansession-pinned", ] ); assert!(page.sessions.iter().all(|session| session.pinned)); - assert!(!page.has_more); + assert!(page + .sessions + .iter() + .all(|session| session.session_id != "orphan-coordinator-pinned")); + assert_eq!(page.sessions[0].agent_org_id.as_deref(), Some("org-pinned")); + assert!(page.has_more); + assert_eq!( + page.next_cursor.as_ref(), + Some(&NativeSidebarSessionCursor { + updated_at: "2026-07-30T12:00:00Z".to_string(), + session_id: "osagent-pinned".to_string(), + }) + ); + + let second = list_native_sidebar_sessions( + NativeSidebarSessionStream::PinnedNative, + page.next_cursor.as_ref(), + 4, + ) + .expect("load second global pinned page"); + assert_eq!( + second + .sessions + .iter() + .map(|session| session.session_id.as_str()) + .collect::>(), + vec!["humansession-pinned"] + ); + assert!(!second.has_more); + } + + #[test] + fn pinned_native_query_uses_bounded_order_and_root_membership_indexes() { + let _sandbox = crate::test_utils::test_env::sandbox(); + let conn = get_connection().expect("sandbox database"); + let mut stmt = conn + .prepare( + "EXPLAIN QUERY PLAN + SELECT s.session_id, s.updated_at, 'agent' AS source_kind + FROM agent_sessions s + WHERE s.pinned = 1 + AND s.status != 'archived' + AND s.parent_session_id IS NULL + AND s.session_type IN ('sde', 'os', 'human') + AND ( + s.org_member_id IS NULL + OR EXISTS ( + SELECT 1 + FROM agent_org_runtime_runs r + WHERE r.root_session_id = s.session_id + ) + ) + UNION ALL + SELECT c.session_id, c.updated_at, 'cli' AS source_kind + FROM code_sessions c + WHERE c.pinned = 1 + AND c.parent_session_id IS NULL + ORDER BY updated_at DESC, session_id DESC + LIMIT 11", + ) + .expect("prepare pinned native query plan"); + let details = stmt + .query_map([], |row| row.get::<_, String>(3)) + .expect("read pinned native query plan") + .collect::, _>>() + .expect("collect pinned native query plan") + .join("\n"); + + assert!( + details.contains("idx_agent_sessions_sidebar"), + "pinned agent page did not use ordered sidebar index:\n{details}" + ); + assert!( + details.contains("idx_agent_org_runtime_runs_root_session"), + "pinned root membership probe did not use root-session index:\n{details}" + ); } #[test] From d25a6e12da1f5736905783975ec160789e525ad3 Mon Sep 17 00:00:00 2001 From: Shibo Sheng Date: Wed, 2 Sep 2026 07:42:45 +0800 Subject: [PATCH 2/2] feat(agent-org): enable redesign by default --- config/webpack.config.js | 2 +- scripts/dev/webpack-config-light.test.cjs | 21 +++++++++++++++++-- .../coordination/agent_org_runs/rollout.rs | 10 ++++----- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/config/webpack.config.js b/config/webpack.config.js index 9103cbd283..6f064ffce3 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -661,7 +661,7 @@ module.exports = (env, argv) => { process.env.ORGII_DEEP_LINK_SCHEME ?? "orgii" ), "process.env.ORGII_AGENT_ORG_REDESIGN": JSON.stringify( - isE2E ? "1" : (process.env.ORGII_AGENT_ORG_REDESIGN ?? "0") + isE2E ? "1" : (process.env.ORGII_AGENT_ORG_REDESIGN ?? "1") ), "process.env.E2E_BASE_URL": JSON.stringify( process.env.E2E_BASE_URL ?? diff --git a/scripts/dev/webpack-config-light.test.cjs b/scripts/dev/webpack-config-light.test.cjs index a2c54816a7..d0b843f8c7 100644 --- a/scripts/dev/webpack-config-light.test.cjs +++ b/scripts/dev/webpack-config-light.test.cjs @@ -84,7 +84,7 @@ test("production keeps default HTML script injection", () => { assert.equal(htmlPlugin?.userOptions?.retryMainScriptLoad, false); }); -test("WebDriver production bundles enable the E2E-only Agent Org gate", () => { +test("WebDriver production bundles force-enable the Agent Org gate", () => { const config = withEnv( { ORGII_E2E: null, @@ -101,7 +101,7 @@ test("WebDriver production bundles enable the E2E-only Agent Org gate", () => { ); }); -test("ordinary production bundles keep the Agent Org rollout disabled", () => { +test("ordinary production bundles enable the Agent Org rollout by default", () => { const config = withEnv( { ORGII_E2E: null, @@ -111,6 +111,23 @@ test("ordinary production bundles keep the Agent Org rollout disabled", () => { () => createWebpackConfig({}, { mode: "production" }) ); + assert.equal(getDefinedValue(config, "process.env.ORGII_E2E"), '"0"'); + assert.equal( + getDefinedValue(config, "process.env.ORGII_AGENT_ORG_REDESIGN"), + '"1"' + ); +}); + +test("ordinary production bundles preserve an explicit Agent Org opt-out", () => { + const config = withEnv( + { + ORGII_E2E: null, + ORGII_AGENT_ORG_REDESIGN: "0", + WEBDRIVER: null, + }, + () => createWebpackConfig({}, { mode: "production" }) + ); + assert.equal(getDefinedValue(config, "process.env.ORGII_E2E"), '"0"'); assert.equal( getDefinedValue(config, "process.env.ORGII_AGENT_ORG_REDESIGN"), diff --git a/src-tauri/crates/agent-core/src/core/coordination/agent_org_runs/rollout.rs b/src-tauri/crates/agent-core/src/core/coordination/agent_org_runs/rollout.rs index 5e65a3df92..a636736880 100644 --- a/src-tauri/crates/agent-core/src/core/coordination/agent_org_runs/rollout.rs +++ b/src-tauri/crates/agent-core/src/core/coordination/agent_org_runs/rollout.rs @@ -1,14 +1,14 @@ //! Single internal rollout gate for the long-lived Agent Org redesign. //! //! This is deliberately not persisted in Team definitions or exposed to -//! model/tool context. Until the final stack PR changes the default, missing -//! or malformed configuration fails closed. +//! model/tool context. Missing configuration enables the completed redesign; +//! explicit values still fail closed unless they are exactly `1`. const ENABLED_VALUE: &str = "1"; const ROLLOUT_ENV: &str = "ORGII_AGENT_ORG_REDESIGN"; fn configured_enabled(value: Option<&str>, test_build: bool) -> bool { - test_build || value.is_some_and(|value| value.trim() == ENABLED_VALUE) + test_build || value.is_none_or(|value| value.trim() == ENABLED_VALUE) } pub fn is_enabled() -> bool { @@ -45,8 +45,8 @@ mod tests { } #[test] - fn production_gate_defaults_and_malformed_values_fail_closed() { - assert!(!super::configured_enabled(None, false)); + fn production_gate_defaults_enabled_and_explicit_values_fail_closed() { + assert!(super::configured_enabled(None, false)); assert!(!super::configured_enabled(Some("true"), false)); assert!(!super::configured_enabled(Some("0"), false)); assert!(super::configured_enabled(Some("1"), false));