@omiron33/omi-neuron-web 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.
- package/README.md +55 -0
- package/dist/api/index.cjs +943 -0
- package/dist/api/index.cjs.map +1 -0
- package/dist/api/index.d.cts +140 -0
- package/dist/api/index.d.ts +140 -0
- package/dist/api/index.js +934 -0
- package/dist/api/index.js.map +1 -0
- package/dist/chunk-BSOSHBDR.cjs +300 -0
- package/dist/chunk-BSOSHBDR.cjs.map +1 -0
- package/dist/chunk-COO66N7H.cjs +950 -0
- package/dist/chunk-COO66N7H.cjs.map +1 -0
- package/dist/chunk-FXKXMSLY.cjs +270 -0
- package/dist/chunk-FXKXMSLY.cjs.map +1 -0
- package/dist/chunk-PSDVPB7Y.js +289 -0
- package/dist/chunk-PSDVPB7Y.js.map +1 -0
- package/dist/chunk-RQCGONPN.js +937 -0
- package/dist/chunk-RQCGONPN.js.map +1 -0
- package/dist/chunk-RTSFO7BW.cjs +592 -0
- package/dist/chunk-RTSFO7BW.cjs.map +1 -0
- package/dist/chunk-TFLMPBX7.js +262 -0
- package/dist/chunk-TFLMPBX7.js.map +1 -0
- package/dist/chunk-XNR42GCJ.js +547 -0
- package/dist/chunk-XNR42GCJ.js.map +1 -0
- package/dist/cli/index.cjs +571 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +563 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/database-B0vplyA4.d.cts +41 -0
- package/dist/database-B0vplyA4.d.ts +41 -0
- package/dist/edge-BzsYe2Ed.d.cts +269 -0
- package/dist/edge-BzsYe2Ed.d.ts +269 -0
- package/dist/index.cjs +895 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1484 -0
- package/dist/index.d.ts +1484 -0
- package/dist/index.js +654 -0
- package/dist/index.js.map +1 -0
- package/dist/migration/index.cjs +32 -0
- package/dist/migration/index.cjs.map +1 -0
- package/dist/migration/index.d.cts +51 -0
- package/dist/migration/index.d.ts +51 -0
- package/dist/migration/index.js +3 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/query-helpers-D8po5Mn-.d.cts +777 -0
- package/dist/query-helpers-DvQTA2_Z.d.ts +777 -0
- package/dist/visualization/index.cjs +485 -0
- package/dist/visualization/index.cjs.map +1 -0
- package/dist/visualization/index.d.cts +134 -0
- package/dist/visualization/index.d.ts +134 -0
- package/dist/visualization/index.js +460 -0
- package/dist/visualization/index.js.map +1 -0
- package/docker/docker-compose.template.yml +28 -0
- package/package.json +116 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/events/event-bus.ts","../src/core/analysis/embeddings-service.ts","../src/core/analysis/clustering-engine.ts","../src/core/analysis/relationship-engine.ts","../src/core/analysis/pipeline.ts","../src/storage/database.ts"],"names":["OpenAI","rows"],"mappings":"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","file":"chunk-RQCGONPN.js","sourcesContent":["import type {\n EventHandler,\n EventSubscription,\n EventSource,\n NeuronEvent,\n NeuronEventEmitter,\n NeuronEventType,\n} from '../types/events';\n\nexport type EventMiddleware = (event: NeuronEvent, next: () => void | Promise<void>) =>\n | void\n | Promise<void>;\n\nexport class EventBus implements NeuronEventEmitter {\n private subscribers = new Map<NeuronEventType, Set<EventHandler>>();\n private globalSubscribers = new Set<EventHandler>();\n private middleware: EventMiddleware[] = [];\n private history: NeuronEvent[] = [];\n private historyLimit = 200;\n\n emit<T>(event: NeuronEvent<T>): void {\n void this.emitAsync(event);\n }\n\n async emitAsync<T>(event: NeuronEvent<T>): Promise<void> {\n await this.runMiddleware(event, async () => {\n this.recordEvent(event);\n const handlers = this.subscribers.get(event.type);\n if (handlers) {\n for (const handler of handlers) {\n await handler(event);\n }\n }\n for (const handler of this.globalSubscribers) {\n await handler(event);\n }\n });\n }\n\n subscribe<T>(type: NeuronEventType, handler: EventHandler<T>): EventSubscription {\n if (!this.subscribers.has(type)) {\n this.subscribers.set(type, new Set());\n }\n this.subscribers.get(type)!.add(handler as EventHandler);\n return {\n unsubscribe: () => this.unsubscribe(type, handler as EventHandler),\n };\n }\n\n subscribeMany(types: NeuronEventType[], handler: EventHandler): EventSubscription {\n types.forEach((type) => this.subscribe(type, handler));\n return {\n unsubscribe: () => types.forEach((type) => this.unsubscribe(type, handler)),\n };\n }\n\n subscribeAll(handler: EventHandler<unknown>): EventSubscription {\n this.globalSubscribers.add(handler as EventHandler);\n return {\n unsubscribe: () => {\n this.globalSubscribers.delete(handler as EventHandler);\n },\n };\n }\n\n unsubscribe(type: NeuronEventType, handler: EventHandler): void {\n const handlers = this.subscribers.get(type);\n if (!handlers) return;\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.subscribers.delete(type);\n }\n }\n\n unsubscribeAll(): void {\n this.subscribers.clear();\n this.globalSubscribers.clear();\n }\n\n use(middleware: EventMiddleware): void {\n this.middleware.push(middleware);\n }\n\n getSubscriberCount(type?: NeuronEventType): number {\n if (!type) {\n let count = this.globalSubscribers.size;\n for (const handlers of this.subscribers.values()) {\n count += handlers.size;\n }\n return count;\n }\n return this.subscribers.get(type)?.size ?? 0;\n }\n\n getEventHistory(limit?: number): NeuronEvent[] {\n if (!limit) return [...this.history];\n return this.history.slice(-limit);\n }\n\n clearHistory(): void {\n this.history = [];\n }\n\n private recordEvent(event: NeuronEvent): void {\n this.history.push(event);\n if (this.history.length > this.historyLimit) {\n this.history.shift();\n }\n }\n\n private async runMiddleware(event: NeuronEvent, finalHandler: () => void | Promise<void>) {\n const stack = [...this.middleware];\n let index = -1;\n\n const runner = async (): Promise<void> => {\n index += 1;\n if (index < stack.length) {\n await stack[index](event, runner);\n } else {\n await finalHandler();\n }\n };\n\n await runner();\n }\n}\n\nexport const createEvent = <T>(\n type: NeuronEventType,\n payload: T,\n source: EventSource = 'system'\n): NeuronEvent<T> => ({\n type,\n payload,\n source,\n timestamp: new Date(),\n});\n","import OpenAI from 'openai';\nimport type { Database } from '../../storage/database';\n\nexport interface EmbeddingsConfig {\n openaiApiKey: string;\n model: 'text-embedding-ada-002' | 'text-embedding-3-small' | 'text-embedding-3-large';\n dimensions?: number;\n batchSize: number;\n rateLimit: number;\n cacheTTL: number;\n maxRetries: number;\n}\n\nexport interface EmbeddingResult {\n nodeId: string;\n embedding: number[];\n model: string;\n tokenCount: number;\n cached: boolean;\n}\n\nexport class EmbeddingsService {\n private client: OpenAI;\n\n constructor(private config: EmbeddingsConfig, private db: Database) {\n this.client = new OpenAI({ apiKey: config.openaiApiKey });\n }\n\n async generateEmbedding(text: string): Promise<number[]> {\n const response = await this.client.embeddings.create({\n model: this.config.model,\n input: text,\n dimensions: this.config.dimensions,\n });\n return response.data[0].embedding;\n }\n\n async generateBatchEmbeddings(texts: string[]): Promise<number[][]> {\n const response = await this.client.embeddings.create({\n model: this.config.model,\n input: texts,\n dimensions: this.config.dimensions,\n });\n return response.data.map((item) => item.embedding as number[]);\n }\n\n async embedNode(nodeId: string): Promise<EmbeddingResult> {\n const node = await this.db.queryOne<{ id: string; content: string | null; embedding: number[] | null; embedding_generated_at: Date | null; }>(\n 'SELECT id, content, embedding, embedding_generated_at FROM nodes WHERE id = $1',\n [nodeId]\n );\n\n if (!node) {\n throw new Error(`Node not found: ${nodeId}`);\n }\n\n const cached = await this.getCachedEmbedding(nodeId);\n if (cached) {\n return {\n nodeId,\n embedding: cached,\n model: this.config.model,\n tokenCount: this.countTokens(node.content ?? ''),\n cached: true,\n };\n }\n\n const text = node.content ?? '';\n const embedding = await this.withRetry(() => this.generateEmbedding(text));\n await this.cacheEmbedding(nodeId, embedding, this.config.model);\n\n return {\n nodeId,\n embedding,\n model: this.config.model,\n tokenCount: this.countTokens(text),\n cached: false,\n };\n }\n\n async embedNodes(nodeIds: string[]): Promise<{\n results: EmbeddingResult[];\n errors: Array<{ nodeId: string; error: string }>;\n }> {\n const results: EmbeddingResult[] = [];\n const errors: Array<{ nodeId: string; error: string }> = [];\n\n const batches = [];\n for (let i = 0; i < nodeIds.length; i += this.config.batchSize) {\n batches.push(nodeIds.slice(i, i + this.config.batchSize));\n }\n\n for (const batch of batches) {\n try {\n const nodes = await this.db.query<{ id: string; content: string | null }>(\n 'SELECT id, content FROM nodes WHERE id = ANY($1)',\n [batch]\n );\n\n const texts = nodes.map((node) => node.content ?? '');\n const embeddings = await this.withRetry(() => this.generateBatchEmbeddings(texts));\n\n for (let idx = 0; idx < nodes.length; idx += 1) {\n const node = nodes[idx];\n const embedding = embeddings[idx];\n await this.cacheEmbedding(node.id, embedding, this.config.model);\n results.push({\n nodeId: node.id,\n embedding,\n model: this.config.model,\n tokenCount: this.countTokens(node.content ?? ''),\n cached: false,\n });\n }\n\n await this.applyRateLimit();\n } catch (error) {\n batch.forEach((nodeId) => {\n errors.push({ nodeId, error: error instanceof Error ? error.message : String(error) });\n });\n }\n }\n\n return { results, errors };\n }\n\n async getCachedEmbedding(nodeId: string): Promise<number[] | null> {\n const row = await this.db.queryOne<{ embedding: number[] | null; embedding_generated_at: Date | null; embedding_model: string | null }>(\n 'SELECT embedding, embedding_generated_at, embedding_model FROM nodes WHERE id = $1',\n [nodeId]\n );\n if (!row?.embedding) return null;\n\n if (row.embedding_model !== this.config.model) return null;\n if (!row.embedding_generated_at) return row.embedding;\n\n const ageSeconds = (Date.now() - row.embedding_generated_at.getTime()) / 1000;\n if (ageSeconds > this.config.cacheTTL) return null;\n\n return row.embedding;\n }\n\n async cacheEmbedding(nodeId: string, embedding: number[], model: string): Promise<void> {\n await this.db.execute(\n 'UPDATE nodes SET embedding = $1, embedding_model = $2, embedding_generated_at = NOW() WHERE id = $3',\n [embedding, model, nodeId]\n );\n }\n\n async invalidateCache(nodeIds?: string[]): Promise<void> {\n if (nodeIds?.length) {\n await this.db.execute(\n 'UPDATE nodes SET embedding = NULL, embedding_model = NULL, embedding_generated_at = NULL WHERE id = ANY($1)',\n [nodeIds]\n );\n return;\n }\n await this.db.execute(\n 'UPDATE nodes SET embedding = NULL, embedding_model = NULL, embedding_generated_at = NULL'\n );\n }\n\n countTokens(text: string): number {\n return Math.ceil(text.length / 4);\n }\n\n estimateCost(nodeCount: number): { tokens: number; cost: number } {\n const tokens = nodeCount * 512;\n const pricePerMillion = this.config.model === 'text-embedding-3-large'\n ? 0.13\n : this.config.model === 'text-embedding-3-small'\n ? 0.02\n : 0.1;\n const cost = (tokens / 1_000_000) * pricePerMillion;\n return { tokens, cost };\n }\n\n private async withRetry<T>(fn: () => Promise<T>): Promise<T> {\n let attempt = 0;\n while (attempt <= this.config.maxRetries) {\n try {\n return await fn();\n } catch (error) {\n attempt += 1;\n if (attempt > this.config.maxRetries) {\n throw error;\n }\n const delay = 500 * Math.pow(2, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n throw new Error('Exceeded retry attempts');\n }\n\n private async applyRateLimit(): Promise<void> {\n const delayMs = Math.ceil(60_000 / this.config.rateLimit);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n}\n","import crypto from 'node:crypto';\nimport type { Database } from '../../storage/database';\nimport type { ClusterMembership } from '../types/cluster';\nimport type { NeuronNode } from '../types/node';\nimport type { EmbeddingsService } from './embeddings-service';\n\nexport interface ClusteringConfig {\n algorithm: 'kmeans' | 'dbscan' | 'hierarchical';\n clusterCount?: number;\n minClusterSize?: number;\n similarityThreshold?: number;\n epsilon?: number;\n minSamples?: number;\n}\n\nexport interface ClusteringResult {\n clusterId: string;\n label: string;\n nodeIds: string[];\n centroid: number[];\n avgSimilarity: number;\n cohesion: number;\n}\n\nconst cosineSimilarity = (a: number[], b: number[]): number => {\n let dot = 0;\n let magA = 0;\n let magB = 0;\n for (let i = 0; i < a.length; i += 1) {\n dot += a[i] * b[i];\n magA += a[i] * a[i];\n magB += b[i] * b[i];\n }\n if (magA === 0 || magB === 0) return 0;\n return dot / (Math.sqrt(magA) * Math.sqrt(magB));\n};\n\nconst averageVector = (vectors: number[][]): number[] => {\n const length = vectors[0]?.length ?? 0;\n const sum = new Array(length).fill(0);\n vectors.forEach((vector) => {\n vector.forEach((value, idx) => {\n sum[idx] += value;\n });\n });\n return sum.map((value) => value / vectors.length);\n};\n\nexport class ClusteringEngine {\n constructor(private db: Database, private embeddings: EmbeddingsService) {}\n\n async clusterNodes(config: ClusteringConfig): Promise<{ clusters: ClusteringResult[]; unassigned: string[] }> {\n const nodes = await this.fetchNodesWithEmbeddings();\n if (nodes.length === 0) return { clusters: [], unassigned: [] };\n\n let clusters: ClusteringResult[] = [];\n if (config.algorithm === 'dbscan') {\n clusters = this.runDbscan(nodes, config);\n } else {\n clusters = this.runKmeans(nodes, config);\n }\n\n await this.persistClusters(clusters);\n\n const assigned = new Set(clusters.flatMap((cluster) => cluster.nodeIds));\n const unassigned = nodes.map((node) => node.id).filter((id) => !assigned.has(id));\n\n return { clusters, unassigned };\n }\n\n async recluster(config: ClusteringConfig): Promise<ClusteringResult[]> {\n const { clusters } = await this.clusterNodes(config);\n return clusters;\n }\n\n async assignToCluster(nodeId: string): Promise<ClusterMembership | null> {\n const node = await this.db.queryOne<{ id: string; embedding: number[] | null }>(\n 'SELECT id, embedding FROM nodes WHERE id = $1',\n [nodeId]\n );\n if (!node?.embedding) return null;\n\n const best = await this.findBestCluster(node.embedding);\n if (!best) return null;\n\n await this.db.execute(\n 'INSERT INTO cluster_memberships (node_id, cluster_id, similarity_score, is_primary) VALUES ($1, $2, $3, true) ON CONFLICT (node_id, cluster_id) DO UPDATE SET similarity_score = $3, is_primary = true',\n [nodeId, best.clusterId, best.similarity]\n );\n await this.db.execute('UPDATE nodes SET cluster_id = $1, cluster_similarity = $2 WHERE id = $3', [\n best.clusterId,\n best.similarity,\n nodeId,\n ]);\n\n return {\n nodeId,\n clusterId: best.clusterId,\n similarityScore: best.similarity,\n isPrimary: true,\n assignedAt: new Date(),\n };\n }\n\n async findBestCluster(embedding: number[]): Promise<{ clusterId: string; similarity: number } | null> {\n const clusters = await this.db.query<{ id: string; centroid: number[] | null }>(\n 'SELECT id, centroid FROM clusters WHERE centroid IS NOT NULL'\n );\n let best: { clusterId: string; similarity: number } | null = null;\n clusters.forEach((cluster) => {\n if (!cluster.centroid) return;\n const similarity = cosineSimilarity(cluster.centroid, embedding);\n if (!best || similarity > best.similarity) {\n best = { clusterId: cluster.id, similarity };\n }\n });\n return best;\n }\n\n async recomputeCentroid(clusterId: string): Promise<void> {\n const rows = await this.db.query<{ embedding: number[] | null }>(\n 'SELECT n.embedding FROM nodes n JOIN cluster_memberships cm ON n.id = cm.node_id WHERE cm.cluster_id = $1',\n [clusterId]\n );\n const vectors = rows.map((row) => row.embedding).filter(Boolean) as number[][];\n if (vectors.length === 0) return;\n const centroid = averageVector(vectors);\n await this.db.execute('UPDATE clusters SET centroid = $1, last_recomputed_at = NOW() WHERE id = $2', [\n centroid,\n clusterId,\n ]);\n }\n\n async recomputeAllCentroids(): Promise<void> {\n const clusters = await this.db.query<{ id: string }>('SELECT id FROM clusters');\n for (const cluster of clusters) {\n await this.recomputeCentroid(cluster.id);\n }\n }\n\n async generateClusterLabel(clusterId: string): Promise<string> {\n const rows = await this.db.query<{ label: string }>(\n 'SELECT n.label FROM nodes n JOIN cluster_memberships cm ON n.id = cm.node_id WHERE cm.cluster_id = $1 LIMIT 5',\n [clusterId]\n );\n const label = rows.map((row) => row.label).join(', ');\n await this.db.execute('UPDATE clusters SET label = $1 WHERE id = $2', [label, clusterId]);\n return label;\n }\n\n async generateAllLabels(): Promise<void> {\n const clusters = await this.db.query<{ id: string }>('SELECT id FROM clusters');\n for (const cluster of clusters) {\n await this.generateClusterLabel(cluster.id);\n }\n }\n\n calculateSilhouetteScore(clusters: ClusteringResult[]): number {\n if (clusters.length === 0) return 0;\n return clusters.reduce((acc, cluster) => acc + cluster.cohesion, 0) / clusters.length;\n }\n\n calculateCohesion(cluster: ClusteringResult): number {\n return cluster.cohesion;\n }\n\n private async fetchNodesWithEmbeddings(): Promise<Array<NeuronNode & { embedding: number[] }>> {\n const nodes = await this.db.query<NeuronNode & { embedding: number[] }>(\n 'SELECT * FROM nodes WHERE embedding IS NOT NULL'\n );\n return nodes as Array<NeuronNode & { embedding: number[] }>;\n }\n\n private runKmeans(nodes: Array<NeuronNode & { embedding: number[] }>, config: ClusteringConfig): ClusteringResult[] {\n const k = Math.max(1, config.clusterCount ?? 3);\n const centroids: number[][] = [];\n const initialNodes = [...nodes].sort(() => Math.random() - 0.5).slice(0, k);\n initialNodes.forEach((node) => centroids.push([...node.embedding]));\n\n let assignments = new Map<string, number>();\n for (let iteration = 0; iteration < 10; iteration += 1) {\n assignments = new Map();\n nodes.forEach((node) => {\n let bestIndex = 0;\n let bestScore = -Infinity;\n centroids.forEach((centroid, idx) => {\n const score = cosineSimilarity(node.embedding, centroid);\n if (score > bestScore) {\n bestScore = score;\n bestIndex = idx;\n }\n });\n assignments.set(node.id, bestIndex);\n });\n\n for (let i = 0; i < k; i += 1) {\n const members = nodes.filter((node) => assignments.get(node.id) === i);\n if (members.length === 0) continue;\n centroids[i] = averageVector(members.map((node) => node.embedding));\n }\n }\n\n const clusters: ClusteringResult[] = [];\n for (let i = 0; i < k; i += 1) {\n const members = nodes.filter((node) => assignments.get(node.id) === i);\n if (members.length === 0) continue;\n const centroid = centroids[i];\n const similarities = members.map((node) => cosineSimilarity(node.embedding, centroid));\n const avgSimilarity = similarities.reduce((acc, val) => acc + val, 0) / similarities.length;\n clusters.push({\n clusterId: crypto.randomUUID(),\n label: members.map((node) => node.label).slice(0, 3).join(', '),\n nodeIds: members.map((node) => node.id),\n centroid,\n avgSimilarity,\n cohesion: avgSimilarity,\n });\n }\n\n return clusters;\n }\n\n private runDbscan(nodes: Array<NeuronNode & { embedding: number[] }>, config: ClusteringConfig): ClusteringResult[] {\n const epsilon = config.similarityThreshold ?? 0.75;\n const minSamples = config.minSamples ?? 2;\n const visited = new Set<string>();\n const clusters: ClusteringResult[] = [];\n\n for (const node of nodes) {\n if (visited.has(node.id)) continue;\n visited.add(node.id);\n const neighbors = this.findNeighbors(nodes, node, epsilon);\n if (neighbors.length < minSamples) {\n continue;\n }\n\n const clusterMembers = new Set<string>([node.id, ...neighbors.map((n) => n.id)]);\n let idx = 0;\n const neighborList = [...neighbors];\n while (idx < neighborList.length) {\n const neighbor = neighborList[idx];\n if (!visited.has(neighbor.id)) {\n visited.add(neighbor.id);\n const neighborNeighbors = this.findNeighbors(nodes, neighbor, epsilon);\n if (neighborNeighbors.length >= minSamples) {\n neighborNeighbors.forEach((n) => {\n if (!clusterMembers.has(n.id)) {\n clusterMembers.add(n.id);\n neighborList.push(n);\n }\n });\n }\n }\n idx += 1;\n }\n\n const members = nodes.filter((n) => clusterMembers.has(n.id));\n const centroid = averageVector(members.map((member) => member.embedding));\n const similarities = members.map((member) => cosineSimilarity(member.embedding, centroid));\n const avgSimilarity = similarities.reduce((acc, val) => acc + val, 0) / similarities.length;\n clusters.push({\n clusterId: crypto.randomUUID(),\n label: members.map((member) => member.label).slice(0, 3).join(', '),\n nodeIds: members.map((member) => member.id),\n centroid,\n avgSimilarity,\n cohesion: avgSimilarity,\n });\n }\n\n return clusters;\n }\n\n private findNeighbors(\n nodes: Array<NeuronNode & { embedding: number[] }>,\n node: NeuronNode & { embedding: number[] },\n threshold: number\n ) {\n return nodes.filter((candidate) => {\n if (candidate.id === node.id) return false;\n return cosineSimilarity(candidate.embedding, node.embedding) >= threshold;\n });\n }\n\n private async persistClusters(clusters: ClusteringResult[]): Promise<void> {\n await this.db.transaction(async (client) => {\n await client.query('DELETE FROM cluster_memberships');\n await client.query('DELETE FROM clusters');\n\n for (const cluster of clusters) {\n await client.query(\n 'INSERT INTO clusters (id, label, centroid, member_count, avg_similarity, cohesion, created_at, updated_at) VALUES ($1, $2, $3, $4, $5, $6, NOW(), NOW())',\n [\n cluster.clusterId,\n cluster.label,\n cluster.centroid,\n cluster.nodeIds.length,\n cluster.avgSimilarity,\n cluster.cohesion,\n ]\n );\n\n for (const nodeId of cluster.nodeIds) {\n await client.query(\n 'INSERT INTO cluster_memberships (node_id, cluster_id, similarity_score, is_primary) VALUES ($1, $2, $3, true)',\n [nodeId, cluster.clusterId, cluster.avgSimilarity]\n );\n await client.query('UPDATE nodes SET cluster_id = $1, cluster_similarity = $2 WHERE id = $3', [\n cluster.clusterId,\n cluster.avgSimilarity,\n nodeId,\n ]);\n }\n }\n });\n }\n}\n","import OpenAI from 'openai';\nimport type { Database } from '../../storage/database';\nimport type { EdgeEvidence, NeuronEdge, RelationshipType } from '../types/edge';\n\nexport interface InferenceConfig {\n model: string;\n minConfidence: number;\n maxPerNode: number;\n similarityThreshold: number;\n includeExisting: boolean;\n batchSize: number;\n rateLimit: number;\n}\n\nexport interface InferredRelationship {\n fromNodeId: string;\n toNodeId: string;\n relationshipType: RelationshipType;\n confidence: number;\n reasoning: string;\n evidence: EdgeEvidence[];\n}\n\nconst INFERENCE_PROMPT = `You are analyzing potential relationships between concepts in a knowledge graph.\n\nNode A:\n- Label: {nodeA.label}\n- Summary: {nodeA.summary}\n- Content: {nodeA.content}\n\nNode B:\n- Label: {nodeB.label}\n- Summary: {nodeB.summary}\n- Content: {nodeB.content}\n\nDetermine if there is a meaningful relationship between these nodes.\n\nRespond in JSON:\n{\n \"hasRelationship\": boolean,\n \"relationshipType\": \"related_to\" | \"derives_from\" | \"contradicts\" | \"supports\" | \"references\" | \"part_of\" | \"leads_to\" | \"similar_to\",\n \"confidence\": 0.0-1.0,\n \"reasoning\": \"Brief explanation\",\n \"evidence\": [\"Specific quote or fact supporting this\"]\n}\n`;\n\nexport class RelationshipEngine {\n private client: OpenAI;\n\n constructor(private db: Database, private config: InferenceConfig) {\n this.client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY ?? '' });\n }\n\n async inferForNode(nodeId: string): Promise<InferredRelationship[]> {\n const candidates = await this.findCandidates(nodeId);\n const inferred: InferredRelationship[] = [];\n\n for (const candidate of candidates.slice(0, this.config.maxPerNode)) {\n const inference = await this.inferPair(nodeId, candidate.nodeId);\n if (inference && inference.confidence >= this.config.minConfidence) {\n inferred.push(inference);\n }\n await this.applyRateLimit();\n }\n\n return inferred;\n }\n\n async inferForNodes(nodeIds: string[]): Promise<{\n inferred: InferredRelationship[];\n errors: Array<{ nodeId: string; error: string }>;\n }> {\n const inferred: InferredRelationship[] = [];\n const errors: Array<{ nodeId: string; error: string }> = [];\n\n for (const nodeId of nodeIds) {\n try {\n const results = await this.inferForNode(nodeId);\n inferred.push(...results);\n } catch (error) {\n errors.push({ nodeId, error: error instanceof Error ? error.message : String(error) });\n }\n }\n\n return { inferred, errors };\n }\n\n async inferAll(): Promise<InferredRelationship[]> {\n const nodes = await this.db.query<{ id: string }>('SELECT id FROM nodes');\n const result = await this.inferForNodes(nodes.map((node) => node.id));\n return result.inferred;\n }\n\n async findCandidates(nodeId: string): Promise<Array<{ nodeId: string; similarity: number }>> {\n const rows = await this.db.query<{ id: string; similarity: number }>(\n `SELECT id, 1 - (embedding <=> (SELECT embedding FROM nodes WHERE id = $1)) as similarity\n FROM nodes\n WHERE embedding IS NOT NULL AND id != $1\n ORDER BY embedding <=> (SELECT embedding FROM nodes WHERE id = $1)\n LIMIT $2`,\n [nodeId, this.config.maxPerNode * 3]\n );\n\n return rows\n .filter((row) => row.similarity >= this.config.similarityThreshold)\n .map((row) => ({ nodeId: row.id, similarity: row.similarity }));\n }\n\n async validateRelationship(rel: InferredRelationship): Promise<boolean> {\n return rel.confidence >= this.config.minConfidence;\n }\n\n async createEdgesFromInferences(\n inferences: InferredRelationship[],\n autoApprove = true\n ): Promise<NeuronEdge[]> {\n const created: NeuronEdge[] = [];\n if (!autoApprove) return created;\n\n for (const inference of inferences) {\n const rows = await this.db.query<NeuronEdge>(\n `INSERT INTO edges (from_node_id, to_node_id, relationship_type, strength, confidence, evidence, source, source_model)\n VALUES ($1, $2, $3, $4, $5, $6, 'ai_inferred', $7)\n ON CONFLICT (from_node_id, to_node_id, relationship_type) DO NOTHING\n RETURNING *`,\n [\n inference.fromNodeId,\n inference.toNodeId,\n inference.relationshipType,\n inference.confidence,\n inference.confidence,\n JSON.stringify(inference.evidence),\n this.config.model,\n ]\n );\n if (rows[0]) {\n created.push(rows[0]);\n }\n }\n\n return created;\n }\n\n private async inferPair(\n fromNodeId: string,\n toNodeId: string\n ): Promise<InferredRelationship | null> {\n const [nodeA, nodeB] = await Promise.all([\n this.db.queryOne<{ id: string; label: string; summary: string | null; content: string | null }>(\n 'SELECT id, label, summary, content FROM nodes WHERE id = $1',\n [fromNodeId]\n ),\n this.db.queryOne<{ id: string; label: string; summary: string | null; content: string | null }>(\n 'SELECT id, label, summary, content FROM nodes WHERE id = $1',\n [toNodeId]\n ),\n ]);\n\n if (!nodeA || !nodeB) return null;\n\n const prompt = INFERENCE_PROMPT.replace('{nodeA.label}', nodeA.label)\n .replace('{nodeA.summary}', nodeA.summary ?? '')\n .replace('{nodeA.content}', nodeA.content ?? '')\n .replace('{nodeB.label}', nodeB.label)\n .replace('{nodeB.summary}', nodeB.summary ?? '')\n .replace('{nodeB.content}', nodeB.content ?? '');\n\n const response = await this.client.chat.completions.create({\n model: this.config.model,\n messages: [{ role: 'user', content: prompt }],\n response_format: { type: 'json_object' },\n });\n\n const content = response.choices[0]?.message?.content;\n if (!content) return null;\n\n const parsed = JSON.parse(content) as {\n hasRelationship: boolean;\n relationshipType: RelationshipType;\n confidence: number;\n reasoning: string;\n evidence: string[];\n };\n\n if (!parsed.hasRelationship) return null;\n\n return {\n fromNodeId,\n toNodeId,\n relationshipType: parsed.relationshipType ?? 'related_to',\n confidence: parsed.confidence ?? 0,\n reasoning: parsed.reasoning ?? '',\n evidence: (parsed.evidence ?? []).map((text) => ({ type: 'text', content: text })),\n };\n }\n\n private async applyRateLimit(): Promise<void> {\n const delayMs = Math.ceil(60_000 / this.config.rateLimit);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n}\n","import type { Database } from '../../storage/database';\nimport type { AnalysisRun, AnalysisRunType } from '../types/analysis';\nimport type { ClusteringAlgorithm } from '../types/cluster';\nimport type { EventBus } from '../events/event-bus';\nimport type { EmbeddingsService } from './embeddings-service';\nimport type { ClusteringEngine } from './clustering-engine';\nimport type { RelationshipEngine } from './relationship-engine';\n\nexport interface PipelineOptions {\n nodeIds?: string[];\n forceRecompute?: boolean;\n skipEmbeddings?: boolean;\n embeddingModel?: string;\n skipClustering?: boolean;\n clusterCount?: number;\n clusteringAlgorithm?: ClusteringAlgorithm;\n skipRelationships?: boolean;\n relationshipThreshold?: number;\n maxRelationshipsPerNode?: number;\n onProgress?: (progress: PipelineProgress) => void;\n webhookUrl?: string;\n}\n\nexport interface PipelineProgress {\n stage: 'embeddings' | 'clustering' | 'relationships' | 'complete';\n progress: number;\n currentItem: string;\n itemsProcessed: number;\n totalItems: number;\n estimatedTimeRemaining?: number;\n}\n\nexport class AnalysisPipeline {\n private activeJobs = new Map<string, AbortController>();\n\n constructor(\n private db: Database,\n private embeddings: EmbeddingsService,\n private clustering: ClusteringEngine,\n private relationships: RelationshipEngine,\n private events: EventBus\n ) {}\n\n async runFull(options: PipelineOptions = {}): Promise<AnalysisRun> {\n const job = await this.createJob('full_analysis', options);\n try {\n if (!options.skipEmbeddings) {\n await this.runEmbeddingsStage(job, options);\n }\n if (!options.skipClustering) {\n await this.runClusteringStage(job, options);\n }\n if (!options.skipRelationships) {\n await this.runRelationshipsStage(job, options);\n }\n return await this.completeJob(job.id);\n } catch (error) {\n return await this.failJob(job.id, error);\n }\n }\n\n async runEmbeddings(options: PipelineOptions = {}): Promise<AnalysisRun> {\n const job = await this.createJob('embedding', options);\n try {\n await this.runEmbeddingsStage(job, options);\n return await this.completeJob(job.id);\n } catch (error) {\n return await this.failJob(job.id, error);\n }\n }\n\n async runClustering(options: PipelineOptions = {}): Promise<AnalysisRun> {\n const job = await this.createJob('clustering', options);\n try {\n await this.runClusteringStage(job, options);\n return await this.completeJob(job.id);\n } catch (error) {\n return await this.failJob(job.id, error);\n }\n }\n\n async runRelationships(options: PipelineOptions = {}): Promise<AnalysisRun> {\n const job = await this.createJob('relationship_inference', options);\n try {\n await this.runRelationshipsStage(job, options);\n return await this.completeJob(job.id);\n } catch (error) {\n return await this.failJob(job.id, error);\n }\n }\n\n async getJob(jobId: string): Promise<AnalysisRun | null> {\n const row = await this.db.queryOne<AnalysisRun>('SELECT * FROM analysis_runs WHERE id = $1', [jobId]);\n return row ?? null;\n }\n\n async listJobs(options?: { status?: string; limit?: number }): Promise<AnalysisRun[]> {\n const where = options?.status ? 'WHERE status = $1' : '';\n const limit = options?.limit ? `LIMIT ${options.limit}` : '';\n const rows = await this.db.query<AnalysisRun>(\n `SELECT * FROM analysis_runs ${where} ORDER BY created_at DESC ${limit}`,\n options?.status ? [options.status] : []\n );\n return rows;\n }\n\n async cancelJob(jobId: string): Promise<boolean> {\n const controller = this.activeJobs.get(jobId);\n if (!controller) return false;\n controller.abort();\n await this.db.execute('UPDATE analysis_runs SET status = $1 WHERE id = $2', [\n 'cancelled',\n jobId,\n ]);\n return true;\n }\n\n getActiveJobs(): AnalysisRun[] {\n return [];\n }\n\n isRunning(): boolean {\n return this.activeJobs.size > 0;\n }\n\n private async runEmbeddingsStage(job: AnalysisRun, options: PipelineOptions): Promise<void> {\n const nodeIds = await this.resolveNodeIds(options.nodeIds, options.forceRecompute);\n const { results, errors } = await this.embeddings.embedNodes(nodeIds);\n await this.updateJobResults(job.id, {\n embeddingsGenerated: results.length,\n errors,\n });\n options.onProgress?.({\n stage: 'embeddings',\n progress: 100,\n currentItem: 'complete',\n itemsProcessed: results.length,\n totalItems: nodeIds.length,\n });\n }\n\n private async runClusteringStage(job: AnalysisRun, options: PipelineOptions): Promise<void> {\n const clusterCount = options.clusterCount;\n const algorithm = options.clusteringAlgorithm ?? 'kmeans';\n const result = await this.clustering.clusterNodes({\n algorithm,\n clusterCount,\n similarityThreshold: options.relationshipThreshold,\n });\n await this.updateJobResults(job.id, {\n clustersCreated: result.clusters.length,\n });\n options.onProgress?.({\n stage: 'clustering',\n progress: 100,\n currentItem: 'complete',\n itemsProcessed: result.clusters.length,\n totalItems: result.clusters.length,\n });\n }\n\n private async runRelationshipsStage(job: AnalysisRun, options: PipelineOptions): Promise<void> {\n const nodeIds = options.nodeIds ?? (await this.resolveNodeIds());\n const { inferred, errors } = await this.relationships.inferForNodes(nodeIds);\n await this.relationships.createEdgesFromInferences(inferred, true);\n await this.updateJobResults(job.id, {\n relationshipsInferred: inferred.length,\n errors,\n });\n options.onProgress?.({\n stage: 'relationships',\n progress: 100,\n currentItem: 'complete',\n itemsProcessed: inferred.length,\n totalItems: inferred.length,\n });\n }\n\n private async createJob(runType: AnalysisRunType, options: PipelineOptions): Promise<AnalysisRun> {\n const controller = new AbortController();\n const row = await this.db.queryOne<AnalysisRun>(\n `INSERT INTO analysis_runs (run_type, input_params, status, progress, started_at)\n VALUES ($1, $2, 'running', 0, NOW())\n RETURNING *`,\n [runType, options]\n );\n if (!row) throw new Error('Failed to create analysis job');\n this.activeJobs.set(row.id, controller);\n return row;\n }\n\n private async completeJob(jobId: string): Promise<AnalysisRun> {\n const row = await this.db.queryOne<AnalysisRun>(\n `UPDATE analysis_runs\n SET status = 'completed', progress = 100, completed_at = NOW(), duration_ms = EXTRACT(EPOCH FROM (NOW() - started_at)) * 1000\n WHERE id = $1\n RETURNING *`,\n [jobId]\n );\n this.activeJobs.delete(jobId);\n return row as AnalysisRun;\n }\n\n private async failJob(jobId: string, error: unknown): Promise<AnalysisRun> {\n const message = error instanceof Error ? error.message : String(error);\n const stack = error instanceof Error ? error.stack : undefined;\n const row = await this.db.queryOne<AnalysisRun>(\n `UPDATE analysis_runs\n SET status = 'failed', error_message = $2, error_stack = $3, completed_at = NOW(), duration_ms = EXTRACT(EPOCH FROM (NOW() - started_at)) * 1000\n WHERE id = $1\n RETURNING *`,\n [jobId, message, stack]\n );\n this.activeJobs.delete(jobId);\n return row as AnalysisRun;\n }\n\n private async updateJobResults(jobId: string, updates: Partial<AnalysisRun['results']>) {\n const row = await this.db.queryOne<{ results: AnalysisRun['results'] }>(\n 'SELECT results FROM analysis_runs WHERE id = $1',\n [jobId]\n );\n const current = row?.results ?? {\n nodesProcessed: 0,\n embeddingsGenerated: 0,\n clustersCreated: 0,\n relationshipsInferred: 0,\n errors: [],\n };\n const next = { ...current, ...updates };\n await this.db.execute('UPDATE analysis_runs SET results = $1 WHERE id = $2', [next, jobId]);\n }\n\n private async resolveNodeIds(nodeIds?: string[], forceRecompute = false): Promise<string[]> {\n if (nodeIds?.length) return nodeIds;\n if (forceRecompute) {\n const rows = await this.db.query<{ id: string }>('SELECT id FROM nodes');\n return rows.map((row) => row.id);\n }\n const rows = await this.db.query<{ id: string }>('SELECT id FROM nodes WHERE embedding IS NULL');\n return rows.map((row) => row.id);\n }\n}\n","import { Pool, type PoolClient, type PoolConfig } from 'pg';\n\nexport interface DatabaseConfig {\n connectionString?: string;\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n database?: string;\n pool?: {\n min: number;\n max: number;\n idleTimeoutMs: number;\n connectionTimeoutMs: number;\n };\n ssl?: boolean | object;\n slowQueryThresholdMs?: number;\n}\n\nexport interface PoolStats {\n totalCount: number;\n idleCount: number;\n waitingCount: number;\n}\n\nexport class Database {\n private pool: Pool;\n private slowQueryThresholdMs?: number;\n\n constructor(config: DatabaseConfig) {\n const poolConfig: PoolConfig = {\n connectionString: config.connectionString ?? this.buildConnectionString(config),\n ssl: config.ssl,\n min: config.pool?.min,\n max: config.pool?.max,\n idleTimeoutMillis: config.pool?.idleTimeoutMs,\n connectionTimeoutMillis: config.pool?.connectionTimeoutMs,\n };\n\n this.pool = new Pool(poolConfig);\n this.slowQueryThresholdMs = config.slowQueryThresholdMs;\n }\n\n async connect(): Promise<void> {\n const client = await this.pool.connect();\n client.release();\n }\n\n async disconnect(): Promise<void> {\n await this.pool.end();\n }\n\n async isConnected(): Promise<boolean> {\n try {\n await this.query('SELECT 1');\n return true;\n } catch {\n return false;\n }\n }\n\n async query<T>(sql: string, params: unknown[] = []): Promise<T[]> {\n const start = Date.now();\n const result = await this.pool.query(sql, params);\n this.logSlowQuery(sql, Date.now() - start);\n return result.rows as T[];\n }\n\n async queryOne<T>(sql: string, params: unknown[] = []): Promise<T | null> {\n const rows = await this.query<T>(sql, params);\n return rows[0] ?? null;\n }\n\n async execute(sql: string, params: unknown[] = []): Promise<number> {\n const start = Date.now();\n const result = await this.pool.query(sql, params);\n this.logSlowQuery(sql, Date.now() - start);\n return result.rowCount ?? 0;\n }\n\n async transaction<T>(fn: (client: PoolClient) => Promise<T>): Promise<T> {\n const client = await this.pool.connect();\n try {\n await client.query('BEGIN');\n const result = await fn(client);\n await client.query('COMMIT');\n return result;\n } catch (error) {\n await client.query('ROLLBACK');\n throw error;\n } finally {\n client.release();\n }\n }\n\n async tableExists(tableName: string): Promise<boolean> {\n const result = await this.queryOne<{ exists: boolean }>(\n 'SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = $1) as exists',\n [tableName]\n );\n return result?.exists ?? false;\n }\n\n async getPoolStats(): Promise<PoolStats> {\n return {\n totalCount: this.pool.totalCount,\n idleCount: this.pool.idleCount,\n waitingCount: this.pool.waitingCount,\n };\n }\n\n private buildConnectionString(config: DatabaseConfig): string | undefined {\n if (config.host && config.port && config.user && config.database) {\n const password = config.password ? `:${config.password}` : '';\n return `postgresql://${config.user}${password}@${config.host}:${config.port}/${config.database}`;\n }\n\n return undefined;\n }\n\n private logSlowQuery(sql: string, durationMs: number): void {\n if (!this.slowQueryThresholdMs || durationMs < this.slowQueryThresholdMs) {\n return;\n }\n\n // eslint-disable-next-line no-console\n console.warn(`[omi-neuron] Slow query (${durationMs}ms): ${sql}`);\n }\n}\n"]}
|