@xproof/xproof 0.1.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.
@@ -0,0 +1,559 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/integrations/vercel.ts
21
+ var vercel_exports = {};
22
+ __export(vercel_exports, {
23
+ xproofMiddleware: () => xproofMiddleware
24
+ });
25
+ module.exports = __toCommonJS(vercel_exports);
26
+ var import_crypto2 = require("crypto");
27
+
28
+ // src/client.ts
29
+ var import_path = require("path");
30
+
31
+ // src/errors.ts
32
+ var XProofError = class extends Error {
33
+ constructor(message, statusCode = 0, response = null) {
34
+ super(message);
35
+ this.name = "XProofError";
36
+ this.statusCode = statusCode;
37
+ this.response = response;
38
+ }
39
+ };
40
+ var AuthenticationError = class extends XProofError {
41
+ constructor(message = "Invalid or missing API key", response = null) {
42
+ super(message, 401, response);
43
+ this.name = "AuthenticationError";
44
+ }
45
+ };
46
+ var ValidationError = class extends XProofError {
47
+ constructor(message = "Invalid request data", response = null) {
48
+ super(message, 400, response);
49
+ this.name = "ValidationError";
50
+ }
51
+ };
52
+ var NotFoundError = class extends XProofError {
53
+ constructor(message = "Resource not found", response = null) {
54
+ super(message, 404, response);
55
+ this.name = "NotFoundError";
56
+ }
57
+ };
58
+ var ConflictError = class extends XProofError {
59
+ constructor(message = "File already certified", certificationId = "", response = null) {
60
+ super(message, 409, response);
61
+ this.name = "ConflictError";
62
+ this.certificationId = certificationId;
63
+ }
64
+ };
65
+ var RateLimitError = class extends XProofError {
66
+ constructor(message = "Rate limit exceeded", response = null) {
67
+ super(message, 429, response);
68
+ this.name = "RateLimitError";
69
+ }
70
+ };
71
+ var ServerError = class extends XProofError {
72
+ constructor(message = "Internal server error", statusCode = 500, response = null) {
73
+ super(message, statusCode, response);
74
+ this.name = "ServerError";
75
+ }
76
+ };
77
+
78
+ // src/hash.ts
79
+ var import_crypto = require("crypto");
80
+ var import_promises = require("fs/promises");
81
+ async function hashFile(path) {
82
+ const data = await (0, import_promises.readFile)(path);
83
+ return (0, import_crypto.createHash)("sha256").update(data).digest("hex");
84
+ }
85
+
86
+ // src/parse.ts
87
+ function parseCertification(data) {
88
+ const blockchain = data.blockchain || {};
89
+ return {
90
+ id: data.id || data.proof_id || "",
91
+ fileName: data.fileName || data.filename || data.file_name || "",
92
+ fileHash: data.fileHash || data.file_hash || "",
93
+ transactionHash: data.transactionHash || blockchain.transaction_hash || "",
94
+ transactionUrl: data.transactionUrl || blockchain.explorer_url || "",
95
+ createdAt: data.createdAt || data.created_at || data.timestamp || "",
96
+ authorName: data.authorName || data.author_name || "",
97
+ blockchainStatus: data.blockchainStatus || data.status || "",
98
+ isPublic: data.isPublic !== void 0 ? !!data.isPublic : data.is_public !== void 0 ? !!data.is_public : true,
99
+ certificateUrl: data.certificateUrl || data.certificate_url || "",
100
+ verifyUrl: data.verifyUrl || data.verify_url || ""
101
+ };
102
+ }
103
+ function parseBatchResult(data) {
104
+ const rawResults = data.results || [];
105
+ const results = rawResults.map(parseCertification);
106
+ const total = data.total ?? rawResults.length;
107
+ const created = data.created ?? 0;
108
+ const existing = data.existing ?? 0;
109
+ const summary = {
110
+ total,
111
+ created,
112
+ existing,
113
+ get certified() {
114
+ return created;
115
+ },
116
+ get failed() {
117
+ return total - created - existing;
118
+ }
119
+ };
120
+ return {
121
+ batchId: data.batch_id || "",
122
+ results,
123
+ summary
124
+ };
125
+ }
126
+ function parsePricingInfo(data) {
127
+ const rawTiers = data.tiers || [];
128
+ const tiers = rawTiers.map((t) => ({
129
+ minCertifications: t.min_certifications ?? t.min ?? 0,
130
+ maxCertifications: t.max_certifications ?? t.max ?? null,
131
+ priceUsd: t.price_usd ?? t.price ?? 0
132
+ }));
133
+ return {
134
+ protocol: data.protocol || "",
135
+ version: data.version || "",
136
+ priceUsd: data.price_usd ?? data.current_price ?? 0,
137
+ tiers,
138
+ paymentMethods: data.payment_methods || [],
139
+ raw: data
140
+ };
141
+ }
142
+ function parseRegistrationResult(data) {
143
+ const trialData = data.trial || {};
144
+ const trial = {
145
+ quota: trialData.quota ?? 0,
146
+ used: trialData.used ?? 0,
147
+ remaining: trialData.remaining ?? 0
148
+ };
149
+ return {
150
+ apiKey: data.api_key || "",
151
+ agentName: data.agent_name || "",
152
+ trial,
153
+ endpoints: data.endpoints || {},
154
+ raw: data
155
+ };
156
+ }
157
+
158
+ // src/client.ts
159
+ var VERSION = "0.1.0";
160
+ var DEFAULT_BASE_URL = "https://xproof.app";
161
+ var DEFAULT_TIMEOUT = 3e4;
162
+ var XProofClient = class _XProofClient {
163
+ constructor(options = {}) {
164
+ this.registration = null;
165
+ this.apiKey = options.apiKey ?? "";
166
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
167
+ this.timeout = options.timeout ?? DEFAULT_TIMEOUT;
168
+ }
169
+ static async register(agentName, options = {}) {
170
+ const temp = new _XProofClient(options);
171
+ const data = await temp.request("POST", "/api/agent/register", {
172
+ body: { agent_name: agentName },
173
+ authRequired: false
174
+ });
175
+ const result = parseRegistrationResult(data);
176
+ const client = new _XProofClient({
177
+ ...options,
178
+ apiKey: result.apiKey
179
+ });
180
+ client.registration = result;
181
+ return client;
182
+ }
183
+ async certify(path, author, fileName, fourW) {
184
+ this.requireAuth();
185
+ const fileHash = await hashFile(path);
186
+ const resolvedName = fileName ?? (0, import_path.basename)(path);
187
+ return this.certifyHash(fileHash, resolvedName, author, fourW);
188
+ }
189
+ async certifyHash(fileHash, fileName, author, fourW) {
190
+ this.requireAuth();
191
+ const metadata = fourW?.metadata ? { ...fourW.metadata } : {};
192
+ if (fourW?.who !== void 0) metadata.who = fourW.who;
193
+ if (fourW?.what !== void 0) metadata.what = fourW.what;
194
+ if (fourW?.when !== void 0) metadata.when = fourW.when;
195
+ if (fourW?.why !== void 0) metadata.why = fourW.why;
196
+ const payload = {
197
+ filename: fileName,
198
+ file_hash: fileHash,
199
+ author_name: author
200
+ };
201
+ if (Object.keys(metadata).length > 0) {
202
+ payload.metadata = metadata;
203
+ }
204
+ const data = await this.request("POST", "/api/proof", { body: payload });
205
+ return parseCertification(data);
206
+ }
207
+ async batchCertify(files) {
208
+ this.requireAuth();
209
+ if (files.length > 50) {
210
+ throw new Error("Batch certification supports a maximum of 50 files");
211
+ }
212
+ const entries = files.map((f) => {
213
+ const entry = {
214
+ filename: f.fileName ?? "unknown",
215
+ file_hash: f.fileHash
216
+ };
217
+ if (f.metadata) entry.metadata = f.metadata;
218
+ return entry;
219
+ });
220
+ const payload = { files: entries };
221
+ const author = files.find((f) => f.author)?.author;
222
+ if (author) payload.author_name = author;
223
+ const data = await this.request("POST", "/api/batch", { body: payload });
224
+ return parseBatchResult(data);
225
+ }
226
+ async verify(proofId) {
227
+ const data = await this.request("GET", `/api/proof/${proofId}`, {
228
+ authRequired: false
229
+ });
230
+ return parseCertification(data);
231
+ }
232
+ async verifyHash(fileHash) {
233
+ const data = await this.request("GET", `/api/proof/hash/${fileHash}`, {
234
+ authRequired: false
235
+ });
236
+ return parseCertification(data);
237
+ }
238
+ async getPricing() {
239
+ const data = await this.request("GET", "/api/pricing", {
240
+ authRequired: false
241
+ });
242
+ return parsePricingInfo(data);
243
+ }
244
+ requireAuth() {
245
+ if (!this.apiKey) {
246
+ throw new Error(
247
+ "apiKey is required \u2014 call XProofClient.register() or pass an apiKey"
248
+ );
249
+ }
250
+ }
251
+ async request(method, path, options = {}) {
252
+ const url = `${this.baseUrl}${path}`;
253
+ const { body, authRequired = true } = options;
254
+ const headers = {
255
+ "User-Agent": `xproof-js/${VERSION}`
256
+ };
257
+ if (authRequired && this.apiKey) {
258
+ headers["Authorization"] = `Bearer ${this.apiKey}`;
259
+ }
260
+ if (body) {
261
+ headers["Content-Type"] = "application/json";
262
+ }
263
+ const controller = new AbortController();
264
+ const timer = setTimeout(() => controller.abort(), this.timeout);
265
+ let resp;
266
+ try {
267
+ resp = await fetch(url, {
268
+ method,
269
+ headers,
270
+ body: body ? JSON.stringify(body) : void 0,
271
+ signal: controller.signal
272
+ });
273
+ } catch (err) {
274
+ clearTimeout(timer);
275
+ if (err instanceof DOMException && err.name === "AbortError") {
276
+ throw new XProofError(`Request timed out after ${this.timeout}ms`);
277
+ }
278
+ throw new XProofError(`Request failed: ${err.message}`);
279
+ } finally {
280
+ clearTimeout(timer);
281
+ }
282
+ if (resp.status === 200 || resp.status === 201) {
283
+ let data;
284
+ try {
285
+ data = await resp.json();
286
+ } catch {
287
+ const text = await resp.text().catch(() => "");
288
+ throw new XProofError(
289
+ `Unexpected non-JSON response from ${method} ${url}: ${text.slice(0, 200)}`
290
+ );
291
+ }
292
+ return data;
293
+ }
294
+ await this.handleError(resp);
295
+ return {};
296
+ }
297
+ async handleError(resp) {
298
+ let body;
299
+ try {
300
+ body = await resp.json();
301
+ } catch {
302
+ body = { message: await resp.text().catch(() => "") };
303
+ }
304
+ const message = body.message || body.error || `HTTP ${resp.status}`;
305
+ const status = resp.status;
306
+ if (status === 400) throw new ValidationError(message, body);
307
+ if (status === 401 || status === 403)
308
+ throw new AuthenticationError(message, body);
309
+ if (status === 404) throw new NotFoundError(message, body);
310
+ if (status === 409)
311
+ throw new ConflictError(
312
+ message,
313
+ body.certificationId || "",
314
+ body
315
+ );
316
+ if (status === 429) throw new RateLimitError(message, body);
317
+ if (status >= 500) throw new ServerError(message, status, body);
318
+ throw new XProofError(message, status, body);
319
+ }
320
+ };
321
+
322
+ // src/integrations/vercel.ts
323
+ function hashData(data) {
324
+ const serialized = typeof data === "string" ? data : JSON.stringify(data, null, 0);
325
+ return (0, import_crypto2.createHash)("sha256").update(serialized, "utf8").digest("hex");
326
+ }
327
+ function xproofMiddleware(options = {}) {
328
+ const client = options.client ?? new XProofClient({ apiKey: options.apiKey ?? "" });
329
+ const agentName = options.agentName ?? "vercel-ai-agent";
330
+ const defaultWhy = options.why ?? "ai-generation";
331
+ const defaultMetadata = options.metadata ?? {};
332
+ const shouldCertify = options.shouldCertify ?? (() => true);
333
+ const batchMode = options.batchMode ?? false;
334
+ const batchFlushSize = options.batchFlushSize ?? 10;
335
+ const proofs = [];
336
+ const pendingBatch = [];
337
+ function buildCertPayload(model, promptHash, resultHash, functionId, extraMetadata) {
338
+ const interactionHash = hashData({
339
+ model,
340
+ prompt: promptHash,
341
+ result: resultHash
342
+ });
343
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
344
+ const fileName = `ai-${functionId ?? "generate"}-${Date.now()}.json`;
345
+ return {
346
+ interactionHash,
347
+ fileName,
348
+ fourW: {
349
+ who: agentName,
350
+ what: interactionHash,
351
+ when: timestamp,
352
+ why: functionId ?? defaultWhy,
353
+ metadata: {
354
+ framework: "vercel-ai-sdk",
355
+ model,
356
+ prompt_hash: promptHash,
357
+ result_hash: resultHash,
358
+ ...defaultMetadata,
359
+ ...extraMetadata ?? {}
360
+ }
361
+ }
362
+ };
363
+ }
364
+ async function certifyOne(interactionHash, fileName, fourW) {
365
+ const cert = await client.certifyHash(
366
+ interactionHash,
367
+ fileName,
368
+ agentName,
369
+ fourW
370
+ );
371
+ const result = {
372
+ proofId: cert.id,
373
+ fileHash: cert.fileHash,
374
+ transactionHash: cert.transactionHash
375
+ };
376
+ proofs.push(result);
377
+ return result;
378
+ }
379
+ function extractModelId(model) {
380
+ if (!model) return "unknown";
381
+ if (typeof model === "string") return model;
382
+ if (typeof model === "object" && model !== null) {
383
+ const m = model;
384
+ if (typeof m.modelId === "string") return m.modelId;
385
+ if (typeof m.id === "string") return m.id;
386
+ }
387
+ return "unknown";
388
+ }
389
+ function extractPromptText(params) {
390
+ if (typeof params.prompt === "string") return params.prompt;
391
+ if (Array.isArray(params.prompt)) return JSON.stringify(params.prompt);
392
+ if (params.messages) return JSON.stringify(params.messages);
393
+ return JSON.stringify(params);
394
+ }
395
+ const middlewareObj = {
396
+ wrapGenerate: async (opts) => {
397
+ const result = await opts.doGenerate();
398
+ const modelId = extractModelId(opts.model);
399
+ if (!shouldCertify({ type: "generate", model: modelId })) {
400
+ return result;
401
+ }
402
+ const promptText = extractPromptText(opts.params);
403
+ const promptHash = hashData(promptText);
404
+ const responseText = typeof result.text === "string" ? result.text : JSON.stringify(result.text ?? result);
405
+ const resultHash = hashData(responseText);
406
+ const { interactionHash, fileName, fourW } = buildCertPayload(
407
+ modelId,
408
+ promptHash,
409
+ resultHash
410
+ );
411
+ if (batchMode) {
412
+ pendingBatch.push({
413
+ interactionHash,
414
+ fileName,
415
+ model: modelId,
416
+ promptHash,
417
+ resultHash,
418
+ timestamp: fourW.when,
419
+ metadata: fourW.metadata
420
+ });
421
+ if (pendingBatch.length >= batchFlushSize) {
422
+ await flushBatch();
423
+ }
424
+ } else {
425
+ await certifyOne(interactionHash, fileName, fourW);
426
+ }
427
+ return result;
428
+ },
429
+ wrapStream: async (opts) => {
430
+ const result = await opts.doStream();
431
+ const modelId = extractModelId(opts.model);
432
+ if (!shouldCertify({ type: "stream", model: modelId })) {
433
+ return result;
434
+ }
435
+ const promptText = extractPromptText(opts.params);
436
+ const promptHash = hashData(promptText);
437
+ const originalStream = result.stream;
438
+ const chunks = [];
439
+ let finishText;
440
+ const transformStream = new TransformStream({
441
+ transform(chunk, controller) {
442
+ if (typeof chunk === "string") {
443
+ chunks.push(chunk);
444
+ } else if (chunk && typeof chunk === "object") {
445
+ const c = chunk;
446
+ if (c.type === "text-delta" && typeof c.textDelta === "string") {
447
+ chunks.push(c.textDelta);
448
+ } else if (c.type === "finish" && typeof c.text === "string") {
449
+ finishText = c.text;
450
+ } else if (typeof c.content === "string") {
451
+ chunks.push(c.content);
452
+ }
453
+ }
454
+ controller.enqueue(chunk);
455
+ },
456
+ async flush() {
457
+ const fullText = finishText ?? chunks.join("");
458
+ const resultHash = hashData(fullText);
459
+ const { interactionHash, fileName, fourW } = buildCertPayload(
460
+ modelId,
461
+ promptHash,
462
+ resultHash,
463
+ "stream"
464
+ );
465
+ if (batchMode) {
466
+ pendingBatch.push({
467
+ interactionHash,
468
+ fileName,
469
+ model: modelId,
470
+ promptHash,
471
+ resultHash,
472
+ timestamp: fourW.when,
473
+ metadata: fourW.metadata
474
+ });
475
+ if (pendingBatch.length >= batchFlushSize) {
476
+ await flushBatch();
477
+ }
478
+ } else {
479
+ await certifyOne(interactionHash, fileName, fourW).catch(() => {
480
+ });
481
+ }
482
+ }
483
+ });
484
+ return {
485
+ ...result,
486
+ stream: originalStream.pipeThrough(transformStream)
487
+ };
488
+ }
489
+ };
490
+ async function flushBatch() {
491
+ if (pendingBatch.length === 0) return [];
492
+ const items = pendingBatch.splice(0, pendingBatch.length);
493
+ const results = [];
494
+ const batchFiles = items.map((item) => ({
495
+ fileHash: item.interactionHash,
496
+ fileName: item.fileName,
497
+ author: agentName,
498
+ metadata: {
499
+ framework: "vercel-ai-sdk",
500
+ model: item.model,
501
+ prompt_hash: item.promptHash,
502
+ result_hash: item.resultHash,
503
+ who: agentName,
504
+ what: item.interactionHash,
505
+ when: item.timestamp,
506
+ why: defaultWhy,
507
+ ...defaultMetadata,
508
+ ...item.metadata ?? {}
509
+ }
510
+ }));
511
+ const batchResult = await client.batchCertify(batchFiles);
512
+ for (const cert of batchResult.results) {
513
+ const r = {
514
+ proofId: cert.id,
515
+ fileHash: cert.fileHash,
516
+ transactionHash: cert.transactionHash
517
+ };
518
+ results.push(r);
519
+ proofs.push(r);
520
+ }
521
+ return results;
522
+ }
523
+ return {
524
+ middleware: middlewareObj,
525
+ async certifyGeneration(params) {
526
+ const promptHash = hashData(params.prompt);
527
+ const resultHash = hashData(params.result);
528
+ const { interactionHash, fileName, fourW } = buildCertPayload(
529
+ params.model,
530
+ promptHash,
531
+ resultHash,
532
+ params.functionId,
533
+ params.metadata
534
+ );
535
+ return certifyOne(interactionHash, fileName, fourW);
536
+ },
537
+ async certifyStream(params) {
538
+ return this.certifyGeneration({
539
+ ...params,
540
+ result: params.fullText,
541
+ functionId: params.functionId ?? "stream"
542
+ });
543
+ },
544
+ flushBatch,
545
+ get proofs() {
546
+ return proofs;
547
+ },
548
+ get pendingCount() {
549
+ return pendingBatch.length;
550
+ },
551
+ client,
552
+ agentName
553
+ };
554
+ }
555
+ // Annotate the CommonJS export names for ESM import in node:
556
+ 0 && (module.exports = {
557
+ xproofMiddleware
558
+ });
559
+ //# sourceMappingURL=vercel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/integrations/vercel.ts","../../src/client.ts","../../src/errors.ts","../../src/hash.ts","../../src/parse.ts"],"sourcesContent":["/**\n * Vercel AI SDK middleware for automatic xProof certification.\n *\n * Provides two integration modes:\n *\n * 1. **Automatic middleware** — wraps a language model so every\n * `generateText` / `streamText` call is certified automatically.\n *\n * 2. **Manual helpers** — `certifyGeneration` / `certifyStream` for\n * post-hoc certification of individual calls.\n *\n * @example Automatic middleware\n * ```typescript\n * import { xproofMiddleware } from \"xproof/vercel\";\n * import { generateText, wrapLanguageModel } from \"ai\";\n * import { openai } from \"@ai-sdk/openai\";\n *\n * const mw = xproofMiddleware({ apiKey: \"pm_...\", agentName: \"my-app\" });\n *\n * const model = wrapLanguageModel({\n * model: openai(\"gpt-4\"),\n * middleware: mw.middleware,\n * });\n *\n * const { text } = await generateText({ model, prompt: \"Hello\" });\n * // proof is created automatically\n * console.log(mw.proofs); // [{ proofId, fileHash, transactionHash }]\n * ```\n *\n * @example Manual certification\n * ```typescript\n * import { xproofMiddleware } from \"xproof/vercel\";\n * import { generateText } from \"ai\";\n *\n * const mw = xproofMiddleware({ apiKey: \"pm_...\" });\n *\n * const { text } = await generateText({\n * model: openai(\"gpt-4\"),\n * prompt: \"Hello\",\n * });\n *\n * const proof = await mw.certifyGeneration({\n * model: \"gpt-4\",\n * prompt: \"Hello\",\n * result: text,\n * functionId: \"chat\",\n * });\n * ```\n */\n\nimport { createHash } from \"crypto\";\nimport { XProofClient } from \"../client.js\";\nimport type { FourWOptions } from \"../types.js\";\n\nexport interface XProofMiddlewareOptions {\n apiKey?: string;\n client?: XProofClient;\n agentName?: string;\n why?: string;\n metadata?: Record<string, unknown>;\n shouldCertify?: (params: { type: string; model: string }) => boolean;\n batchMode?: boolean;\n batchFlushSize?: number;\n}\n\nfunction hashData(data: unknown): string {\n const serialized =\n typeof data === \"string\" ? data : JSON.stringify(data, null, 0);\n return createHash(\"sha256\").update(serialized, \"utf8\").digest(\"hex\");\n}\n\nexport interface MiddlewareResult {\n proofId: string;\n fileHash: string;\n transactionHash: string;\n}\n\ninterface PendingCertification {\n interactionHash: string;\n fileName: string;\n model: string;\n promptHash: string;\n resultHash: string;\n timestamp: string;\n metadata?: Record<string, unknown>;\n}\n\nexport function xproofMiddleware(options: XProofMiddlewareOptions = {}) {\n const client =\n options.client ?? new XProofClient({ apiKey: options.apiKey ?? \"\" });\n const agentName = options.agentName ?? \"vercel-ai-agent\";\n const defaultWhy = options.why ?? \"ai-generation\";\n const defaultMetadata = options.metadata ?? {};\n const shouldCertify = options.shouldCertify ?? (() => true);\n const batchMode = options.batchMode ?? false;\n const batchFlushSize = options.batchFlushSize ?? 10;\n\n const proofs: MiddlewareResult[] = [];\n const pendingBatch: PendingCertification[] = [];\n\n function buildCertPayload(\n model: string,\n promptHash: string,\n resultHash: string,\n functionId?: string,\n extraMetadata?: Record<string, unknown>\n ): { interactionHash: string; fileName: string; fourW: FourWOptions } {\n const interactionHash = hashData({\n model,\n prompt: promptHash,\n result: resultHash,\n });\n const timestamp = new Date().toISOString();\n const fileName = `ai-${functionId ?? \"generate\"}-${Date.now()}.json`;\n\n return {\n interactionHash,\n fileName,\n fourW: {\n who: agentName,\n what: interactionHash,\n when: timestamp,\n why: functionId ?? defaultWhy,\n metadata: {\n framework: \"vercel-ai-sdk\",\n model,\n prompt_hash: promptHash,\n result_hash: resultHash,\n ...defaultMetadata,\n ...(extraMetadata ?? {}),\n },\n },\n };\n }\n\n async function certifyOne(\n interactionHash: string,\n fileName: string,\n fourW: FourWOptions\n ): Promise<MiddlewareResult> {\n const cert = await client.certifyHash(\n interactionHash,\n fileName,\n agentName,\n fourW\n );\n\n const result: MiddlewareResult = {\n proofId: cert.id,\n fileHash: cert.fileHash,\n transactionHash: cert.transactionHash,\n };\n proofs.push(result);\n return result;\n }\n\n function extractModelId(model: unknown): string {\n if (!model) return \"unknown\";\n if (typeof model === \"string\") return model;\n if (typeof model === \"object\" && model !== null) {\n const m = model as Record<string, unknown>;\n if (typeof m.modelId === \"string\") return m.modelId;\n if (typeof m.id === \"string\") return m.id;\n }\n return \"unknown\";\n }\n\n function extractPromptText(params: Record<string, unknown>): string {\n if (typeof params.prompt === \"string\") return params.prompt;\n if (Array.isArray(params.prompt)) return JSON.stringify(params.prompt);\n if (params.messages) return JSON.stringify(params.messages);\n return JSON.stringify(params);\n }\n\n const middlewareObj = {\n wrapGenerate: async (opts: {\n doGenerate: () => Promise<Record<string, unknown>>;\n params: Record<string, unknown>;\n model: unknown;\n }) => {\n const result = await opts.doGenerate();\n\n const modelId = extractModelId(opts.model);\n if (!shouldCertify({ type: \"generate\", model: modelId })) {\n return result;\n }\n\n const promptText = extractPromptText(opts.params);\n const promptHash = hashData(promptText);\n\n const responseText =\n typeof result.text === \"string\"\n ? result.text\n : JSON.stringify(result.text ?? result);\n const resultHash = hashData(responseText);\n\n const { interactionHash, fileName, fourW } = buildCertPayload(\n modelId,\n promptHash,\n resultHash\n );\n\n if (batchMode) {\n pendingBatch.push({\n interactionHash,\n fileName,\n model: modelId,\n promptHash,\n resultHash,\n timestamp: fourW.when!,\n metadata: fourW.metadata,\n });\n if (pendingBatch.length >= batchFlushSize) {\n await flushBatch();\n }\n } else {\n await certifyOne(interactionHash, fileName, fourW);\n }\n\n return result;\n },\n\n wrapStream: async (opts: {\n doStream: () => Promise<{\n stream: ReadableStream;\n [key: string]: unknown;\n }>;\n params: Record<string, unknown>;\n model: unknown;\n }) => {\n const result = await opts.doStream();\n\n const modelId = extractModelId(opts.model);\n if (!shouldCertify({ type: \"stream\", model: modelId })) {\n return result;\n }\n\n const promptText = extractPromptText(opts.params);\n const promptHash = hashData(promptText);\n\n const originalStream = result.stream;\n const chunks: string[] = [];\n let finishText: string | undefined;\n\n const transformStream = new TransformStream({\n transform(chunk, controller) {\n if (typeof chunk === \"string\") {\n chunks.push(chunk);\n } else if (chunk && typeof chunk === \"object\") {\n const c = chunk as Record<string, unknown>;\n if (c.type === \"text-delta\" && typeof c.textDelta === \"string\") {\n chunks.push(c.textDelta);\n } else if (c.type === \"finish\" && typeof c.text === \"string\") {\n finishText = c.text as string;\n } else if (typeof c.content === \"string\") {\n chunks.push(c.content);\n }\n }\n controller.enqueue(chunk);\n },\n async flush() {\n const fullText = finishText ?? chunks.join(\"\");\n const resultHash = hashData(fullText);\n const { interactionHash, fileName, fourW } = buildCertPayload(\n modelId,\n promptHash,\n resultHash,\n \"stream\"\n );\n\n if (batchMode) {\n pendingBatch.push({\n interactionHash,\n fileName,\n model: modelId,\n promptHash,\n resultHash,\n timestamp: fourW.when!,\n metadata: fourW.metadata,\n });\n if (pendingBatch.length >= batchFlushSize) {\n await flushBatch();\n }\n } else {\n await certifyOne(interactionHash, fileName, fourW).catch(() => {});\n }\n },\n });\n\n return {\n ...result,\n stream: originalStream.pipeThrough(transformStream),\n };\n },\n };\n\n async function flushBatch(): Promise<MiddlewareResult[]> {\n if (pendingBatch.length === 0) return [];\n\n const items = pendingBatch.splice(0, pendingBatch.length);\n const results: MiddlewareResult[] = [];\n\n const batchFiles = items.map((item) => ({\n fileHash: item.interactionHash,\n fileName: item.fileName,\n author: agentName,\n metadata: {\n framework: \"vercel-ai-sdk\",\n model: item.model,\n prompt_hash: item.promptHash,\n result_hash: item.resultHash,\n who: agentName,\n what: item.interactionHash,\n when: item.timestamp,\n why: defaultWhy,\n ...defaultMetadata,\n ...(item.metadata ?? {}),\n },\n }));\n\n const batchResult = await client.batchCertify(batchFiles);\n for (const cert of batchResult.results) {\n const r: MiddlewareResult = {\n proofId: cert.id,\n fileHash: cert.fileHash,\n transactionHash: cert.transactionHash,\n };\n results.push(r);\n proofs.push(r);\n }\n\n return results;\n }\n\n return {\n middleware: middlewareObj,\n\n async certifyGeneration(params: {\n model: string;\n prompt: string | Array<unknown>;\n result: string;\n functionId?: string;\n metadata?: Record<string, unknown>;\n }): Promise<MiddlewareResult> {\n const promptHash = hashData(params.prompt);\n const resultHash = hashData(params.result);\n const { interactionHash, fileName, fourW } = buildCertPayload(\n params.model,\n promptHash,\n resultHash,\n params.functionId,\n params.metadata\n );\n return certifyOne(interactionHash, fileName, fourW);\n },\n\n async certifyStream(params: {\n model: string;\n prompt: string | Array<unknown>;\n fullText: string;\n functionId?: string;\n metadata?: Record<string, unknown>;\n }): Promise<MiddlewareResult> {\n return this.certifyGeneration({\n ...params,\n result: params.fullText,\n functionId: params.functionId ?? \"stream\",\n });\n },\n\n flushBatch,\n\n get proofs(): MiddlewareResult[] {\n return proofs;\n },\n\n get pendingCount(): number {\n return pendingBatch.length;\n },\n\n client,\n agentName,\n };\n}\n\nexport type XProofVercelMiddleware = ReturnType<typeof xproofMiddleware>;\n","import { basename } from \"path\";\nimport {\n XProofError,\n AuthenticationError,\n ValidationError,\n NotFoundError,\n ConflictError,\n RateLimitError,\n ServerError,\n} from \"./errors.js\";\nimport { hashFile } from \"./hash.js\";\nimport {\n parseCertification,\n parseBatchResult,\n parsePricingInfo,\n parseRegistrationResult,\n} from \"./parse.js\";\nimport type {\n Certification,\n BatchResult,\n PricingInfo,\n RegistrationResult,\n FourWOptions,\n BatchFileEntry,\n XProofClientOptions,\n} from \"./types.js\";\n\nconst VERSION = \"0.1.0\";\nconst DEFAULT_BASE_URL = \"https://xproof.app\";\nconst DEFAULT_TIMEOUT = 30_000;\n\nexport class XProofClient {\n private apiKey: string;\n private baseUrl: string;\n private timeout: number;\n\n registration: RegistrationResult | null = null;\n\n constructor(options: XProofClientOptions = {}) {\n this.apiKey = options.apiKey ?? \"\";\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n static async register(\n agentName: string,\n options: Omit<XProofClientOptions, \"apiKey\"> = {}\n ): Promise<XProofClient> {\n const temp = new XProofClient(options);\n const data = await temp.request(\"POST\", \"/api/agent/register\", {\n body: { agent_name: agentName },\n authRequired: false,\n });\n const result = parseRegistrationResult(data);\n const client = new XProofClient({\n ...options,\n apiKey: result.apiKey,\n });\n client.registration = result;\n return client;\n }\n\n async certify(\n path: string,\n author: string,\n fileName?: string,\n fourW?: FourWOptions\n ): Promise<Certification> {\n this.requireAuth();\n const fileHash = await hashFile(path);\n const resolvedName = fileName ?? basename(path);\n return this.certifyHash(fileHash, resolvedName, author, fourW);\n }\n\n async certifyHash(\n fileHash: string,\n fileName: string,\n author: string,\n fourW?: FourWOptions\n ): Promise<Certification> {\n this.requireAuth();\n\n const metadata: Record<string, unknown> = fourW?.metadata\n ? { ...fourW.metadata }\n : {};\n if (fourW?.who !== undefined) metadata.who = fourW.who;\n if (fourW?.what !== undefined) metadata.what = fourW.what;\n if (fourW?.when !== undefined) metadata.when = fourW.when;\n if (fourW?.why !== undefined) metadata.why = fourW.why;\n\n const payload: Record<string, unknown> = {\n filename: fileName,\n file_hash: fileHash,\n author_name: author,\n };\n if (Object.keys(metadata).length > 0) {\n payload.metadata = metadata;\n }\n\n const data = await this.request(\"POST\", \"/api/proof\", { body: payload });\n return parseCertification(data);\n }\n\n async batchCertify(files: BatchFileEntry[]): Promise<BatchResult> {\n this.requireAuth();\n\n if (files.length > 50) {\n throw new Error(\"Batch certification supports a maximum of 50 files\");\n }\n\n const entries = files.map((f) => {\n const entry: Record<string, unknown> = {\n filename: f.fileName ?? \"unknown\",\n file_hash: f.fileHash,\n };\n if (f.metadata) entry.metadata = f.metadata;\n return entry;\n });\n\n const payload: Record<string, unknown> = { files: entries };\n const author = files.find((f) => f.author)?.author;\n if (author) payload.author_name = author;\n\n const data = await this.request(\"POST\", \"/api/batch\", { body: payload });\n return parseBatchResult(data);\n }\n\n async verify(proofId: string): Promise<Certification> {\n const data = await this.request(\"GET\", `/api/proof/${proofId}`, {\n authRequired: false,\n });\n return parseCertification(data);\n }\n\n async verifyHash(fileHash: string): Promise<Certification> {\n const data = await this.request(\"GET\", `/api/proof/hash/${fileHash}`, {\n authRequired: false,\n });\n return parseCertification(data);\n }\n\n async getPricing(): Promise<PricingInfo> {\n const data = await this.request(\"GET\", \"/api/pricing\", {\n authRequired: false,\n });\n return parsePricingInfo(data);\n }\n\n private requireAuth(): void {\n if (!this.apiKey) {\n throw new Error(\n \"apiKey is required — call XProofClient.register() or pass an apiKey\"\n );\n }\n }\n\n private async request(\n method: string,\n path: string,\n options: {\n body?: Record<string, unknown>;\n authRequired?: boolean;\n } = {}\n ): Promise<Record<string, unknown>> {\n const url = `${this.baseUrl}${path}`;\n const { body, authRequired = true } = options;\n\n const headers: Record<string, string> = {\n \"User-Agent\": `xproof-js/${VERSION}`,\n };\n\n if (authRequired && this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n\n if (body) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let resp: Response;\n try {\n resp = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n if (err instanceof DOMException && err.name === \"AbortError\") {\n throw new XProofError(`Request timed out after ${this.timeout}ms`);\n }\n throw new XProofError(`Request failed: ${(err as Error).message}`);\n } finally {\n clearTimeout(timer);\n }\n\n if (resp.status === 200 || resp.status === 201) {\n let data: Record<string, unknown>;\n try {\n data = (await resp.json()) as Record<string, unknown>;\n } catch {\n const text = await resp.text().catch(() => \"\");\n throw new XProofError(\n `Unexpected non-JSON response from ${method} ${url}: ${text.slice(0, 200)}`\n );\n }\n return data;\n }\n\n await this.handleError(resp);\n return {};\n }\n\n private async handleError(resp: Response): Promise<never> {\n let body: Record<string, unknown>;\n try {\n body = (await resp.json()) as Record<string, unknown>;\n } catch {\n body = { message: await resp.text().catch(() => \"\") };\n }\n\n const message =\n (body.message as string) || (body.error as string) || `HTTP ${resp.status}`;\n const status = resp.status;\n\n if (status === 400) throw new ValidationError(message, body);\n if (status === 401 || status === 403)\n throw new AuthenticationError(message, body);\n if (status === 404) throw new NotFoundError(message, body);\n if (status === 409)\n throw new ConflictError(\n message,\n (body.certificationId as string) || \"\",\n body\n );\n if (status === 429) throw new RateLimitError(message, body);\n if (status >= 500) throw new ServerError(message, status, body);\n throw new XProofError(message, status, body);\n }\n}\n","export class XProofError extends Error {\n statusCode: number;\n response: Record<string, unknown> | null;\n\n constructor(\n message: string,\n statusCode = 0,\n response: Record<string, unknown> | null = null\n ) {\n super(message);\n this.name = \"XProofError\";\n this.statusCode = statusCode;\n this.response = response;\n }\n}\n\nexport class AuthenticationError extends XProofError {\n constructor(\n message = \"Invalid or missing API key\",\n response: Record<string, unknown> | null = null\n ) {\n super(message, 401, response);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class ValidationError extends XProofError {\n constructor(\n message = \"Invalid request data\",\n response: Record<string, unknown> | null = null\n ) {\n super(message, 400, response);\n this.name = \"ValidationError\";\n }\n}\n\nexport class NotFoundError extends XProofError {\n constructor(\n message = \"Resource not found\",\n response: Record<string, unknown> | null = null\n ) {\n super(message, 404, response);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class ConflictError extends XProofError {\n certificationId: string;\n\n constructor(\n message = \"File already certified\",\n certificationId = \"\",\n response: Record<string, unknown> | null = null\n ) {\n super(message, 409, response);\n this.name = \"ConflictError\";\n this.certificationId = certificationId;\n }\n}\n\nexport class RateLimitError extends XProofError {\n constructor(\n message = \"Rate limit exceeded\",\n response: Record<string, unknown> | null = null\n ) {\n super(message, 429, response);\n this.name = \"RateLimitError\";\n }\n}\n\nexport class ServerError extends XProofError {\n constructor(\n message = \"Internal server error\",\n statusCode = 500,\n response: Record<string, unknown> | null = null\n ) {\n super(message, statusCode, response);\n this.name = \"ServerError\";\n }\n}\n","import { createHash } from \"crypto\";\nimport { readFile } from \"fs/promises\";\n\nexport async function hashFile(path: string): Promise<string> {\n const data = await readFile(path);\n return createHash(\"sha256\").update(data).digest(\"hex\");\n}\n\nexport function hashBuffer(data: Buffer | Uint8Array): string {\n return createHash(\"sha256\").update(data).digest(\"hex\");\n}\n\nexport function hashString(data: string): string {\n return createHash(\"sha256\").update(data, \"utf8\").digest(\"hex\");\n}\n","import type {\n Certification,\n BatchResult,\n BatchResultSummary,\n PricingInfo,\n PricingTier,\n RegistrationResult,\n TrialInfo,\n} from \"./types.js\";\n\nexport function parseCertification(data: Record<string, unknown>): Certification {\n const blockchain = (data.blockchain as Record<string, unknown>) || {};\n return {\n id: (data.id as string) || (data.proof_id as string) || \"\",\n fileName:\n (data.fileName as string) ||\n (data.filename as string) ||\n (data.file_name as string) ||\n \"\",\n fileHash:\n (data.fileHash as string) || (data.file_hash as string) || \"\",\n transactionHash:\n (data.transactionHash as string) ||\n (blockchain.transaction_hash as string) ||\n \"\",\n transactionUrl:\n (data.transactionUrl as string) ||\n (blockchain.explorer_url as string) ||\n \"\",\n createdAt:\n (data.createdAt as string) ||\n (data.created_at as string) ||\n (data.timestamp as string) ||\n \"\",\n authorName:\n (data.authorName as string) || (data.author_name as string) || \"\",\n blockchainStatus:\n (data.blockchainStatus as string) || (data.status as string) || \"\",\n isPublic: data.isPublic !== undefined ? !!data.isPublic : (data.is_public !== undefined ? !!data.is_public : true),\n certificateUrl:\n (data.certificateUrl as string) ||\n (data.certificate_url as string) ||\n \"\",\n verifyUrl:\n (data.verifyUrl as string) || (data.verify_url as string) || \"\",\n };\n}\n\nexport function parseBatchResult(data: Record<string, unknown>): BatchResult {\n const rawResults = (data.results as Array<Record<string, unknown>>) || [];\n const results = rawResults.map(parseCertification);\n const total = (data.total as number) ?? rawResults.length;\n const created = (data.created as number) ?? 0;\n const existing = (data.existing as number) ?? 0;\n\n const summary: BatchResultSummary = {\n total,\n created,\n existing,\n get certified() { return created; },\n get failed() { return total - created - existing; },\n };\n\n return {\n batchId: (data.batch_id as string) || \"\",\n results,\n summary,\n };\n}\n\nexport function parsePricingInfo(data: Record<string, unknown>): PricingInfo {\n const rawTiers = (data.tiers as Array<Record<string, unknown>>) || [];\n const tiers: PricingTier[] = rawTiers.map((t) => ({\n minCertifications:\n (t.min_certifications as number) ?? (t.min as number) ?? 0,\n maxCertifications:\n (t.max_certifications as number) ?? (t.max as number) ?? null,\n priceUsd: (t.price_usd as number) ?? (t.price as number) ?? 0,\n }));\n\n return {\n protocol: (data.protocol as string) || \"\",\n version: (data.version as string) || \"\",\n priceUsd:\n (data.price_usd as number) ?? (data.current_price as number) ?? 0,\n tiers,\n paymentMethods:\n (data.payment_methods as Array<Record<string, string>>) || [],\n raw: data,\n };\n}\n\nexport function parseRegistrationResult(\n data: Record<string, unknown>\n): RegistrationResult {\n const trialData = (data.trial as Record<string, unknown>) || {};\n const trial: TrialInfo = {\n quota: (trialData.quota as number) ?? 0,\n used: (trialData.used as number) ?? 0,\n remaining: (trialData.remaining as number) ?? 0,\n };\n return {\n apiKey: (data.api_key as string) || \"\",\n agentName: (data.agent_name as string) || \"\",\n trial,\n endpoints: (data.endpoints as Record<string, string>) || {},\n raw: data,\n };\n}\n"],"mappings":"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","names":["import_crypto"]}