@aibuildinfra/proofgraph 1.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.
Files changed (76) hide show
  1. package/LICENSE +21 -0
  2. package/PRIVACY.md +8 -0
  3. package/README.md +193 -0
  4. package/SECURITY.md +27 -0
  5. package/dist/cli/index.d.ts +6 -0
  6. package/dist/cli/index.js +273 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/dashboard/server.d.ts +5 -0
  9. package/dist/dashboard/server.js +271 -0
  10. package/dist/dashboard/server.js.map +1 -0
  11. package/dist/data/seed.d.ts +6 -0
  12. package/dist/data/seed.js +325 -0
  13. package/dist/data/seed.js.map +1 -0
  14. package/dist/engine/aiDiscoverability.d.ts +11 -0
  15. package/dist/engine/aiDiscoverability.js +135 -0
  16. package/dist/engine/aiDiscoverability.js.map +1 -0
  17. package/dist/engine/claimVerifier.d.ts +26 -0
  18. package/dist/engine/claimVerifier.js +130 -0
  19. package/dist/engine/claimVerifier.js.map +1 -0
  20. package/dist/engine/consistencyAudit.d.ts +11 -0
  21. package/dist/engine/consistencyAudit.js +172 -0
  22. package/dist/engine/consistencyAudit.js.map +1 -0
  23. package/dist/engine/exporter.d.ts +17 -0
  24. package/dist/engine/exporter.js +83 -0
  25. package/dist/engine/exporter.js.map +1 -0
  26. package/dist/engine/graphTraversal.d.ts +25 -0
  27. package/dist/engine/graphTraversal.js +74 -0
  28. package/dist/engine/graphTraversal.js.map +1 -0
  29. package/dist/engine/resolver.d.ts +20 -0
  30. package/dist/engine/resolver.js +168 -0
  31. package/dist/engine/resolver.js.map +1 -0
  32. package/dist/engine/schemaOrg.d.ts +12 -0
  33. package/dist/engine/schemaOrg.js +105 -0
  34. package/dist/engine/schemaOrg.js.map +1 -0
  35. package/dist/engine/tokenOptimizer.d.ts +25 -0
  36. package/dist/engine/tokenOptimizer.js +166 -0
  37. package/dist/engine/tokenOptimizer.js.map +1 -0
  38. package/dist/engine/webPresence.d.ts +32 -0
  39. package/dist/engine/webPresence.js +63 -0
  40. package/dist/engine/webPresence.js.map +1 -0
  41. package/dist/index.d.ts +20 -0
  42. package/dist/index.js +35 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/mcp/prompts.d.ts +25 -0
  45. package/dist/mcp/prompts.js +136 -0
  46. package/dist/mcp/prompts.js.map +1 -0
  47. package/dist/mcp/resources.d.ts +27 -0
  48. package/dist/mcp/resources.js +118 -0
  49. package/dist/mcp/resources.js.map +1 -0
  50. package/dist/mcp/server.d.ts +15 -0
  51. package/dist/mcp/server.js +88 -0
  52. package/dist/mcp/server.js.map +1 -0
  53. package/dist/mcp/tools.d.ts +256 -0
  54. package/dist/mcp/tools.js +391 -0
  55. package/dist/mcp/tools.js.map +1 -0
  56. package/dist/security/robots.d.ts +15 -0
  57. package/dist/security/robots.js +78 -0
  58. package/dist/security/robots.js.map +1 -0
  59. package/dist/security/safeFetch.d.ts +23 -0
  60. package/dist/security/safeFetch.js +122 -0
  61. package/dist/security/safeFetch.js.map +1 -0
  62. package/dist/storage/graphStore.d.ts +70 -0
  63. package/dist/storage/graphStore.js +275 -0
  64. package/dist/storage/graphStore.js.map +1 -0
  65. package/dist/storage/sqliteAdapter.d.ts +14 -0
  66. package/dist/storage/sqliteAdapter.js +137 -0
  67. package/dist/storage/sqliteAdapter.js.map +1 -0
  68. package/dist/tests/proofgraph.test.d.ts +5 -0
  69. package/dist/tests/proofgraph.test.js +249 -0
  70. package/dist/tests/proofgraph.test.js.map +1 -0
  71. package/dist/types/index.d.ts +206 -0
  72. package/dist/types/index.js +6 -0
  73. package/dist/types/index.js.map +1 -0
  74. package/package.json +65 -0
  75. package/server.json +24 -0
  76. package/smithery.yaml +6 -0
