@xproof/xproof 0.1.8 → 0.1.9
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.
- package/dist/{client-CWrki-T_.d.mts → client-Dq5Be9On.d.mts} +39 -1
- package/dist/{client-CWrki-T_.d.ts → client-Dq5Be9On.d.ts} +39 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +95 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +94 -5
- package/dist/index.mjs.map +1 -1
- package/dist/integrations/vercel.d.mts +1 -1
- package/dist/integrations/vercel.d.ts +1 -1
- package/dist/integrations/vercel.js +93 -5
- package/dist/integrations/vercel.js.map +1 -1
- package/dist/integrations/vercel.mjs +93 -5
- package/dist/integrations/vercel.mjs.map +1 -1
- package/package.json +10 -11
package/dist/index.mjs
CHANGED
|
@@ -63,8 +63,47 @@ function hashString(data) {
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
// src/parse.ts
|
|
66
|
+
function parseTimingBreakdown(raw) {
|
|
67
|
+
const tb = {};
|
|
68
|
+
let hasAnyField = false;
|
|
69
|
+
if (raw.instruction_received_at != null) {
|
|
70
|
+
tb.instructionReceivedAt = raw.instruction_received_at;
|
|
71
|
+
hasAnyField = true;
|
|
72
|
+
}
|
|
73
|
+
if (raw.reasoning_started_at != null) {
|
|
74
|
+
tb.reasoningStartedAt = raw.reasoning_started_at;
|
|
75
|
+
hasAnyField = true;
|
|
76
|
+
}
|
|
77
|
+
if (raw.action_taken_at != null) {
|
|
78
|
+
tb.actionTakenAt = raw.action_taken_at;
|
|
79
|
+
hasAnyField = true;
|
|
80
|
+
}
|
|
81
|
+
if (raw.jurisdiction_type != null) {
|
|
82
|
+
tb.jurisdictionType = raw.jurisdiction_type;
|
|
83
|
+
hasAnyField = true;
|
|
84
|
+
}
|
|
85
|
+
if (raw.reasoning_duration_ms != null) {
|
|
86
|
+
tb.reasoningDurationMs = raw.reasoning_duration_ms;
|
|
87
|
+
hasAnyField = true;
|
|
88
|
+
}
|
|
89
|
+
if (raw.total_duration_ms != null) {
|
|
90
|
+
tb.totalDurationMs = raw.total_duration_ms;
|
|
91
|
+
hasAnyField = true;
|
|
92
|
+
}
|
|
93
|
+
return hasAnyField ? tb : void 0;
|
|
94
|
+
}
|
|
66
95
|
function parseCertification(data) {
|
|
67
96
|
const blockchain = data.blockchain || {};
|
|
97
|
+
const _meta = data.metadata;
|
|
98
|
+
const _TIMING_KEYS = [
|
|
99
|
+
"instruction_received_at",
|
|
100
|
+
"reasoning_started_at",
|
|
101
|
+
"action_taken_at",
|
|
102
|
+
"jurisdiction_type",
|
|
103
|
+
"reasoning_duration_ms",
|
|
104
|
+
"total_duration_ms"
|
|
105
|
+
];
|
|
106
|
+
const rawTiming = data.timing_breakdown ?? _meta?.timing_breakdown ?? (_meta && _TIMING_KEYS.some((k) => _meta[k] != null) ? _meta : void 0);
|
|
68
107
|
return {
|
|
69
108
|
id: data.id || data.proof_id || "",
|
|
70
109
|
fileName: data.fileName || data.filename || data.file_name || "",
|
|
@@ -76,7 +115,8 @@ function parseCertification(data) {
|
|
|
76
115
|
blockchainStatus: data.blockchainStatus || data.status || "",
|
|
77
116
|
isPublic: data.isPublic !== void 0 ? !!data.isPublic : data.is_public !== void 0 ? !!data.is_public : true,
|
|
78
117
|
certificateUrl: data.certificateUrl || data.certificate_url || "",
|
|
79
|
-
verifyUrl: data.verifyUrl || data.verify_url || ""
|
|
118
|
+
verifyUrl: data.verifyUrl || data.verify_url || "",
|
|
119
|
+
timingBreakdown: rawTiming ? parseTimingBreakdown(rawTiming) : void 0
|
|
80
120
|
};
|
|
81
121
|
}
|
|
82
122
|
function parseBatchResult(data) {
|
|
@@ -134,8 +174,15 @@ function parseRegistrationResult(data) {
|
|
|
134
174
|
};
|
|
135
175
|
}
|
|
136
176
|
|
|
177
|
+
// src/types.ts
|
|
178
|
+
var JURISDICTION_TYPES = [
|
|
179
|
+
"instruction_following",
|
|
180
|
+
"autonomous_inference",
|
|
181
|
+
"human_approved"
|
|
182
|
+
];
|
|
183
|
+
|
|
137
184
|
// src/client.ts
|
|
138
|
-
var VERSION = "0.1.
|
|
185
|
+
var VERSION = "0.1.9";
|
|
139
186
|
var DEFAULT_BASE_URL = "https://xproof.app";
|
|
140
187
|
var DEFAULT_TIMEOUT = 3e4;
|
|
141
188
|
var XProofClient = class _XProofClient {
|
|
@@ -195,7 +242,25 @@ var XProofClient = class _XProofClient {
|
|
|
195
242
|
filename: f.fileName ?? "unknown",
|
|
196
243
|
file_hash: f.fileHash
|
|
197
244
|
};
|
|
198
|
-
|
|
245
|
+
const entryMeta = f.metadata ? { ...f.metadata } : {};
|
|
246
|
+
if (f.timing !== void 0) {
|
|
247
|
+
const t = f.timing;
|
|
248
|
+
if (t.jurisdictionType !== void 0 && !JURISDICTION_TYPES.includes(t.jurisdictionType)) {
|
|
249
|
+
throw new ValidationError(
|
|
250
|
+
`timing.jurisdictionType must be one of: ${JURISDICTION_TYPES.join(", ")}`,
|
|
251
|
+
{}
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
if (t.instructionReceivedAt !== void 0)
|
|
255
|
+
entryMeta.instruction_received_at = t.instructionReceivedAt;
|
|
256
|
+
if (t.reasoningStartedAt !== void 0)
|
|
257
|
+
entryMeta.reasoning_started_at = t.reasoningStartedAt;
|
|
258
|
+
if (t.actionTakenAt !== void 0)
|
|
259
|
+
entryMeta.action_taken_at = t.actionTakenAt;
|
|
260
|
+
if (t.jurisdictionType !== void 0)
|
|
261
|
+
entryMeta.jurisdiction_type = t.jurisdictionType;
|
|
262
|
+
}
|
|
263
|
+
if (Object.keys(entryMeta).length > 0) entry.metadata = entryMeta;
|
|
199
264
|
return entry;
|
|
200
265
|
});
|
|
201
266
|
const payload = { files: entries };
|
|
@@ -205,13 +270,13 @@ var XProofClient = class _XProofClient {
|
|
|
205
270
|
return parseBatchResult(data);
|
|
206
271
|
}
|
|
207
272
|
async verify(proofId) {
|
|
208
|
-
const data = await this.request("GET", `/api/proof/${proofId}`, {
|
|
273
|
+
const data = await this.request("GET", `/api/proof/${encodeURIComponent(proofId)}`, {
|
|
209
274
|
authRequired: false
|
|
210
275
|
});
|
|
211
276
|
return parseCertification(data);
|
|
212
277
|
}
|
|
213
278
|
async verifyHash(fileHash) {
|
|
214
|
-
const data = await this.request("GET", `/api/proof/hash/${fileHash}`, {
|
|
279
|
+
const data = await this.request("GET", `/api/proof/hash/${encodeURIComponent(fileHash)}`, {
|
|
215
280
|
authRequired: false
|
|
216
281
|
});
|
|
217
282
|
return parseCertification(data);
|
|
@@ -239,6 +304,23 @@ var XProofClient = class _XProofClient {
|
|
|
239
304
|
metadata.decision_id = confidence.decisionId;
|
|
240
305
|
if (confidence.reversibilityClass !== void 0)
|
|
241
306
|
metadata.reversibility_class = confidence.reversibilityClass;
|
|
307
|
+
if (confidence.timing !== void 0) {
|
|
308
|
+
const t = confidence.timing;
|
|
309
|
+
if (t.jurisdictionType !== void 0 && !JURISDICTION_TYPES.includes(t.jurisdictionType)) {
|
|
310
|
+
throw new ValidationError(
|
|
311
|
+
`timing.jurisdictionType must be one of: ${JURISDICTION_TYPES.join(", ")}`,
|
|
312
|
+
{}
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
if (t.instructionReceivedAt !== void 0)
|
|
316
|
+
metadata.instruction_received_at = t.instructionReceivedAt;
|
|
317
|
+
if (t.reasoningStartedAt !== void 0)
|
|
318
|
+
metadata.reasoning_started_at = t.reasoningStartedAt;
|
|
319
|
+
if (t.actionTakenAt !== void 0)
|
|
320
|
+
metadata.action_taken_at = t.actionTakenAt;
|
|
321
|
+
if (t.jurisdictionType !== void 0)
|
|
322
|
+
metadata.jurisdiction_type = t.jurisdictionType;
|
|
323
|
+
}
|
|
242
324
|
const payload = {
|
|
243
325
|
filename: fileName,
|
|
244
326
|
file_hash: fileHash,
|
|
@@ -249,6 +331,9 @@ var XProofClient = class _XProofClient {
|
|
|
249
331
|
return parseCertification(data);
|
|
250
332
|
}
|
|
251
333
|
async getConfidenceTrail(decisionId) {
|
|
334
|
+
if (!decisionId || !decisionId.trim()) {
|
|
335
|
+
throw new ValidationError("decisionId is required", {});
|
|
336
|
+
}
|
|
252
337
|
const data = await this.request(
|
|
253
338
|
"GET",
|
|
254
339
|
`/api/confidence-trail/${encodeURIComponent(decisionId)}`,
|
|
@@ -302,6 +387,9 @@ var XProofClient = class _XProofClient {
|
|
|
302
387
|
};
|
|
303
388
|
}
|
|
304
389
|
async getContextDrift(decisionId) {
|
|
390
|
+
if (!decisionId || !decisionId.trim()) {
|
|
391
|
+
throw new ValidationError("decisionId is required", {});
|
|
392
|
+
}
|
|
305
393
|
const data = await this.request(
|
|
306
394
|
"GET",
|
|
307
395
|
`/api/context-drift/${encodeURIComponent(decisionId)}`,
|
|
@@ -454,6 +542,7 @@ var XProofClient = class _XProofClient {
|
|
|
454
542
|
export {
|
|
455
543
|
AuthenticationError,
|
|
456
544
|
ConflictError,
|
|
545
|
+
JURISDICTION_TYPES,
|
|
457
546
|
NotFoundError,
|
|
458
547
|
RateLimitError,
|
|
459
548
|
ServerError,
|
package/dist/index.mjs.map
CHANGED
|
@@ -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 ConfidenceTrailDrift,\n ContextDrift,\n ContextDriftStage,\n ExecutionContext,\n PolicyViolation,\n PolicyCheckResult,\n ReversibilityClass,\n} from \"./types.js\";\n\nconst VERSION = \"0.1.7\";\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 if (fourW?.reversibilityClass !== undefined)\n metadata.reversibility_class = fourW.reversibilityClass;\n\n metadata.confidence_level = confidence.confidenceLevel;\n metadata.threshold_stage = confidence.thresholdStage;\n metadata.decision_id = confidence.decisionId;\n // confidence.reversibilityClass takes priority over fourW.reversibilityClass\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 /**\n * Check policy compliance for a decision chain without fetching the full trail.\n *\n * Calls `GET /api/proofs/policy-check?decision_id=<id>` and returns a lightweight\n * compliance report: whether the chain is policy-compliant and any violations found.\n *\n * @param decisionId - The shared decision chain identifier.\n * @returns A `PolicyCheckResult` with `policyCompliant`, `policyViolations`, and metadata.\n */\n async getPolicyCheck(decisionId: string): Promise<PolicyCheckResult> {\n if (!decisionId || !decisionId.trim()) {\n throw new ValidationError(\"decisionId is required\", {});\n }\n const data = await this.request(\n \"GET\",\n `/api/proofs/policy-check?decision_id=${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n const violations = ((data.policy_violations as unknown[]) ?? []).map(\n (v) => {\n const vv = v as Record<string, unknown>;\n return {\n proofId: (vv.proof_id as string) ?? \"\",\n confidenceLevel:\n vv.confidence_level != null\n ? (vv.confidence_level as number)\n : null,\n reversibilityClass:\n (vv.reversibility_class as ReversibilityClass) ?? \"reversible\",\n thresholdStage:\n vv.threshold_stage != null\n ? (vv.threshold_stage as string)\n : null,\n threshold: (vv.threshold as number) ?? 0,\n rule: (vv.rule as string) ?? \"\",\n } satisfies PolicyViolation;\n }\n );\n return {\n decisionId: (data.decision_id as string) ?? decisionId,\n totalAnchors: (data.total_anchors as number) ?? 0,\n policyCompliant: (data.policy_compliant as boolean) ?? true,\n policyViolations: violations,\n checkedAt: (data.checked_at as string) ?? \"\",\n raw: data,\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","../src/types.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 PolicyCheckResult,\n ReversibilityClass,\n} from \"./types.js\";\nimport { JURISDICTION_TYPES } from \"./types.js\";\n\nconst VERSION = \"0.1.9\";\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 const entryMeta: Record<string, unknown> = f.metadata ? { ...f.metadata } : {};\n if (f.timing !== undefined) {\n const t = f.timing;\n if (\n t.jurisdictionType !== undefined &&\n !(JURISDICTION_TYPES as readonly string[]).includes(t.jurisdictionType)\n ) {\n throw new ValidationError(\n `timing.jurisdictionType must be one of: ${JURISDICTION_TYPES.join(\", \")}`,\n {}\n );\n }\n if (t.instructionReceivedAt !== undefined)\n entryMeta.instruction_received_at = t.instructionReceivedAt;\n if (t.reasoningStartedAt !== undefined)\n entryMeta.reasoning_started_at = t.reasoningStartedAt;\n if (t.actionTakenAt !== undefined)\n entryMeta.action_taken_at = t.actionTakenAt;\n if (t.jurisdictionType !== undefined)\n entryMeta.jurisdiction_type = t.jurisdictionType;\n }\n if (Object.keys(entryMeta).length > 0) entry.metadata = entryMeta;\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/${encodeURIComponent(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/${encodeURIComponent(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 if (fourW?.reversibilityClass !== undefined)\n metadata.reversibility_class = fourW.reversibilityClass;\n\n metadata.confidence_level = confidence.confidenceLevel;\n metadata.threshold_stage = confidence.thresholdStage;\n metadata.decision_id = confidence.decisionId;\n // confidence.reversibilityClass takes priority over fourW.reversibilityClass\n if (confidence.reversibilityClass !== undefined)\n metadata.reversibility_class = confidence.reversibilityClass;\n\n if (confidence.timing !== undefined) {\n const t = confidence.timing;\n if (\n t.jurisdictionType !== undefined &&\n !(JURISDICTION_TYPES as readonly string[]).includes(t.jurisdictionType)\n ) {\n throw new ValidationError(\n `timing.jurisdictionType must be one of: ${JURISDICTION_TYPES.join(\", \")}`,\n {}\n );\n }\n if (t.instructionReceivedAt !== undefined)\n metadata.instruction_received_at = t.instructionReceivedAt;\n if (t.reasoningStartedAt !== undefined)\n metadata.reasoning_started_at = t.reasoningStartedAt;\n if (t.actionTakenAt !== undefined)\n metadata.action_taken_at = t.actionTakenAt;\n if (t.jurisdictionType !== undefined)\n metadata.jurisdiction_type = t.jurisdictionType;\n }\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 if (!decisionId || !decisionId.trim()) {\n throw new ValidationError(\"decisionId is required\", {});\n }\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 if (!decisionId || !decisionId.trim()) {\n throw new ValidationError(\"decisionId is required\", {});\n }\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 /**\n * Check policy compliance for a decision chain without fetching the full trail.\n *\n * Calls `GET /api/proofs/policy-check?decision_id=<id>` and returns a lightweight\n * compliance report: whether the chain is policy-compliant and any violations found.\n *\n * @param decisionId - The shared decision chain identifier.\n * @returns A `PolicyCheckResult` with `policyCompliant`, `policyViolations`, and metadata.\n */\n async getPolicyCheck(decisionId: string): Promise<PolicyCheckResult> {\n if (!decisionId || !decisionId.trim()) {\n throw new ValidationError(\"decisionId is required\", {});\n }\n const data = await this.request(\n \"GET\",\n `/api/proofs/policy-check?decision_id=${encodeURIComponent(decisionId)}`,\n { authRequired: false }\n );\n const violations = ((data.policy_violations as unknown[]) ?? []).map(\n (v) => {\n const vv = v as Record<string, unknown>;\n return {\n proofId: (vv.proof_id as string) ?? \"\",\n confidenceLevel:\n vv.confidence_level != null\n ? (vv.confidence_level as number)\n : null,\n reversibilityClass:\n (vv.reversibility_class as ReversibilityClass) ?? \"reversible\",\n thresholdStage:\n vv.threshold_stage != null\n ? (vv.threshold_stage as string)\n : null,\n threshold: (vv.threshold as number) ?? 0,\n rule: (vv.rule as string) ?? \"\",\n } satisfies PolicyViolation;\n }\n );\n return {\n decisionId: (data.decision_id as string) ?? decisionId,\n totalAnchors: (data.total_anchors as number) ?? 0,\n policyCompliant: (data.policy_compliant as boolean) ?? true,\n policyViolations: violations,\n checkedAt: (data.checked_at as string) ?? \"\",\n raw: data,\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 TimingBreakdown,\n JurisdictionType,\n TrialInfo,\n} from \"./types.js\";\n\nfunction parseTimingBreakdown(\n raw: Record<string, unknown>\n): TimingBreakdown | undefined {\n const tb: TimingBreakdown = {};\n let hasAnyField = false;\n\n if (raw.instruction_received_at != null) {\n tb.instructionReceivedAt = raw.instruction_received_at as string;\n hasAnyField = true;\n }\n if (raw.reasoning_started_at != null) {\n tb.reasoningStartedAt = raw.reasoning_started_at as string;\n hasAnyField = true;\n }\n if (raw.action_taken_at != null) {\n tb.actionTakenAt = raw.action_taken_at as string;\n hasAnyField = true;\n }\n if (raw.jurisdiction_type != null) {\n tb.jurisdictionType = raw.jurisdiction_type as JurisdictionType;\n hasAnyField = true;\n }\n if (raw.reasoning_duration_ms != null) {\n tb.reasoningDurationMs = raw.reasoning_duration_ms as number;\n hasAnyField = true;\n }\n if (raw.total_duration_ms != null) {\n tb.totalDurationMs = raw.total_duration_ms as number;\n hasAnyField = true;\n }\n\n return hasAnyField ? tb : undefined;\n}\n\nexport function parseCertification(data: Record<string, unknown>): Certification {\n const blockchain = (data.blockchain as Record<string, unknown>) || {};\n\n const _meta = data.metadata as Record<string, unknown> | undefined;\n const _TIMING_KEYS = [\n \"instruction_received_at\",\n \"reasoning_started_at\",\n \"action_taken_at\",\n \"jurisdiction_type\",\n \"reasoning_duration_ms\",\n \"total_duration_ms\",\n ] as const;\n const rawTiming =\n (data.timing_breakdown as Record<string, unknown> | undefined) ??\n (_meta?.timing_breakdown as Record<string, unknown> | undefined) ??\n (_meta && _TIMING_KEYS.some((k) => _meta[k] != null) ? _meta : undefined);\n\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 timingBreakdown: rawTiming ? parseTimingBreakdown(rawTiming) : undefined,\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","export type JurisdictionType =\n | \"instruction_following\"\n | \"autonomous_inference\"\n | \"human_approved\";\n\n/**\n * All valid `JurisdictionType` values — useful for runtime validation.\n *\n * - `instruction_following` — agent executed an explicit human instruction;\n * accountability follows the principal.\n * - `autonomous_inference` — agent reached its own conclusion; agent and its\n * operator bear primary accountability.\n * - `human_approved` — agent recommended, human approved; shared accountability.\n */\nexport const JURISDICTION_TYPES: readonly JurisdictionType[] = [\n \"instruction_following\",\n \"autonomous_inference\",\n \"human_approved\",\n] as const;\n\n/**\n * Decomposed decision timeline for forensic audit.\n *\n * Pass a `TimingBreakdown` to `certifyWithConfidence()` via `confidence.timing`\n * to anchor the full decision chronology on-chain.\n *\n * All timestamp fields are optional ISO8601 strings with a timezone offset\n * (e.g. `\"2026-04-20T14:31:58Z\"`).\n *\n * When read back from the API the server populates two computed fields:\n * - `reasoningDurationMs` — ms between `reasoningStartedAt` and `actionTakenAt`\n * - `totalDurationMs` — ms between `instructionReceivedAt` and `actionTakenAt`\n */\nexport interface TimingBreakdown {\n instructionReceivedAt?: string;\n reasoningStartedAt?: string;\n actionTakenAt?: string;\n jurisdictionType?: JurisdictionType;\n /** Computed by server; present in API responses only. */\n reasoningDurationMs?: number;\n /** Computed by server; present in API responses only. */\n totalDurationMs?: number;\n}\n\nexport interface Certification {\n id: string;\n fileName: string;\n fileHash: string;\n transactionHash: string;\n transactionUrl: string;\n createdAt: string;\n authorName: string;\n blockchainStatus: string;\n isPublic: boolean;\n certificateUrl: string;\n verifyUrl: string;\n timingBreakdown?: TimingBreakdown;\n}\n\nexport interface BatchResultSummary {\n total: number;\n created: number;\n existing: number;\n certified: number;\n failed: number;\n}\n\nexport interface BatchResult {\n batchId: string;\n results: Certification[];\n summary: BatchResultSummary;\n}\n\nexport interface PricingTier {\n minCertifications: number;\n maxCertifications: number | null;\n priceUsd: number;\n}\n\nexport interface PricingInfo {\n protocol: string;\n version: string;\n priceUsd: number;\n tiers: PricingTier[];\n paymentMethods: Array<Record<string, string>>;\n raw: Record<string, unknown>;\n}\n\nexport interface TrialInfo {\n quota: number;\n used: number;\n remaining: number;\n}\n\nexport interface RegistrationResult {\n apiKey: string;\n agentName: string;\n trial: TrialInfo;\n endpoints: Record<string, string>;\n raw: Record<string, unknown>;\n}\n\nexport interface FourWOptions {\n who?: string;\n what?: string;\n when?: string;\n why?: string;\n reversibilityClass?: ReversibilityClass;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CertifyHashOptions extends FourWOptions {\n fileHash: string;\n fileName: string;\n author: string;\n}\n\nexport type ThresholdStage = \"initial\" | \"partial\" | \"pre-commitment\" | \"final\";\n\nexport type ReversibilityClass = \"reversible\" | \"costly\" | \"irreversible\";\n\nexport interface ConfidenceOptions {\n confidenceLevel: number;\n thresholdStage: ThresholdStage;\n decisionId: string;\n reversibilityClass?: ReversibilityClass;\n /** Optional timing breakdown to anchor the full decision chronology on-chain. */\n timing?: TimingBreakdown;\n}\n\nexport interface ConfidenceTrailStage {\n proofId: string;\n fileName: string;\n fileHash: string;\n confidenceLevel: number | null;\n thresholdStage: string | null;\n reversibilityClass: ReversibilityClass | null;\n author: string;\n blockchain: {\n transactionHash: string;\n explorerUrl: string;\n status: string;\n };\n anchoredAt: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface ConfidenceTrailDrift {\n contextCoherent: boolean;\n driftScore: number;\n fieldsMonitored: string[];\n fieldsDrifted: string[];\n fieldsStable: string[];\n fieldsAbsent: string[];\n}\n\nexport interface PolicyViolation {\n proofId: string;\n confidenceLevel: number | null;\n reversibilityClass: ReversibilityClass;\n thresholdStage: string | null;\n threshold: number;\n rule: string;\n}\n\nexport interface ConfidenceTrail {\n decisionId: string;\n totalAnchors: number;\n currentConfidence: number | null;\n currentStage: string | null;\n isFinalized: boolean;\n policyCompliant: boolean;\n policyViolations: PolicyViolation[];\n contextDrift: ConfidenceTrailDrift | null;\n stages: ConfidenceTrailStage[];\n}\n\nexport interface PolicyCheckResult {\n decisionId: string;\n totalAnchors: number;\n policyCompliant: boolean;\n policyViolations: PolicyViolation[];\n checkedAt: string;\n raw: Record<string, unknown>;\n}\n\nexport interface BatchFileEntry {\n fileHash: string;\n fileName?: string;\n author?: string;\n metadata?: Record<string, unknown>;\n timing?: TimingBreakdown;\n}\n\nexport interface XProofClientOptions {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n}\n\nexport interface ExecutionContext {\n model_hash: string | null;\n tools_version: string | null;\n strategy_snapshot: string | null;\n operator_scope: string | null;\n [key: string]: string | null;\n}\n\nexport interface ContextDriftStage {\n proofId: string;\n stageIndex: number;\n anchoredAt: string;\n executionContext: ExecutionContext;\n contextBreak: boolean;\n driftedFields: string[];\n}\n\nexport interface ContextDrift {\n decisionId: string;\n contextCoherent: boolean;\n driftScore: number;\n fieldsMonitored: string[];\n fieldsDrifted: string[];\n fieldsStable: string[];\n fieldsAbsent: string[];\n totalAnchors: number;\n stages: ContextDriftStage[];\n}\n"],"mappings":"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","names":[]}
|
|
@@ -84,8 +84,47 @@ async function hashFile(path) {
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
// src/parse.ts
|
|
87
|
+
function parseTimingBreakdown(raw) {
|
|
88
|
+
const tb = {};
|
|
89
|
+
let hasAnyField = false;
|
|
90
|
+
if (raw.instruction_received_at != null) {
|
|
91
|
+
tb.instructionReceivedAt = raw.instruction_received_at;
|
|
92
|
+
hasAnyField = true;
|
|
93
|
+
}
|
|
94
|
+
if (raw.reasoning_started_at != null) {
|
|
95
|
+
tb.reasoningStartedAt = raw.reasoning_started_at;
|
|
96
|
+
hasAnyField = true;
|
|
97
|
+
}
|
|
98
|
+
if (raw.action_taken_at != null) {
|
|
99
|
+
tb.actionTakenAt = raw.action_taken_at;
|
|
100
|
+
hasAnyField = true;
|
|
101
|
+
}
|
|
102
|
+
if (raw.jurisdiction_type != null) {
|
|
103
|
+
tb.jurisdictionType = raw.jurisdiction_type;
|
|
104
|
+
hasAnyField = true;
|
|
105
|
+
}
|
|
106
|
+
if (raw.reasoning_duration_ms != null) {
|
|
107
|
+
tb.reasoningDurationMs = raw.reasoning_duration_ms;
|
|
108
|
+
hasAnyField = true;
|
|
109
|
+
}
|
|
110
|
+
if (raw.total_duration_ms != null) {
|
|
111
|
+
tb.totalDurationMs = raw.total_duration_ms;
|
|
112
|
+
hasAnyField = true;
|
|
113
|
+
}
|
|
114
|
+
return hasAnyField ? tb : void 0;
|
|
115
|
+
}
|
|
87
116
|
function parseCertification(data) {
|
|
88
117
|
const blockchain = data.blockchain || {};
|
|
118
|
+
const _meta = data.metadata;
|
|
119
|
+
const _TIMING_KEYS = [
|
|
120
|
+
"instruction_received_at",
|
|
121
|
+
"reasoning_started_at",
|
|
122
|
+
"action_taken_at",
|
|
123
|
+
"jurisdiction_type",
|
|
124
|
+
"reasoning_duration_ms",
|
|
125
|
+
"total_duration_ms"
|
|
126
|
+
];
|
|
127
|
+
const rawTiming = data.timing_breakdown ?? _meta?.timing_breakdown ?? (_meta && _TIMING_KEYS.some((k) => _meta[k] != null) ? _meta : void 0);
|
|
89
128
|
return {
|
|
90
129
|
id: data.id || data.proof_id || "",
|
|
91
130
|
fileName: data.fileName || data.filename || data.file_name || "",
|
|
@@ -97,7 +136,8 @@ function parseCertification(data) {
|
|
|
97
136
|
blockchainStatus: data.blockchainStatus || data.status || "",
|
|
98
137
|
isPublic: data.isPublic !== void 0 ? !!data.isPublic : data.is_public !== void 0 ? !!data.is_public : true,
|
|
99
138
|
certificateUrl: data.certificateUrl || data.certificate_url || "",
|
|
100
|
-
verifyUrl: data.verifyUrl || data.verify_url || ""
|
|
139
|
+
verifyUrl: data.verifyUrl || data.verify_url || "",
|
|
140
|
+
timingBreakdown: rawTiming ? parseTimingBreakdown(rawTiming) : void 0
|
|
101
141
|
};
|
|
102
142
|
}
|
|
103
143
|
function parseBatchResult(data) {
|
|
@@ -155,8 +195,15 @@ function parseRegistrationResult(data) {
|
|
|
155
195
|
};
|
|
156
196
|
}
|
|
157
197
|
|
|
198
|
+
// src/types.ts
|
|
199
|
+
var JURISDICTION_TYPES = [
|
|
200
|
+
"instruction_following",
|
|
201
|
+
"autonomous_inference",
|
|
202
|
+
"human_approved"
|
|
203
|
+
];
|
|
204
|
+
|
|
158
205
|
// src/client.ts
|
|
159
|
-
var VERSION = "0.1.
|
|
206
|
+
var VERSION = "0.1.9";
|
|
160
207
|
var DEFAULT_BASE_URL = "https://xproof.app";
|
|
161
208
|
var DEFAULT_TIMEOUT = 3e4;
|
|
162
209
|
var XProofClient = class _XProofClient {
|
|
@@ -216,7 +263,25 @@ var XProofClient = class _XProofClient {
|
|
|
216
263
|
filename: f.fileName ?? "unknown",
|
|
217
264
|
file_hash: f.fileHash
|
|
218
265
|
};
|
|
219
|
-
|
|
266
|
+
const entryMeta = f.metadata ? { ...f.metadata } : {};
|
|
267
|
+
if (f.timing !== void 0) {
|
|
268
|
+
const t = f.timing;
|
|
269
|
+
if (t.jurisdictionType !== void 0 && !JURISDICTION_TYPES.includes(t.jurisdictionType)) {
|
|
270
|
+
throw new ValidationError(
|
|
271
|
+
`timing.jurisdictionType must be one of: ${JURISDICTION_TYPES.join(", ")}`,
|
|
272
|
+
{}
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
if (t.instructionReceivedAt !== void 0)
|
|
276
|
+
entryMeta.instruction_received_at = t.instructionReceivedAt;
|
|
277
|
+
if (t.reasoningStartedAt !== void 0)
|
|
278
|
+
entryMeta.reasoning_started_at = t.reasoningStartedAt;
|
|
279
|
+
if (t.actionTakenAt !== void 0)
|
|
280
|
+
entryMeta.action_taken_at = t.actionTakenAt;
|
|
281
|
+
if (t.jurisdictionType !== void 0)
|
|
282
|
+
entryMeta.jurisdiction_type = t.jurisdictionType;
|
|
283
|
+
}
|
|
284
|
+
if (Object.keys(entryMeta).length > 0) entry.metadata = entryMeta;
|
|
220
285
|
return entry;
|
|
221
286
|
});
|
|
222
287
|
const payload = { files: entries };
|
|
@@ -226,13 +291,13 @@ var XProofClient = class _XProofClient {
|
|
|
226
291
|
return parseBatchResult(data);
|
|
227
292
|
}
|
|
228
293
|
async verify(proofId) {
|
|
229
|
-
const data = await this.request("GET", `/api/proof/${proofId}`, {
|
|
294
|
+
const data = await this.request("GET", `/api/proof/${encodeURIComponent(proofId)}`, {
|
|
230
295
|
authRequired: false
|
|
231
296
|
});
|
|
232
297
|
return parseCertification(data);
|
|
233
298
|
}
|
|
234
299
|
async verifyHash(fileHash) {
|
|
235
|
-
const data = await this.request("GET", `/api/proof/hash/${fileHash}`, {
|
|
300
|
+
const data = await this.request("GET", `/api/proof/hash/${encodeURIComponent(fileHash)}`, {
|
|
236
301
|
authRequired: false
|
|
237
302
|
});
|
|
238
303
|
return parseCertification(data);
|
|
@@ -260,6 +325,23 @@ var XProofClient = class _XProofClient {
|
|
|
260
325
|
metadata.decision_id = confidence.decisionId;
|
|
261
326
|
if (confidence.reversibilityClass !== void 0)
|
|
262
327
|
metadata.reversibility_class = confidence.reversibilityClass;
|
|
328
|
+
if (confidence.timing !== void 0) {
|
|
329
|
+
const t = confidence.timing;
|
|
330
|
+
if (t.jurisdictionType !== void 0 && !JURISDICTION_TYPES.includes(t.jurisdictionType)) {
|
|
331
|
+
throw new ValidationError(
|
|
332
|
+
`timing.jurisdictionType must be one of: ${JURISDICTION_TYPES.join(", ")}`,
|
|
333
|
+
{}
|
|
334
|
+
);
|
|
335
|
+
}
|
|
336
|
+
if (t.instructionReceivedAt !== void 0)
|
|
337
|
+
metadata.instruction_received_at = t.instructionReceivedAt;
|
|
338
|
+
if (t.reasoningStartedAt !== void 0)
|
|
339
|
+
metadata.reasoning_started_at = t.reasoningStartedAt;
|
|
340
|
+
if (t.actionTakenAt !== void 0)
|
|
341
|
+
metadata.action_taken_at = t.actionTakenAt;
|
|
342
|
+
if (t.jurisdictionType !== void 0)
|
|
343
|
+
metadata.jurisdiction_type = t.jurisdictionType;
|
|
344
|
+
}
|
|
263
345
|
const payload = {
|
|
264
346
|
filename: fileName,
|
|
265
347
|
file_hash: fileHash,
|
|
@@ -270,6 +352,9 @@ var XProofClient = class _XProofClient {
|
|
|
270
352
|
return parseCertification(data);
|
|
271
353
|
}
|
|
272
354
|
async getConfidenceTrail(decisionId) {
|
|
355
|
+
if (!decisionId || !decisionId.trim()) {
|
|
356
|
+
throw new ValidationError("decisionId is required", {});
|
|
357
|
+
}
|
|
273
358
|
const data = await this.request(
|
|
274
359
|
"GET",
|
|
275
360
|
`/api/confidence-trail/${encodeURIComponent(decisionId)}`,
|
|
@@ -323,6 +408,9 @@ var XProofClient = class _XProofClient {
|
|
|
323
408
|
};
|
|
324
409
|
}
|
|
325
410
|
async getContextDrift(decisionId) {
|
|
411
|
+
if (!decisionId || !decisionId.trim()) {
|
|
412
|
+
throw new ValidationError("decisionId is required", {});
|
|
413
|
+
}
|
|
326
414
|
const data = await this.request(
|
|
327
415
|
"GET",
|
|
328
416
|
`/api/context-drift/${encodeURIComponent(decisionId)}`,
|