@xproof/xproof 0.1.4 → 0.1.6

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.
@@ -53,6 +53,7 @@ interface FourWOptions {
53
53
  what?: string;
54
54
  when?: string;
55
55
  why?: string;
56
+ reversibilityClass?: ReversibilityClass;
56
57
  metadata?: Record<string, unknown>;
57
58
  }
58
59
  interface CertifyHashOptions extends FourWOptions {
@@ -61,10 +62,12 @@ interface CertifyHashOptions extends FourWOptions {
61
62
  author: string;
62
63
  }
63
64
  type ThresholdStage = "initial" | "partial" | "pre-commitment" | "final";
65
+ type ReversibilityClass = "reversible" | "costly" | "irreversible";
64
66
  interface ConfidenceOptions {
65
67
  confidenceLevel: number;
66
68
  thresholdStage: ThresholdStage;
67
69
  decisionId: string;
70
+ reversibilityClass?: ReversibilityClass;
68
71
  }
69
72
  interface ConfidenceTrailStage {
70
73
  proofId: string;
@@ -72,6 +75,7 @@ interface ConfidenceTrailStage {
72
75
  fileHash: string;
73
76
  confidenceLevel: number | null;
74
77
  thresholdStage: string | null;
78
+ reversibilityClass: ReversibilityClass | null;
75
79
  author: string;
76
80
  blockchain: {
77
81
  transactionHash: string;
@@ -81,12 +85,31 @@ interface ConfidenceTrailStage {
81
85
  anchoredAt: string;
82
86
  metadata: Record<string, unknown>;
83
87
  }
88
+ interface ConfidenceTrailDrift {
89
+ contextCoherent: boolean;
90
+ driftScore: number;
91
+ fieldsMonitored: string[];
92
+ fieldsDrifted: string[];
93
+ fieldsStable: string[];
94
+ fieldsAbsent: string[];
95
+ }
96
+ interface PolicyViolation {
97
+ proofId: string;
98
+ confidenceLevel: number | null;
99
+ reversibilityClass: ReversibilityClass;
100
+ thresholdStage: string | null;
101
+ threshold: number;
102
+ rule: string;
103
+ }
84
104
  interface ConfidenceTrail {
85
105
  decisionId: string;
86
106
  totalAnchors: number;
87
107
  currentConfidence: number | null;
88
108
  currentStage: string | null;
89
109
  isFinalized: boolean;
110
+ policyCompliant: boolean;
111
+ policyViolations: PolicyViolation[];
112
+ contextDrift: ConfidenceTrailDrift | null;
90
113
  stages: ConfidenceTrailStage[];
91
114
  }
92
115
  interface BatchFileEntry {
@@ -148,4 +171,4 @@ declare class XProofClient {
148
171
  private handleError;
149
172
  }
150
173
 
151
- export { type BatchFileEntry as B, type Certification as C, type ExecutionContext as E, type FourWOptions as F, type PricingInfo as P, type RegistrationResult as R, type ThresholdStage as T, XProofClient as X, type BatchResult as a, type BatchResultSummary as b, type CertifyHashOptions as c, type ConfidenceOptions as d, type ConfidenceTrail as e, type ConfidenceTrailStage as f, type ContextDrift as g, type ContextDriftStage as h, type PricingTier as i, type TrialInfo as j, type XProofClientOptions as k };
174
+ export { type BatchFileEntry as B, type Certification as C, type ExecutionContext as E, type FourWOptions as F, type PolicyViolation as P, type RegistrationResult as R, type ThresholdStage as T, XProofClient as X, type BatchResult as a, type BatchResultSummary as b, type CertifyHashOptions as c, type ConfidenceOptions as d, type ConfidenceTrail as e, type ConfidenceTrailDrift as f, type ConfidenceTrailStage as g, type ContextDrift as h, type ContextDriftStage as i, type PricingInfo as j, type PricingTier as k, type ReversibilityClass as l, type TrialInfo as m, type XProofClientOptions as n };
@@ -53,6 +53,7 @@ interface FourWOptions {
53
53
  what?: string;
54
54
  when?: string;
55
55
  why?: string;
56
+ reversibilityClass?: ReversibilityClass;
56
57
  metadata?: Record<string, unknown>;
57
58
  }
58
59
  interface CertifyHashOptions extends FourWOptions {
@@ -61,10 +62,12 @@ interface CertifyHashOptions extends FourWOptions {
61
62
  author: string;
62
63
  }
63
64
  type ThresholdStage = "initial" | "partial" | "pre-commitment" | "final";
65
+ type ReversibilityClass = "reversible" | "costly" | "irreversible";
64
66
  interface ConfidenceOptions {
65
67
  confidenceLevel: number;
66
68
  thresholdStage: ThresholdStage;
67
69
  decisionId: string;
70
+ reversibilityClass?: ReversibilityClass;
68
71
  }
69
72
  interface ConfidenceTrailStage {
70
73
  proofId: string;
@@ -72,6 +75,7 @@ interface ConfidenceTrailStage {
72
75
  fileHash: string;
73
76
  confidenceLevel: number | null;
74
77
  thresholdStage: string | null;
78
+ reversibilityClass: ReversibilityClass | null;
75
79
  author: string;
76
80
  blockchain: {
77
81
  transactionHash: string;
@@ -81,12 +85,31 @@ interface ConfidenceTrailStage {
81
85
  anchoredAt: string;
82
86
  metadata: Record<string, unknown>;
83
87
  }
88
+ interface ConfidenceTrailDrift {
89
+ contextCoherent: boolean;
90
+ driftScore: number;
91
+ fieldsMonitored: string[];
92
+ fieldsDrifted: string[];
93
+ fieldsStable: string[];
94
+ fieldsAbsent: string[];
95
+ }
96
+ interface PolicyViolation {
97
+ proofId: string;
98
+ confidenceLevel: number | null;
99
+ reversibilityClass: ReversibilityClass;
100
+ thresholdStage: string | null;
101
+ threshold: number;
102
+ rule: string;
103
+ }
84
104
  interface ConfidenceTrail {
85
105
  decisionId: string;
86
106
  totalAnchors: number;
87
107
  currentConfidence: number | null;
88
108
  currentStage: string | null;
89
109
  isFinalized: boolean;
110
+ policyCompliant: boolean;
111
+ policyViolations: PolicyViolation[];
112
+ contextDrift: ConfidenceTrailDrift | null;
90
113
  stages: ConfidenceTrailStage[];
91
114
  }
92
115
  interface BatchFileEntry {
@@ -148,4 +171,4 @@ declare class XProofClient {
148
171
  private handleError;
149
172
  }
150
173
 
151
- export { type BatchFileEntry as B, type Certification as C, type ExecutionContext as E, type FourWOptions as F, type PricingInfo as P, type RegistrationResult as R, type ThresholdStage as T, XProofClient as X, type BatchResult as a, type BatchResultSummary as b, type CertifyHashOptions as c, type ConfidenceOptions as d, type ConfidenceTrail as e, type ConfidenceTrailStage as f, type ContextDrift as g, type ContextDriftStage as h, type PricingTier as i, type TrialInfo as j, type XProofClientOptions as k };
174
+ export { type BatchFileEntry as B, type Certification as C, type ExecutionContext as E, type FourWOptions as F, type PolicyViolation as P, type RegistrationResult as R, type ThresholdStage as T, XProofClient as X, type BatchResult as a, type BatchResultSummary as b, type CertifyHashOptions as c, type ConfidenceOptions as d, type ConfidenceTrail as e, type ConfidenceTrailDrift as f, type ConfidenceTrailStage as g, type ContextDrift as h, type ContextDriftStage as i, type PricingInfo as j, type PricingTier as k, type ReversibilityClass as l, type TrialInfo as m, type XProofClientOptions as n };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- export { B as BatchFileEntry, a as BatchResult, b as BatchResultSummary, C as Certification, c as CertifyHashOptions, d as ConfidenceOptions, e as ConfidenceTrail, f as ConfidenceTrailStage, g as ContextDrift, h as ContextDriftStage, E as ExecutionContext, F as FourWOptions, P as PricingInfo, i as PricingTier, R as RegistrationResult, T as ThresholdStage, j as TrialInfo, X as XProofClient, k as XProofClientOptions } from './client-BNp2oPhL.mjs';
1
+ export { B as BatchFileEntry, a as BatchResult, b as BatchResultSummary, C as Certification, c as CertifyHashOptions, d as ConfidenceOptions, e as ConfidenceTrail, f as ConfidenceTrailDrift, g as ConfidenceTrailStage, h as ContextDrift, i as ContextDriftStage, E as ExecutionContext, F as FourWOptions, P as PolicyViolation, j as PricingInfo, k as PricingTier, R as RegistrationResult, l as ReversibilityClass, T as ThresholdStage, m as TrialInfo, X as XProofClient, n as XProofClientOptions } from './client-DrHsmqL6.mjs';
2
2
 
3
3
  declare class XProofError extends Error {
4
4
  statusCode: number;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { B as BatchFileEntry, a as BatchResult, b as BatchResultSummary, C as Certification, c as CertifyHashOptions, d as ConfidenceOptions, e as ConfidenceTrail, f as ConfidenceTrailStage, g as ContextDrift, h as ContextDriftStage, E as ExecutionContext, F as FourWOptions, P as PricingInfo, i as PricingTier, R as RegistrationResult, T as ThresholdStage, j as TrialInfo, X as XProofClient, k as XProofClientOptions } from './client-BNp2oPhL.js';
1
+ export { B as BatchFileEntry, a as BatchResult, b as BatchResultSummary, C as Certification, c as CertifyHashOptions, d as ConfidenceOptions, e as ConfidenceTrail, f as ConfidenceTrailDrift, g as ConfidenceTrailStage, h as ContextDrift, i as ContextDriftStage, E as ExecutionContext, F as FourWOptions, P as PolicyViolation, j as PricingInfo, k as PricingTier, R as RegistrationResult, l as ReversibilityClass, T as ThresholdStage, m as TrialInfo, X as XProofClient, n as XProofClientOptions } from './client-DrHsmqL6.js';
2
2
 
3
3
  declare class XProofError extends Error {
4
4
  statusCode: number;
package/dist/index.js CHANGED
@@ -171,7 +171,7 @@ function parseRegistrationResult(data) {
171
171
  }
172
172
 
173
173
  // src/client.ts
174
- var VERSION = "0.1.4";
174
+ var VERSION = "0.1.6";
175
175
  var DEFAULT_BASE_URL = "https://xproof.app";
176
176
  var DEFAULT_TIMEOUT = 3e4;
177
177
  var XProofClient = class _XProofClient {
@@ -208,6 +208,8 @@ var XProofClient = class _XProofClient {
208
208
  if (fourW?.what !== void 0) metadata.what = fourW.what;
209
209
  if (fourW?.when !== void 0) metadata.when = fourW.when;
210
210
  if (fourW?.why !== void 0) metadata.why = fourW.why;
211
+ if (fourW?.reversibilityClass !== void 0)
212
+ metadata.reversibility_class = fourW.reversibilityClass;
211
213
  const payload = {
212
214
  filename: fileName,
213
215
  file_hash: fileHash,
@@ -269,6 +271,8 @@ var XProofClient = class _XProofClient {
269
271
  metadata.confidence_level = confidence.confidenceLevel;
270
272
  metadata.threshold_stage = confidence.thresholdStage;
271
273
  metadata.decision_id = confidence.decisionId;
274
+ if (confidence.reversibilityClass !== void 0)
275
+ metadata.reversibility_class = confidence.reversibilityClass;
272
276
  const payload = {
273
277
  filename: fileName,
274
278
  file_hash: fileHash,
@@ -291,6 +295,7 @@ var XProofClient = class _XProofClient {
291
295
  fileHash: s.file_hash || "",
292
296
  confidenceLevel: s.confidence_level ?? null,
293
297
  thresholdStage: s.threshold_stage ?? null,
298
+ reversibilityClass: s.metadata?.reversibility_class ?? null,
294
299
  author: s.author || "",
295
300
  blockchain: {
296
301
  transactionHash: s.blockchain?.transaction_hash || "",
@@ -300,12 +305,33 @@ var XProofClient = class _XProofClient {
300
305
  anchoredAt: s.anchored_at || "",
301
306
  metadata: s.metadata || {}
302
307
  }));
308
+ const rawDrift = data.context_drift;
309
+ const contextDrift = rawDrift ? {
310
+ contextCoherent: rawDrift.context_coherent ?? true,
311
+ driftScore: rawDrift.drift_score ?? 0,
312
+ fieldsMonitored: rawDrift.fields_monitored || [],
313
+ fieldsDrifted: rawDrift.fields_drifted || [],
314
+ fieldsStable: rawDrift.fields_stable || [],
315
+ fieldsAbsent: rawDrift.fields_absent || []
316
+ } : null;
317
+ const rawViolations = data.policy_violations || [];
318
+ const policyViolations = rawViolations.map((v) => ({
319
+ proofId: v.proof_id || "",
320
+ confidenceLevel: v.confidence_level ?? null,
321
+ reversibilityClass: v.reversibility_class,
322
+ thresholdStage: v.threshold_stage ?? null,
323
+ threshold: v.threshold ?? 0.95,
324
+ rule: v.rule || ""
325
+ }));
303
326
  return {
304
327
  decisionId: data.decision_id || decisionId,
305
328
  totalAnchors: data.total_anchors || stages.length,
306
329
  currentConfidence: data.current_confidence ?? null,
307
330
  currentStage: data.current_stage ?? null,
308
331
  isFinalized: data.is_finalized || false,
332
+ policyCompliant: data.policy_compliant ?? true,
333
+ policyViolations,
334
+ contextDrift,
309
335
  stages
310
336
  };
311
337
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/errors.ts","../src/hash.ts","../src/parse.ts"],"sourcesContent":["export { XProofClient } from \"./client.js\";\nexport {\n XProofError,\n AuthenticationError,\n ValidationError,\n NotFoundError,\n ConflictError,\n RateLimitError,\n ServerError,\n} from \"./errors.js\";\nexport type {\n Certification,\n BatchResult,\n BatchResultSummary,\n PricingInfo,\n PricingTier,\n RegistrationResult,\n TrialInfo,\n FourWOptions,\n CertifyHashOptions,\n BatchFileEntry,\n XProofClientOptions,\n ThresholdStage,\n ConfidenceOptions,\n ConfidenceTrail,\n ConfidenceTrailStage,\n ExecutionContext,\n ContextDriftStage,\n ContextDrift,\n} from \"./types.js\";\nexport { hashFile, hashBuffer, hashString } from \"./hash.js\";\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 ConfidenceOptions,\n ConfidenceTrail,\n ConfidenceTrailStage,\n ContextDrift,\n ContextDriftStage,\n ExecutionContext,\n} from \"./types.js\";\n\nconst VERSION = \"0.1.4\";\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 certifyWithConfidence(\n fileHash: string,\n fileName: string,\n author: string,\n confidence: ConfidenceOptions,\n fourW?: FourWOptions\n ): Promise<Certification> {\n this.requireAuth();\n\n if (confidence.confidenceLevel < 0 || confidence.confidenceLevel > 1) {\n throw new ValidationError(\n \"confidenceLevel must be between 0.0 and 1.0\",\n {}\n );\n }\n if (!confidence.decisionId || confidence.decisionId.trim().length === 0) {\n throw new ValidationError(\"decisionId is required\", {});\n }\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 metadata.confidence_level = confidence.confidenceLevel;\n metadata.threshold_stage = confidence.thresholdStage;\n metadata.decision_id = confidence.decisionId;\n\n const payload: Record<string, unknown> = {\n filename: fileName,\n file_hash: fileHash,\n author_name: author,\n metadata,\n };\n\n const data = await this.request(\"POST\", \"/api/proof\", { body: payload });\n return parseCertification(data);\n }\n\n async getConfidenceTrail(decisionId: string): Promise<ConfidenceTrail> {\n const data = await this.request(\n \"GET\",\n `/api/confidence-trail/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ConfidenceTrailStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n fileName: s.file_name || \"\",\n fileHash: s.file_hash || \"\",\n confidenceLevel: s.confidence_level ?? null,\n thresholdStage: s.threshold_stage ?? null,\n author: s.author || \"\",\n blockchain: {\n transactionHash: s.blockchain?.transaction_hash || \"\",\n explorerUrl: s.blockchain?.explorer_url || \"\",\n status: s.blockchain?.status || \"\",\n },\n anchoredAt: s.anchored_at || \"\",\n metadata: s.metadata || {},\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n totalAnchors: (data.total_anchors as number) || stages.length,\n currentConfidence: (data.current_confidence as number) ?? null,\n currentStage: (data.current_stage as string) ?? null,\n isFinalized: (data.is_finalized as boolean) || false,\n stages,\n };\n }\n\n async getContextDrift(decisionId: string): Promise<ContextDrift> {\n const data = await this.request(\n \"GET\",\n `/api/context-drift/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ContextDriftStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n stageIndex: s.stage_index ?? 0,\n anchoredAt: s.anchored_at || \"\",\n executionContext: (s.execution_context || {}) as ExecutionContext,\n contextBreak: s.context_break || false,\n driftedFields: s.drifted_fields || [],\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n contextCoherent: (data.context_coherent as boolean) ?? true,\n driftScore: (data.drift_score as number) ?? 0,\n fieldsMonitored: (data.fields_monitored as string[]) || [],\n fieldsDrifted: (data.fields_drifted as string[]) || [],\n fieldsStable: (data.fields_stable as string[]) || [],\n fieldsAbsent: (data.fields_absent as string[]) || [],\n totalAnchors: (data.total_anchors as number) || stages.length,\n stages,\n };\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: 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":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/errors.ts","../src/hash.ts","../src/parse.ts"],"sourcesContent":["export { XProofClient } from \"./client.js\";\nexport {\n XProofError,\n AuthenticationError,\n ValidationError,\n NotFoundError,\n ConflictError,\n RateLimitError,\n ServerError,\n} from \"./errors.js\";\nexport type {\n Certification,\n BatchResult,\n BatchResultSummary,\n PricingInfo,\n PricingTier,\n RegistrationResult,\n TrialInfo,\n FourWOptions,\n CertifyHashOptions,\n BatchFileEntry,\n XProofClientOptions,\n ThresholdStage,\n ReversibilityClass,\n ConfidenceOptions,\n ConfidenceTrail,\n ConfidenceTrailStage,\n ConfidenceTrailDrift,\n PolicyViolation,\n ExecutionContext,\n ContextDriftStage,\n ContextDrift,\n} from \"./types.js\";\nexport { hashFile, hashBuffer, hashString } from \"./hash.js\";\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 ConfidenceOptions,\n ConfidenceTrail,\n ConfidenceTrailStage,\n ConfidenceTrailDrift,\n ContextDrift,\n ContextDriftStage,\n ExecutionContext,\n PolicyViolation,\n ReversibilityClass,\n} from \"./types.js\";\n\nconst VERSION = \"0.1.6\";\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 if (fourW?.reversibilityClass !== undefined)\n metadata.reversibility_class = fourW.reversibilityClass;\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 certifyWithConfidence(\n fileHash: string,\n fileName: string,\n author: string,\n confidence: ConfidenceOptions,\n fourW?: FourWOptions\n ): Promise<Certification> {\n this.requireAuth();\n\n if (confidence.confidenceLevel < 0 || confidence.confidenceLevel > 1) {\n throw new ValidationError(\n \"confidenceLevel must be between 0.0 and 1.0\",\n {}\n );\n }\n if (!confidence.decisionId || confidence.decisionId.trim().length === 0) {\n throw new ValidationError(\"decisionId is required\", {});\n }\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 metadata.confidence_level = confidence.confidenceLevel;\n metadata.threshold_stage = confidence.thresholdStage;\n metadata.decision_id = confidence.decisionId;\n if (confidence.reversibilityClass !== undefined)\n metadata.reversibility_class = confidence.reversibilityClass;\n\n const payload: Record<string, unknown> = {\n filename: fileName,\n file_hash: fileHash,\n author_name: author,\n metadata,\n };\n\n const data = await this.request(\"POST\", \"/api/proof\", { body: payload });\n return parseCertification(data);\n }\n\n async getConfidenceTrail(decisionId: string): Promise<ConfidenceTrail> {\n const data = await this.request(\n \"GET\",\n `/api/confidence-trail/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ConfidenceTrailStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n fileName: s.file_name || \"\",\n fileHash: s.file_hash || \"\",\n confidenceLevel: s.confidence_level ?? null,\n thresholdStage: s.threshold_stage ?? null,\n reversibilityClass: (s.metadata?.reversibility_class ?? null) as ReversibilityClass | null,\n author: s.author || \"\",\n blockchain: {\n transactionHash: s.blockchain?.transaction_hash || \"\",\n explorerUrl: s.blockchain?.explorer_url || \"\",\n status: s.blockchain?.status || \"\",\n },\n anchoredAt: s.anchored_at || \"\",\n metadata: s.metadata || {},\n }));\n\n const rawDrift = data.context_drift as any;\n const contextDrift: ConfidenceTrailDrift | null = rawDrift\n ? {\n contextCoherent: rawDrift.context_coherent ?? true,\n driftScore: rawDrift.drift_score ?? 0,\n fieldsMonitored: rawDrift.fields_monitored || [],\n fieldsDrifted: rawDrift.fields_drifted || [],\n fieldsStable: rawDrift.fields_stable || [],\n fieldsAbsent: rawDrift.fields_absent || [],\n }\n : null;\n\n const rawViolations = (data.policy_violations as any[]) || [];\n const policyViolations: PolicyViolation[] = rawViolations.map((v: any) => ({\n proofId: v.proof_id || \"\",\n confidenceLevel: v.confidence_level ?? null,\n reversibilityClass: v.reversibility_class as ReversibilityClass,\n thresholdStage: v.threshold_stage ?? null,\n threshold: v.threshold ?? 0.95,\n rule: v.rule || \"\",\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n totalAnchors: (data.total_anchors as number) || stages.length,\n currentConfidence: (data.current_confidence as number) ?? null,\n currentStage: (data.current_stage as string) ?? null,\n isFinalized: (data.is_finalized as boolean) || false,\n policyCompliant: (data.policy_compliant as boolean) ?? true,\n policyViolations,\n contextDrift,\n stages,\n };\n }\n\n async getContextDrift(decisionId: string): Promise<ContextDrift> {\n const data = await this.request(\n \"GET\",\n `/api/context-drift/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ContextDriftStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n stageIndex: s.stage_index ?? 0,\n anchoredAt: s.anchored_at || \"\",\n executionContext: (s.execution_context || {}) as ExecutionContext,\n contextBreak: s.context_break || false,\n driftedFields: s.drifted_fields || [],\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n contextCoherent: (data.context_coherent as boolean) ?? true,\n driftScore: (data.drift_score as number) ?? 0,\n fieldsMonitored: (data.fields_monitored as string[]) || [],\n fieldsDrifted: (data.fields_drifted as string[]) || [],\n fieldsStable: (data.fields_stable as string[]) || [],\n fieldsAbsent: (data.fields_absent as string[]) || [],\n totalAnchors: (data.total_anchors as number) || stages.length,\n stages,\n };\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: 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":[]}
package/dist/index.mjs CHANGED
@@ -135,7 +135,7 @@ function parseRegistrationResult(data) {
135
135
  }
136
136
 
137
137
  // src/client.ts
138
- var VERSION = "0.1.4";
138
+ var VERSION = "0.1.6";
139
139
  var DEFAULT_BASE_URL = "https://xproof.app";
140
140
  var DEFAULT_TIMEOUT = 3e4;
141
141
  var XProofClient = class _XProofClient {
@@ -172,6 +172,8 @@ var XProofClient = class _XProofClient {
172
172
  if (fourW?.what !== void 0) metadata.what = fourW.what;
173
173
  if (fourW?.when !== void 0) metadata.when = fourW.when;
174
174
  if (fourW?.why !== void 0) metadata.why = fourW.why;
175
+ if (fourW?.reversibilityClass !== void 0)
176
+ metadata.reversibility_class = fourW.reversibilityClass;
175
177
  const payload = {
176
178
  filename: fileName,
177
179
  file_hash: fileHash,
@@ -233,6 +235,8 @@ var XProofClient = class _XProofClient {
233
235
  metadata.confidence_level = confidence.confidenceLevel;
234
236
  metadata.threshold_stage = confidence.thresholdStage;
235
237
  metadata.decision_id = confidence.decisionId;
238
+ if (confidence.reversibilityClass !== void 0)
239
+ metadata.reversibility_class = confidence.reversibilityClass;
236
240
  const payload = {
237
241
  filename: fileName,
238
242
  file_hash: fileHash,
@@ -255,6 +259,7 @@ var XProofClient = class _XProofClient {
255
259
  fileHash: s.file_hash || "",
256
260
  confidenceLevel: s.confidence_level ?? null,
257
261
  thresholdStage: s.threshold_stage ?? null,
262
+ reversibilityClass: s.metadata?.reversibility_class ?? null,
258
263
  author: s.author || "",
259
264
  blockchain: {
260
265
  transactionHash: s.blockchain?.transaction_hash || "",
@@ -264,12 +269,33 @@ var XProofClient = class _XProofClient {
264
269
  anchoredAt: s.anchored_at || "",
265
270
  metadata: s.metadata || {}
266
271
  }));
272
+ const rawDrift = data.context_drift;
273
+ const contextDrift = rawDrift ? {
274
+ contextCoherent: rawDrift.context_coherent ?? true,
275
+ driftScore: rawDrift.drift_score ?? 0,
276
+ fieldsMonitored: rawDrift.fields_monitored || [],
277
+ fieldsDrifted: rawDrift.fields_drifted || [],
278
+ fieldsStable: rawDrift.fields_stable || [],
279
+ fieldsAbsent: rawDrift.fields_absent || []
280
+ } : null;
281
+ const rawViolations = data.policy_violations || [];
282
+ const policyViolations = rawViolations.map((v) => ({
283
+ proofId: v.proof_id || "",
284
+ confidenceLevel: v.confidence_level ?? null,
285
+ reversibilityClass: v.reversibility_class,
286
+ thresholdStage: v.threshold_stage ?? null,
287
+ threshold: v.threshold ?? 0.95,
288
+ rule: v.rule || ""
289
+ }));
267
290
  return {
268
291
  decisionId: data.decision_id || decisionId,
269
292
  totalAnchors: data.total_anchors || stages.length,
270
293
  currentConfidence: data.current_confidence ?? null,
271
294
  currentStage: data.current_stage ?? null,
272
295
  isFinalized: data.is_finalized || false,
296
+ policyCompliant: data.policy_compliant ?? true,
297
+ policyViolations,
298
+ contextDrift,
273
299
  stages
274
300
  };
275
301
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/hash.ts","../src/parse.ts"],"sourcesContent":["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 ConfidenceOptions,\n ConfidenceTrail,\n ConfidenceTrailStage,\n ContextDrift,\n ContextDriftStage,\n ExecutionContext,\n} from \"./types.js\";\n\nconst VERSION = \"0.1.4\";\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 certifyWithConfidence(\n fileHash: string,\n fileName: string,\n author: string,\n confidence: ConfidenceOptions,\n fourW?: FourWOptions\n ): Promise<Certification> {\n this.requireAuth();\n\n if (confidence.confidenceLevel < 0 || confidence.confidenceLevel > 1) {\n throw new ValidationError(\n \"confidenceLevel must be between 0.0 and 1.0\",\n {}\n );\n }\n if (!confidence.decisionId || confidence.decisionId.trim().length === 0) {\n throw new ValidationError(\"decisionId is required\", {});\n }\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 metadata.confidence_level = confidence.confidenceLevel;\n metadata.threshold_stage = confidence.thresholdStage;\n metadata.decision_id = confidence.decisionId;\n\n const payload: Record<string, unknown> = {\n filename: fileName,\n file_hash: fileHash,\n author_name: author,\n metadata,\n };\n\n const data = await this.request(\"POST\", \"/api/proof\", { body: payload });\n return parseCertification(data);\n }\n\n async getConfidenceTrail(decisionId: string): Promise<ConfidenceTrail> {\n const data = await this.request(\n \"GET\",\n `/api/confidence-trail/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ConfidenceTrailStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n fileName: s.file_name || \"\",\n fileHash: s.file_hash || \"\",\n confidenceLevel: s.confidence_level ?? null,\n thresholdStage: s.threshold_stage ?? null,\n author: s.author || \"\",\n blockchain: {\n transactionHash: s.blockchain?.transaction_hash || \"\",\n explorerUrl: s.blockchain?.explorer_url || \"\",\n status: s.blockchain?.status || \"\",\n },\n anchoredAt: s.anchored_at || \"\",\n metadata: s.metadata || {},\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n totalAnchors: (data.total_anchors as number) || stages.length,\n currentConfidence: (data.current_confidence as number) ?? null,\n currentStage: (data.current_stage as string) ?? null,\n isFinalized: (data.is_finalized as boolean) || false,\n stages,\n };\n }\n\n async getContextDrift(decisionId: string): Promise<ContextDrift> {\n const data = await this.request(\n \"GET\",\n `/api/context-drift/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ContextDriftStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n stageIndex: s.stage_index ?? 0,\n anchoredAt: s.anchored_at || \"\",\n executionContext: (s.execution_context || {}) as ExecutionContext,\n contextBreak: s.context_break || false,\n driftedFields: s.drifted_fields || [],\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n contextCoherent: (data.context_coherent as boolean) ?? true,\n driftScore: (data.drift_score as number) ?? 0,\n fieldsMonitored: (data.fields_monitored as string[]) || [],\n fieldsDrifted: (data.fields_drifted as string[]) || [],\n fieldsStable: (data.fields_stable as string[]) || [],\n fieldsAbsent: (data.fields_absent as string[]) || [],\n totalAnchors: (data.total_anchors as number) || stages.length,\n stages,\n };\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: 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":[]}
1
+ {"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/hash.ts","../src/parse.ts"],"sourcesContent":["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 ConfidenceOptions,\n ConfidenceTrail,\n ConfidenceTrailStage,\n ConfidenceTrailDrift,\n ContextDrift,\n ContextDriftStage,\n ExecutionContext,\n PolicyViolation,\n ReversibilityClass,\n} from \"./types.js\";\n\nconst VERSION = \"0.1.6\";\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 if (fourW?.reversibilityClass !== undefined)\n metadata.reversibility_class = fourW.reversibilityClass;\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 certifyWithConfidence(\n fileHash: string,\n fileName: string,\n author: string,\n confidence: ConfidenceOptions,\n fourW?: FourWOptions\n ): Promise<Certification> {\n this.requireAuth();\n\n if (confidence.confidenceLevel < 0 || confidence.confidenceLevel > 1) {\n throw new ValidationError(\n \"confidenceLevel must be between 0.0 and 1.0\",\n {}\n );\n }\n if (!confidence.decisionId || confidence.decisionId.trim().length === 0) {\n throw new ValidationError(\"decisionId is required\", {});\n }\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 metadata.confidence_level = confidence.confidenceLevel;\n metadata.threshold_stage = confidence.thresholdStage;\n metadata.decision_id = confidence.decisionId;\n if (confidence.reversibilityClass !== undefined)\n metadata.reversibility_class = confidence.reversibilityClass;\n\n const payload: Record<string, unknown> = {\n filename: fileName,\n file_hash: fileHash,\n author_name: author,\n metadata,\n };\n\n const data = await this.request(\"POST\", \"/api/proof\", { body: payload });\n return parseCertification(data);\n }\n\n async getConfidenceTrail(decisionId: string): Promise<ConfidenceTrail> {\n const data = await this.request(\n \"GET\",\n `/api/confidence-trail/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ConfidenceTrailStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n fileName: s.file_name || \"\",\n fileHash: s.file_hash || \"\",\n confidenceLevel: s.confidence_level ?? null,\n thresholdStage: s.threshold_stage ?? null,\n reversibilityClass: (s.metadata?.reversibility_class ?? null) as ReversibilityClass | null,\n author: s.author || \"\",\n blockchain: {\n transactionHash: s.blockchain?.transaction_hash || \"\",\n explorerUrl: s.blockchain?.explorer_url || \"\",\n status: s.blockchain?.status || \"\",\n },\n anchoredAt: s.anchored_at || \"\",\n metadata: s.metadata || {},\n }));\n\n const rawDrift = data.context_drift as any;\n const contextDrift: ConfidenceTrailDrift | null = rawDrift\n ? {\n contextCoherent: rawDrift.context_coherent ?? true,\n driftScore: rawDrift.drift_score ?? 0,\n fieldsMonitored: rawDrift.fields_monitored || [],\n fieldsDrifted: rawDrift.fields_drifted || [],\n fieldsStable: rawDrift.fields_stable || [],\n fieldsAbsent: rawDrift.fields_absent || [],\n }\n : null;\n\n const rawViolations = (data.policy_violations as any[]) || [];\n const policyViolations: PolicyViolation[] = rawViolations.map((v: any) => ({\n proofId: v.proof_id || \"\",\n confidenceLevel: v.confidence_level ?? null,\n reversibilityClass: v.reversibility_class as ReversibilityClass,\n thresholdStage: v.threshold_stage ?? null,\n threshold: v.threshold ?? 0.95,\n rule: v.rule || \"\",\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n totalAnchors: (data.total_anchors as number) || stages.length,\n currentConfidence: (data.current_confidence as number) ?? null,\n currentStage: (data.current_stage as string) ?? null,\n isFinalized: (data.is_finalized as boolean) || false,\n policyCompliant: (data.policy_compliant as boolean) ?? true,\n policyViolations,\n contextDrift,\n stages,\n };\n }\n\n async getContextDrift(decisionId: string): Promise<ContextDrift> {\n const data = await this.request(\n \"GET\",\n `/api/context-drift/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ContextDriftStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n stageIndex: s.stage_index ?? 0,\n anchoredAt: s.anchored_at || \"\",\n executionContext: (s.execution_context || {}) as ExecutionContext,\n contextBreak: s.context_break || false,\n driftedFields: s.drifted_fields || [],\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n contextCoherent: (data.context_coherent as boolean) ?? true,\n driftScore: (data.drift_score as number) ?? 0,\n fieldsMonitored: (data.fields_monitored as string[]) || [],\n fieldsDrifted: (data.fields_drifted as string[]) || [],\n fieldsStable: (data.fields_stable as string[]) || [],\n fieldsAbsent: (data.fields_absent as string[]) || [],\n totalAnchors: (data.total_anchors as number) || stages.length,\n stages,\n };\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: 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":[]}
@@ -1,4 +1,4 @@
1
- import { X as XProofClient } from '../client-BNp2oPhL.mjs';
1
+ import { X as XProofClient } from '../client-DrHsmqL6.mjs';
2
2
 
3
3
  /**
4
4
  * Vercel AI SDK middleware for automatic xProof certification.
@@ -1,4 +1,4 @@
1
- import { X as XProofClient } from '../client-BNp2oPhL.js';
1
+ import { X as XProofClient } from '../client-DrHsmqL6.js';
2
2
 
3
3
  /**
4
4
  * Vercel AI SDK middleware for automatic xProof certification.
@@ -156,7 +156,7 @@ function parseRegistrationResult(data) {
156
156
  }
157
157
 
158
158
  // src/client.ts
159
- var VERSION = "0.1.4";
159
+ var VERSION = "0.1.6";
160
160
  var DEFAULT_BASE_URL = "https://xproof.app";
161
161
  var DEFAULT_TIMEOUT = 3e4;
162
162
  var XProofClient = class _XProofClient {
@@ -193,6 +193,8 @@ var XProofClient = class _XProofClient {
193
193
  if (fourW?.what !== void 0) metadata.what = fourW.what;
194
194
  if (fourW?.when !== void 0) metadata.when = fourW.when;
195
195
  if (fourW?.why !== void 0) metadata.why = fourW.why;
196
+ if (fourW?.reversibilityClass !== void 0)
197
+ metadata.reversibility_class = fourW.reversibilityClass;
196
198
  const payload = {
197
199
  filename: fileName,
198
200
  file_hash: fileHash,
@@ -254,6 +256,8 @@ var XProofClient = class _XProofClient {
254
256
  metadata.confidence_level = confidence.confidenceLevel;
255
257
  metadata.threshold_stage = confidence.thresholdStage;
256
258
  metadata.decision_id = confidence.decisionId;
259
+ if (confidence.reversibilityClass !== void 0)
260
+ metadata.reversibility_class = confidence.reversibilityClass;
257
261
  const payload = {
258
262
  filename: fileName,
259
263
  file_hash: fileHash,
@@ -276,6 +280,7 @@ var XProofClient = class _XProofClient {
276
280
  fileHash: s.file_hash || "",
277
281
  confidenceLevel: s.confidence_level ?? null,
278
282
  thresholdStage: s.threshold_stage ?? null,
283
+ reversibilityClass: s.metadata?.reversibility_class ?? null,
279
284
  author: s.author || "",
280
285
  blockchain: {
281
286
  transactionHash: s.blockchain?.transaction_hash || "",
@@ -285,12 +290,33 @@ var XProofClient = class _XProofClient {
285
290
  anchoredAt: s.anchored_at || "",
286
291
  metadata: s.metadata || {}
287
292
  }));
293
+ const rawDrift = data.context_drift;
294
+ const contextDrift = rawDrift ? {
295
+ contextCoherent: rawDrift.context_coherent ?? true,
296
+ driftScore: rawDrift.drift_score ?? 0,
297
+ fieldsMonitored: rawDrift.fields_monitored || [],
298
+ fieldsDrifted: rawDrift.fields_drifted || [],
299
+ fieldsStable: rawDrift.fields_stable || [],
300
+ fieldsAbsent: rawDrift.fields_absent || []
301
+ } : null;
302
+ const rawViolations = data.policy_violations || [];
303
+ const policyViolations = rawViolations.map((v) => ({
304
+ proofId: v.proof_id || "",
305
+ confidenceLevel: v.confidence_level ?? null,
306
+ reversibilityClass: v.reversibility_class,
307
+ thresholdStage: v.threshold_stage ?? null,
308
+ threshold: v.threshold ?? 0.95,
309
+ rule: v.rule || ""
310
+ }));
288
311
  return {
289
312
  decisionId: data.decision_id || decisionId,
290
313
  totalAnchors: data.total_anchors || stages.length,
291
314
  currentConfidence: data.current_confidence ?? null,
292
315
  currentStage: data.current_stage ?? null,
293
316
  isFinalized: data.is_finalized || false,
317
+ policyCompliant: data.policy_compliant ?? true,
318
+ policyViolations,
319
+ contextDrift,
294
320
  stages
295
321
  };
296
322
  }
@@ -1 +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 ConfidenceOptions,\n ConfidenceTrail,\n ConfidenceTrailStage,\n ContextDrift,\n ContextDriftStage,\n ExecutionContext,\n} from \"./types.js\";\n\nconst VERSION = \"0.1.4\";\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 certifyWithConfidence(\n fileHash: string,\n fileName: string,\n author: string,\n confidence: ConfidenceOptions,\n fourW?: FourWOptions\n ): Promise<Certification> {\n this.requireAuth();\n\n if (confidence.confidenceLevel < 0 || confidence.confidenceLevel > 1) {\n throw new ValidationError(\n \"confidenceLevel must be between 0.0 and 1.0\",\n {}\n );\n }\n if (!confidence.decisionId || confidence.decisionId.trim().length === 0) {\n throw new ValidationError(\"decisionId is required\", {});\n }\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 metadata.confidence_level = confidence.confidenceLevel;\n metadata.threshold_stage = confidence.thresholdStage;\n metadata.decision_id = confidence.decisionId;\n\n const payload: Record<string, unknown> = {\n filename: fileName,\n file_hash: fileHash,\n author_name: author,\n metadata,\n };\n\n const data = await this.request(\"POST\", \"/api/proof\", { body: payload });\n return parseCertification(data);\n }\n\n async getConfidenceTrail(decisionId: string): Promise<ConfidenceTrail> {\n const data = await this.request(\n \"GET\",\n `/api/confidence-trail/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ConfidenceTrailStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n fileName: s.file_name || \"\",\n fileHash: s.file_hash || \"\",\n confidenceLevel: s.confidence_level ?? null,\n thresholdStage: s.threshold_stage ?? null,\n author: s.author || \"\",\n blockchain: {\n transactionHash: s.blockchain?.transaction_hash || \"\",\n explorerUrl: s.blockchain?.explorer_url || \"\",\n status: s.blockchain?.status || \"\",\n },\n anchoredAt: s.anchored_at || \"\",\n metadata: s.metadata || {},\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n totalAnchors: (data.total_anchors as number) || stages.length,\n currentConfidence: (data.current_confidence as number) ?? null,\n currentStage: (data.current_stage as string) ?? null,\n isFinalized: (data.is_finalized as boolean) || false,\n stages,\n };\n }\n\n async getContextDrift(decisionId: string): Promise<ContextDrift> {\n const data = await this.request(\n \"GET\",\n `/api/context-drift/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ContextDriftStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n stageIndex: s.stage_index ?? 0,\n anchoredAt: s.anchored_at || \"\",\n executionContext: (s.execution_context || {}) as ExecutionContext,\n contextBreak: s.context_break || false,\n driftedFields: s.drifted_fields || [],\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n contextCoherent: (data.context_coherent as boolean) ?? true,\n driftScore: (data.drift_score as number) ?? 0,\n fieldsMonitored: (data.fields_monitored as string[]) || [],\n fieldsDrifted: (data.fields_drifted as string[]) || [],\n fieldsStable: (data.fields_stable as string[]) || [],\n fieldsAbsent: (data.fields_absent as string[]) || [],\n totalAnchors: (data.total_anchors as number) || stages.length,\n stages,\n };\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: 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"]}
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 ConfidenceOptions,\n ConfidenceTrail,\n ConfidenceTrailStage,\n ConfidenceTrailDrift,\n ContextDrift,\n ContextDriftStage,\n ExecutionContext,\n PolicyViolation,\n ReversibilityClass,\n} from \"./types.js\";\n\nconst VERSION = \"0.1.6\";\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 if (fourW?.reversibilityClass !== undefined)\n metadata.reversibility_class = fourW.reversibilityClass;\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 certifyWithConfidence(\n fileHash: string,\n fileName: string,\n author: string,\n confidence: ConfidenceOptions,\n fourW?: FourWOptions\n ): Promise<Certification> {\n this.requireAuth();\n\n if (confidence.confidenceLevel < 0 || confidence.confidenceLevel > 1) {\n throw new ValidationError(\n \"confidenceLevel must be between 0.0 and 1.0\",\n {}\n );\n }\n if (!confidence.decisionId || confidence.decisionId.trim().length === 0) {\n throw new ValidationError(\"decisionId is required\", {});\n }\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 metadata.confidence_level = confidence.confidenceLevel;\n metadata.threshold_stage = confidence.thresholdStage;\n metadata.decision_id = confidence.decisionId;\n if (confidence.reversibilityClass !== undefined)\n metadata.reversibility_class = confidence.reversibilityClass;\n\n const payload: Record<string, unknown> = {\n filename: fileName,\n file_hash: fileHash,\n author_name: author,\n metadata,\n };\n\n const data = await this.request(\"POST\", \"/api/proof\", { body: payload });\n return parseCertification(data);\n }\n\n async getConfidenceTrail(decisionId: string): Promise<ConfidenceTrail> {\n const data = await this.request(\n \"GET\",\n `/api/confidence-trail/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ConfidenceTrailStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n fileName: s.file_name || \"\",\n fileHash: s.file_hash || \"\",\n confidenceLevel: s.confidence_level ?? null,\n thresholdStage: s.threshold_stage ?? null,\n reversibilityClass: (s.metadata?.reversibility_class ?? null) as ReversibilityClass | null,\n author: s.author || \"\",\n blockchain: {\n transactionHash: s.blockchain?.transaction_hash || \"\",\n explorerUrl: s.blockchain?.explorer_url || \"\",\n status: s.blockchain?.status || \"\",\n },\n anchoredAt: s.anchored_at || \"\",\n metadata: s.metadata || {},\n }));\n\n const rawDrift = data.context_drift as any;\n const contextDrift: ConfidenceTrailDrift | null = rawDrift\n ? {\n contextCoherent: rawDrift.context_coherent ?? true,\n driftScore: rawDrift.drift_score ?? 0,\n fieldsMonitored: rawDrift.fields_monitored || [],\n fieldsDrifted: rawDrift.fields_drifted || [],\n fieldsStable: rawDrift.fields_stable || [],\n fieldsAbsent: rawDrift.fields_absent || [],\n }\n : null;\n\n const rawViolations = (data.policy_violations as any[]) || [];\n const policyViolations: PolicyViolation[] = rawViolations.map((v: any) => ({\n proofId: v.proof_id || \"\",\n confidenceLevel: v.confidence_level ?? null,\n reversibilityClass: v.reversibility_class as ReversibilityClass,\n thresholdStage: v.threshold_stage ?? null,\n threshold: v.threshold ?? 0.95,\n rule: v.rule || \"\",\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n totalAnchors: (data.total_anchors as number) || stages.length,\n currentConfidence: (data.current_confidence as number) ?? null,\n currentStage: (data.current_stage as string) ?? null,\n isFinalized: (data.is_finalized as boolean) || false,\n policyCompliant: (data.policy_compliant as boolean) ?? true,\n policyViolations,\n contextDrift,\n stages,\n };\n }\n\n async getContextDrift(decisionId: string): Promise<ContextDrift> {\n const data = await this.request(\n \"GET\",\n `/api/context-drift/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ContextDriftStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n stageIndex: s.stage_index ?? 0,\n anchoredAt: s.anchored_at || \"\",\n executionContext: (s.execution_context || {}) as ExecutionContext,\n contextBreak: s.context_break || false,\n driftedFields: s.drifted_fields || [],\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n contextCoherent: (data.context_coherent as boolean) ?? true,\n driftScore: (data.drift_score as number) ?? 0,\n fieldsMonitored: (data.fields_monitored as string[]) || [],\n fieldsDrifted: (data.fields_drifted as string[]) || [],\n fieldsStable: (data.fields_stable as string[]) || [],\n fieldsAbsent: (data.fields_absent as string[]) || [],\n totalAnchors: (data.total_anchors as number) || stages.length,\n stages,\n };\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: 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"]}
@@ -132,7 +132,7 @@ function parseRegistrationResult(data) {
132
132
  }
133
133
 
134
134
  // src/client.ts
135
- var VERSION = "0.1.4";
135
+ var VERSION = "0.1.6";
136
136
  var DEFAULT_BASE_URL = "https://xproof.app";
137
137
  var DEFAULT_TIMEOUT = 3e4;
138
138
  var XProofClient = class _XProofClient {
@@ -169,6 +169,8 @@ var XProofClient = class _XProofClient {
169
169
  if (fourW?.what !== void 0) metadata.what = fourW.what;
170
170
  if (fourW?.when !== void 0) metadata.when = fourW.when;
171
171
  if (fourW?.why !== void 0) metadata.why = fourW.why;
172
+ if (fourW?.reversibilityClass !== void 0)
173
+ metadata.reversibility_class = fourW.reversibilityClass;
172
174
  const payload = {
173
175
  filename: fileName,
174
176
  file_hash: fileHash,
@@ -230,6 +232,8 @@ var XProofClient = class _XProofClient {
230
232
  metadata.confidence_level = confidence.confidenceLevel;
231
233
  metadata.threshold_stage = confidence.thresholdStage;
232
234
  metadata.decision_id = confidence.decisionId;
235
+ if (confidence.reversibilityClass !== void 0)
236
+ metadata.reversibility_class = confidence.reversibilityClass;
233
237
  const payload = {
234
238
  filename: fileName,
235
239
  file_hash: fileHash,
@@ -252,6 +256,7 @@ var XProofClient = class _XProofClient {
252
256
  fileHash: s.file_hash || "",
253
257
  confidenceLevel: s.confidence_level ?? null,
254
258
  thresholdStage: s.threshold_stage ?? null,
259
+ reversibilityClass: s.metadata?.reversibility_class ?? null,
255
260
  author: s.author || "",
256
261
  blockchain: {
257
262
  transactionHash: s.blockchain?.transaction_hash || "",
@@ -261,12 +266,33 @@ var XProofClient = class _XProofClient {
261
266
  anchoredAt: s.anchored_at || "",
262
267
  metadata: s.metadata || {}
263
268
  }));
269
+ const rawDrift = data.context_drift;
270
+ const contextDrift = rawDrift ? {
271
+ contextCoherent: rawDrift.context_coherent ?? true,
272
+ driftScore: rawDrift.drift_score ?? 0,
273
+ fieldsMonitored: rawDrift.fields_monitored || [],
274
+ fieldsDrifted: rawDrift.fields_drifted || [],
275
+ fieldsStable: rawDrift.fields_stable || [],
276
+ fieldsAbsent: rawDrift.fields_absent || []
277
+ } : null;
278
+ const rawViolations = data.policy_violations || [];
279
+ const policyViolations = rawViolations.map((v) => ({
280
+ proofId: v.proof_id || "",
281
+ confidenceLevel: v.confidence_level ?? null,
282
+ reversibilityClass: v.reversibility_class,
283
+ thresholdStage: v.threshold_stage ?? null,
284
+ threshold: v.threshold ?? 0.95,
285
+ rule: v.rule || ""
286
+ }));
264
287
  return {
265
288
  decisionId: data.decision_id || decisionId,
266
289
  totalAnchors: data.total_anchors || stages.length,
267
290
  currentConfidence: data.current_confidence ?? null,
268
291
  currentStage: data.current_stage ?? null,
269
292
  isFinalized: data.is_finalized || false,
293
+ policyCompliant: data.policy_compliant ?? true,
294
+ policyViolations,
295
+ contextDrift,
270
296
  stages
271
297
  };
272
298
  }
@@ -1 +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 ConfidenceOptions,\n ConfidenceTrail,\n ConfidenceTrailStage,\n ContextDrift,\n ContextDriftStage,\n ExecutionContext,\n} from \"./types.js\";\n\nconst VERSION = \"0.1.4\";\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 certifyWithConfidence(\n fileHash: string,\n fileName: string,\n author: string,\n confidence: ConfidenceOptions,\n fourW?: FourWOptions\n ): Promise<Certification> {\n this.requireAuth();\n\n if (confidence.confidenceLevel < 0 || confidence.confidenceLevel > 1) {\n throw new ValidationError(\n \"confidenceLevel must be between 0.0 and 1.0\",\n {}\n );\n }\n if (!confidence.decisionId || confidence.decisionId.trim().length === 0) {\n throw new ValidationError(\"decisionId is required\", {});\n }\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 metadata.confidence_level = confidence.confidenceLevel;\n metadata.threshold_stage = confidence.thresholdStage;\n metadata.decision_id = confidence.decisionId;\n\n const payload: Record<string, unknown> = {\n filename: fileName,\n file_hash: fileHash,\n author_name: author,\n metadata,\n };\n\n const data = await this.request(\"POST\", \"/api/proof\", { body: payload });\n return parseCertification(data);\n }\n\n async getConfidenceTrail(decisionId: string): Promise<ConfidenceTrail> {\n const data = await this.request(\n \"GET\",\n `/api/confidence-trail/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ConfidenceTrailStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n fileName: s.file_name || \"\",\n fileHash: s.file_hash || \"\",\n confidenceLevel: s.confidence_level ?? null,\n thresholdStage: s.threshold_stage ?? null,\n author: s.author || \"\",\n blockchain: {\n transactionHash: s.blockchain?.transaction_hash || \"\",\n explorerUrl: s.blockchain?.explorer_url || \"\",\n status: s.blockchain?.status || \"\",\n },\n anchoredAt: s.anchored_at || \"\",\n metadata: s.metadata || {},\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n totalAnchors: (data.total_anchors as number) || stages.length,\n currentConfidence: (data.current_confidence as number) ?? null,\n currentStage: (data.current_stage as string) ?? null,\n isFinalized: (data.is_finalized as boolean) || false,\n stages,\n };\n }\n\n async getContextDrift(decisionId: string): Promise<ContextDrift> {\n const data = await this.request(\n \"GET\",\n `/api/context-drift/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ContextDriftStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n stageIndex: s.stage_index ?? 0,\n anchoredAt: s.anchored_at || \"\",\n executionContext: (s.execution_context || {}) as ExecutionContext,\n contextBreak: s.context_break || false,\n driftedFields: s.drifted_fields || [],\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n contextCoherent: (data.context_coherent as boolean) ?? true,\n driftScore: (data.drift_score as number) ?? 0,\n fieldsMonitored: (data.fields_monitored as string[]) || [],\n fieldsDrifted: (data.fields_drifted as string[]) || [],\n fieldsStable: (data.fields_stable as string[]) || [],\n fieldsAbsent: (data.fields_absent as string[]) || [],\n totalAnchors: (data.total_anchors as number) || stages.length,\n stages,\n };\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: 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":["createHash","createHash"]}
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 ConfidenceOptions,\n ConfidenceTrail,\n ConfidenceTrailStage,\n ConfidenceTrailDrift,\n ContextDrift,\n ContextDriftStage,\n ExecutionContext,\n PolicyViolation,\n ReversibilityClass,\n} from \"./types.js\";\n\nconst VERSION = \"0.1.6\";\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 if (fourW?.reversibilityClass !== undefined)\n metadata.reversibility_class = fourW.reversibilityClass;\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 certifyWithConfidence(\n fileHash: string,\n fileName: string,\n author: string,\n confidence: ConfidenceOptions,\n fourW?: FourWOptions\n ): Promise<Certification> {\n this.requireAuth();\n\n if (confidence.confidenceLevel < 0 || confidence.confidenceLevel > 1) {\n throw new ValidationError(\n \"confidenceLevel must be between 0.0 and 1.0\",\n {}\n );\n }\n if (!confidence.decisionId || confidence.decisionId.trim().length === 0) {\n throw new ValidationError(\"decisionId is required\", {});\n }\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 metadata.confidence_level = confidence.confidenceLevel;\n metadata.threshold_stage = confidence.thresholdStage;\n metadata.decision_id = confidence.decisionId;\n if (confidence.reversibilityClass !== undefined)\n metadata.reversibility_class = confidence.reversibilityClass;\n\n const payload: Record<string, unknown> = {\n filename: fileName,\n file_hash: fileHash,\n author_name: author,\n metadata,\n };\n\n const data = await this.request(\"POST\", \"/api/proof\", { body: payload });\n return parseCertification(data);\n }\n\n async getConfidenceTrail(decisionId: string): Promise<ConfidenceTrail> {\n const data = await this.request(\n \"GET\",\n `/api/confidence-trail/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ConfidenceTrailStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n fileName: s.file_name || \"\",\n fileHash: s.file_hash || \"\",\n confidenceLevel: s.confidence_level ?? null,\n thresholdStage: s.threshold_stage ?? null,\n reversibilityClass: (s.metadata?.reversibility_class ?? null) as ReversibilityClass | null,\n author: s.author || \"\",\n blockchain: {\n transactionHash: s.blockchain?.transaction_hash || \"\",\n explorerUrl: s.blockchain?.explorer_url || \"\",\n status: s.blockchain?.status || \"\",\n },\n anchoredAt: s.anchored_at || \"\",\n metadata: s.metadata || {},\n }));\n\n const rawDrift = data.context_drift as any;\n const contextDrift: ConfidenceTrailDrift | null = rawDrift\n ? {\n contextCoherent: rawDrift.context_coherent ?? true,\n driftScore: rawDrift.drift_score ?? 0,\n fieldsMonitored: rawDrift.fields_monitored || [],\n fieldsDrifted: rawDrift.fields_drifted || [],\n fieldsStable: rawDrift.fields_stable || [],\n fieldsAbsent: rawDrift.fields_absent || [],\n }\n : null;\n\n const rawViolations = (data.policy_violations as any[]) || [];\n const policyViolations: PolicyViolation[] = rawViolations.map((v: any) => ({\n proofId: v.proof_id || \"\",\n confidenceLevel: v.confidence_level ?? null,\n reversibilityClass: v.reversibility_class as ReversibilityClass,\n thresholdStage: v.threshold_stage ?? null,\n threshold: v.threshold ?? 0.95,\n rule: v.rule || \"\",\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n totalAnchors: (data.total_anchors as number) || stages.length,\n currentConfidence: (data.current_confidence as number) ?? null,\n currentStage: (data.current_stage as string) ?? null,\n isFinalized: (data.is_finalized as boolean) || false,\n policyCompliant: (data.policy_compliant as boolean) ?? true,\n policyViolations,\n contextDrift,\n stages,\n };\n }\n\n async getContextDrift(decisionId: string): Promise<ContextDrift> {\n const data = await this.request(\n \"GET\",\n `/api/context-drift/${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n\n const rawStages = (data.stages as any[]) || [];\n const stages: ContextDriftStage[] = rawStages.map((s: any) => ({\n proofId: s.proof_id || \"\",\n stageIndex: s.stage_index ?? 0,\n anchoredAt: s.anchored_at || \"\",\n executionContext: (s.execution_context || {}) as ExecutionContext,\n contextBreak: s.context_break || false,\n driftedFields: s.drifted_fields || [],\n }));\n\n return {\n decisionId: (data.decision_id as string) || decisionId,\n contextCoherent: (data.context_coherent as boolean) ?? true,\n driftScore: (data.drift_score as number) ?? 0,\n fieldsMonitored: (data.fields_monitored as string[]) || [],\n fieldsDrifted: (data.fields_drifted as string[]) || [],\n fieldsStable: (data.fields_stable as string[]) || [],\n fieldsAbsent: (data.fields_absent as string[]) || [],\n totalAnchors: (data.total_anchors as number) || stages.length,\n stages,\n };\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: 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":["createHash","createHash"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xproof/xproof",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Official SDK for the xProof blockchain certification API — proof and accountability layer for autonomous agents",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -36,7 +36,8 @@
36
36
  "build": "tsup",
37
37
  "test": "vitest run",
38
38
  "test:watch": "vitest",
39
- "prepublishOnly": "npm run build"
39
+ "prepublishOnly": "npm run build",
40
+ "release": "npm publish --access public"
40
41
  },
41
42
  "keywords": [
42
43
  "xproof",