fix: normalize zero-width prefix in agent registration lookup

This commit is contained in:
YeonGyu-Kim
2026-03-31 16:58:15 -07:00
parent 9f2c4500e8
commit 62a46fbabd
2 changed files with 31 additions and 8 deletions
@@ -1,4 +1,6 @@
import { describe, test, expect, beforeEach, afterEach } from "bun:test" /// <reference path="../../../bun-test.d.ts" />
import { describe, it as test, expect, beforeEach, afterEach } from "bun:test"
import { import {
setSessionAgent, setSessionAgent,
getSessionAgent, getSessionAgent,
@@ -51,7 +53,7 @@ describe("claude-code-session-state", () => {
// given - no session set // given - no session set
// when / then // when / then
expect(getSessionAgent("unknown-session")).toBeUndefined() expect(getSessionAgent("unknown-session")).toBe(undefined)
}) })
}) })
@@ -80,7 +82,7 @@ describe("claude-code-session-state", () => {
clearSessionAgent(sessionID) clearSessionAgent(sessionID)
// then // then
expect(getSessionAgent(sessionID)).toBeUndefined() expect(getSessionAgent(sessionID)).toBe(undefined)
}) })
}) })
@@ -100,7 +102,7 @@ describe("claude-code-session-state", () => {
// given - explicit reset to ensure clean state (parallel test isolation) // given - explicit reset to ensure clean state (parallel test isolation)
_resetForTesting() _resetForTesting()
// then // then
expect(getMainSessionID()).toBeUndefined() expect(getMainSessionID()).toBe(undefined)
}) })
}) })
@@ -113,6 +115,21 @@ describe("claude-code-session-state", () => {
expect(isAgentRegistered("atlas")).toBe(true) expect(isAgentRegistered("atlas")).toBe(true)
expect(isAgentRegistered("Atlas (Plan Executor)")).toBe(true) expect(isAgentRegistered("Atlas (Plan Executor)")).toBe(true)
}) })
describe("#given atlas display name with zero-width prefix", () => {
describe("#when checking registration without the zero-width prefix", () => {
test("#then it treats the display name as registered", () => {
// given
registerAgentName("\u200BAtlas (Plan Executor)")
// when
const isRegistered = isAgentRegistered("Atlas (Plan Executor)")
// then
expect(isRegistered).toBe(true)
})
})
})
}) })
describe("prometheus-md-only integration scenario", () => { describe("prometheus-md-only integration scenario", () => {
@@ -135,7 +152,7 @@ describe("claude-code-session-state", () => {
const sessionID = "test-prometheus-session" const sessionID = "test-prometheus-session"
// when / then - this is the bug: agent is undefined // when / then - this is the bug: agent is undefined
expect(getSessionAgent(sessionID)).toBeUndefined() expect(getSessionAgent(sessionID)).toBe(undefined)
}) })
}) })
@@ -15,18 +15,24 @@ export function getMainSessionID(): string | undefined {
const registeredAgentNames = new Set<string>() const registeredAgentNames = new Set<string>()
const ZERO_WIDTH_CHARACTERS_REGEX = /[\u200B\u200C\u200D\uFEFF]/g
function normalizeRegisteredAgentName(name: string): string {
return name.replace(ZERO_WIDTH_CHARACTERS_REGEX, "").toLowerCase()
}
export function registerAgentName(name: string): void { export function registerAgentName(name: string): void {
const normalizedName = name.toLowerCase() const normalizedName = normalizeRegisteredAgentName(name)
registeredAgentNames.add(normalizedName) registeredAgentNames.add(normalizedName)
const configKey = getAgentConfigKey(name).toLowerCase() const configKey = normalizeRegisteredAgentName(getAgentConfigKey(name))
if (configKey !== normalizedName) { if (configKey !== normalizedName) {
registeredAgentNames.add(configKey) registeredAgentNames.add(configKey)
} }
} }
export function isAgentRegistered(name: string): boolean { export function isAgentRegistered(name: string): boolean {
return registeredAgentNames.has(name.toLowerCase()) return registeredAgentNames.has(normalizeRegisteredAgentName(name))
} }
/** @internal For testing only */ /** @internal For testing only */