源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
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
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
This commit is contained in:
+140
@@ -0,0 +1,140 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import type { AgentGUINodeData } from "../../../types";
|
||||
import {
|
||||
forgetAgentGUISessionMemories,
|
||||
rememberAgentGUIActiveConversation,
|
||||
resolveAgentGUIRememberedSessionSelection,
|
||||
resolveAgentGUISessionMemoryTarget
|
||||
} from "./agentGuiSessionNavigationMemory";
|
||||
|
||||
describe("agent GUI session navigation memory", () => {
|
||||
it("remembers the last selected session independently for each agent target", () => {
|
||||
const initial: AgentGUINodeData = {
|
||||
agentTargetId: "local:codex",
|
||||
lastActiveAgentSessionId: "codex-1",
|
||||
provider: "codex"
|
||||
};
|
||||
const codex = rememberAgentGUIActiveConversation(
|
||||
initial,
|
||||
"codex-1",
|
||||
"local:codex"
|
||||
);
|
||||
const claude = rememberAgentGUIActiveConversation(
|
||||
codex,
|
||||
"claude-1",
|
||||
"local:claude-code"
|
||||
);
|
||||
const home = rememberAgentGUIActiveConversation(claude, null);
|
||||
|
||||
expect(home.lastActiveAgentSessionId).toBeNull();
|
||||
expect(home.lastActiveAgentSessionIdByAgentTargetId).toEqual({
|
||||
"local:claude-code": "claude-1",
|
||||
"local:codex": "codex-1"
|
||||
});
|
||||
});
|
||||
|
||||
it("forgets deleted sessions without removing other target memories", () => {
|
||||
const current: AgentGUINodeData = {
|
||||
agentTargetId: "local:claude-code",
|
||||
lastActiveAgentSessionId: "claude-1",
|
||||
lastActiveAgentSessionIdByAgentTargetId: {
|
||||
"local:claude-code": "claude-1",
|
||||
"local:codex": "codex-1"
|
||||
},
|
||||
provider: "claude-code"
|
||||
};
|
||||
|
||||
expect(
|
||||
forgetAgentGUISessionMemories(current, new Set(["claude-1"]))
|
||||
).toEqual({
|
||||
...current,
|
||||
lastActiveAgentSessionId: null,
|
||||
lastActiveAgentSessionIdByAgentTargetId: {
|
||||
"local:codex": "codex-1"
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it("uses only canonical, projected, or matching pending target evidence", () => {
|
||||
expect(
|
||||
resolveAgentGUISessionMemoryTarget({
|
||||
agentSessionId: "session-1",
|
||||
canonicalAgentTargetId: "local:codex",
|
||||
pendingActivation: {
|
||||
agentSessionId: "session-1",
|
||||
agentTargetId: "local:claude-code"
|
||||
},
|
||||
projectedAgentTargetId: "local:opencode"
|
||||
})
|
||||
).toBe("local:codex");
|
||||
expect(
|
||||
resolveAgentGUISessionMemoryTarget({
|
||||
agentSessionId: "session-1",
|
||||
pendingActivation: {
|
||||
agentSessionId: "session-1",
|
||||
agentTargetId: "local:claude-code"
|
||||
}
|
||||
})
|
||||
).toBe("local:claude-code");
|
||||
expect(
|
||||
resolveAgentGUISessionMemoryTarget({
|
||||
agentSessionId: "session-1",
|
||||
pendingActivation: {
|
||||
agentSessionId: "other-session",
|
||||
agentTargetId: "local:claude-code"
|
||||
}
|
||||
})
|
||||
).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe("remembered provider session selection", () => {
|
||||
const data = {
|
||||
lastActiveAgentSessionId: null,
|
||||
lastActiveAgentSessionIdByAgentTargetId: {
|
||||
"local:codex": "codex-session"
|
||||
},
|
||||
provider: "codex"
|
||||
} as const;
|
||||
|
||||
it("restores the window-local session remembered for the exact target", () => {
|
||||
expect(
|
||||
resolveAgentGUIRememberedSessionSelection({
|
||||
data,
|
||||
deleted: false,
|
||||
knownAgentTargetId: "local:codex",
|
||||
targetAgentTargetId: "local:codex"
|
||||
})
|
||||
).toEqual({ agentSessionId: "codex-session", kind: "restore" });
|
||||
});
|
||||
|
||||
it("restores a remembered bounded-history session before it is loaded", () => {
|
||||
expect(
|
||||
resolveAgentGUIRememberedSessionSelection({
|
||||
data,
|
||||
deleted: false,
|
||||
knownAgentTargetId: null,
|
||||
targetAgentTargetId: "local:codex"
|
||||
})
|
||||
).toEqual({ agentSessionId: "codex-session", kind: "restore" });
|
||||
});
|
||||
|
||||
it("rejects deleted or target-mismatched memories", () => {
|
||||
expect(
|
||||
resolveAgentGUIRememberedSessionSelection({
|
||||
data,
|
||||
deleted: true,
|
||||
knownAgentTargetId: "local:codex",
|
||||
targetAgentTargetId: "local:codex"
|
||||
})
|
||||
).toEqual({ agentSessionId: "codex-session", kind: "stale" });
|
||||
expect(
|
||||
resolveAgentGUIRememberedSessionSelection({
|
||||
data,
|
||||
deleted: false,
|
||||
knownAgentTargetId: "local:claude-code",
|
||||
targetAgentTargetId: "local:codex"
|
||||
})
|
||||
).toEqual({ agentSessionId: "codex-session", kind: "stale" });
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user