fix(agents): strip ZWSP ordering prefixes in session state, config lookups, and override protection

Prevent ZWSP sort prefixes from leaking into stored agent names, config
key lookups, and override-protection normalization. Ensures prefixed
list-display names resolve correctly throughout the pipeline.

🤖 Generated with [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) assistance
This commit is contained in:
YeonGyu-Kim
2026-04-06 18:07:26 +09:00
parent 178b635d72
commit e62d5d7a22
5 changed files with 62 additions and 4 deletions
@@ -37,6 +37,18 @@ describe("claude-code-session-state", () => {
expect(getSessionAgent(sessionID)).toBe(agent)
})
test("should strip zero-width ordering prefixes before storing agent for session", () => {
// given
const sessionID = "test-session-prefixed"
const agent = "\u200B\u200B\u200BPrometheus (Plan Builder)"
// when
setSessionAgent(sessionID, agent)
// then
expect(getSessionAgent(sessionID)).toBe("Prometheus (Plan Builder)")
})
test("should NOT overwrite existing agent (first-write wins)", () => {
// given
const sessionID = "test-session-1"
@@ -69,6 +81,18 @@ describe("claude-code-session-state", () => {
// then
expect(getSessionAgent(sessionID)).toBe("sisyphus")
})
test("should strip zero-width ordering prefixes when overwriting existing agent", () => {
// given
const sessionID = "test-session-prefixed-update"
setSessionAgent(sessionID, "sisyphus")
// when
updateSessionAgent(sessionID, "\u200B\u200BHephaestus (Deep Agent)")
// then
expect(getSessionAgent(sessionID)).toBe("Hephaestus (Deep Agent)")
})
})
describe("clearSessionAgent", () => {
@@ -21,6 +21,10 @@ function normalizeRegisteredAgentName(name: string): string {
return name.replace(ZERO_WIDTH_CHARACTERS_REGEX, "").toLowerCase()
}
function normalizeStoredAgentName(name: string): string {
return name.replace(ZERO_WIDTH_CHARACTERS_REGEX, "")
}
export function registerAgentName(name: string): void {
const normalizedName = normalizeRegisteredAgentName(name)
registeredAgentNames.add(normalizedName)
@@ -48,12 +52,12 @@ const sessionAgentMap = new Map<string, string>()
export function setSessionAgent(sessionID: string, agent: string): void {
if (!sessionAgentMap.has(sessionID)) {
sessionAgentMap.set(sessionID, agent)
sessionAgentMap.set(sessionID, normalizeStoredAgentName(agent))
}
}
export function updateSessionAgent(sessionID: string, agent: string): void {
sessionAgentMap.set(sessionID, agent)
sessionAgentMap.set(sessionID, normalizeStoredAgentName(agent))
}
export function getSessionAgent(sessionID: string): string | undefined {