evidential-protocol 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,83 @@
1
+ /**
2
+ * EP-1 Phase 4: Content Pipeline Integration
3
+ *
4
+ * Tags generated content with inline evidence markers,
5
+ * computes content trust scores, and gates publishing.
6
+ */
7
+ import { type EvidenceClass, type ContentEvidenceMarker, type TrustScore } from "./types.js";
8
+ /** A tagged sentence within content. */
9
+ export interface TaggedSentence {
10
+ /** Original sentence text. */
11
+ text: string;
12
+ /** Evidence marker if tagged. */
13
+ marker?: ContentEvidenceMarker;
14
+ /** Whether this sentence makes a claim that should be tagged. */
15
+ isClaim: boolean;
16
+ }
17
+ /** Result of content analysis. */
18
+ export interface ContentAnalysis {
19
+ /** All sentences in the content. */
20
+ sentences: TaggedSentence[];
21
+ /** Extracted evidence markers. */
22
+ markers: ContentEvidenceMarker[];
23
+ /** Trust score based on markers. */
24
+ trust: TrustScore;
25
+ /** Display string. */
26
+ display: string;
27
+ /** Sentences that appear to be claims but lack markers. */
28
+ untagged_claims: string[];
29
+ /** Content with markers stripped (clean version). */
30
+ clean_text: string;
31
+ /** Whether content passes the publish gate. */
32
+ publishable: boolean;
33
+ }
34
+ /**
35
+ * Detect if a sentence contains a factual claim that should be evidentially tagged.
36
+ */
37
+ export declare function isClaim(sentence: string): boolean;
38
+ /**
39
+ * Strip evidence markers from content, returning clean text.
40
+ */
41
+ export declare function stripMarkers(content: string): string;
42
+ /**
43
+ * Analyze content for evidential completeness.
44
+ */
45
+ export declare function analyzeContent(content: string): ContentAnalysis;
46
+ /**
47
+ * Tag a sentence with an evidence marker.
48
+ */
49
+ export declare function tagSentence(sentence: string, cls: EvidenceClass, source: string, confidence?: number): string;
50
+ /**
51
+ * Auto-tag content by applying evidence markers to detected claims.
52
+ * Uses a default classification function to guess the evidence class.
53
+ */
54
+ export declare function autoTag(content: string, classifier: (sentence: string) => ContentEvidenceMarker | null): string;
55
+ /** Publish gate result. */
56
+ export interface PublishGateResult {
57
+ /** Whether content is approved for publishing. */
58
+ approved: boolean;
59
+ /** Reason if blocked. */
60
+ reason?: string;
61
+ /** Trust score. */
62
+ trust: TrustScore;
63
+ /** Number of untagged claims (claims without evidence). */
64
+ untagged_claims: number;
65
+ /** Recommendations for improvement. */
66
+ recommendations: string[];
67
+ }
68
+ /**
69
+ * Check if content passes the publish gate.
70
+ *
71
+ * Rules:
72
+ * 1. Trust score must be >= threshold (default 0.5)
73
+ * 2. No more than max_untagged claims without evidence markers
74
+ * 3. No conjecture claims without explicit reasoning
75
+ */
76
+ export declare function publishGate(content: string, opts?: {
77
+ trust_threshold?: number;
78
+ max_untagged?: number;
79
+ require_all_tagged?: boolean;
80
+ }): PublishGateResult;
81
+ /** Render content with visual evidence indicators for human review. */
82
+ export declare function renderForReview(content: string): string;
83
+ //# sourceMappingURL=content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EAGhB,MAAM,YAAY,CAAC;AAepB,wCAAwC;AACxC,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,iEAAiE;IACjE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,kCAAkC;AAClC,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,kCAAkC;IAClC,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,oCAAoC;IACpC,KAAK,EAAE,UAAU,CAAC;IAClB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,WAAW,EAAE,OAAO,CAAC;CACtB;AA4BD;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAejD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CA2D/D;AAMD;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,qBAAqB,GAAG,IAAI,GAC7D,MAAM,CAkBR;AAMD,2BAA2B;AAC3B,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,KAAK,EAAE,UAAU,CAAC;IAClB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IACJ,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CACzB,GACL,iBAAiB,CAkDnB;AAMD,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA+BvD"}
@@ -0,0 +1,218 @@
1
+ /**
2
+ * EP-1 Phase 4: Content Pipeline Integration
3
+ *
4
+ * Tags generated content with inline evidence markers,
5
+ * computes content trust scores, and gates publishing.
6
+ */
7
+ import { CONFIDENCE_FLOORS, } from "./types.js";
8
+ import { formatContentMarker, extractMarkers, computeTrustScore, formatTrustDisplay, evidence, } from "./schema.js";
9
+ /** Patterns that indicate a claim vs. narrative. */
10
+ const CLAIM_INDICATORS = [
11
+ /\b(?:is|are|was|were|has|have|had)\b.*\b(?:the|a|an)\b/i,
12
+ /\b\d+[\d,.]*\s*(?:%|percent|million|billion|thousand|USD|\$|SOL|ETH|BTC)\b/i,
13
+ /\$\d/i,
14
+ /\d+%/i,
15
+ /\b\d+\s+(?:MCP|servers?|tools?|repos?|agents?|teams?|competitors?)\b/i,
16
+ /\bzero\s+(?:direct\s+)?competitors?\b/i,
17
+ /\b(?:never|always|every|all|none|no one)\b/i,
18
+ /\b(?:first|only|largest|smallest|fastest|best|worst|most|least)\b/i,
19
+ /\b(?:grew|growth|increase|decrease|rise|fell|decline|triple|double)\b/i,
20
+ /\b(?:will|shall|must|should|can|could|would|might)\b.*\b(?:increase|decrease|grow|shrink|rise|fall|improve|decline)\b/i,
21
+ /\b(?:estimated|projected|expected|predicted|forecast)\b/i,
22
+ /\b(?:according to|reports? (?:say|show|indicate)|study (?:found|shows))\b/i,
23
+ /\b(?:market\s+(?:size|cap|opportunity|share))\b/i,
24
+ /\b(?:revenue|profit|cost|price|valuation|funding|raised)\b/i,
25
+ ];
26
+ /** Patterns that indicate non-claims (narrative, questions, etc.). */
27
+ const NON_CLAIM_PATTERNS = [
28
+ /^(?:hey|hi|hello|dear|thanks|thank you)/i,
29
+ /\?$/,
30
+ /^(?:best|regards|sincerely|cheers)/i,
31
+ /^[-*•]\s/, // list items are context, not claims
32
+ ];
33
+ /**
34
+ * Detect if a sentence contains a factual claim that should be evidentially tagged.
35
+ */
36
+ export function isClaim(sentence) {
37
+ const trimmed = sentence.trim();
38
+ if (trimmed.length < 10)
39
+ return false;
40
+ // Skip non-claims
41
+ for (const pattern of NON_CLAIM_PATTERNS) {
42
+ if (pattern.test(trimmed))
43
+ return false;
44
+ }
45
+ // Check for claim indicators
46
+ for (const pattern of CLAIM_INDICATORS) {
47
+ if (pattern.test(trimmed))
48
+ return true;
49
+ }
50
+ return false;
51
+ }
52
+ /**
53
+ * Strip evidence markers from content, returning clean text.
54
+ */
55
+ export function stripMarkers(content) {
56
+ return content
57
+ .replace(/\s*\[ev:(?:direct|inferred|reported|conjecture)\|[^|]+\|[0-9.]+\]/g, "")
58
+ .replace(/\n{3,}/g, "\n\n")
59
+ .trim();
60
+ }
61
+ /**
62
+ * Analyze content for evidential completeness.
63
+ */
64
+ export function analyzeContent(content) {
65
+ const markers = extractMarkers(content);
66
+ const cleanText = stripMarkers(content);
67
+ // Split into sentences (rough but practical)
68
+ const sentences = cleanText
69
+ .split(/(?<=[.!?])\s+/)
70
+ .filter((s) => s.trim().length > 0);
71
+ const tagged = [];
72
+ const untaggedClaims = [];
73
+ for (const sentence of sentences) {
74
+ const isClaimSentence = isClaim(sentence);
75
+ // Check if this sentence has a marker in the original content
76
+ const sentenceInOriginal = content.includes(sentence.trim());
77
+ let marker;
78
+ if (sentenceInOriginal) {
79
+ // Look for marker immediately after this sentence in original
80
+ const idx = content.indexOf(sentence.trim());
81
+ const afterSentence = content.slice(idx + sentence.trim().length, idx + sentence.trim().length + 100);
82
+ const markerMatch = afterSentence.match(/^\s*\[ev:(direct|inferred|reported|conjecture)\|([^|]+)\|([0-9.]+)\]/);
83
+ if (markerMatch) {
84
+ marker = {
85
+ class: markerMatch[1],
86
+ source: markerMatch[2],
87
+ confidence: parseFloat(markerMatch[3]),
88
+ };
89
+ }
90
+ }
91
+ tagged.push({ text: sentence, marker, isClaim: isClaimSentence });
92
+ if (isClaimSentence && !marker) {
93
+ untaggedClaims.push(sentence);
94
+ }
95
+ }
96
+ // Compute trust from markers
97
+ const markerClaims = markers.map((m, i) => ({
98
+ claim: `marker-${i}`,
99
+ evidence: evidence(m.class, m.source, { confidence: m.confidence }),
100
+ }));
101
+ const trust = computeTrustScore(markerClaims);
102
+ return {
103
+ sentences: tagged,
104
+ markers,
105
+ trust,
106
+ display: formatTrustDisplay(trust),
107
+ untagged_claims: untaggedClaims,
108
+ clean_text: cleanText,
109
+ publishable: markers.length > 0 ? trust.score >= 0.5 : untaggedClaims.length === 0,
110
+ };
111
+ }
112
+ // ---------------------------------------------------------------------------
113
+ // Content Tagging Helpers
114
+ // ---------------------------------------------------------------------------
115
+ /**
116
+ * Tag a sentence with an evidence marker.
117
+ */
118
+ export function tagSentence(sentence, cls, source, confidence) {
119
+ const conf = confidence ?? CONFIDENCE_FLOORS[cls];
120
+ return `${sentence} ${formatContentMarker({ class: cls, source, confidence: conf })}`;
121
+ }
122
+ /**
123
+ * Auto-tag content by applying evidence markers to detected claims.
124
+ * Uses a default classification function to guess the evidence class.
125
+ */
126
+ export function autoTag(content, classifier) {
127
+ const sentences = content.split(/(?<=[.!?])\s+/);
128
+ const result = [];
129
+ for (const sentence of sentences) {
130
+ if (isClaim(sentence)) {
131
+ const marker = classifier(sentence);
132
+ if (marker) {
133
+ result.push(`${sentence} ${formatContentMarker(marker)}`);
134
+ }
135
+ else {
136
+ result.push(sentence);
137
+ }
138
+ }
139
+ else {
140
+ result.push(sentence);
141
+ }
142
+ }
143
+ return result.join(" ");
144
+ }
145
+ /**
146
+ * Check if content passes the publish gate.
147
+ *
148
+ * Rules:
149
+ * 1. Trust score must be >= threshold (default 0.5)
150
+ * 2. No more than max_untagged claims without evidence markers
151
+ * 3. No conjecture claims without explicit reasoning
152
+ */
153
+ export function publishGate(content, opts = {}) {
154
+ const threshold = opts.trust_threshold ?? 0.5;
155
+ const maxUntagged = opts.max_untagged ?? 2;
156
+ const requireAllTagged = opts.require_all_tagged ?? false;
157
+ const analysis = analyzeContent(content);
158
+ const recommendations = [];
159
+ // Check trust score
160
+ if (analysis.markers.length > 0 && analysis.trust.score < threshold) {
161
+ recommendations.push(`Trust score ${analysis.trust.score} is below threshold ${threshold}. Add more direct/inferred evidence.`);
162
+ }
163
+ // Check untagged claims
164
+ if (analysis.untagged_claims.length > maxUntagged) {
165
+ recommendations.push(`${analysis.untagged_claims.length} claims lack evidence markers. Tag these with [ev:class|source|confidence].`);
166
+ for (const claim of analysis.untagged_claims.slice(0, 5)) {
167
+ recommendations.push(` - "${claim.slice(0, 80)}..."`);
168
+ }
169
+ }
170
+ // Check for conjecture without reasoning
171
+ const conjectureMarkers = analysis.markers.filter((m) => m.class === "conjecture");
172
+ if (conjectureMarkers.length > 0) {
173
+ recommendations.push(`${conjectureMarkers.length} conjecture markers found. Consider upgrading with stronger evidence or adding reasoning.`);
174
+ }
175
+ const approved = (analysis.markers.length === 0 || analysis.trust.score >= threshold) &&
176
+ (requireAllTagged
177
+ ? analysis.untagged_claims.length === 0
178
+ : analysis.untagged_claims.length <= maxUntagged);
179
+ return {
180
+ approved,
181
+ reason: approved
182
+ ? undefined
183
+ : recommendations[0] ?? "Content did not pass publish gate",
184
+ trust: analysis.trust,
185
+ untagged_claims: analysis.untagged_claims.length,
186
+ recommendations,
187
+ };
188
+ }
189
+ // ---------------------------------------------------------------------------
190
+ // Markdown Renderer
191
+ // ---------------------------------------------------------------------------
192
+ /** Render content with visual evidence indicators for human review. */
193
+ export function renderForReview(content) {
194
+ const icons = {
195
+ direct: "●",
196
+ inferred: "◐",
197
+ reported: "○",
198
+ conjecture: "◌",
199
+ };
200
+ // Replace markers with visual indicators
201
+ let rendered = content.replace(/\[ev:(direct|inferred|reported|conjecture)\|([^|]+)\|([0-9.]+)\]/g, (_match, cls, source, conf) => {
202
+ const icon = icons[cls] ?? "?";
203
+ return `**${icon}** ^${cls}:${source}:${conf}^`;
204
+ });
205
+ // Add legend at bottom
206
+ const analysis = analyzeContent(content);
207
+ rendered += "\n\n---\n";
208
+ rendered += `**Evidence Legend:** ● Direct | ◐ Inferred | ○ Reported | ◌ Conjecture\n`;
209
+ rendered += `**Trust:** ${analysis.display}\n`;
210
+ if (analysis.untagged_claims.length > 0) {
211
+ rendered += `\n**Untagged claims (${analysis.untagged_claims.length}):**\n`;
212
+ for (const c of analysis.untagged_claims.slice(0, 10)) {
213
+ rendered += `- ⚠ ${c.slice(0, 120)}\n`;
214
+ }
215
+ }
216
+ return rendered;
217
+ }
218
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * EP-1 Phase 5: Dashboard & Audit Trail
3
+ *
4
+ * Generates an HTML dashboard from evidential responses.
5
+ * Deploys as a static page to Cloudflare Pages.
6
+ */
7
+ import { type EvidenceClass, type EvidentialResponse, type TrustScore } from "./types.js";
8
+ /** Audit log entry. */
9
+ export interface AuditEntry {
10
+ timestamp: string;
11
+ producer: string;
12
+ action: "claim" | "inherit" | "verify" | "degrade" | "publish_gate";
13
+ claim: string;
14
+ evidence_class: EvidenceClass;
15
+ confidence: number;
16
+ source: string;
17
+ detail?: string;
18
+ }
19
+ /** Extract audit entries from an EvidentialResponse. */
20
+ export declare function extractAudit(resp: EvidentialResponse): AuditEntry[];
21
+ /** Dashboard data for rendering. */
22
+ export interface DashboardData {
23
+ generated_at: string;
24
+ total_responses: number;
25
+ total_claims: number;
26
+ overall_trust: TrustScore;
27
+ overall_display: string;
28
+ producers: ProducerSummary[];
29
+ class_distribution: Record<EvidenceClass, number>;
30
+ degradation_count: number;
31
+ review_required: number;
32
+ audit_trail: AuditEntry[];
33
+ }
34
+ /** Summary per producer/agent. */
35
+ export interface ProducerSummary {
36
+ name: string;
37
+ claims: number;
38
+ trust: TrustScore;
39
+ display: string;
40
+ last_active: string;
41
+ degradations: number;
42
+ }
43
+ /** Build dashboard data from multiple evidential responses. */
44
+ export declare function buildDashboardData(responses: EvidentialResponse[]): DashboardData;
45
+ /** Generate a full HTML dashboard page. */
46
+ export declare function renderDashboardHtml(data: DashboardData): string;
47
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAEvB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAQpB,uBAAuB;AACvB,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,aAAa,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU,EAAE,CAqCnE;AAMD,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,UAAU,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAClD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,kCAAkC;AAClC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,kBAAkB,EAAE,GAC9B,aAAa,CAkEf;AAMD,2CAA2C;AAC3C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAgK/D"}
@@ -0,0 +1,264 @@
1
+ /**
2
+ * EP-1 Phase 5: Dashboard & Audit Trail
3
+ *
4
+ * Generates an HTML dashboard from evidential responses.
5
+ * Deploys as a static page to Cloudflare Pages.
6
+ */
7
+ import { computeTrustScore, formatTrustDisplay } from "./schema.js";
8
+ import { checkDegradation } from "./middleware.js";
9
+ /** Extract audit entries from an EvidentialResponse. */
10
+ export function extractAudit(resp) {
11
+ const entries = [];
12
+ for (const c of resp.claims) {
13
+ const isInherited = c.evidence.source.includes("<-");
14
+ const isVerified = c.refs?.some((r) => r.startsWith("verified-by:"));
15
+ entries.push({
16
+ timestamp: c.evidence.timestamp,
17
+ producer: resp.producer,
18
+ action: isVerified ? "verify" : isInherited ? "inherit" : "claim",
19
+ claim: c.claim,
20
+ evidence_class: c.evidence.class,
21
+ confidence: c.evidence.confidence,
22
+ source: c.evidence.source,
23
+ detail: c.evidence.reasoning,
24
+ });
25
+ }
26
+ // Add degradation events
27
+ const degradations = checkDegradation(resp);
28
+ for (const d of degradations) {
29
+ entries.push({
30
+ timestamp: d.timestamp,
31
+ producer: resp.producer,
32
+ action: "degrade",
33
+ claim: d.claim_id,
34
+ evidence_class: d.to_class,
35
+ confidence: 0,
36
+ source: d.reason,
37
+ detail: `${d.from_class} → ${d.to_class}`,
38
+ });
39
+ }
40
+ return entries.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
41
+ }
42
+ /** Build dashboard data from multiple evidential responses. */
43
+ export function buildDashboardData(responses) {
44
+ const allClaims = responses.flatMap((r) => r.claims);
45
+ const overallTrust = computeTrustScore(allClaims);
46
+ const distribution = {
47
+ direct: 0,
48
+ inferred: 0,
49
+ reported: 0,
50
+ conjecture: 0,
51
+ };
52
+ for (const c of allClaims) {
53
+ distribution[c.evidence.class]++;
54
+ }
55
+ // Group by producer
56
+ const producerMap = new Map();
57
+ for (const r of responses) {
58
+ const existing = producerMap.get(r.producer) ?? [];
59
+ existing.push(r);
60
+ producerMap.set(r.producer, existing);
61
+ }
62
+ const producers = [];
63
+ let totalDegradations = 0;
64
+ for (const [name, resps] of producerMap) {
65
+ const claims = resps.flatMap((r) => r.claims);
66
+ const trust = computeTrustScore(claims);
67
+ const degradations = resps.flatMap((r) => checkDegradation(r));
68
+ totalDegradations += degradations.length;
69
+ const lastActive = resps
70
+ .map((r) => r.produced_at)
71
+ .sort()
72
+ .pop() ?? "";
73
+ producers.push({
74
+ name,
75
+ claims: claims.length,
76
+ trust,
77
+ display: formatTrustDisplay(trust),
78
+ last_active: lastActive,
79
+ degradations: degradations.length,
80
+ });
81
+ }
82
+ producers.sort((a, b) => b.trust.score - a.trust.score);
83
+ const auditTrail = responses.flatMap((r) => extractAudit(r));
84
+ auditTrail.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
85
+ return {
86
+ generated_at: new Date().toISOString(),
87
+ total_responses: responses.length,
88
+ total_claims: allClaims.length,
89
+ overall_trust: overallTrust,
90
+ overall_display: formatTrustDisplay(overallTrust),
91
+ producers,
92
+ class_distribution: distribution,
93
+ degradation_count: totalDegradations,
94
+ review_required: producers.filter((p) => p.trust.requires_review).length,
95
+ audit_trail: auditTrail.slice(0, 100), // Last 100 entries
96
+ };
97
+ }
98
+ // ---------------------------------------------------------------------------
99
+ // HTML Renderer
100
+ // ---------------------------------------------------------------------------
101
+ /** Generate a full HTML dashboard page. */
102
+ export function renderDashboardHtml(data) {
103
+ const classColors = {
104
+ direct: "#22c55e",
105
+ inferred: "#3b82f6",
106
+ reported: "#eab308",
107
+ conjecture: "#ef4444",
108
+ };
109
+ const classIcons = {
110
+ direct: "&#9679;", // ●
111
+ inferred: "&#9680;", // ◐
112
+ reported: "&#9675;", // ○
113
+ conjecture: "&#9676;", // ◌
114
+ };
115
+ const trustColor = data.overall_trust.score >= 0.7
116
+ ? "#22c55e"
117
+ : data.overall_trust.score >= 0.5
118
+ ? "#eab308"
119
+ : "#ef4444";
120
+ const totalDist = Object.values(data.class_distribution).reduce((a, b) => a + b, 0) || 1;
121
+ return `<!DOCTYPE html>
122
+ <html lang="en">
123
+ <head>
124
+ <meta charset="utf-8">
125
+ <meta name="viewport" content="width=device-width, initial-scale=1">
126
+ <title>EP-1 Evidential Dashboard</title>
127
+ <style>
128
+ :root {
129
+ --bg: #0a0a0a; --surface: #141414; --border: #262626;
130
+ --text: #e5e5e5; --muted: #737373; --accent: #22c55e;
131
+ }
132
+ * { margin: 0; padding: 0; box-sizing: border-box; }
133
+ body {
134
+ font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace;
135
+ background: var(--bg); color: var(--text);
136
+ padding: 2rem; max-width: 1200px; margin: 0 auto;
137
+ line-height: 1.6;
138
+ }
139
+ h1 { font-size: 1.5rem; font-weight: 600; margin-bottom: 0.5rem; letter-spacing: -0.02em; }
140
+ h2 { font-size: 1.1rem; font-weight: 500; margin: 2rem 0 1rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.1em; font-size: 0.75rem; }
141
+ .subtitle { color: var(--muted); font-size: 0.8rem; margin-bottom: 2rem; }
142
+ .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; }
143
+ .card {
144
+ background: var(--surface); border: 1px solid var(--border);
145
+ padding: 1.25rem; border-radius: 8px;
146
+ }
147
+ .card-label { font-size: 0.7rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.08em; }
148
+ .card-value { font-size: 2rem; font-weight: 700; margin: 0.25rem 0; }
149
+ .card-sub { font-size: 0.75rem; color: var(--muted); }
150
+ .bar-container { display: flex; height: 24px; border-radius: 4px; overflow: hidden; margin: 0.5rem 0; }
151
+ .bar-segment { transition: width 0.3s; }
152
+ .producer-row {
153
+ display: grid; grid-template-columns: 1fr 80px 100px 60px;
154
+ padding: 0.75rem 0; border-bottom: 1px solid var(--border);
155
+ font-size: 0.85rem; align-items: center;
156
+ }
157
+ .producer-row:first-child { border-top: 1px solid var(--border); }
158
+ .producer-name { font-weight: 500; }
159
+ .trust-badge {
160
+ display: inline-block; padding: 2px 8px; border-radius: 4px;
161
+ font-size: 0.7rem; font-weight: 600;
162
+ }
163
+ .audit-row {
164
+ display: grid; grid-template-columns: 140px 60px 1fr 80px;
165
+ padding: 0.4rem 0; border-bottom: 1px solid var(--border);
166
+ font-size: 0.75rem; gap: 0.5rem;
167
+ }
168
+ .audit-time { color: var(--muted); }
169
+ .audit-action { font-weight: 600; text-transform: uppercase; font-size: 0.65rem; }
170
+ .legend { display: flex; gap: 1.5rem; font-size: 0.75rem; color: var(--muted); margin: 1rem 0; }
171
+ .legend-item { display: flex; align-items: center; gap: 0.3rem; }
172
+ .legend-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
173
+ .warning { color: #ef4444; font-weight: 600; }
174
+ footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid var(--border); font-size: 0.7rem; color: var(--muted); }
175
+ </style>
176
+ </head>
177
+ <body>
178
+ <h1>Evidential Protocol Dashboard</h1>
179
+ <p class="subtitle">EP-1 v1.0 &mdash; Generated ${new Date(data.generated_at).toLocaleString()}</p>
180
+
181
+ <div class="grid">
182
+ <div class="card">
183
+ <div class="card-label">Trust Score</div>
184
+ <div class="card-value" style="color: ${trustColor}">${data.overall_trust.score.toFixed(2)}</div>
185
+ <div class="card-sub">${data.overall_trust.requires_review ? '<span class="warning">REVIEW REQUIRED</span>' : "Passing"}</div>
186
+ </div>
187
+ <div class="card">
188
+ <div class="card-label">Total Claims</div>
189
+ <div class="card-value">${data.total_claims}</div>
190
+ <div class="card-sub">${data.total_responses} responses</div>
191
+ </div>
192
+ <div class="card">
193
+ <div class="card-label">Producers</div>
194
+ <div class="card-value">${data.producers.length}</div>
195
+ <div class="card-sub">${data.review_required > 0 ? `<span class="warning">${data.review_required} need review</span>` : "All passing"}</div>
196
+ </div>
197
+ <div class="card">
198
+ <div class="card-label">Degradations</div>
199
+ <div class="card-value">${data.degradation_count}</div>
200
+ <div class="card-sub">stale evidence</div>
201
+ </div>
202
+ </div>
203
+
204
+ <h2>Evidence Distribution</h2>
205
+ <div class="bar-container">
206
+ <div class="bar-segment" style="width: ${(data.class_distribution.direct / totalDist) * 100}%; background: ${classColors.direct}"></div>
207
+ <div class="bar-segment" style="width: ${(data.class_distribution.inferred / totalDist) * 100}%; background: ${classColors.inferred}"></div>
208
+ <div class="bar-segment" style="width: ${(data.class_distribution.reported / totalDist) * 100}%; background: ${classColors.reported}"></div>
209
+ <div class="bar-segment" style="width: ${(data.class_distribution.conjecture / totalDist) * 100}%; background: ${classColors.conjecture}"></div>
210
+ </div>
211
+ <div class="legend">
212
+ <span class="legend-item"><span class="legend-dot" style="background: ${classColors.direct}"></span> Direct (${data.class_distribution.direct})</span>
213
+ <span class="legend-item"><span class="legend-dot" style="background: ${classColors.inferred}"></span> Inferred (${data.class_distribution.inferred})</span>
214
+ <span class="legend-item"><span class="legend-dot" style="background: ${classColors.reported}"></span> Reported (${data.class_distribution.reported})</span>
215
+ <span class="legend-item"><span class="legend-dot" style="background: ${classColors.conjecture}"></span> Conjecture (${data.class_distribution.conjecture})</span>
216
+ </div>
217
+
218
+ <h2>Agent Trust Ranking</h2>
219
+ ${data.producers.map((p) => {
220
+ const tc = p.trust.score >= 0.7
221
+ ? classColors.direct
222
+ : p.trust.score >= 0.5
223
+ ? classColors.reported
224
+ : classColors.conjecture;
225
+ return `<div class="producer-row">
226
+ <span class="producer-name">${escapeHtml(p.name)}</span>
227
+ <span>${p.claims} claims</span>
228
+ <span><span class="trust-badge" style="background: ${tc}20; color: ${tc}">${p.trust.score.toFixed(2)}</span></span>
229
+ <span>${p.degradations > 0 ? `<span class="warning">${p.degradations} stale</span>` : "fresh"}</span>
230
+ </div>`;
231
+ }).join("\n")}
232
+
233
+ <h2>Audit Trail (Last ${Math.min(data.audit_trail.length, 50)})</h2>
234
+ ${data.audit_trail.slice(0, 50).map((a) => {
235
+ const actionColor = {
236
+ claim: classColors.direct,
237
+ inherit: classColors.inferred,
238
+ verify: classColors.direct,
239
+ degrade: classColors.conjecture,
240
+ publish_gate: classColors.reported,
241
+ };
242
+ return `<div class="audit-row">
243
+ <span class="audit-time">${new Date(a.timestamp).toLocaleTimeString()}</span>
244
+ <span class="audit-action" style="color: ${actionColor[a.action] ?? "#737373"}">${a.action}</span>
245
+ <span>${escapeHtml(a.claim.slice(0, 80))}</span>
246
+ <span style="color: ${classColors[a.evidence_class]}">${classIcons[a.evidence_class]} ${a.confidence.toFixed(2)}</span>
247
+ </div>`;
248
+ }).join("\n")}
249
+
250
+ <footer>
251
+ Evidential Protocol v1.0 &mdash; Matsés-inspired epistemic metadata for AI agents.<br>
252
+ Every claim declares how it knows. No silent assertions.
253
+ </footer>
254
+ </body>
255
+ </html>`;
256
+ }
257
+ function escapeHtml(str) {
258
+ return str
259
+ .replace(/&/g, "&amp;")
260
+ .replace(/</g, "&lt;")
261
+ .replace(/>/g, "&gt;")
262
+ .replace(/"/g, "&quot;");
263
+ }
264
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -12,4 +12,6 @@ export { validateEvidence, validateClaim, validateResponse, validateMcpTag, type
12
12
  export { wrapToolResult, buildAgentResponse, directClaim, inferredClaim, reportedClaim, conjectureClaim, inheritClaim, verifyClaim, checkDegradation, applyDegradation, type McpMiddlewareOptions, type EvidentialToolResult, type AgentResponseOptions, } from "./middleware.js";
13
13
  export { McpEvidenceWrapper, EvidenceCache, createMcpMiddleware, type ToolHandler, type WrappedToolResult, type WrapperConfig, type McpToolCall, type McpToolResponse, } from "./mcp-wrapper.js";
14
14
  export { AgentOutputBuilder, runAgentTeam, runPipeline, generateReport, type AgentIdentity, type TeamRunResult, type PipelineStep, } from "./agent-wrapper.js";
15
+ export { isClaim, stripMarkers, analyzeContent, tagSentence, autoTag, publishGate, renderForReview, type TaggedSentence, type ContentAnalysis, type PublishGateResult, } from "./content.js";
16
+ export { extractAudit, buildDashboardData, renderDashboardHtml, type AuditEntry, type DashboardData, type ProducerSummary, } from "./dashboard.js";
15
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,iBAAiB,EACjB,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,WAAW,EACX,aAAa,EACb,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,MAAM,EACN,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,iBAAiB,EACjB,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,WAAW,EACX,aAAa,EACb,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,MAAM,EACN,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,OAAO,EACP,YAAY,EACZ,cAAc,EACd,WAAW,EACX,OAAO,EACP,WAAW,EACX,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -18,4 +18,8 @@ export { wrapToolResult, buildAgentResponse, directClaim, inferredClaim, reporte
18
18
  export { McpEvidenceWrapper, EvidenceCache, createMcpMiddleware, } from "./mcp-wrapper.js";
19
19
  // Agent Team Integration (Phase 3)
20
20
  export { AgentOutputBuilder, runAgentTeam, runPipeline, generateReport, } from "./agent-wrapper.js";
21
+ // Content Pipeline (Phase 4)
22
+ export { isClaim, stripMarkers, analyzeContent, tagSentence, autoTag, publishGate, renderForReview, } from "./content.js";
23
+ // Dashboard & Audit Trail (Phase 5)
24
+ export { extractAudit, buildDashboardData, renderDashboardHtml, } from "./dashboard.js";
21
25
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,aAAa;AACb,OAAO,EAWL,iBAAiB,EACjB,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,8BAA8B;AAC9B,OAAO,EACL,WAAW,EACX,aAAa,EACb,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,MAAM,EACN,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AAErB,aAAa;AACb,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,GAGf,MAAM,eAAe,CAAC;AAEvB,aAAa;AACb,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GAIjB,MAAM,iBAAiB,CAAC;AAEzB,wBAAwB;AACxB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,mBAAmB,GAMpB,MAAM,kBAAkB,CAAC;AAE1B,mCAAmC;AACnC,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,GAIf,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,aAAa;AACb,OAAO,EAWL,iBAAiB,EACjB,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,8BAA8B;AAC9B,OAAO,EACL,WAAW,EACX,aAAa,EACb,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,MAAM,EACN,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AAErB,aAAa;AACb,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,GAGf,MAAM,eAAe,CAAC;AAEvB,aAAa;AACb,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GAIjB,MAAM,iBAAiB,CAAC;AAEzB,wBAAwB;AACxB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,mBAAmB,GAMpB,MAAM,kBAAkB,CAAC;AAE1B,mCAAmC;AACnC,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,GAIf,MAAM,oBAAoB,CAAC;AAE5B,6BAA6B;AAC7B,OAAO,EACL,OAAO,EACP,YAAY,EACZ,cAAc,EACd,WAAW,EACX,OAAO,EACP,WAAW,EACX,eAAe,GAIhB,MAAM,cAAc,CAAC;AAEtB,oCAAoC;AACpC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,GAIpB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=content.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.test.d.ts","sourceRoot":"","sources":["../../src/tests/content.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,122 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { isClaim, stripMarkers, analyzeContent, tagSentence, autoTag, publishGate, renderForReview, } from "../content.js";
4
+ describe("isClaim()", () => {
5
+ it("detects numeric claims", () => {
6
+ assert.ok(isClaim("The market opportunity is estimated at $2.1B."));
7
+ assert.ok(isClaim("Revenue grew 45% year over year."));
8
+ assert.ok(isClaim("There are 47 MCP servers in production."));
9
+ });
10
+ it("detects superlative claims", () => {
11
+ assert.ok(isClaim("This is the largest MCP ecosystem in production."));
12
+ assert.ok(isClaim("Coldstar is the only air-gapped Solana wallet."));
13
+ });
14
+ it("detects attribution claims", () => {
15
+ assert.ok(isClaim("According to Messari, the market cap is $5B."));
16
+ });
17
+ it("rejects greetings and questions", () => {
18
+ assert.ok(!isClaim("Hey team!"));
19
+ assert.ok(!isClaim("What do you think?"));
20
+ assert.ok(!isClaim("Best regards"));
21
+ });
22
+ it("rejects short strings", () => {
23
+ assert.ok(!isClaim("Yes."));
24
+ assert.ok(!isClaim("OK"));
25
+ });
26
+ });
27
+ describe("stripMarkers()", () => {
28
+ it("removes evidence markers from content", () => {
29
+ const content = "Price is $100 [ev:direct|coingecko|0.9] and stable.";
30
+ const clean = stripMarkers(content);
31
+ assert.equal(clean, "Price is $100 and stable.");
32
+ });
33
+ it("handles multiple markers", () => {
34
+ const content = "A [ev:direct|a|0.9] and B [ev:inferred|b|0.7] end.";
35
+ const clean = stripMarkers(content);
36
+ assert.equal(clean, "A and B end.");
37
+ });
38
+ });
39
+ describe("tagSentence()", () => {
40
+ it("appends a marker to a sentence", () => {
41
+ const tagged = tagSentence("Token supply is 1.2M.", "direct", "solana-rpc", 0.95);
42
+ assert.equal(tagged, "Token supply is 1.2M. [ev:direct|solana-rpc|0.95]");
43
+ });
44
+ it("uses default confidence for class", () => {
45
+ const tagged = tagSentence("Guess.", "conjecture", "model");
46
+ assert.ok(tagged.includes("[ev:conjecture|model|0.1]"));
47
+ });
48
+ });
49
+ describe("analyzeContent()", () => {
50
+ it("analyzes tagged content", () => {
51
+ const content = "Coldstar has zero direct competitors. [ev:direct|competitive-analysis|0.95] The market is growing. [ev:reported|messari|0.7]";
52
+ const analysis = analyzeContent(content);
53
+ assert.equal(analysis.markers.length, 2);
54
+ assert.ok(analysis.trust.score > 0);
55
+ assert.ok(analysis.clean_text.includes("Coldstar"));
56
+ assert.ok(!analysis.clean_text.includes("[ev:"));
57
+ });
58
+ it("detects untagged claims", () => {
59
+ const content = "There are 47 MCP servers running. Revenue is $500K annually.";
60
+ const analysis = analyzeContent(content);
61
+ assert.ok(analysis.untagged_claims.length >= 1);
62
+ });
63
+ it("handles content with no markers", () => {
64
+ const content = "Hello world. Just a greeting.";
65
+ const analysis = analyzeContent(content);
66
+ assert.equal(analysis.markers.length, 0);
67
+ });
68
+ });
69
+ describe("autoTag()", () => {
70
+ it("auto-tags claims using a classifier", () => {
71
+ const content = "Hey team. The market cap is $5B. We should investigate.";
72
+ const tagged = autoTag(content, (sentence) => {
73
+ if (sentence.includes("$")) {
74
+ return { class: "reported", source: "estimate", confidence: 0.6 };
75
+ }
76
+ return null;
77
+ });
78
+ assert.ok(tagged.includes("[ev:reported|estimate|0.6]"));
79
+ assert.ok(!tagged.includes("[ev:") || tagged.split("[ev:").length === 2); // only one marker
80
+ });
81
+ });
82
+ describe("publishGate()", () => {
83
+ it("approves high-trust content", () => {
84
+ const content = "Balance is 2.5 SOL. [ev:direct|solana-rpc|0.95] Supply is 1M. [ev:direct|rpc|0.98]";
85
+ const result = publishGate(content);
86
+ assert.equal(result.approved, true);
87
+ assert.ok(result.trust.score > 0.5);
88
+ });
89
+ it("blocks low-trust content", () => {
90
+ const content = "Market might crash. [ev:conjecture|vibes|0.15] Revenue could triple. [ev:conjecture|hope|0.12]";
91
+ const result = publishGate(content);
92
+ assert.equal(result.approved, false);
93
+ assert.ok(result.recommendations.length > 0);
94
+ });
95
+ it("blocks content with too many untagged claims", () => {
96
+ const content = "Revenue is $500K. The market cap is $5B. There are 100 competitors. Growth is 45% YoY.";
97
+ const result = publishGate(content, { max_untagged: 1 });
98
+ assert.equal(result.approved, false);
99
+ });
100
+ it("passes content with no claims", () => {
101
+ const content = "Hello! Thanks for reading. Best regards.";
102
+ const result = publishGate(content);
103
+ assert.equal(result.approved, true);
104
+ });
105
+ it("respects custom threshold", () => {
106
+ const content = "Balance is 2.5 SOL. [ev:direct|solana-rpc|0.95]";
107
+ const strict = publishGate(content, { trust_threshold: 0.99 });
108
+ assert.equal(strict.approved, false);
109
+ const relaxed = publishGate(content, { trust_threshold: 0.5 });
110
+ assert.equal(relaxed.approved, true);
111
+ });
112
+ });
113
+ describe("renderForReview()", () => {
114
+ it("renders content with visual indicators", () => {
115
+ const content = "Balance is 2.5 SOL. [ev:direct|solana-rpc|0.95]";
116
+ const rendered = renderForReview(content);
117
+ assert.ok(rendered.includes("●")); // direct icon
118
+ assert.ok(rendered.includes("Evidence Legend"));
119
+ assert.ok(rendered.includes("Trust:"));
120
+ });
121
+ });
122
+ //# sourceMappingURL=content.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.test.js","sourceRoot":"","sources":["../../src/tests/content.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dashboard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.test.d.ts","sourceRoot":"","sources":["../../src/tests/dashboard.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,104 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { extractAudit, buildDashboardData, renderDashboardHtml, } from "../dashboard.js";
4
+ import { response } from "../schema.js";
5
+ import { directClaim, inferredClaim, reportedClaim, conjectureClaim, inheritClaim, } from "../middleware.js";
6
+ function makeResponse(producer, claims) {
7
+ return response(producer, { test: true }, claims);
8
+ }
9
+ describe("extractAudit()", () => {
10
+ it("extracts claim entries from a response", () => {
11
+ const resp = makeResponse("security-team:auditor", [
12
+ directClaim("Vault OK", "fs:check"),
13
+ inferredClaim("Key might expire", "mtime", "90 days old"),
14
+ ]);
15
+ const entries = extractAudit(resp);
16
+ assert.equal(entries.length, 2);
17
+ assert.equal(entries[0].action, "claim");
18
+ assert.equal(entries[0].evidence_class, "direct");
19
+ assert.equal(entries[1].evidence_class, "inferred");
20
+ });
21
+ it("detects inherited claims", () => {
22
+ const original = directClaim("fact", "rpc");
23
+ const inherited = inheritClaim(original, "agent-B");
24
+ const resp = response("agent-B", {}, [inherited]);
25
+ const entries = extractAudit(resp);
26
+ assert.equal(entries[0].action, "inherit");
27
+ });
28
+ });
29
+ describe("buildDashboardData()", () => {
30
+ it("builds dashboard from multiple responses", () => {
31
+ const responses = [
32
+ makeResponse("security:auditor", [
33
+ directClaim("3 keys valid", "vault:scan"),
34
+ inferredClaim("1 key stale", "mtime", "old file"),
35
+ ]),
36
+ makeResponse("ops:dns-checker", [
37
+ directClaim("DNS healthy", "dns:query"),
38
+ ]),
39
+ makeResponse("research:market", [
40
+ reportedClaim("Market cap $5B", "messari"),
41
+ conjectureClaim("Will grow 20%", "model", "extrapolation"),
42
+ ]),
43
+ ];
44
+ const data = buildDashboardData(responses);
45
+ assert.equal(data.total_responses, 3);
46
+ assert.equal(data.total_claims, 5);
47
+ assert.equal(data.producers.length, 3);
48
+ assert.equal(data.class_distribution.direct, 2);
49
+ assert.equal(data.class_distribution.inferred, 1);
50
+ assert.equal(data.class_distribution.reported, 1);
51
+ assert.equal(data.class_distribution.conjecture, 1);
52
+ assert.ok(data.overall_trust.score > 0);
53
+ assert.ok(data.audit_trail.length > 0);
54
+ });
55
+ it("handles empty input", () => {
56
+ const data = buildDashboardData([]);
57
+ assert.equal(data.total_responses, 0);
58
+ assert.equal(data.total_claims, 0);
59
+ assert.equal(data.producers.length, 0);
60
+ });
61
+ it("sorts producers by trust score descending", () => {
62
+ const responses = [
63
+ makeResponse("high-trust", [directClaim("fact", "rpc")]),
64
+ makeResponse("low-trust", [
65
+ conjectureClaim("guess", "model", "vibes"),
66
+ ]),
67
+ ];
68
+ const data = buildDashboardData(responses);
69
+ assert.equal(data.producers[0].name, "high-trust");
70
+ assert.equal(data.producers[1].name, "low-trust");
71
+ });
72
+ });
73
+ describe("renderDashboardHtml()", () => {
74
+ it("renders a complete HTML page", () => {
75
+ const responses = [
76
+ makeResponse("security:auditor", [
77
+ directClaim("Vault OK", "fs:check"),
78
+ ]),
79
+ makeResponse("ops:checker", [
80
+ reportedClaim("Status from API", "external"),
81
+ ]),
82
+ ];
83
+ const data = buildDashboardData(responses);
84
+ const html = renderDashboardHtml(data);
85
+ assert.ok(html.includes("<!DOCTYPE html>"));
86
+ assert.ok(html.includes("Evidential Protocol Dashboard"));
87
+ assert.ok(html.includes("Trust Score"));
88
+ assert.ok(html.includes("security:auditor"));
89
+ assert.ok(html.includes("ops:checker"));
90
+ assert.ok(html.includes("Audit Trail"));
91
+ assert.ok(html.includes("Matsés"));
92
+ });
93
+ it("shows warning for low trust", () => {
94
+ const responses = [
95
+ makeResponse("bad-agent", [
96
+ conjectureClaim("wild guess", "model", "no evidence"),
97
+ ]),
98
+ ];
99
+ const data = buildDashboardData(responses);
100
+ const html = renderDashboardHtml(data);
101
+ assert.ok(html.includes("REVIEW REQUIRED"));
102
+ });
103
+ });
104
+ //# sourceMappingURL=dashboard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.test.js","sourceRoot":"","sources":["../../src/tests/dashboard.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evidential-protocol",
3
- "version": "1.1.0",
3
+ "version": "2.0.0",
4
4
  "description": "Matsés-inspired evidential metadata for AI agent outputs. Every claim declares how it knows.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -54,6 +54,14 @@
54
54
  "./agent": {
55
55
  "types": "./dist/agent-wrapper.d.ts",
56
56
  "import": "./dist/agent-wrapper.js"
57
+ },
58
+ "./content": {
59
+ "types": "./dist/content.d.ts",
60
+ "import": "./dist/content.js"
61
+ },
62
+ "./dashboard": {
63
+ "types": "./dist/dashboard.d.ts",
64
+ "import": "./dist/dashboard.js"
57
65
  }
58
66
  },
59
67
  "devDependencies": {