Files
tutti/packages/agent/gui/agent-gui/agentGuiNode/model/agentGuiSessionNavigationMemory.ts
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

120 lines
4.0 KiB
TypeScript

import type { AgentGUINodeData } from "../../../types";
export type AgentGUIRememberedSessionSelection =
| { kind: "none" }
| { agentSessionId: string; kind: "restore" }
| { agentSessionId: string; kind: "stale" };
interface PendingSessionTarget {
agentSessionId: string;
agentTargetId?: string | null;
}
function normalizeOptionalText(
value: string | null | undefined
): string | null {
return value?.trim() || null;
}
export function resolveAgentGUISessionMemoryTarget(input: {
agentSessionId: string | null;
canonicalAgentTargetId?: string | null;
pendingActivation?: PendingSessionTarget | null;
projectedAgentTargetId?: string | null;
}): string | null {
const agentSessionId = normalizeOptionalText(input.agentSessionId);
if (!agentSessionId) return null;
const pendingAgentTargetId =
normalizeOptionalText(input.pendingActivation?.agentSessionId) ===
agentSessionId
? normalizeOptionalText(input.pendingActivation?.agentTargetId)
: null;
return (
normalizeOptionalText(input.canonicalAgentTargetId) ??
normalizeOptionalText(input.projectedAgentTargetId) ??
pendingAgentTargetId
);
}
export function rememberAgentGUIActiveConversation(
current: AgentGUINodeData,
agentSessionId: string | null,
agentTargetId?: string | null
): AgentGUINodeData {
const normalizedAgentSessionId = normalizeOptionalText(agentSessionId);
const normalizedAgentTargetId = normalizeOptionalText(agentTargetId);
const rememberedAgentSessionId = normalizedAgentTargetId
? (current.lastActiveAgentSessionIdByAgentTargetId?.[
normalizedAgentTargetId
] ?? null)
: null;
if (
current.lastActiveAgentSessionId === normalizedAgentSessionId &&
(!normalizedAgentSessionId ||
!normalizedAgentTargetId ||
rememberedAgentSessionId === normalizedAgentSessionId)
) {
return current;
}
return {
...current,
lastActiveAgentSessionId: normalizedAgentSessionId,
...(normalizedAgentSessionId && normalizedAgentTargetId
? {
lastActiveAgentSessionIdByAgentTargetId: {
...(current.lastActiveAgentSessionIdByAgentTargetId ?? {}),
[normalizedAgentTargetId]: normalizedAgentSessionId
}
}
: {})
};
}
export function forgetAgentGUISessionMemories(
current: AgentGUINodeData,
agentSessionIds: ReadonlySet<string>
): AgentGUINodeData {
if (agentSessionIds.size === 0) return current;
const nextEntries = Object.entries(
current.lastActiveAgentSessionIdByAgentTargetId ?? {}
).filter(([, agentSessionId]) => !agentSessionIds.has(agentSessionId));
const nextMemories =
nextEntries.length > 0 ? Object.fromEntries(nextEntries) : null;
const nextActiveAgentSessionId =
current.lastActiveAgentSessionId &&
agentSessionIds.has(current.lastActiveAgentSessionId)
? null
: current.lastActiveAgentSessionId;
if (
nextActiveAgentSessionId === current.lastActiveAgentSessionId &&
nextEntries.length ===
Object.keys(current.lastActiveAgentSessionIdByAgentTargetId ?? {}).length
) {
return current;
}
return {
...current,
lastActiveAgentSessionId: nextActiveAgentSessionId,
lastActiveAgentSessionIdByAgentTargetId: nextMemories
};
}
export function resolveAgentGUIRememberedSessionSelection(input: {
data: AgentGUINodeData;
deleted: boolean;
knownAgentTargetId?: string | null;
targetAgentTargetId: string | null;
}): AgentGUIRememberedSessionSelection {
const targetAgentTargetId = normalizeOptionalText(input.targetAgentTargetId);
if (!targetAgentTargetId) return { kind: "none" };
const agentSessionId = normalizeOptionalText(
input.data.lastActiveAgentSessionIdByAgentTargetId?.[targetAgentTargetId]
);
if (!agentSessionId) return { kind: "none" };
const knownAgentTargetId = normalizeOptionalText(input.knownAgentTargetId);
return input.deleted ||
(knownAgentTargetId !== null && knownAgentTargetId !== targetAgentTargetId)
? { agentSessionId, kind: "stale" }
: { agentSessionId, kind: "restore" };
}