@cef-ai/cli 2.7.6 → 2.8.1

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.
Files changed (62) hide show
  1. package/README.md +15 -0
  2. package/dist/cli-program.d.ts +2 -0
  3. package/dist/cli-program.d.ts.map +1 -1
  4. package/dist/cli-program.js +17 -0
  5. package/dist/cli-program.js.map +1 -1
  6. package/dist/commands/cubby.d.ts +7 -0
  7. package/dist/commands/cubby.d.ts.map +1 -1
  8. package/dist/commands/cubby.js +8 -4
  9. package/dist/commands/cubby.js.map +1 -1
  10. package/dist/commands/eval.d.ts +217 -0
  11. package/dist/commands/eval.d.ts.map +1 -0
  12. package/dist/commands/eval.js +860 -0
  13. package/dist/commands/eval.js.map +1 -0
  14. package/dist/commands/eval.test.d.ts +2 -0
  15. package/dist/commands/eval.test.d.ts.map +1 -0
  16. package/dist/commands/eval.test.js +474 -0
  17. package/dist/commands/eval.test.js.map +1 -0
  18. package/dist/commands/push.d.ts +23 -0
  19. package/dist/commands/push.d.ts.map +1 -1
  20. package/dist/commands/push.js +70 -1
  21. package/dist/commands/push.js.map +1 -1
  22. package/dist/lib/access-token.d.ts +33 -0
  23. package/dist/lib/access-token.d.ts.map +1 -1
  24. package/dist/lib/access-token.js +89 -20
  25. package/dist/lib/access-token.js.map +1 -1
  26. package/dist/lib/bucket-owner.d.ts +45 -0
  27. package/dist/lib/bucket-owner.d.ts.map +1 -0
  28. package/dist/lib/bucket-owner.js +107 -0
  29. package/dist/lib/bucket-owner.js.map +1 -0
  30. package/dist/lib/ddc.d.ts +22 -0
  31. package/dist/lib/ddc.d.ts.map +1 -1
  32. package/dist/lib/ddc.js +72 -20
  33. package/dist/lib/ddc.js.map +1 -1
  34. package/dist/lib/eval-auth.d.ts +139 -0
  35. package/dist/lib/eval-auth.d.ts.map +1 -0
  36. package/dist/lib/eval-auth.js +385 -0
  37. package/dist/lib/eval-auth.js.map +1 -0
  38. package/dist/lib/eval-auth.test.d.ts +2 -0
  39. package/dist/lib/eval-auth.test.d.ts.map +1 -0
  40. package/dist/lib/eval-auth.test.js +192 -0
  41. package/dist/lib/eval-auth.test.js.map +1 -0
  42. package/dist/lib/eval-store.d.ts +62 -0
  43. package/dist/lib/eval-store.d.ts.map +1 -0
  44. package/dist/lib/eval-store.js +334 -0
  45. package/dist/lib/eval-store.js.map +1 -0
  46. package/dist/lib/eval-store.test.d.ts +2 -0
  47. package/dist/lib/eval-store.test.d.ts.map +1 -0
  48. package/dist/lib/eval-store.test.js +155 -0
  49. package/dist/lib/eval-store.test.js.map +1 -0
  50. package/dist/lib/eval-target.d.ts +122 -0
  51. package/dist/lib/eval-target.d.ts.map +1 -0
  52. package/dist/lib/eval-target.js +320 -0
  53. package/dist/lib/eval-target.js.map +1 -0
  54. package/dist/lib/eval-target.test.d.ts +2 -0
  55. package/dist/lib/eval-target.test.d.ts.map +1 -0
  56. package/dist/lib/eval-target.test.js +209 -0
  57. package/dist/lib/eval-target.test.js.map +1 -0
  58. package/dist/lib/eval-workflow.d.ts +24 -0
  59. package/dist/lib/eval-workflow.d.ts.map +1 -0
  60. package/dist/lib/eval-workflow.js +91 -0
  61. package/dist/lib/eval-workflow.js.map +1 -0
  62. package/package.json +8 -4
