























@@ -223,6 +223,64 @@ describe("gateway server agent", () => {
223223});
224224});
225225226+test("agent preserves CLI session binding metadata when refreshing session state", async () => {
227+await useTempSessionStorePath();
228+await writeSessionStore({
229+entries: {
230+main: {
231+sessionId: "sess-cli",
232+updatedAt: Date.now(),
233+modelProvider: "claude-cli",
234+model: "claude-opus-4-6",
235+cliSessionIds: {
236+"claude-cli": "cli-session-123",
237+},
238+cliSessionBindings: {
239+"claude-cli": {
240+sessionId: "cli-session-123",
241+authProfileId: "anthropic:work",
242+mcpConfigHash: "mcp-config-hash",
243+mcpResumeHash: "mcp-resume-hash",
244+},
245+},
246+claudeCliSessionId: "cli-session-123",
247+},
248+},
249+});
250+251+const res = await rpcReq(ws, "agent", {
252+message: "hi",
253+sessionKey: "main",
254+idempotencyKey: "idem-agent-cli-binding",
255+});
256+expect(res.ok).toBe(true);
257+258+const sessionStorePath = testState.sessionStorePath;
259+if (!sessionStorePath) {
260+throw new Error("expected session store path");
261+}
262+const stored = JSON.parse(await fs.readFile(sessionStorePath, "utf-8")) as Record<
263+string,
264+{
265+cliSessionBindings?: Record<string, unknown>;
266+cliSessionIds?: Record<string, string>;
267+claudeCliSessionId?: string;
268+}
269+>;
270+expect(stored["agent:main:main"]?.cliSessionBindings).toEqual({
271+"claude-cli": {
272+sessionId: "cli-session-123",
273+authProfileId: "anthropic:work",
274+mcpConfigHash: "mcp-config-hash",
275+mcpResumeHash: "mcp-resume-hash",
276+},
277+});
278+expect(stored["agent:main:main"]?.cliSessionIds).toEqual({
279+"claude-cli": "cli-session-123",
280+});
281+expect(stored["agent:main:main"]?.claudeCliSessionId).toBe("cli-session-123");
282+});
283+226284test("agent accepts built-in channel alias (imsg)", async () => {
227285const registry = createRegistry([
228286{
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。