






















@@ -154,6 +154,106 @@ describe("sessionsCommand", () => {
154154expect(payload.sessions?.map((row) => row.key)).toEqual(["recent"]);
155155});
156156157+it("limits JSON output to the newest 100 sessions by default", async () => {
158+const entries: Record<string, { sessionId: string; updatedAt: number; model: string }> = {};
159+for (let i = 0; i < 105; i += 1) {
160+entries[`session-${String(i).padStart(3, "0")}`] = {
161+sessionId: `session-${i}`,
162+updatedAt: Date.now() - i * 60_000,
163+model: "pi:opus",
164+};
165+}
166+const store = writeStore(entries, "sessions-default-limit");
167+168+const payload = await runSessionsJson<{
169+count?: number;
170+totalCount?: number;
171+limitApplied?: number | null;
172+hasMore?: boolean;
173+sessions?: Array<{ key: string }>;
174+}>(sessionsCommand, store);
175+176+expect(payload.count).toBe(100);
177+expect(payload.totalCount).toBe(105);
178+expect(payload.limitApplied).toBe(100);
179+expect(payload.hasMore).toBe(true);
180+expect(payload.sessions?.at(0)?.key).toBe("session-000");
181+expect(payload.sessions?.some((row) => row.key === "session-104")).toBe(false);
182+});
183+184+it("honors explicit JSON output limits", async () => {
185+const store = writeStore(
186+{
187+newest: { sessionId: "newest", updatedAt: Date.now(), model: "pi:opus" },
188+middle: { sessionId: "middle", updatedAt: Date.now() - 60_000, model: "pi:opus" },
189+oldest: { sessionId: "oldest", updatedAt: Date.now() - 120_000, model: "pi:opus" },
190+},
191+"sessions-explicit-limit",
192+);
193+194+const payload = await runSessionsJson<{
195+count?: number;
196+totalCount?: number;
197+limitApplied?: number | null;
198+hasMore?: boolean;
199+sessions?: Array<{ key: string }>;
200+}>(sessionsCommand, store, { limit: "2" });
201+202+expect(payload.count).toBe(2);
203+expect(payload.totalCount).toBe(3);
204+expect(payload.limitApplied).toBe(2);
205+expect(payload.hasMore).toBe(true);
206+expect(payload.sessions?.map((row) => row.key)).toEqual(["newest", "middle"]);
207+});
208+209+it("allows full JSON output with --limit all", async () => {
210+const store = writeStore(
211+{
212+newest: { sessionId: "newest", updatedAt: Date.now(), model: "pi:opus" },
213+oldest: { sessionId: "oldest", updatedAt: Date.now() - 120_000, model: "pi:opus" },
214+},
215+"sessions-limit-all",
216+);
217+218+const payload = await runSessionsJson<{
219+count?: number;
220+totalCount?: number;
221+limitApplied?: number | null;
222+hasMore?: boolean;
223+sessions?: Array<{ key: string }>;
224+}>(sessionsCommand, store, { limit: "all" });
225+226+expect(payload.count).toBe(2);
227+expect(payload.totalCount).toBe(2);
228+expect(payload.limitApplied).toBeNull();
229+expect(payload.hasMore).toBe(false);
230+expect(payload.sessions?.map((row) => row.key)).toEqual(["newest", "oldest"]);
231+});
232+233+it("sorts and slices large explicit limits instead of using top-N insertion", async () => {
234+const store = writeStore(
235+{
236+newest: { sessionId: "newest", updatedAt: Date.now(), model: "pi:opus" },
237+oldest: { sessionId: "oldest", updatedAt: Date.now() - 120_000, model: "pi:opus" },
238+},
239+"sessions-large-limit",
240+);
241+242+const payload = await runSessionsJson<{
243+count?: number;
244+totalCount?: number;
245+limitApplied?: number | null;
246+hasMore?: boolean;
247+sessions?: Array<{ key: string }>;
248+}>(sessionsCommand, store, { limit: "100000" });
249+250+expect(payload.count).toBe(2);
251+expect(payload.totalCount).toBe(2);
252+expect(payload.limitApplied).toBe(100000);
253+expect(payload.hasMore).toBe(false);
254+expect(payload.sessions?.map((row) => row.key)).toEqual(["newest", "oldest"]);
255+});
256+157257it("rejects invalid --active values", async () => {
158258const store = writeStore(
159259{
@@ -171,4 +271,22 @@ describe("sessionsCommand", () => {
171271172272fs.rmSync(store);
173273});
274+275+it("rejects invalid --limit values", async () => {
276+const store = writeStore(
277+{
278+demo: {
279+sessionId: "demo",
280+updatedAt: Date.now() - 5 * 60_000,
281+},
282+},
283+"sessions-limit-invalid",
284+);
285+const { runtime, errors } = makeRuntime();
286+287+await expect(sessionsCommand({ store, limit: "0" }, runtime)).rejects.toThrow("exit 1");
288+expect(errors[0]).toContain('--limit must be a positive integer or "all"');
289+290+fs.rmSync(store);
291+});
174292});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。