























@@ -5,6 +5,7 @@ import {
55createSessionAndRefresh,
66deleteSessionsAndRefresh,
77loadSessions,
8+parseSessionsFilterInteger,
89subscribeSessions,
910syncSelectedSessionMessageSubscription,
1011type SessionsState,
@@ -70,6 +71,17 @@ describe("subscribeSessions", () => {
7071});
7172});
727374+describe("parseSessionsFilterInteger", () => {
75+it("accepts safe decimal integer filters only", () => {
76+expect(parseSessionsFilterInteger("120")).toBe(120);
77+expect(parseSessionsFilterInteger(" 50 ")).toBe(50);
78+expect(parseSessionsFilterInteger("1e3")).toBe(0);
79+expect(parseSessionsFilterInteger("0x1000")).toBe(0);
80+expect(parseSessionsFilterInteger("1.5")).toBe(0);
81+expect(parseSessionsFilterInteger("9007199254740993")).toBe(0);
82+});
83+});
84+7385describe("syncSelectedSessionMessageSubscription", () => {
7486it("subscribes to the selected session message stream", async () => {
7587const request = vi.fn(async () => ({ key: "agent:main:main" }));
@@ -639,6 +651,63 @@ describe("loadSessions", () => {
639651});
640652});
641653654+it("ignores non-decimal and unsafe sessions filter numbers", async () => {
655+const request = vi.fn(async (method: string) => {
656+if (method !== "sessions.list") {
657+throw new Error(`unexpected method: ${method}`);
658+}
659+return {
660+ts: 1,
661+path: "(multiple)",
662+count: 0,
663+defaults: { modelProvider: null, model: null, contextTokens: null },
664+sessions: [],
665+};
666+});
667+const state = createState(request, {
668+sessionsFilterActive: "1e3",
669+sessionsFilterLimit: "9007199254740993",
670+sessionsShowArchived: false,
671+});
672+673+await loadSessions(state);
674+675+expect(request).toHaveBeenCalledWith("sessions.list", {
676+includeGlobal: true,
677+includeUnknown: true,
678+configuredAgentsOnly: true,
679+});
680+});
681+682+it("ignores unsafe numeric session filter overrides", async () => {
683+const request = vi.fn(async (method: string) => {
684+if (method !== "sessions.list") {
685+throw new Error(`unexpected method: ${method}`);
686+}
687+return {
688+ts: 1,
689+path: "(multiple)",
690+count: 0,
691+defaults: { modelProvider: null, model: null, contextTokens: null },
692+sessions: [],
693+};
694+});
695+const state = createState(request);
696+697+await loadSessions(state, {
698+activeMinutes: Number.MAX_SAFE_INTEGER + 1,
699+limit: Number.MAX_SAFE_INTEGER + 1,
700+includeGlobal: true,
701+includeUnknown: true,
702+});
703+704+expect(request).toHaveBeenCalledWith("sessions.list", {
705+includeGlobal: true,
706+includeUnknown: true,
707+configuredAgentsOnly: true,
708+});
709+});
710+642711it("forwards scoped agent refreshes to sessions.list", async () => {
643712const request = vi.fn(async (method: string) => {
644713if (method !== "sessions.list") {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。