@@ -0,0 +1,385 @@
1
+ /**
2
+ * Credentials for `cef eval`.
3
+ *
4
+ * THE STORE is the agent service's bucket on the DDC S3 gateway
5
+ * (`as-<first 60 hex of the AS pubkey>`, the bucket ROC uses), reached with a
6
+ * short-lived S3 credential minted for the owner's wallet: a DDC delegation
7
+ * token naming the gateway as subject, signed by the wallet, registered at
8
+ * `POST /auth/credentials`. The same mint ROC does in the browser. Explicit
9
+ * credentials (`--access-key` / `--secret` / `--bucket`) skip it.
10
+ *
11
+ * THE WALLET comes from a keystore JSON (`--keystore` + `--password`, the
12
+ * export of a Cere wallet) or a secret phrase (`--secret-phrase`). Both are
13
+ * ed25519; the same key signs vault-api requests (publishing `workflow.start`,
14
+ * reading the run's events).
15
+ *
16
+ * THE DDC ACCESS TOKEN `cef push` uses (`$CEF_DDC_ACCESS_TOKEN`, minted in
17
+ * ROC's Access tab) CANNOT OPEN THE STORE, and no CLI-side delegation fixes
18
+ * that — see {@link ddcTokenCannotOpenStore} for the three reasons. A person
19
+ * who has only that token is told so, and what to use instead, rather than
20
+ * being asked for a wallet they may not have.
21
+ *
22
+ * THE ORCHESTRATOR (deployments, jobs) takes the CLI access token
23
+ * (`--access-token` / `$CEF_ACCESS_TOKEN`), as `cef deploy` does.
24
+ *
25
+ * A MINTED CREDENTIAL LIVES ONE HOUR, and a run can take longer. It is served
26
+ * through a {@link CredentialSource}: re-minted before it expires (the S3
27
+ * client asks again inside its own refresh window), re-minted once when the
28
+ * gateway refuses it anyway (403), and kept in a 0600 file cache so the next
29
+ * command reuses it instead of minting another — the gateway caps live
30
+ * credentials per wallet, and one per command reaches that cap quickly.
31
+ */
32
+ import { chmod, mkdir, open, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
33
+ import os from "node:os";
34
+ import path from "node:path";
35
+ import { CredentialLimitError, registerCredential } from "@cef-ai/account";
36
+ import { inspectAccessTokenScope, ss58Address } from "./access-token.js";
37
+ import { envConfig } from "./env.js";
38
+ async function ddcSdk() {
39
+ try {
40
+ return (await import("@cere-ddc-sdk/ddc-client"));
41
+ }
42
+ catch {
43
+ throw new Error("[cef eval] signing with a wallet needs the optional dependency @cere-ddc-sdk/ddc-client; install it, "
44
+ + "or pass explicit gateway credentials (--access-key/--secret/--bucket)");
45
+ }
46
+ }
47
+ /** The wallet from options, then `$CEF_KEYSTORE`/`$CEF_KEYSTORE_PASSWORD`, then `$CEF_SECRET_PHRASE`; undefined when none. */
48
+ export async function loadWallet(opts) {
49
+ const keystore = opts.keystore ?? process.env.CEF_KEYSTORE;
50
+ const phrase = (opts.secretPhrase ?? process.env.CEF_SECRET_PHRASE ?? "").trim();
51
+ if (keystore && phrase) {
52
+ throw new Error("[cef eval] give a keystore or a secret phrase, not both — they may be different identities");
53
+ }
54
+ if (keystore) {
55
+ const password = opts.password ?? process.env.CEF_KEYSTORE_PASSWORD ?? "";
56
+ const file = keystore.startsWith("~") ? path.join(os.homedir(), keystore.slice(1)) : path.resolve(keystore);
57
+ const json = JSON.parse(await readFile(file, "utf8"));
58
+ const content = json.encoding?.content ?? [];
59
+ if (!content.includes("ed25519")) {
60
+ throw new Error(`[cef eval] ${keystore} is not an ed25519 keystore (encoding.content: ${content.join(", ") || "unknown"})`);
61
+ }
62
+ const { JsonSigner } = await ddcSdk();
63
+ const signer = new JsonSigner(json, { passphrase: password });
64
+ await signer.isReady();
65
+ return signer;
66
+ }
67
+ if (phrase) {
68
+ const { UriSigner } = await ddcSdk();
69
+ const signer = new UriSigner(phrase, { type: "ed25519" });
70
+ await signer.isReady();
71
+ return signer;
72
+ }
73
+ return undefined;
74
+ }
75
+ /** The AS bucket on the S3 gateway, as ROC derives it. */
76
+ export function deriveAsBucketName(asPubKey) {
77
+ const hex = asPubKey.replace(/^0x/i, "").toLowerCase().replace(/[^0-9a-f]/g, "");
78
+ return `as-${hex.slice(0, 60)}`;
79
+ }
80
+ /** The gateway base URL: the env's auth-info URL minus `/auth/info`. */
81
+ export function gatewayBaseUrl(env) {
82
+ return envConfig(env).s3GatewayAuthInfo.replace(/\/auth\/info\/?$/, "");
83
+ }
84
+ export const CREDENTIAL_TTL_SECONDS = 3600;
85
+ /** A credential with less than this left is replaced before use. More than the S3 client's own 5 min refresh window. */
86
+ export const CREDENTIAL_REFRESH_MARGIN_MS = 10 * 60_000;
87
+ /** Explicit keys: served as given, never replaced. */
88
+ export function staticCredentials(c) {
89
+ return { get: async () => c, invalidate: async () => false };
90
+ }
91
+ /**
92
+ * Minted on demand: reused while it has more than `refreshMarginMs` left,
93
+ * replaced (from the cache if another command already minted a fresh one,
94
+ * else by minting) once it does not. Concurrent callers share one mint.
95
+ */
96
+ export function mintedCredentials(opts) {
97
+ const now = opts.now ?? Date.now;
98
+ const margin = opts.refreshMarginMs ?? CREDENTIAL_REFRESH_MARGIN_MS;
99
+ const fresh = (c) => !!c && (c.expiresAt === undefined || c.expiresAt - now() > margin);
100
+ let current;
101
+ let pending;
102
+ const replace = async () => {
103
+ const cached = await opts.cache?.read().catch(() => undefined);
104
+ if (fresh(cached))
105
+ return cached;
106
+ const minted = await opts.mint();
107
+ await opts.cache?.write(minted).catch(() => { });
108
+ return minted;
109
+ };
110
+ return {
111
+ async get() {
112
+ if (fresh(current))
113
+ return current;
114
+ pending ??= replace().then((c) => {
115
+ current = c;
116
+ pending = undefined;
117
+ return c;
118
+ }, (e) => {
119
+ pending = undefined;
120
+ throw e;
121
+ });
122
+ return pending;
123
+ },
124
+ async invalidate() {
125
+ const dropped = current;
126
+ current = undefined;
127
+ if (dropped)
128
+ await opts.cache?.clear(dropped.accessKeyId).catch(() => { });
129
+ return true;
130
+ },
131
+ };
132
+ }
133
+ /** The default cache file: `$CEF_EVAL_CREDENTIAL_CACHE`, else `~/.cef/eval-credentials.json`; `off` disables. */
134
+ export function defaultCredentialCacheFile() {
135
+ const env = process.env.CEF_EVAL_CREDENTIAL_CACHE;
136
+ if (env === "off" || env === "0" || env === "false")
137
+ return undefined;
138
+ return env || path.join(os.homedir(), ".cef", "eval-credentials.json");
139
+ }
140
+ /** How long a cache update waits for another process's lock before going ahead without it. */
141
+ export const CREDENTIAL_CACHE_LOCK_WAIT_MS = 2000;
142
+ /** A lock older than this was left by a process that died holding it. */
143
+ const CREDENTIAL_CACHE_LOCK_STALE_MS = 10_000;
144
+ /**
145
+ * Hold `<file>.lock` (created exclusively) while `fn` runs. A lock older than
146
+ * the stale limit is taken over; one still held after the wait is ignored —
147
+ * the cache only saves mints, so a rare lost entry beats a stuck command.
148
+ */
149
+ async function withFileLock(file, fn) {
150
+ const lock = `${file}.lock`;
151
+ const deadline = Date.now() + CREDENTIAL_CACHE_LOCK_WAIT_MS;
152
+ let held = false;
153
+ while (!held) {
154
+ try {
155
+ await (await open(lock, "wx", 0o600)).close();
156
+ held = true;
157
+ }
158
+ catch (e) {
159
+ if (e.code !== "EEXIST")
160
+ break;
161
+ const age = await stat(lock).then((st) => Date.now() - st.mtimeMs, () => 0);
162
+ if (age > CREDENTIAL_CACHE_LOCK_STALE_MS)
163
+ await rm(lock, { force: true });
164
+ else if (Date.now() >= deadline)
165
+ break;
166
+ else
167
+ await new Promise((r) => setTimeout(r, 5 + Math.random() * 20));
168
+ }
169
+ }
170
+ try {
171
+ return await fn();
172
+ }
173
+ finally {
174
+ if (held)
175
+ await rm(lock, { force: true });
176
+ }
177
+ }
178
+ /**
179
+ * A JSON file of credentials keyed by `key` (gateway + wallet), readable by
180
+ * its owner only. Each entry holds a secret that expires within the hour.
181
+ *
182
+ * SHARED BY CONCURRENT COMMANDS. Every change is a read-modify-write of the
183
+ * whole file, so two `cef eval` processes writing at once would each drop the
184
+ * other's entry — and a dropped entry means another mint, against a gateway
185
+ * that caps live credentials per wallet. Each change therefore re-reads and
186
+ * merges under an exclusive `<file>.lock`, and replaces the file by renaming a
187
+ * fully written temp file, so a reader never sees half a file.
188
+ */
189
+ export function fileCredentialCache(file, key) {
190
+ const readAll = async () => {
191
+ try {
192
+ const raw = JSON.parse(await readFile(file, "utf8"));
193
+ return raw && typeof raw === "object" && !Array.isArray(raw) ? raw : {};
194
+ }
195
+ catch {
196
+ return {};
197
+ }
198
+ };
199
+ const update = async (change) => {
200
+ await mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
201
+ await withFileLock(file, async () => {
202
+ const all = await readAll();
203
+ if (!change(all))
204
+ return;
205
+ const tmp = `${file}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
206
+ await writeFile(tmp, JSON.stringify(all, null, 2) + "\n", { mode: 0o600 });
207
+ await chmod(tmp, 0o600);
208
+ await rename(tmp, file);
209
+ });
210
+ };
211
+ return {
212
+ async read() {
213
+ const c = (await readAll())[key];
214
+ return c && typeof c.accessKeyId === "string" && typeof c.secretAccessKey === "string" ? c : undefined;
215
+ },
216
+ async write(c) {
217
+ await update((all) => {
218
+ const t = Date.now();
219
+ // Drop expired entries while here, so the file does not collect dead secrets.
220
+ for (const [k, v] of Object.entries(all))
221
+ if (typeof v.expiresAt === "number" && v.expiresAt <= t)
222
+ delete all[k];
223
+ all[key] = c;
224
+ return true;
225
+ });
226
+ },
227
+ async clear(accessKeyId) {
228
+ await update((all) => {
229
+ if (all[key]?.accessKeyId !== accessKeyId)
230
+ return false;
231
+ delete all[key];
232
+ return true;
233
+ });
234
+ },
235
+ };
236
+ }
237
+ /** Mint a short-lived S3 credential for the wallet, as ROC does in the browser. */
238
+ export async function mintGatewayCredentials(opts) {
239
+ const fetchImpl = opts.fetchImpl ?? fetch;
240
+ const endpoint = (opts.endpoint ?? gatewayBaseUrl(opts.env)).replace(/\/+$/, "");
241
+ const res = await fetchImpl(`${endpoint}/auth/info`);
242
+ if (!res.ok)
243
+ throw new Error(`[cef eval] ${endpoint}/auth/info answered ${res.status}`);
244
+ const info = (await res.json());
245
+ if (!info.gateway_public_key)
246
+ throw new Error(`[cef eval] ${endpoint}/auth/info named no gateway_public_key`);
247
+ const gatewayKey = info.gateway_public_key.replace(/^0x/i, "");
248
+ const subject = ss58Address(Uint8Array.from(gatewayKey.match(/../g).map((h) => Number.parseInt(h, 16))));
249
+ const { AuthToken } = await ddcSdk();
250
+ const token = AuthToken.fullAccess({ subject, canDelegate: true });
251
+ await token.sign(opts.signer);
252
+ const mintedAt = Date.now();
253
+ let cred;
254
+ try {
255
+ cred = await registerCredential({
256
+ gatewayUrl: endpoint,
257
+ signer: opts.signer,
258
+ delegationToken: token.toString(),
259
+ label: "cef-eval",
260
+ expiresInSeconds: CREDENTIAL_TTL_SECONDS,
261
+ fetchFn: fetchImpl,
262
+ });
263
+ }
264
+ catch (e) {
265
+ if (e instanceof CredentialLimitError) {
266
+ throw new Error(`[cef eval] the wallet ${opts.signer.address} already holds as many live S3 credentials as the gateway allows `
267
+ + `(${endpoint}). \`cef eval\` reuses its own for an hour (~/.cef/eval-credentials.json), but ROC and other `
268
+ + "tools mint theirs. Wait for older ones to expire, revoke unused ones, or pass explicit --access-key/--secret.", { cause: e });
269
+ }
270
+ throw e;
271
+ }
272
+ const expiresAt = cred.expiresAt ? Date.parse(cred.expiresAt) : NaN;
273
+ return {
274
+ endpoint,
275
+ bucket: deriveAsBucketName(opts.asPubKey),
276
+ accessKeyId: cred.accessKeyId,
277
+ secretAccessKey: cred.secretAccessKey,
278
+ ...(cred.region || info.region ? { region: cred.region || info.region } : {}),
279
+ expiresAt: Number.isFinite(expiresAt) ? expiresAt : mintedAt + CREDENTIAL_TTL_SECONDS * 1000,
280
+ };
281
+ }
282
+ /**
283
+ * Why `cef push`'s DDC access token cannot be turned into an S3 credential,
284
+ * as an error that says what to use instead.
285
+ *
286
+ * The gateway serves an object by minting a DDC token whose `prev` is the
287
+ * delegation token the credential was registered with, scoped to the S3
288
+ * bucket's own DDC bucket. For a ROC-minted registry token that chain cannot
289
+ * verify, for three independent reasons:
290
+ *
291
+ * 1. BUCKET. The token is limited to the agent service's registry bucket
292
+ * (`CEF_BUCKET`); datasets live in the gateway bucket `as-<pubkey>`, which
293
+ * the gateway created as a separate DDC bucket. A chain whose hops name
294
+ * different buckets is refused (the gateway's own 403 says "re-register
295
+ * with a wallet-wide token").
296
+ * 2. NO SUBJECT, NO DELEGATION. It is a bearer token (`canDelegate` false,
297
+ * no subject); the gateway's hop must be signed by the previous hop's
298
+ * subject, and the gateway's key is not it.
299
+ * 3. WHO REGISTERS. `POST /auth/credentials` files the credential under the
300
+ * key that signs the request; only the owner's key yields an owner
301
+ * credential, and `/auth/credentials/delegated` takes only an on-chain
302
+ * proxy of the owner.
303
+ */
304
+ export function ddcTokenCannotOpenStore(token, bucket) {
305
+ let scope = "";
306
+ try {
307
+ const s = inspectAccessTokenScope(token);
308
+ const parts = [
309
+ s.bucketId !== undefined ? `limited to DDC bucket ${s.bucketId}` : "",
310
+ s.subject ? "" : "names no subject",
311
+ s.canDelegate ? "" : "cannot be delegated",
312
+ ].filter(Boolean);
313
+ if (parts.length > 0)
314
+ scope = ` (this one is ${parts.join(", ")})`;
315
+ }
316
+ catch {
317
+ // Not a readable token: the generic explanation still holds.
318
+ }
319
+ return new Error("[cef eval] $CEF_DDC_ACCESS_TOKEN authorizes `cef push` to the agent service's registry bucket, but it cannot "
320
+ + `open dataset storage${scope}: datasets live in the S3 gateway bucket ${bucket}, a different DDC bucket, `
321
+ + "and the gateway issues S3 credentials only for a key that signs the request and roots the delegation. "
322
+ + "Use an S3 access key/secret issued for the owner's wallet (--access-key/--secret, or "
323
+ + "$CEF_EVAL_KEY/$CEF_EVAL_SECRET), or the owner's wallet itself (--keystore/--password or --secret-phrase).");
324
+ }
325
+ /**
326
+ * Gateway access, in this order:
327
+ *
328
+ * 1. explicit keys (`--access-key`/`--secret`, `$CEF_EVAL_KEY`/`$CEF_EVAL_SECRET`);
329
+ * 2. a wallet (`--keystore`/`--secret-phrase` or their env vars): credentials
330
+ * minted on demand, cached across commands, refreshed before they expire;
331
+ * 3. `$CEF_DDC_ACCESS_TOKEN` alone: refused, saying why and what to use —
332
+ * it cannot mint (see {@link ddcTokenCannotOpenStore}), so it is checked
333
+ * only when nothing that can is present.
334
+ */
335
+ export async function resolveGatewayAccess(opts, wallet, deps = {}) {
336
+ const accessKeyId = opts.accessKey ?? process.env.CEF_EVAL_KEY;
337
+ const secretAccessKey = opts.secret ?? process.env.CEF_EVAL_SECRET;
338
+ const endpoint = (opts.endpoint ?? process.env.CEF_EVAL_ENDPOINT ?? gatewayBaseUrl(opts.env)).replace(/\/+$/, "");
339
+ const asPubKey = opts.asPubkey ?? process.env.CEF_AS_PUBKEY;
340
+ const bucket = opts.bucket ?? process.env.CEF_EVAL_BUCKET ?? (asPubKey ? deriveAsBucketName(asPubKey) : undefined);
341
+ // Half a pair is a mistake, not a request for the wallet path: say which half is missing.
342
+ if (!!accessKeyId !== !!secretAccessKey) {
343
+ const given = accessKeyId
344
+ ? (opts.accessKey !== undefined ? "--access-key" : "$CEF_EVAL_KEY")
345
+ : (opts.secret !== undefined ? "--secret" : "$CEF_EVAL_SECRET");
346
+ const missing = accessKeyId ? "--secret (or $CEF_EVAL_SECRET)" : "--access-key (or $CEF_EVAL_KEY)";
347
+ throw new Error(`[cef eval] ${given} is set but ${missing} is not — explicit gateway credentials need both`);
348
+ }
349
+ if (accessKeyId && secretAccessKey) {
350
+ if (!bucket)
351
+ throw new Error("[cef eval] explicit gateway credentials need --bucket or --as-pubkey");
352
+ return {
353
+ endpoint,
354
+ bucket,
355
+ ...(opts.region ? { region: opts.region } : {}),
356
+ credentials: staticCredentials({ accessKeyId, secretAccessKey, ...(opts.region ? { region: opts.region } : {}) }),
357
+ };
358
+ }
359
+ if (!asPubKey || !bucket)
360
+ throw new Error("[cef eval] --as-pubkey (or $CEF_AS_PUBKEY) is required — it names the bucket");
361
+ const signer = wallet ?? (await loadWallet(opts));
362
+ if (!signer) {
363
+ const ddcToken = (process.env.CEF_DDC_ACCESS_TOKEN ?? "").trim();
364
+ if (ddcToken)
365
+ throw ddcTokenCannotOpenStore(ddcToken, bucket);
366
+ throw new Error("[cef eval] no credential for the S3 gateway — pass --keystore/--password or --secret-phrase "
367
+ + "(the agent service owner's wallet), or explicit --access-key/--secret");
368
+ }
369
+ const mint = deps.mint ?? mintGatewayCredentials;
370
+ const cacheFile = deps.cacheFile === undefined ? defaultCredentialCacheFile() : deps.cacheFile ?? undefined;
371
+ const credentials = mintedCredentials({
372
+ mint: async () => {
373
+ const m = await mint({ env: opts.env, endpoint, asPubKey, signer });
374
+ return {
375
+ accessKeyId: m.accessKeyId, secretAccessKey: m.secretAccessKey,
376
+ ...(m.region ? { region: m.region } : {}), ...(m.expiresAt !== undefined ? { expiresAt: m.expiresAt } : {}),
377
+ };
378
+ },
379
+ ...(cacheFile ? { cache: fileCredentialCache(cacheFile, `${endpoint}|${signer.address}`) } : {}),
380
+ });
381
+ // Mint (or load) now, so a missing wallet permission fails before any work starts.
382
+ const first = await credentials.get();
383
+ return { endpoint, bucket, ...(first.region ? { region: first.region } : {}), credentials };
384
+ }
385
+ //# sourceMappingURL=eval-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-auth.js","sourceRoot":"","sources":["../../src/lib/eval-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=eval-auth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-auth.test.d.ts","sourceRoot":"","sources":["../../src/lib/eval-auth.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,192 @@
1
+ import { mkdtemp, readdir, readFile, rm, stat } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+ import { CREDENTIAL_REFRESH_MARGIN_MS, ddcTokenCannotOpenStore, fileCredentialCache, mintGatewayCredentials, mintedCredentials, resolveGatewayAccess, } from "./eval-auth.js";
6
+ let dir;
7
+ beforeEach(async () => {
8
+ dir = await mkdtemp(path.join(os.tmpdir(), "cef-eval-auth-"));
9
+ });
10
+ afterEach(async () => {
11
+ await rm(dir, { recursive: true, force: true });
12
+ });
13
+ const HOUR = 3600_000;
14
+ /** A mint that hands out `k1`, `k2`, … each valid for an hour from `now()`. */
15
+ function minter(now) {
16
+ let n = 0;
17
+ const mint = async () => {
18
+ n++;
19
+ return { accessKeyId: `k${n}`, secretAccessKey: `s${n}`, expiresAt: now() + HOUR };
20
+ };
21
+ return { mint, count: () => n };
22
+ }
23
+ describe("a minted credential", () => {
24
+ it("is reused while it has time left, and replaced before it expires", async () => {
25
+ let t = 0;
26
+ const m = minter(() => t);
27
+ const source = mintedCredentials({ mint: m.mint, now: () => t });
28
+ expect((await source.get()).accessKeyId).toBe("k1");
29
+ t = HOUR - CREDENTIAL_REFRESH_MARGIN_MS - 1;
30
+ expect((await source.get()).accessKeyId).toBe("k1");
31
+ // Inside the margin: a long run must not carry it to the gateway's 403.
32
+ t = HOUR - CREDENTIAL_REFRESH_MARGIN_MS + 1;
33
+ expect((await source.get()).accessKeyId).toBe("k2");
34
+ expect(m.count()).toBe(2);
35
+ });
36
+ it("is minted once for callers asking at the same time", async () => {
37
+ const m = minter(() => 0);
38
+ const source = mintedCredentials({ mint: m.mint, now: () => 0 });
39
+ const got = await Promise.all([source.get(), source.get(), source.get()]);
40
+ expect(got.map((c) => c.accessKeyId)).toEqual(["k1", "k1", "k1"]);
41
+ expect(m.count()).toBe(1);
42
+ });
43
+ it("is replaced after the gateway refused it", async () => {
44
+ const m = minter(() => 0);
45
+ const source = mintedCredentials({ mint: m.mint, now: () => 0 });
46
+ await source.get();
47
+ expect(await source.invalidate()).toBe(true);
48
+ expect((await source.get()).accessKeyId).toBe("k2");
49
+ });
50
+ it("is shared between commands through an owner-only cache file", async () => {
51
+ const file = path.join(dir, "nested", "creds.json");
52
+ const t = Date.now();
53
+ const m = minter(() => t);
54
+ const first = mintedCredentials({ mint: m.mint, now: () => t, cache: fileCredentialCache(file, "gw|alice") });
55
+ expect((await first.get()).accessKeyId).toBe("k1");
56
+ // A second command: same gateway and wallet, no new mint.
57
+ const second = mintedCredentials({ mint: m.mint, now: () => t, cache: fileCredentialCache(file, "gw|alice") });
58
+ expect((await second.get()).accessKeyId).toBe("k1");
59
+ expect(m.count()).toBe(1);
60
+ // Another wallet does not get alice's.
61
+ const other = mintedCredentials({ mint: m.mint, now: () => t, cache: fileCredentialCache(file, "gw|bob") });
62
+ expect((await other.get()).accessKeyId).toBe("k2");
63
+ expect((await stat(file)).mode & 0o777).toBe(0o600);
64
+ // A refused credential leaves the cache, so the next command does not pick it up again.
65
+ await second.invalidate();
66
+ expect(Object.keys(JSON.parse(await readFile(file, "utf8")))).toEqual(["gw|bob"]);
67
+ });
68
+ it("keeps every entry when several commands write the cache at once", async () => {
69
+ const file = path.join(dir, "creds.json");
70
+ const expiresAt = Date.now() + HOUR;
71
+ const wallets = Array.from({ length: 8 }, (_, i) => `gw|w${i}`);
72
+ // Each write is a read-modify-write of the whole file; unserialised, they drop each other's entries.
73
+ await Promise.all(wallets.map((k) => fileCredentialCache(file, k).write({ accessKeyId: k, secretAccessKey: "s", expiresAt })));
74
+ expect(Object.keys(JSON.parse(await readFile(file, "utf8"))).sort()).toEqual(wallets);
75
+ expect((await stat(file)).mode & 0o777).toBe(0o600);
76
+ expect((await readdir(dir)).sort()).toEqual(["creds.json"]);
77
+ });
78
+ it("is not reused from the cache when it is about to expire", async () => {
79
+ const file = path.join(dir, "creds.json");
80
+ let t = Date.now();
81
+ const m = minter(() => t);
82
+ await mintedCredentials({ mint: m.mint, now: () => t, cache: fileCredentialCache(file, "k") }).get();
83
+ t += HOUR - CREDENTIAL_REFRESH_MARGIN_MS + 1;
84
+ expect((await mintedCredentials({ mint: m.mint, now: () => t, cache: fileCredentialCache(file, "k") }).get()).accessKeyId).toBe("k2");
85
+ });
86
+ });
87
+ describe("resolving gateway access", () => {
88
+ const signer = { address: "5Alice" };
89
+ it("mints through the source and keeps the bucket the AS pubkey names", async () => {
90
+ let n = 0;
91
+ const access = await resolveGatewayAccess({ asPubkey: `0x${"ab".repeat(32)}`, endpoint: "https://gw.example/" }, signer, {
92
+ cacheFile: null,
93
+ mint: async () => ({ endpoint: "x", bucket: "x", accessKeyId: `k${++n}`, secretAccessKey: "s", expiresAt: Date.now() + HOUR }),
94
+ });
95
+ expect(access).toMatchObject({ endpoint: "https://gw.example", bucket: `as-${"ab".repeat(30)}` });
96
+ expect((await access.credentials.get()).accessKeyId).toBe("k1");
97
+ expect(n).toBe(1);
98
+ });
99
+ it("serves explicit keys as given, and cannot replace them", async () => {
100
+ const access = await resolveGatewayAccess({ accessKey: "AK", secret: "SK", bucket: "b", endpoint: "https://gw" });
101
+ expect(await access.credentials.get()).toEqual({ accessKeyId: "AK", secretAccessKey: "SK" });
102
+ expect(await access.credentials.invalidate()).toBe(false);
103
+ });
104
+ it.each([
105
+ [{ accessKey: "AK" }, /--access-key is set but --secret \(or \$CEF_EVAL_SECRET\) is not/],
106
+ [{ secret: "SK" }, /--secret is set but --access-key \(or \$CEF_EVAL_KEY\) is not/],
107
+ ])("refuses half of an explicit key pair instead of falling through to the wallet (%o)", async (half, error) => {
108
+ const saved = { key: process.env.CEF_EVAL_KEY, secret: process.env.CEF_EVAL_SECRET };
109
+ delete process.env.CEF_EVAL_KEY;
110
+ delete process.env.CEF_EVAL_SECRET;
111
+ try {
112
+ // A wallet is present, so without the check this would quietly mint and ignore the flag.
113
+ await expect(resolveGatewayAccess({ asPubkey: `0x${"ab".repeat(32)}`, endpoint: "https://gw", ...half }, signer, {
114
+ cacheFile: null,
115
+ mint: async () => ({ endpoint: "x", bucket: "x", accessKeyId: "minted", secretAccessKey: "s", expiresAt: Date.now() + HOUR }),
116
+ })).rejects.toThrow(error);
117
+ }
118
+ finally {
119
+ if (saved.key !== undefined)
120
+ process.env.CEF_EVAL_KEY = saved.key;
121
+ if (saved.secret !== undefined)
122
+ process.env.CEF_EVAL_SECRET = saved.secret;
123
+ }
124
+ });
125
+ });
126
+ describe("choosing a credential when $CEF_DDC_ACCESS_TOKEN is set", () => {
127
+ const ENV = ["CEF_DDC_ACCESS_TOKEN", "CEF_KEYSTORE", "CEF_SECRET_PHRASE", "CEF_EVAL_KEY", "CEF_EVAL_SECRET"];
128
+ const saved = {};
129
+ let registryToken = "";
130
+ beforeEach(async () => {
131
+ for (const k of ENV) {
132
+ saved[k] = process.env[k];
133
+ delete process.env[k];
134
+ }
135
+ // What ROC's Access tab mints for `cef push`: full access, one bucket, no subject.
136
+ const ddc = (await import("@cere-ddc-sdk/ddc-client"));
137
+ const owner = new ddc.UriSigner("//cef-eval-test-owner");
138
+ await owner.isReady();
139
+ registryToken = (await ddc.AuthToken.fullAccess({ bucketId: 4044n }).sign(owner)).toString();
140
+ process.env.CEF_DDC_ACCESS_TOKEN = registryToken;
141
+ });
142
+ afterEach(() => {
143
+ for (const k of ENV) {
144
+ if (saved[k] === undefined)
145
+ delete process.env[k];
146
+ else
147
+ process.env[k] = saved[k];
148
+ }
149
+ });
150
+ const AS = `0x${"cd".repeat(32)}`;
151
+ const neverMint = async () => { throw new Error("must not mint"); };
152
+ it("refuses the token alone, naming its bucket, the dataset bucket, and what to use instead", async () => {
153
+ const err = await resolveGatewayAccess({ asPubkey: AS, endpoint: "https://gw" }, undefined, { cacheFile: null, mint: neverMint })
154
+ .then(() => undefined, (e) => e);
155
+ expect(err?.message).toMatch(/\$CEF_DDC_ACCESS_TOKEN .*cannot open dataset storage/);
156
+ expect(err?.message).toContain("limited to DDC bucket 4044");
157
+ expect(err?.message).toContain("cannot be delegated");
158
+ expect(err?.message).toContain(`as-${"cd".repeat(30)}`);
159
+ expect(err?.message).toContain("--access-key/--secret");
160
+ });
161
+ it("uses explicit keys over the token", async () => {
162
+ const access = await resolveGatewayAccess({ asPubkey: AS, accessKey: "AK", secret: "SK", endpoint: "https://gw" });
163
+ expect(await access.credentials.get()).toEqual({ accessKeyId: "AK", secretAccessKey: "SK" });
164
+ });
165
+ it("mints with a wallet when one is given beside the token", async () => {
166
+ let minted = 0;
167
+ const access = await resolveGatewayAccess({ asPubkey: AS, endpoint: "https://gw" }, { address: "5Alice" }, {
168
+ cacheFile: null,
169
+ mint: async () => ({ endpoint: "x", bucket: "x", accessKeyId: `k${++minted}`, secretAccessKey: "s", expiresAt: Date.now() + HOUR }),
170
+ });
171
+ expect((await access.credentials.get()).accessKeyId).toBe("k1");
172
+ });
173
+ it("still explains a string that is not a token", () => {
174
+ expect(ddcTokenCannotOpenStore("not a token!", "as-x").message).toMatch(/cannot open dataset storage: datasets live in the S3 gateway bucket as-x/);
175
+ });
176
+ });
177
+ describe("minting at the credential cap", () => {
178
+ it("says what to do instead of surfacing the gateway's 400", async () => {
179
+ const { UriSigner } = (await import("@cere-ddc-sdk/ddc-client"));
180
+ const wallet = new UriSigner("//Alice", { type: "ed25519" });
181
+ await wallet.isReady();
182
+ const fetchImpl = (async (url) => {
183
+ if (String(url).endsWith("/auth/info")) {
184
+ return new Response(JSON.stringify({ gateway_public_key: "11".repeat(32) }), { status: 200 });
185
+ }
186
+ return new Response("credential limit reached", { status: 400 });
187
+ });
188
+ await expect(mintGatewayCredentials({ endpoint: "https://gw", asPubKey: "0x00", signer: wallet, fetchImpl }))
189
+ .rejects.toThrow(/already holds as many live S3 credentials as the gateway allows.*--access-key\/--secret/s);
190
+ });
191
+ });
192
+ //# sourceMappingURL=eval-auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-auth.test.js","sourceRoot":"","sources":["../../src/lib/eval-auth.test.ts"],"names":[],"mappings":"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"}