@bufinance/gtm-graph 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/algorithms/graph-paths.ts","../src/algorithms/gtm-decorations.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Graph path / bridge engine (plan 099; re-homed here as the published SSOT\n * in plan 100 — `packages/intelligence/src/knowledge/graph-paths.ts` is now a\n * re-export shim of this module).\n *\n * PURE module: no I/O, no clocks, no randomness — every time- or\n * order-sensitive function takes explicit `now` / `seed` / `pairs` inputs so\n * results are deterministic and testable, and so the UI can run the same\n * code client-side over a fetched graph payload.\n *\n * Operates on a camelCase graph shape structurally compatible with the\n * `get_knowledge_graph` RPC payload (`KnowledgeGraphData` in the BUFI desk\n * repo). NOTE: that RPC's relationship objects omit `lastSeenAt`; the weight\n * formula treats a missing `lastSeenAt` as \"fresh\" (factor 1).\n *\n * Weight formula (documented constants below):\n * w = strength * ln(1 + evidenceCount) * recencyFactor(lastSeenAt, now)\n * recencyFactor = 0.5 ^ (daysStale / 90) — halves per 90 stale days\n *\n * Scale ceiling: everything here is in-memory over the fetched graph —\n * fine for the BUFI-internal GTM graph (thousands of edges). Past ~50k\n * edges, graduate to pgRouting / an RPC (see the 2026-07-16 gtm-graph spec).\n */\n\n// ---------------------------------------------------------------------------\n// Structural input types (compatible with KnowledgeGraphData and the raw\n// get_knowledge_graph JSON — only the fields used here are required)\n// ---------------------------------------------------------------------------\n\nexport interface GraphEntityLike {\n id: string;\n}\n\nexport interface GraphEdgeLike {\n id: string;\n sourceEntityId: string;\n targetEntityId: string;\n relationshipType: string;\n strength?: number | null;\n evidenceCount?: number | null;\n lastSeenAt?: string | null;\n}\n\nexport interface GraphDataLike {\n entities: GraphEntityLike[];\n relationships: GraphEdgeLike[];\n}\n\nexport interface AdjacentEdge {\n edgeId: string;\n otherId: string;\n relationshipType: string;\n weight: number;\n}\n\n/** node id → undirected incident edges (both directions materialized). */\nexport type Adjacency = Map<string, AdjacentEdge[]>;\n\nexport interface GraphPath {\n /** Node ids from source to target (inclusive). */\n nodeIds: string[];\n /** Edge ids traversed, in order (`nodeIds.length - 1` entries). */\n edgeIds: string[];\n /** Hop count (= edgeIds.length). */\n hops: number;\n /** Sum of Dijkstra costs (1/w) — lower = stronger; 0 for the trivial path. */\n cost: number;\n}\n\n// ---------------------------------------------------------------------------\n// Weight constants (documented; see module header)\n// ---------------------------------------------------------------------------\n\n/** Staleness half-life: an edge unseen for this many days weighs half. */\nexport const RECENCY_HALF_LIFE_DAYS = 90;\n/** Default strength when the payload omits it (DB default is 1.0). */\nexport const DEFAULT_STRENGTH = 1.0;\n/** Default evidence count when the payload omits it (DB default is 1). */\nexport const DEFAULT_EVIDENCE_COUNT = 1;\n/** Floor so degenerate edges never divide by zero in 1/w costs. */\nexport const MIN_EDGE_WEIGHT = 1e-6;\n\nconst MS_PER_DAY = 86_400_000;\n\n/** 0.5^(daysStale/90); missing/unparseable lastSeenAt → 1 (fresh). */\nexport function recencyFactor(lastSeenAt: string | null | undefined, now: number): number {\n if (!lastSeenAt) return 1;\n const seenAt = Date.parse(lastSeenAt);\n if (Number.isNaN(seenAt)) return 1;\n const daysStale = Math.max(0, (now - seenAt) / MS_PER_DAY);\n return 0.5 ** (daysStale / RECENCY_HALF_LIFE_DAYS);\n}\n\n/** w = strength * ln(1 + evidenceCount) * recencyFactor — floored at MIN_EDGE_WEIGHT. */\nexport function edgeWeight(edge: GraphEdgeLike, now: number): number {\n const strength = edge.strength ?? DEFAULT_STRENGTH;\n const evidence = edge.evidenceCount ?? DEFAULT_EVIDENCE_COUNT;\n const weight =\n strength * Math.log(1 + Math.max(0, evidence)) * recencyFactor(edge.lastSeenAt, now);\n return Math.max(MIN_EDGE_WEIGHT, weight);\n}\n\n// ---------------------------------------------------------------------------\n// buildAdjacency\n// ---------------------------------------------------------------------------\n\n/**\n * Undirected adjacency view with per-edge weights.\n * `now` (epoch ms) drives the recency factor — pass a fixed value in tests.\n */\nexport function buildAdjacency(data: GraphDataLike, options: { now: number }): Adjacency {\n const adjacency: Adjacency = new Map();\n for (const entity of data.entities) adjacency.set(entity.id, []);\n\n for (const edge of data.relationships) {\n const weight = edgeWeight(edge, options.now);\n const forward: AdjacentEdge = {\n edgeId: edge.id,\n otherId: edge.targetEntityId,\n relationshipType: edge.relationshipType,\n weight,\n };\n const backward: AdjacentEdge = {\n edgeId: edge.id,\n otherId: edge.sourceEntityId,\n relationshipType: edge.relationshipType,\n weight,\n };\n // Skip edges pointing at nodes missing from the entity list (partial fetch)\n if (adjacency.has(edge.sourceEntityId) && adjacency.has(edge.targetEntityId)) {\n adjacency.get(edge.sourceEntityId)!.push(forward);\n adjacency.get(edge.targetEntityId)!.push(backward);\n }\n }\n return adjacency;\n}\n\n// ---------------------------------------------------------------------------\n// fewestHops — BFS\n// ---------------------------------------------------------------------------\n\nexport interface FewestHopsOptions {\n now?: number;\n /** Give up beyond this many hops (default: unbounded). */\n maxHops?: number;\n /** Reuse a prebuilt adjacency (must match `data`). */\n adjacency?: Adjacency;\n}\n\n/** BFS shortest path by hop count. Null when unreachable (or beyond maxHops). */\nexport function fewestHops(\n data: GraphDataLike,\n fromId: string,\n toId: string,\n options: FewestHopsOptions = {}\n): GraphPath | null {\n const adjacency = options.adjacency ?? buildAdjacency(data, { now: options.now ?? 0 });\n if (!adjacency.has(fromId) || !adjacency.has(toId)) return null;\n if (fromId === toId) return { nodeIds: [fromId], edgeIds: [], hops: 0, cost: 0 };\n\n const previous = new Map<string, { nodeId: string; edge: AdjacentEdge }>();\n const visited = new Set<string>([fromId]);\n let frontier = [fromId];\n let depth = 0;\n\n while (frontier.length > 0) {\n depth++;\n if (options.maxHops != null && depth > options.maxHops) return null;\n const next: string[] = [];\n for (const nodeId of frontier) {\n for (const edge of adjacency.get(nodeId) ?? []) {\n if (visited.has(edge.otherId)) continue;\n visited.add(edge.otherId);\n previous.set(edge.otherId, { nodeId, edge });\n if (edge.otherId === toId) return reconstructPath(previous, fromId, toId);\n next.push(edge.otherId);\n }\n }\n frontier = next;\n }\n return null;\n}\n\nfunction reconstructPath(\n previous: Map<string, { nodeId: string; edge: AdjacentEdge }>,\n fromId: string,\n toId: string\n): GraphPath {\n const nodeIds: string[] = [toId];\n const edgeIds: string[] = [];\n let cost = 0;\n let cursor = toId;\n while (cursor !== fromId) {\n const step = previous.get(cursor)!;\n edgeIds.unshift(step.edge.edgeId);\n cost += 1 / step.edge.weight;\n nodeIds.unshift(step.nodeId);\n cursor = step.nodeId;\n }\n return { nodeIds, edgeIds, hops: edgeIds.length, cost };\n}\n\n// ---------------------------------------------------------------------------\n// strongestPath — Dijkstra on 1/w costs\n// ---------------------------------------------------------------------------\n\nexport interface StrongestPathOptions {\n /** Epoch ms for the recency factor. REQUIRED for determinism. */\n now: number;\n adjacency?: Adjacency;\n}\n\n/**\n * Dijkstra minimizing sum(1/w): prefers few, strong, recent edges.\n * Can legitimately return MORE hops than `fewestHops` when a longer chain of\n * strong edges beats a weak direct edge. Null when unreachable.\n */\nexport function strongestPath(\n data: GraphDataLike,\n fromId: string,\n toId: string,\n options: StrongestPathOptions\n): GraphPath | null {\n const adjacency = options.adjacency ?? buildAdjacency(data, { now: options.now });\n if (!adjacency.has(fromId) || !adjacency.has(toId)) return null;\n if (fromId === toId) return { nodeIds: [fromId], edgeIds: [], hops: 0, cost: 0 };\n\n const distance = new Map<string, number>([[fromId, 0]]);\n const previous = new Map<string, { nodeId: string; edge: AdjacentEdge }>();\n const settled = new Set<string>();\n // Simple O(V^2) selection — fine at the in-memory scale ceiling.\n const pending = new Set<string>([fromId]);\n\n while (pending.size > 0) {\n let current: string | null = null;\n let best = Number.POSITIVE_INFINITY;\n for (const nodeId of pending) {\n const d = distance.get(nodeId) ?? Number.POSITIVE_INFINITY;\n if (d < best) {\n best = d;\n current = nodeId;\n }\n }\n if (current == null) break;\n pending.delete(current);\n if (current === toId) break;\n if (settled.has(current)) continue;\n settled.add(current);\n\n for (const edge of adjacency.get(current) ?? []) {\n if (settled.has(edge.otherId)) continue;\n const candidate = best + 1 / edge.weight;\n if (candidate < (distance.get(edge.otherId) ?? Number.POSITIVE_INFINITY)) {\n distance.set(edge.otherId, candidate);\n previous.set(edge.otherId, { nodeId: current, edge });\n pending.add(edge.otherId);\n }\n }\n }\n\n if (!distance.has(toId)) return null;\n return reconstructPath(previous, fromId, toId);\n}\n\n// ---------------------------------------------------------------------------\n// bridgeScores — sampled approximate betweenness\n// ---------------------------------------------------------------------------\n\nexport interface BridgeScoreOptions {\n now?: number;\n /** Max sampled node pairs (default 200). */\n sampleSize?: number;\n /** PRNG seed — same seed + same graph → identical scores. */\n seed?: number;\n /** Explicit pair list overrides sampling entirely (fully deterministic). */\n pairs?: Array<[string, string]>;\n}\n\n/** Deterministic mulberry32 PRNG. */\nfunction mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t ^= t + Math.imul(t ^ (t >>> 7), 61 | t);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nexport const DEFAULT_BRIDGE_SAMPLE_SIZE = 200;\nexport const DEFAULT_BRIDGE_SEED = 99;\n\n/**\n * Approximate betweenness: run `fewestHops` over sampled node pairs and count\n * how often each node sits STRICTLY INSIDE the path. Normalized to [0, 1]\n * by the max count. Deterministic given (`seed` | `pairs`) + the graph.\n */\nexport function bridgeScores(\n data: GraphDataLike,\n options: BridgeScoreOptions = {}\n): Map<string, number> {\n const now = options.now ?? 0;\n const adjacency = buildAdjacency(data, { now });\n const nodeIds = data.entities.map(e => e.id);\n const scores = new Map<string, number>(nodeIds.map(id => [id, 0]));\n if (nodeIds.length < 3) return scores;\n\n let pairs: Array<[string, string]>;\n if (options.pairs) {\n pairs = options.pairs;\n } else {\n const sampleSize = options.sampleSize ?? DEFAULT_BRIDGE_SAMPLE_SIZE;\n const random = mulberry32(options.seed ?? DEFAULT_BRIDGE_SEED);\n const seen = new Set<string>();\n pairs = [];\n const maxDistinctPairs = (nodeIds.length * (nodeIds.length - 1)) / 2;\n const target = Math.min(sampleSize, maxDistinctPairs);\n // Bounded attempts so tiny graphs can't loop forever\n for (let attempt = 0; attempt < target * 20 && pairs.length < target; attempt++) {\n const i = Math.floor(random() * nodeIds.length);\n const j = Math.floor(random() * nodeIds.length);\n if (i === j) continue;\n const key = i < j ? `${i}|${j}` : `${j}|${i}`;\n if (seen.has(key)) continue;\n seen.add(key);\n pairs.push([nodeIds[Math.min(i, j)]!, nodeIds[Math.max(i, j)]!]);\n }\n }\n\n for (const [fromId, toId] of pairs) {\n const path = fewestHops(data, fromId, toId, { adjacency });\n if (!path) continue;\n // Strictly-inside nodes only\n for (const nodeId of path.nodeIds.slice(1, -1)) {\n scores.set(nodeId, (scores.get(nodeId) ?? 0) + 1);\n }\n }\n\n let max = 0;\n for (const score of scores.values()) if (score > max) max = score;\n if (max > 0) {\n for (const [nodeId, score] of scores) scores.set(nodeId, score / max);\n }\n return scores;\n}\n\n// ---------------------------------------------------------------------------\n// neighborhood — k-hop subgraph extraction\n// ---------------------------------------------------------------------------\n\n/**\n * The sub-graph within `hops` of `centerId` (entities + every edge whose two\n * endpoints are both inside). Empty graph when the center is unknown.\n */\nexport function neighborhood(data: GraphDataLike, centerId: string, hops: number): GraphDataLike {\n const adjacency = buildAdjacency(data, { now: 0 });\n if (!adjacency.has(centerId)) return { entities: [], relationships: [] };\n\n const included = new Set<string>([centerId]);\n let frontier = [centerId];\n for (let depth = 0; depth < hops && frontier.length > 0; depth++) {\n const next: string[] = [];\n for (const nodeId of frontier) {\n for (const edge of adjacency.get(nodeId) ?? []) {\n if (included.has(edge.otherId)) continue;\n included.add(edge.otherId);\n next.push(edge.otherId);\n }\n }\n frontier = next;\n }\n\n return {\n entities: data.entities.filter(e => included.has(e.id)),\n relationships: data.relationships.filter(\n r => included.has(r.sourceEntityId) && included.has(r.targetEntityId)\n ),\n };\n}\n","/**\n * GTM decorations — pure classification helpers on top of the path engine\n * (plan 100). Implements the POI + bridge definitions from the 2026-07-16\n * gtm-graph spec so every consumer (desk admin route, open-agents endpoint,\n * Shiva MCP routes) classifies nodes identically.\n *\n * - POI (person of interest): persons with `champion_of` /\n * `decision_maker_for` edges into OPEN deals, OR a decision-maker title\n * match on their metadata.\n * - Bridge: top-N nodes by sampled betweenness (`bridgeScores`) — the\n * people/orgs the most shortest paths flow through.\n */\n\nimport { bridgeScores } from './graph-paths';\n\n// ---------------------------------------------------------------------------\n// Structural inputs — a superset of graph-paths' *Like types: decorations\n// also need entity type/metadata and edge metadata.\n// ---------------------------------------------------------------------------\n\nexport interface GtmEntityLike {\n id: string;\n entityType: string;\n entityName?: string;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface GtmEdgeLike {\n id: string;\n sourceEntityId: string;\n targetEntityId: string;\n relationshipType: string;\n strength?: number | null;\n evidenceCount?: number | null;\n lastSeenAt?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface GtmGraphLike {\n entities: GtmEntityLike[];\n relationships: GtmEdgeLike[];\n}\n\nexport type GtmNodeClass = 'poi' | 'bridge' | 'other';\n\n/** Edge types that mark a person as tied to a deal's buying decision. */\nexport const POI_EDGE_TYPES = ['champion_of', 'decision_maker_for'] as const;\n\n/**\n * Canonical CLOSED pipeline stages (lowercased): deals in these stages no\n * longer make their champions POIs. Mirrors `@bu/types/sales-pipeline`\n * (`Activo` = won, `Nurture/Perdido` = lost) — duplicated here because this\n * package is published standalone and cannot import `@bu/*`.\n */\nexport const DEFAULT_CLOSED_STAGES = ['activo', 'nurture/perdido', 'won', 'lost'] as const;\n\n/**\n * Decision-maker title fragments (lowercased substring match) for the\n * title-based POI rule. Derived from the current LATAM-agencies ICP\n * (tasks/notes/2026-07-15-icp-enriched-r1.md in the desk repo). Hosts can\n * override via `PoiOptions.titlePatterns`.\n */\nexport const DEFAULT_POI_TITLE_PATTERNS = [\n 'founder',\n 'co-founder',\n 'cofounder',\n 'ceo',\n 'coo',\n 'cfo',\n 'owner',\n 'partner',\n 'managing director',\n 'director general',\n 'general manager',\n 'head of finance',\n 'head of operations',\n 'finance manager',\n 'operations manager',\n] as const;\n\nexport interface PoiOptions {\n /** Lowercased stage names counting as CLOSED (default: DEFAULT_CLOSED_STAGES). */\n closedStages?: readonly string[];\n /** Lowercased title fragments that qualify a person as POI (default: DEFAULT_POI_TITLE_PATTERNS). */\n titlePatterns?: readonly string[];\n}\n\nfunction metadataString(\n metadata: Record<string, unknown> | null | undefined,\n key: string\n): string | null {\n const value = metadata?.[key];\n return typeof value === 'string' ? value : null;\n}\n\n/** True when the deal entity's `metadata.stage` is NOT in the closed set (unknown stage → open). */\nexport function isOpenDeal(\n deal: GtmEntityLike,\n closedStages: readonly string[] = DEFAULT_CLOSED_STAGES\n): boolean {\n const stage = metadataString(deal.metadata, 'stage');\n if (!stage) return true;\n return !closedStages.includes(stage.trim().toLowerCase());\n}\n\n/**\n * POI ids per the spec: persons with champion_of/decision_maker_for edges\n * into OPEN deals, OR a decision-maker title match.\n */\nexport function computePoiIds(data: GtmGraphLike, options: PoiOptions = {}): Set<string> {\n const closedStages = options.closedStages ?? DEFAULT_CLOSED_STAGES;\n const titlePatterns = options.titlePatterns ?? DEFAULT_POI_TITLE_PATTERNS;\n\n const byId = new Map(data.entities.map(e => [e.id, e]));\n const pois = new Set<string>();\n\n for (const edge of data.relationships) {\n if (!POI_EDGE_TYPES.includes(edge.relationshipType as (typeof POI_EDGE_TYPES)[number]))\n continue;\n const source = byId.get(edge.sourceEntityId);\n const target = byId.get(edge.targetEntityId);\n if (!source || source.entityType !== 'person' || !target) continue;\n // decision_maker_for may point at a deal OR an org; champion_of points at a deal.\n const isDealTarget = target.entityType === 'project';\n if (isDealTarget && !isOpenDeal(target, closedStages)) continue;\n pois.add(source.id);\n }\n\n for (const entity of data.entities) {\n if (entity.entityType !== 'person') continue;\n const title = metadataString(entity.metadata, 'title')?.toLowerCase();\n if (!title) continue;\n if (titlePatterns.some(pattern => title.includes(pattern))) pois.add(entity.id);\n }\n\n return pois;\n}\n\nexport interface BridgeOptions {\n /** How many top-scored nodes count as bridges (default 5). */\n topN?: number;\n /** Epoch ms for recency weighting (default 0 = ignore recency). */\n now?: number;\n /** Deterministic sampling seed forwarded to bridgeScores. */\n seed?: number;\n /** Explicit pair list forwarded to bridgeScores (fully deterministic). */\n pairs?: Array<[string, string]>;\n}\n\n/**\n * Top-N bridge node ids by sampled betweenness. Nodes with score 0 are never\n * bridges, so small/star graphs can return fewer than `topN`.\n */\nexport function computeBridgeIds(data: GtmGraphLike, options: BridgeOptions = {}): Set<string> {\n const topN = options.topN ?? 5;\n const scores = bridgeScores(data, {\n now: options.now ?? 0,\n seed: options.seed,\n pairs: options.pairs,\n });\n const ranked = [...scores.entries()]\n .filter(([, score]) => score > 0)\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, topN);\n return new Set(ranked.map(([id]) => id));\n}\n\n/** Node class from precomputed POI/bridge sets — POI wins over bridge. */\nexport function classifyNode(\n id: string,\n poiIds: ReadonlySet<string>,\n bridgeIds: ReadonlySet<string>\n): GtmNodeClass {\n if (poiIds.has(id)) return 'poi';\n if (bridgeIds.has(id)) return 'bridge';\n return 'other';\n}\n\n/**\n * Cap a graph at `maxNodes` keeping the highest-degree nodes (POIs/bridges\n * always survive), plus every edge whose two endpoints survive.\n */\nexport function capGraph(\n data: GtmGraphLike,\n maxNodes: number,\n pinned: ReadonlySet<string> = new Set()\n): GtmGraphLike {\n if (data.entities.length <= maxNodes) return data;\n\n const degree = new Map<string, number>();\n for (const edge of data.relationships) {\n degree.set(edge.sourceEntityId, (degree.get(edge.sourceEntityId) ?? 0) + 1);\n degree.set(edge.targetEntityId, (degree.get(edge.targetEntityId) ?? 0) + 1);\n }\n\n const ranked = [...data.entities].sort((a, b) => {\n const pinnedDelta = Number(pinned.has(b.id)) - Number(pinned.has(a.id));\n if (pinnedDelta !== 0) return pinnedDelta;\n return (degree.get(b.id) ?? 0) - (degree.get(a.id) ?? 0) || a.id.localeCompare(b.id);\n });\n\n const keep = new Set(ranked.slice(0, maxNodes).map(e => e.id));\n return {\n entities: data.entities.filter(e => keep.has(e.id)),\n relationships: data.relationships.filter(\n r => keep.has(r.sourceEntityId) && keep.has(r.targetEntityId)\n ),\n };\n}\n"]}
@@ -0,0 +1,53 @@
1
+ export { Adjacency, AdjacentEdge, BridgeOptions, BridgeScoreOptions, DEFAULT_BRIDGE_SAMPLE_SIZE, DEFAULT_BRIDGE_SEED, DEFAULT_CLOSED_STAGES, DEFAULT_EVIDENCE_COUNT, DEFAULT_POI_TITLE_PATTERNS, DEFAULT_STRENGTH, FewestHopsOptions, GraphDataLike, GraphEdgeLike, GraphEntityLike, GraphPath, GtmEdgeLike, GtmEntityLike, GtmGraphLike, GtmNodeClass, MIN_EDGE_WEIGHT, POI_EDGE_TYPES, PoiOptions, RECENCY_HALF_LIFE_DAYS, StrongestPathOptions, bridgeScores, buildAdjacency, capGraph, classifyNode, computeBridgeIds, computePoiIds, edgeWeight, fewestHops, isOpenDeal, neighborhood, recencyFactor, strongestPath } from './algorithms/index.cjs';
2
+
3
+ /**
4
+ * Graph data contracts for `@bufinance/gtm-graph`.
5
+ *
6
+ * Deliberately a MINIMAL structural duplicate of the BUFI desk repo's
7
+ * `KnowledgeGraphData` (`@bu/types/intelligence`) — this package is published
8
+ * standalone and cannot import `@bu/*`. Structural compatibility is asserted
9
+ * by a compat test inside the desk repo
10
+ * (`packages/intelligence/src/knowledge/gtm-graph-compat.test.ts`).
11
+ *
12
+ * `lastSeenAt`/`metadata` on edges are optional because the desk's
13
+ * `get_knowledge_graph` RPC omits them; hosts that fetch
14
+ * `entity_relationships` directly should include both so recency fading and
15
+ * true traversal weights work.
16
+ */
17
+ interface GtmGraphEntity {
18
+ id: string;
19
+ entityType: string;
20
+ entityName: string;
21
+ content?: string | null;
22
+ metadata?: Record<string, unknown> | null;
23
+ createdAt?: string | null;
24
+ updatedAt?: string | null;
25
+ }
26
+ interface GtmGraphEdge {
27
+ id: string;
28
+ sourceEntityId: string;
29
+ targetEntityId: string;
30
+ relationshipType: string;
31
+ strength?: number | null;
32
+ evidenceCount?: number | null;
33
+ lastSeenAt?: string | null;
34
+ metadata?: Record<string, unknown> | null;
35
+ }
36
+ interface GtmGraphData {
37
+ entities: GtmGraphEntity[];
38
+ relationships: GtmGraphEdge[];
39
+ }
40
+ /** Server-computed decorations shipped alongside the graph payload. */
41
+ interface GtmGraphDecorations {
42
+ /** Person-of-interest entity ids (spec: champions/decision-makers on open deals + ICP title matches). */
43
+ poiIds: string[];
44
+ /** Normalized [0,1] betweenness per entity id (only nonzero entries need be present). */
45
+ bridgeScores: Record<string, number>;
46
+ }
47
+ interface GtmGraphPayload extends GtmGraphData {
48
+ decorations: GtmGraphDecorations;
49
+ /** Epoch ms the server computed the payload at — drives recency fading client-side. */
50
+ generatedAt: number;
51
+ }
52
+
53
+ export type { GtmGraphData, GtmGraphDecorations, GtmGraphEdge, GtmGraphEntity, GtmGraphPayload };
@@ -0,0 +1,53 @@
1
+ export { Adjacency, AdjacentEdge, BridgeOptions, BridgeScoreOptions, DEFAULT_BRIDGE_SAMPLE_SIZE, DEFAULT_BRIDGE_SEED, DEFAULT_CLOSED_STAGES, DEFAULT_EVIDENCE_COUNT, DEFAULT_POI_TITLE_PATTERNS, DEFAULT_STRENGTH, FewestHopsOptions, GraphDataLike, GraphEdgeLike, GraphEntityLike, GraphPath, GtmEdgeLike, GtmEntityLike, GtmGraphLike, GtmNodeClass, MIN_EDGE_WEIGHT, POI_EDGE_TYPES, PoiOptions, RECENCY_HALF_LIFE_DAYS, StrongestPathOptions, bridgeScores, buildAdjacency, capGraph, classifyNode, computeBridgeIds, computePoiIds, edgeWeight, fewestHops, isOpenDeal, neighborhood, recencyFactor, strongestPath } from './algorithms/index.js';
2
+
3
+ /**
4
+ * Graph data contracts for `@bufinance/gtm-graph`.
5
+ *
6
+ * Deliberately a MINIMAL structural duplicate of the BUFI desk repo's
7
+ * `KnowledgeGraphData` (`@bu/types/intelligence`) — this package is published
8
+ * standalone and cannot import `@bu/*`. Structural compatibility is asserted
9
+ * by a compat test inside the desk repo
10
+ * (`packages/intelligence/src/knowledge/gtm-graph-compat.test.ts`).
11
+ *
12
+ * `lastSeenAt`/`metadata` on edges are optional because the desk's
13
+ * `get_knowledge_graph` RPC omits them; hosts that fetch
14
+ * `entity_relationships` directly should include both so recency fading and
15
+ * true traversal weights work.
16
+ */
17
+ interface GtmGraphEntity {
18
+ id: string;
19
+ entityType: string;
20
+ entityName: string;
21
+ content?: string | null;
22
+ metadata?: Record<string, unknown> | null;
23
+ createdAt?: string | null;
24
+ updatedAt?: string | null;
25
+ }
26
+ interface GtmGraphEdge {
27
+ id: string;
28
+ sourceEntityId: string;
29
+ targetEntityId: string;
30
+ relationshipType: string;
31
+ strength?: number | null;
32
+ evidenceCount?: number | null;
33
+ lastSeenAt?: string | null;
34
+ metadata?: Record<string, unknown> | null;
35
+ }
36
+ interface GtmGraphData {
37
+ entities: GtmGraphEntity[];
38
+ relationships: GtmGraphEdge[];
39
+ }
40
+ /** Server-computed decorations shipped alongside the graph payload. */
41
+ interface GtmGraphDecorations {
42
+ /** Person-of-interest entity ids (spec: champions/decision-makers on open deals + ICP title matches). */
43
+ poiIds: string[];
44
+ /** Normalized [0,1] betweenness per entity id (only nonzero entries need be present). */
45
+ bridgeScores: Record<string, number>;
46
+ }
47
+ interface GtmGraphPayload extends GtmGraphData {
48
+ decorations: GtmGraphDecorations;
49
+ /** Epoch ms the server computed the payload at — drives recency fading client-side. */
50
+ generatedAt: number;
51
+ }
52
+
53
+ export type { GtmGraphData, GtmGraphDecorations, GtmGraphEdge, GtmGraphEntity, GtmGraphPayload };
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { DEFAULT_BRIDGE_SAMPLE_SIZE, DEFAULT_BRIDGE_SEED, DEFAULT_CLOSED_STAGES, DEFAULT_EVIDENCE_COUNT, DEFAULT_POI_TITLE_PATTERNS, DEFAULT_STRENGTH, MIN_EDGE_WEIGHT, POI_EDGE_TYPES, RECENCY_HALF_LIFE_DAYS, bridgeScores, buildAdjacency, capGraph, classifyNode, computeBridgeIds, computePoiIds, edgeWeight, fewestHops, isOpenDeal, neighborhood, recencyFactor, strongestPath } from './chunk-MW4VOWB5.js';
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}