Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
51 lines
1.8 KiB
TypeScript
51 lines
1.8 KiB
TypeScript
import type { AISession } from "../../infrastructure/ai/types";
|
|
|
|
export function getSessionScopeMatchRank(
|
|
session: AISession,
|
|
scopeType: "terminal" | "workspace",
|
|
scopeTargetId?: string,
|
|
scopeHostIds?: string[],
|
|
/**
|
|
* Session ids currently displayed by other terminal scopes. Tracked by
|
|
* session id rather than `scope.targetId` so that a host-matched session
|
|
* resumed from a different terminal is still recognised as in-use and
|
|
* not offered (or cleaned) as if it were orphaned.
|
|
*/
|
|
activeTerminalSessionIds?: Set<string>,
|
|
/**
|
|
* Terminal session ids currently living in this workspace. When terminals
|
|
* merge, their AI chats stay `scope.type === "terminal"`; treating those
|
|
* member chats as exact workspace matches keeps history/resume working.
|
|
*/
|
|
workspaceMemberTerminalIds?: Set<string>,
|
|
/** Chats currently selected by workspace members, including resumed history. */
|
|
workspaceMemberActiveSessionIds?: Set<string>,
|
|
): number {
|
|
// After a terminal merge the AI panel flips to workspace scope, but chats
|
|
// created or resumed on member terminals remain terminal-scoped. Rank them as
|
|
// exact matches so they stay visible and preferred over stale workspaces.
|
|
if (
|
|
scopeType === "workspace"
|
|
&& session.scope.type === "terminal"
|
|
&& (
|
|
(session.scope.targetId && workspaceMemberTerminalIds?.has(session.scope.targetId))
|
|
|| workspaceMemberActiveSessionIds?.has(session.id)
|
|
)
|
|
) {
|
|
return 3;
|
|
}
|
|
|
|
if (session.scope.type !== scopeType) return 0;
|
|
if (session.scope.targetId === scopeTargetId) return 3;
|
|
|
|
if (scopeType === "terminal" && activeTerminalSessionIds?.has(session.id)) {
|
|
return 0;
|
|
}
|
|
|
|
if (scopeType === "terminal" && scopeHostIds?.length && session.scope.hostIds?.length) {
|
|
return session.scope.hostIds.some((hostId) => scopeHostIds.includes(hostId)) ? 2 : 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|