@@ -0,0 +1,74 @@
1
+ /**
2
+ * ProofGraph Relationship Traversal & Path Discovery Engine
3
+ */
4
+ export class GraphTraversalEngine {
5
+ store;
6
+ constructor(store) {
7
+ this.store = store;
8
+ }
9
+ findRelationships(entityId, relationshipType, depth = 2) {
10
+ const origin = this.store.getEntity(entityId);
11
+ const filter = relationshipType ? [relationshipType.toUpperCase()] : undefined;
12
+ const traversal = this.store.traverse(entityId, {
13
+ maxDepth: depth,
14
+ relationshipFilter: filter,
15
+ });
16
+ const direct = this.store.getRelationships(entityId, relationshipType);
17
+ return {
18
+ origin,
19
+ direct_relationships: direct,
20
+ traversal_nodes: traversal.nodes,
21
+ traversal_edges: traversal.edges,
22
+ };
23
+ }
24
+ explainConnection(sourceEntityId, targetEntityId) {
25
+ const fromEntity = this.store.getEntity(sourceEntityId);
26
+ const toEntity = this.store.getEntity(targetEntityId);
27
+ if (!fromEntity || !toEntity)
28
+ return null;
29
+ const traversal = this.store.traverse(sourceEntityId, {
30
+ maxDepth: 3,
31
+ targetId: targetEntityId,
32
+ });
33
+ if (traversal.paths.length === 0) {
34
+ return {
35
+ from_entity: fromEntity,
36
+ to_entity: toEntity,
37
+ hops: 0,
38
+ path_sequence: [],
39
+ relationships: [],
40
+ connecting_evidence: [],
41
+ summary: `No direct or 3-hop relationship path found between ${fromEntity.name} and ${toEntity.name}.`,
42
+ };
43
+ }
44
+ const shortestPath = traversal.paths[0];
45
+ const connectingEvidence = [];
46
+ for (const edge of shortestPath.edges) {
47
+ if (edge.evidence_ids) {
48
+ for (const evId of edge.evidence_ids) {
49
+ const ev = this.store.getEvidence(evId);
50
+ if (ev)
51
+ connectingEvidence.push(ev);
52
+ }
53
+ }
54
+ }
55
+ // Build human-readable narrative
56
+ const steps = [];
57
+ for (let i = 0; i < shortestPath.edges.length; i++) {
58
+ const edge = shortestPath.edges[i];
59
+ const src = this.store.getEntity(edge.source_id)?.name || edge.source_id;
60
+ const tgt = this.store.getEntity(edge.target_id)?.name || edge.target_id;
61
+ steps.push(`${src} --[${edge.relationship}]--> ${tgt}`);
62
+ }
63
+ return {
64
+ from_entity: fromEntity,
65
+ to_entity: toEntity,
66
+ hops: shortestPath.edges.length,
67
+ path_sequence: shortestPath.path,
68
+ relationships: shortestPath.edges,
69
+ connecting_evidence: connectingEvidence,
70
+ summary: steps.join(' THEN '),
71
+ };
72
+ }
73
+ }
74
+ //# sourceMappingURL=graphTraversal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphTraversal.js","sourceRoot":"","sources":["../../src/engine/graphTraversal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ProofGraph Entity Resolution Engine
3
+ * Multi-signal entity resolution without false-positive merges
4
+ */
5
+ import { Entity, EntityResolutionCandidate } from '../types/index.js';
6
+ import { GraphStore } from '../storage/graphStore.js';
7
+ export declare function jaroWinklerSimilarity(s1: string, s2: string): number;
8
+ export declare function normalizeSlug(text: string): string;
9
+ export declare class EntityResolver {
10
+ private store;
11
+ constructor(store: GraphStore);
12
+ resolve(query: {
13
+ name?: string;
14
+ domain?: string;
15
+ github?: string;
16
+ npm?: string;
17
+ email?: string;
18
+ }): EntityResolutionCandidate[];
19
+ findCanonical(query: string): Entity | undefined;
20
+ }
@@ -0,0 +1,168 @@
1
+ /**
2
+ * ProofGraph Entity Resolution Engine
3
+ * Multi-signal entity resolution without false-positive merges
4
+ */
5
+ export function jaroWinklerSimilarity(s1, s2) {
6
+ const str1 = s1.toLowerCase().trim();
7
+ const str2 = s2.toLowerCase().trim();
8
+ if (str1 === str2)
9
+ return 1.0;
10
+ if (!str1.length || !str2.length)
11
+ return 0.0;
12
+ const matchDistance = Math.floor(Math.max(str1.length, str2.length) / 2) - 1;
13
+ const str1Matches = new Array(str1.length).fill(false);
14
+ const str2Matches = new Array(str2.length).fill(false);
15
+ let matches = 0;
16
+ let transpositions = 0;
17
+ for (let i = 0; i < str1.length; i++) {
18
+ const start = Math.max(0, i - matchDistance);
19
+ const end = Math.min(i + matchDistance + 1, str2.length);
20
+ for (let j = start; j < end; j++) {
21
+ if (str2Matches[j])
22
+ continue;
23
+ if (str1[i] !== str2[j])
24
+ continue;
25
+ str1Matches[i] = true;
26
+ str2Matches[j] = true;
27
+ matches++;
28
+ break;
29
+ }
30
+ }
31
+ if (matches === 0)
32
+ return 0.0;
33
+ let k = 0;
34
+ for (let i = 0; i < str1.length; i++) {
35
+ if (!str1Matches[i])
36
+ continue;
37
+ while (!str2Matches[k])
38
+ k++;
39
+ if (str1[i] !== str2[k])
40
+ transpositions++;
41
+ k++;
42
+ }
43
+ const jaro = (matches / str1.length + matches / str2.length + (matches - transpositions / 2) / matches) / 3.0;
44
+ // Prefix scale for Winkler
45
+ let prefix = 0;
46
+ for (let i = 0; i < Math.min(4, Math.min(str1.length, str2.length)); i++) {
47
+ if (str1[i] === str2[i])
48
+ prefix++;
49
+ else
50
+ break;
51
+ }
52
+ return jaro + prefix * 0.1 * (1 - jaro);
53
+ }
54
+ export function normalizeSlug(text) {
55
+ return text
56
+ .toLowerCase()
57
+ .replace(/https?:\/\//g, '')
58
+ .replace(/[^\w\s-]/g, '')
59
+ .replace(/[\s_-]+/g, '')
60
+ .trim();
61
+ }
62
+ export class EntityResolver {
63
+ store;
64
+ constructor(store) {
65
+ this.store = store;
66
+ }
67
+ resolve(query) {
68
+ const allEntities = this.store.getAllEntities();
69
+ const candidates = [];
70
+ const targetName = query.name || '';
71
+ const normTargetName = normalizeSlug(targetName);
72
+ const targetDomain = query.domain ? query.domain.toLowerCase().replace(/^www\./, '') : '';
73
+ const targetGithub = query.github ? query.github.toLowerCase() : '';
74
+ const targetNpm = query.npm ? query.npm.toLowerCase() : '';
75
+ for (const entity of allEntities) {
76
+ // 1. Name Signal
77
+ let maxNameScore = 0;
78
+ const entityNames = [entity.name, ...entity.aliases];
79
+ for (const name of entityNames) {
80
+ if (name.toLowerCase() === targetName.toLowerCase()) {
81
+ maxNameScore = 1.0;
82
+ break;
83
+ }
84
+ const normEntityName = normalizeSlug(name);
85
+ if (normEntityName === normTargetName && normTargetName.length > 2) {
86
+ maxNameScore = Math.max(maxNameScore, 0.96);
87
+ }
88
+ const sim = jaroWinklerSimilarity(name, targetName);
89
+ maxNameScore = Math.max(maxNameScore, sim);
90
+ }
91
+ // 2. Domain Signal
92
+ let domainScore = 0;
93
+ const entityUrl = entity.canonical_url || entity.metadata?.domain || '';
94
+ if (targetDomain && entityUrl) {
95
+ const cleanEntityDomain = entityUrl.toLowerCase().replace(/^https?:\/\//, '').replace(/^www\./, '').split('/')[0];
96
+ if (cleanEntityDomain === targetDomain) {
97
+ domainScore = 1.0;
98
+ }
99
+ else if (cleanEntityDomain.includes(targetDomain) || targetDomain.includes(cleanEntityDomain)) {
100
+ domainScore = 0.8;
101
+ }
102
+ }
103
+ // 3. GitHub Signal
104
+ let githubScore = 0;
105
+ const entityGithub = entity.metadata?.github || entity.metadata?.github_org || '';
106
+ if (targetGithub && entityGithub) {
107
+ if (entityGithub.toLowerCase().includes(targetGithub) || targetGithub.includes(entityGithub.toLowerCase())) {
108
+ githubScore = 1.0;
109
+ }
110
+ }
111
+ // 4. npm Scope Signal
112
+ let npmScore = 0;
113
+ const entityNpm = entity.metadata?.npm || entity.metadata?.npm_scope || '';
114
+ if (targetNpm && entityNpm) {
115
+ if (entityNpm.toLowerCase().includes(targetNpm) || targetNpm.includes(entityNpm.toLowerCase())) {
116
+ npmScore = 1.0;
117
+ }
118
+ }
119
+ // Weighted composite score calculation
120
+ let totalWeight = 0;
121
+ let weightedSum = 0;
122
+ if (targetName) {
123
+ const weight = 0.45;
124
+ weightedSum += maxNameScore * weight;
125
+ totalWeight += weight;
126
+ }
127
+ if (targetDomain) {
128
+ const weight = 0.25;
129
+ weightedSum += domainScore * weight;
130
+ totalWeight += weight;
131
+ }
132
+ if (targetGithub) {
133
+ const weight = 0.15;
134
+ weightedSum += githubScore * weight;
135
+ totalWeight += weight;
136
+ }
137
+ if (targetNpm) {
138
+ const weight = 0.15;
139
+ weightedSum += npmScore * weight;
140
+ totalWeight += weight;
141
+ }
142
+ const matchScore = totalWeight > 0 ? Number((weightedSum / totalWeight).toFixed(3)) : 0;
143
+ // Only include candidates above minimum recognition threshold (0.50)
144
+ if (matchScore >= 0.50) {
145
+ candidates.push({
146
+ entity,
147
+ match_score: matchScore,
148
+ signals: {
149
+ name: Number(maxNameScore.toFixed(3)),
150
+ domain: Number(domainScore.toFixed(3)),
151
+ github: Number(githubScore.toFixed(3)),
152
+ npm: Number(npmScore.toFixed(3)),
153
+ },
154
+ });
155
+ }
156
+ }
157
+ candidates.sort((a, b) => b.match_score - a.match_score);
158
+ return candidates;
159
+ }
160
+ findCanonical(query) {
161
+ const candidates = this.resolve({ name: query });
162
+ if (candidates.length > 0 && candidates[0].match_score >= 0.85) {
163
+ return candidates[0].entity;
164
+ }
165
+ return undefined;
166
+ }
167
+ }
168
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/engine/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ProofGraph Schema.org Structured Data Generator & Validator
3
+ * Produces compliant JSON-LD grounded purely in verified facts
4
+ */
5
+ import { Entity } from '../types/index.js';
6
+ export declare class SchemaOrgGenerator {
7
+ static generateOrganization(entity: Entity): Record<string, any>;
8
+ static generateSoftwareApplication(entity: Entity): Record<string, any>;
9
+ static generateService(entity: Entity): Record<string, any>;
10
+ static generateArticle(entity: Entity): Record<string, any>;
11
+ static generateForEntity(entity: Entity): Record<string, any>;
12
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * ProofGraph Schema.org Structured Data Generator & Validator
3
+ * Produces compliant JSON-LD grounded purely in verified facts
4
+ */
5
+ export class SchemaOrgGenerator {
6
+ static generateOrganization(entity) {
7
+ const meta = entity.metadata || {};
8
+ const schema = {
9
+ '@context': 'https://schema.org',
10
+ '@type': 'Organization',
11
+ '@id': entity.canonical_url || `https://aibuildinfra.com/#${entity.id}`,
12
+ 'name': entity.name,
13
+ 'description': entity.description,
14
+ };
15
+ if (entity.canonical_url) {
16
+ schema['url'] = entity.canonical_url;
17
+ }
18
+ if (entity.aliases.length > 0) {
19
+ schema['alternateName'] = entity.aliases;
20
+ }
21
+ const sameAs = [];
22
+ if (meta.github)
23
+ sameAs.push(meta.github);
24
+ if (meta.npm)
25
+ sameAs.push(`https://www.npmjs.com/package/${meta.npm}`);
26
+ if (meta.mcp_registry)
27
+ sameAs.push(meta.mcp_registry);
28
+ if (meta.linkedin)
29
+ sameAs.push(meta.linkedin);
30
+ if (meta.twitter)
31
+ sameAs.push(meta.twitter);
32
+ if (sameAs.length > 0) {
33
+ schema['sameAs'] = sameAs;
34
+ }
35
+ return schema;
36
+ }
37
+ static generateSoftwareApplication(entity) {
38
+ const meta = entity.metadata || {};
39
+ return {
40
+ '@context': 'https://schema.org',
41
+ '@type': 'SoftwareApplication',
42
+ 'name': entity.name,
43
+ 'description': entity.description,
44
+ 'applicationCategory': meta.category || 'DeveloperApplication',
45
+ 'operatingSystem': meta.os || 'Cross-platform',
46
+ 'offers': {
47
+ '@type': 'Offer',
48
+ 'price': '0',
49
+ 'priceCurrency': 'USD',
50
+ },
51
+ 'url': entity.canonical_url,
52
+ 'codeRepository': meta.github || meta.repository,
53
+ 'softwareVersion': meta.version || '1.0.0',
54
+ };
55
+ }
56
+ static generateService(entity) {
57
+ return {
58
+ '@context': 'https://schema.org',
59
+ '@type': 'Service',
60
+ 'name': entity.name,
61
+ 'description': entity.description,
62
+ 'provider': {
63
+ '@type': 'Organization',
64
+ 'name': entity.metadata?.provider || 'AI Build Infra',
65
+ },
66
+ 'serviceType': entity.metadata?.serviceType || 'Agentic AI Architecture',
67
+ };
68
+ }
69
+ static generateArticle(entity) {
70
+ return {
71
+ '@context': 'https://schema.org',
72
+ '@type': 'TechArticle',
73
+ 'headline': entity.name,
74
+ 'description': entity.description,
75
+ 'author': {
76
+ '@type': 'Organization',
77
+ 'name': entity.metadata?.author || 'AI Build Infra',
78
+ },
79
+ 'datePublished': entity.metadata?.published_at || entity.created_at,
80
+ };
81
+ }
82
+ static generateForEntity(entity) {
83
+ switch (entity.type) {
84
+ case 'Organization':
85
+ return this.generateOrganization(entity);
86
+ case 'Project':
87
+ case 'Product':
88
+ case 'Package':
89
+ return this.generateSoftwareApplication(entity);
90
+ case 'Service':
91
+ return this.generateService(entity);
92
+ case 'Article':
93
+ return this.generateArticle(entity);
94
+ default:
95
+ return {
96
+ '@context': 'https://schema.org',
97
+ '@type': 'Thing',
98
+ 'name': entity.name,
99
+ 'description': entity.description,
100
+ 'url': entity.canonical_url,
101
+ };
102
+ }
103
+ }
104
+ }
105
+ //# sourceMappingURL=schemaOrg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaOrg.js","sourceRoot":"","sources":["../../src/engine/schemaOrg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * ProofGraph Token Budget & Evidence Compression Engine
3
+ * Guarantees Minimum Sufficient Context and prevents context bloating
4
+ */
5
+ import { Evidence, Source, Claim, Entity, EvidencePacket, SourceTrustClass } from '../types/index.js';
6
+ export declare const TRUST_CLASS_WEIGHTS: Record<SourceTrustClass, number>;
7
+ export declare function estimateTokens(text: string | object): number;
8
+ export declare class TokenOptimizer {
9
+ static rankEvidence(evidenceList: Evidence[], sources: Map<string, Source>, claimStatement?: string): Evidence[];
10
+ static deduplicateEvidence(evidenceList: Evidence[]): Evidence[];
11
+ static buildPacket(options: {
12
+ question?: string;
13
+ entities: Entity[];
14
+ claims: Claim[];
15
+ evidence: Evidence[];
16
+ sources: Map<string, Source>;
17
+ relationships?: Array<{
18
+ source_id: string;
19
+ target_id: string;
20
+ relationship: string;
21
+ confidence: number;
22
+ }>;
23
+ maxTokens?: number;
24
+ }): EvidencePacket;
25
+ }
@@ -0,0 +1,166 @@
1
+ /**
2
+ * ProofGraph Token Budget & Evidence Compression Engine
3
+ * Guarantees Minimum Sufficient Context and prevents context bloating
4
+ */
5
+ import { jaroWinklerSimilarity } from './resolver.js';
6
+ export const TRUST_CLASS_WEIGHTS = {
7
+ standards_body: 1.0,
8
+ official_registry: 0.98,
9
+ official_source: 0.95,
10
+ government_source: 0.95,
11
+ github_repository: 0.90,
12
+ package_registry: 0.90,
13
+ academic_source: 0.88,
14
+ established_publication: 0.80,
15
+ industry_directory: 0.70,
16
+ community_source: 0.50,
17
+ social_media: 0.35,
18
+ unknown_source: 0.20,
19
+ };
20
+ export function estimateTokens(text) {
21
+ const str = typeof text === 'string' ? text : JSON.stringify(text);
22
+ // Standard approximation: ~4 characters per token
23
+ return Math.ceil(str.length / 4);
24
+ }
25
+ export class TokenOptimizer {
26
+ static rankEvidence(evidenceList, sources, claimStatement) {
27
+ return [...evidenceList].sort((a, b) => {
28
+ const sourceA = sources.get(a.source_id);
29
+ const sourceB = sources.get(b.source_id);
30
+ const trustA = sourceA ? TRUST_CLASS_WEIGHTS[sourceA.trust_class] || 0.5 : 0.5;
31
+ const trustB = sourceB ? TRUST_CLASS_WEIGHTS[sourceB.trust_class] || 0.5 : 0.5;
32
+ let relevanceA = a.confidence;
33
+ let relevanceB = b.confidence;
34
+ if (claimStatement) {
35
+ const simA = jaroWinklerSimilarity(a.excerpt, claimStatement);
36
+ const simB = jaroWinklerSimilarity(b.excerpt, claimStatement);
37
+ relevanceA = relevanceA * 0.7 + simA * 0.3;
38
+ relevanceB = relevanceB * 0.7 + simB * 0.3;
39
+ }
40
+ const scoreA = trustA * 0.35 +
41
+ relevanceA * 0.30 +
42
+ (a.directness || 0.8) * 0.20 +
43
+ (a.supports_claim ? 0.15 : 0.05);
44
+ const scoreB = trustB * 0.35 +
45
+ relevanceB * 0.30 +
46
+ (b.directness || 0.8) * 0.20 +
47
+ (b.supports_claim ? 0.15 : 0.05);
48
+ return scoreB - scoreA;
49
+ });
50
+ }
51
+ static deduplicateEvidence(evidenceList) {
52
+ const clustered = [];
53
+ const visited = new Set();
54
+ for (let i = 0; i < evidenceList.length; i++) {
55
+ if (visited.has(evidenceList[i].id))
56
+ continue;
57
+ const primary = { ...evidenceList[i] };
58
+ const corroborating = [];
59
+ for (let j = i + 1; j < evidenceList.length; j++) {
60
+ if (visited.has(evidenceList[j].id))
61
+ continue;
62
+ const other = evidenceList[j];
63
+ const sim = jaroWinklerSimilarity(primary.excerpt, other.excerpt);
64
+ // If excerpt is nearly identical (> 0.88 similarity), cluster as corroboration
65
+ if (sim > 0.88) {
66
+ visited.add(other.id);
67
+ corroborating.push(other.source_id);
68
+ }
69
+ }
70
+ if (corroborating.length > 0) {
71
+ primary.corroborating_sources = [
72
+ ...(primary.corroborating_sources || []),
73
+ ...corroborating,
74
+ ];
75
+ }
76
+ clustered.push(primary);
77
+ visited.add(primary.id);
78
+ }
79
+ return clustered;
80
+ }
81
+ static buildPacket(options) {
82
+ const budget = options.maxTokens || 1500;
83
+ const sourcesConsidered = options.evidence.length;
84
+ // 1. Deduplicate & rank evidence
85
+ const deduped = this.deduplicateEvidence(options.evidence);
86
+ const ranked = this.rankEvidence(deduped, options.sources, options.claims[0]?.statement);
87
+ // Calculate raw estimated tokens if all uncompressed sources were dumped
88
+ let rawTextAccumulator = '';
89
+ for (const ev of options.evidence) {
90
+ rawTextAccumulator += `${ev.title} ${ev.excerpt} ${ev.url} `;
91
+ }
92
+ const rawEstimatedTokens = Math.max(estimateTokens(rawTextAccumulator) * 5, 4500); // Raw full pages would be 5x larger
93
+ // 2. Budget partition calculation
94
+ const entityBudget = Math.floor(budget * 0.12);
95
+ const claimBudget = Math.floor(budget * 0.15);
96
+ const evidenceBudget = Math.floor(budget * 0.55);
97
+ const provenanceBudget = Math.floor(budget * 0.12);
98
+ // 3. Compact Entities
99
+ const compactEntities = options.entities.map(e => ({
100
+ id: e.id,
101
+ name: e.name,
102
+ type: e.type,
103
+ canonical_url: e.canonical_url,
104
+ description: e.description.length > 180 ? e.description.substring(0, 177) + '...' : e.description,
105
+ }));
106
+ // 4. Compact Claims
107
+ const compactClaims = options.claims.map(c => ({
108
+ id: c.id,
109
+ claim: c.statement,
110
+ status: c.status,
111
+ confidence: c.confidence,
112
+ }));
113
+ // 5. Select Evidence within budget
114
+ const packedEvidence = [];
115
+ const packedProvenance = [];
116
+ let currentEvidenceTokens = 0;
117
+ for (const ev of ranked) {
118
+ const source = options.sources.get(ev.source_id);
119
+ const excerpt = ev.excerpt.length > 250 ? ev.excerpt.substring(0, 247) + '...' : ev.excerpt;
120
+ const evItem = {
121
+ evidence_id: ev.id,
122
+ source: ev.publisher || source?.publisher || source?.title || 'Unknown Source',
123
+ source_type: ev.source_type,
124
+ url: ev.url,
125
+ excerpt,
126
+ confidence: ev.confidence,
127
+ retrieved_at: ev.retrieved_at,
128
+ corroborating_count: ev.corroborating_sources?.length || 0,
129
+ };
130
+ const itemTokens = estimateTokens(evItem);
131
+ if (currentEvidenceTokens + itemTokens <= evidenceBudget || packedEvidence.length === 0) {
132
+ packedEvidence.push(evItem);
133
+ currentEvidenceTokens += itemTokens;
134
+ // Add Provenance
135
+ packedProvenance.push({
136
+ claim_id: ev.claim_id || 'claim:general',
137
+ evidence_id: ev.id,
138
+ source_id: ev.source_id,
139
+ url: ev.url,
140
+ content_hash: ev.content_hash,
141
+ retrieved_at: ev.retrieved_at,
142
+ });
143
+ }
144
+ }
145
+ const packet = {
146
+ question: options.question,
147
+ entities: compactEntities,
148
+ claims: compactClaims,
149
+ relationships: options.relationships || [],
150
+ evidence: packedEvidence,
151
+ provenance: packedProvenance,
152
+ metrics: {
153
+ sources_considered: sourcesConsidered,
154
+ sources_returned: packedEvidence.length,
155
+ raw_estimated_tokens: rawEstimatedTokens,
156
+ returned_tokens: 0,
157
+ compression_ratio: 0,
158
+ },
159
+ };
160
+ const returnedTokens = estimateTokens(packet);
161
+ packet.metrics.returned_tokens = returnedTokens;
162
+ packet.metrics.compression_ratio = Number((returnedTokens / Math.max(rawEstimatedTokens, returnedTokens)).toFixed(3));
163
+ return packet;
164
+ }
165
+ }
166
+ //# sourceMappingURL=tokenOptimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenOptimizer.js","sourceRoot":"","sources":["../../src/engine/tokenOptimizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * ProofGraph Web Presence & Digital Footprint Analyzer
3
+ */
4
+ import { Source } from '../types/index.js';
5
+ import { GraphStore } from '../storage/graphStore.js';
6
+ export interface WebPresenceAnalysis {
7
+ entity_id: string;
8
+ entity_name: string;
9
+ domain?: string;
10
+ breakdown: {
11
+ official_references: Source[];
12
+ third_party_references: Source[];
13
+ github_references: Source[];
14
+ package_references: Source[];
15
+ registry_references: Source[];
16
+ documentation_references: Source[];
17
+ social_references: Source[];
18
+ case_studies: Source[];
19
+ };
20
+ detected_anomalies: string[];
21
+ summary: {
22
+ total_sources: number;
23
+ official_count: number;
24
+ third_party_count: number;
25
+ footprint_diversity: number;
26
+ };
27
+ }
28
+ export declare class WebPresenceAnalyzer {
29
+ private store;
30
+ constructor(store: GraphStore);
31
+ analyze(entityIdOrName: string, domainHint?: string): WebPresenceAnalysis;
32
+ }