@cef-ai/cli 2.9.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,155 +0,0 @@
1
- /**
2
- * `s3Store` against an in-process S3 that behaves like the gateway where it
3
- * matters: a list page holds at most PAGE keys, and `If-None-Match: *` on an
4
- * existing key answers 412. A plain memory map would pass a store that reads
5
- * one page or ignores the condition.
6
- */
7
- import { describe, expect, it } from "vitest";
8
- import { GetObjectCommand, ListObjectsV2Command, PutObjectCommand, } from "@aws-sdk/client-s3";
9
- import { addCase, createDataset, cutVersion, loadVersion, storeConformance } from "@cef-ai/eval";
10
- import { mintedCredentials, staticCredentials } from "./eval-auth.js";
11
- import { gatewayStore, s3Store } from "./eval-store.js";
12
- const PAGE = 3;
13
- function fakeS3(opts = {}) {
14
- const objects = new Map();
15
- const sent = [];
16
- const send = async (cmd) => {
17
- const input = cmd.input;
18
- sent.push({ name: cmd.constructor.name, input });
19
- if (cmd instanceof GetObjectCommand) {
20
- const body = objects.get(String(input.Key));
21
- if (body === undefined)
22
- throw Object.assign(new Error("NoSuchKey"), { name: "NoSuchKey" });
23
- return { Body: { transformToString: async () => body } };
24
- }
25
- if (cmd instanceof PutObjectCommand) {
26
- const key = String(input.Key);
27
- if (input.IfNoneMatch === "*") {
28
- if (opts.conditional === "501")
29
- throw Object.assign(new Error("NotImplemented"), { $metadata: { httpStatusCode: 501 } });
30
- if (objects.has(key))
31
- throw Object.assign(new Error("PreconditionFailed"), { name: "PreconditionFailed", $metadata: { httpStatusCode: 412 } });
32
- }
33
- objects.set(key, String(input.Body));
34
- return {};
35
- }
36
- if (cmd instanceof ListObjectsV2Command) {
37
- const prefix = String(input.Prefix ?? "");
38
- const keys = [...objects.keys()].filter((k) => k.startsWith(prefix)).sort();
39
- // With a delimiter, S3 rolls every key below a "/" into one CommonPrefix and pages over the mix.
40
- const entries = input.Delimiter === "/"
41
- ? [...new Set(keys.map((k) => {
42
- const slash = k.indexOf("/", prefix.length);
43
- return slash < 0 ? k : `${k.slice(0, slash + 1)}`;
44
- }))].sort()
45
- : keys;
46
- const start = input.ContinuationToken ? Number(input.ContinuationToken) : 0;
47
- const page = entries.slice(start, start + PAGE);
48
- const more = start + PAGE < entries.length;
49
- return {
50
- Contents: page.filter((k) => !k.endsWith("/") || input.Delimiter !== "/").map((Key) => ({ Key })),
51
- CommonPrefixes: input.Delimiter === "/" ? page.filter((k) => k.endsWith("/")).map((Prefix) => ({ Prefix })) : [],
52
- IsTruncated: more,
53
- ...(more ? { NextContinuationToken: String(start + PAGE) } : {}),
54
- };
55
- }
56
- throw new Error(`unexpected command ${cmd.constructor.name}`);
57
- };
58
- return { client: { send }, objects, sent };
59
- }
60
- describe("s3Store", () => {
61
- for (const check of storeConformance(async () => s3Store({ bucket: "b", client: fakeS3().client }))) {
62
- // The 1050-key paging check is slow against nothing in particular; paging is covered below.
63
- if (check.name.includes("pages past"))
64
- continue;
65
- it(check.name, check.run);
66
- }
67
- it("lists every page, under the root, with the root stripped", async () => {
68
- const s3 = fakeS3();
69
- const store = s3Store({ bucket: "b", client: s3.client, root: "team" });
70
- for (let i = 0; i < 7; i++)
71
- await store.put(`evals/k${i}`, "x");
72
- await store.put("other/z", "x");
73
- expect(await store.list("evals/")).toEqual(["evals/k0", "evals/k1", "evals/k2", "evals/k3", "evals/k4", "evals/k5", "evals/k6"]);
74
- expect([...s3.objects.keys()].every((k) => k.startsWith("team/"))).toBe(true);
75
- });
76
- it("reads an absent key as null and refuses a taken one with a conditional put", async () => {
77
- const s3 = fakeS3();
78
- const store = s3Store({ bucket: "b", client: s3.client });
79
- expect(await store.get("nope")).toBeNull();
80
- expect(await store.putIfAbsent("k", "1")).toBe(true);
81
- expect(await store.putIfAbsent("k", "2")).toBe(false);
82
- expect(await store.get("k")).toBe("1");
83
- expect(s3.sent.filter((c) => c.name === "PutObjectCommand").every((c) => c.input.IfNoneMatch === "*")).toBe(true);
84
- });
85
- it("lists child prefixes across pages, under the root, with the root stripped", async () => {
86
- const s3 = fakeS3();
87
- const store = s3Store({ bucket: "b", client: s3.client, root: "team" });
88
- for (const d of ["a", "b", "c", "d", "e"]) {
89
- await store.put(`evals/datasets/${d}/header.json`, "{}");
90
- await store.put(`evals/datasets/${d}/cases/x/r1.json`, "{}");
91
- }
92
- await store.put("evals/datasets/loose.json", "{}");
93
- expect(await store.listPrefixes("evals/datasets/")).toEqual(["a", "b", "c", "d", "e"].map((d) => `evals/datasets/${d}/`));
94
- expect(s3.sent.filter((c) => c.name === "ListObjectsV2Command").every((c) => c.input.Delimiter === "/")).toBe(true);
95
- });
96
- it("falls back to an unconditional write only on 501", async () => {
97
- const store = s3Store({ bucket: "b", client: fakeS3({ conditional: "501" }).client });
98
- expect(await store.putIfAbsent("k", "1")).toBe(true);
99
- });
100
- it("holds a dataset end to end", async () => {
101
- const store = s3Store({ bucket: "b", client: fakeS3().client });
102
- await createDataset(store, { dataset: "triage", workflowId: "wf" });
103
- for (const id of ["a", "b", "c", "d"])
104
- await addCase(store, "wf", "triage", { id, input: { id } });
105
- await cutVersion(store, "wf", "triage");
106
- expect((await loadVersion(store, "wf", "triage", 1)).cases.map((c) => c.case.id)).toEqual(["a", "b", "c", "d"]);
107
- });
108
- it("replaces a refused credential once, shared by every request it failed, and retries each", async () => {
109
- const backing = fakeS3();
110
- let n = 0;
111
- const credentials = mintedCredentials({
112
- mint: async () => ({ accessKeyId: `k${++n}`, secretAccessKey: "s", expiresAt: Date.now() + 3600_000 }),
113
- });
114
- await credentials.get();
115
- const clients = [];
116
- const store = gatewayStore({
117
- endpoint: "https://gw", bucket: "b", credentials,
118
- makeClient: (cfg) => {
119
- const send = async (cmd) => {
120
- const key = (await cfg.credentials.get()).accessKeyId;
121
- // The first credential was revoked behind our back.
122
- if (key === "k1") {
123
- // One request was already in flight on the old credential, and is refused after the renewal.
124
- if (cmd.input.Key === "slow")
125
- await new Promise((r) => setTimeout(r, 20));
126
- throw Object.assign(new Error("InvalidAccessKeyId"), { name: "InvalidAccessKeyId", $metadata: { httpStatusCode: 403 } });
127
- }
128
- return backing.client.send(cmd);
129
- };
130
- clients.push(`client${clients.length + 1}`);
131
- return { send };
132
- },
133
- });
134
- await Promise.all([store.get("slow"), store.put("a", "1"), store.put("b", "2"), store.get("a")]);
135
- expect(await store.get("a")).toBe("1");
136
- expect(await store.get("b")).toBe("2");
137
- expect(clients).toEqual(["client1", "client2"]);
138
- expect(n).toBe(2);
139
- });
140
- it("does not retry a refusal it cannot fix", async () => {
141
- let calls = 0;
142
- const store = gatewayStore({
143
- endpoint: "https://gw", bucket: "b", credentials: staticCredentials({ accessKeyId: "AK", secretAccessKey: "SK" }),
144
- makeClient: () => ({
145
- send: async () => {
146
- calls++;
147
- throw Object.assign(new Error("AccessDenied"), { name: "AccessDenied", $metadata: { httpStatusCode: 403 } });
148
- },
149
- }),
150
- });
151
- await expect(store.put("a", "1")).rejects.toThrow(/AccessDenied/);
152
- expect(calls).toBe(1);
153
- });
154
- });
155
- //# sourceMappingURL=eval-store.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eval-store.test.js","sourceRoot":"","sources":["../../src/lib/eval-store.test.ts"],"names":[],"mappings":"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"}