@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.
Files changed (55) hide show
  1. package/README.md +55 -0
  2. package/dist/api/index.cjs +943 -0
  3. package/dist/api/index.cjs.map +1 -0
  4. package/dist/api/index.d.cts +140 -0
  5. package/dist/api/index.d.ts +140 -0
  6. package/dist/api/index.js +934 -0
  7. package/dist/api/index.js.map +1 -0
  8. package/dist/chunk-BSOSHBDR.cjs +300 -0
  9. package/dist/chunk-BSOSHBDR.cjs.map +1 -0
  10. package/dist/chunk-COO66N7H.cjs +950 -0
  11. package/dist/chunk-COO66N7H.cjs.map +1 -0
  12. package/dist/chunk-FXKXMSLY.cjs +270 -0
  13. package/dist/chunk-FXKXMSLY.cjs.map +1 -0
  14. package/dist/chunk-PSDVPB7Y.js +289 -0
  15. package/dist/chunk-PSDVPB7Y.js.map +1 -0
  16. package/dist/chunk-RQCGONPN.js +937 -0
  17. package/dist/chunk-RQCGONPN.js.map +1 -0
  18. package/dist/chunk-RTSFO7BW.cjs +592 -0
  19. package/dist/chunk-RTSFO7BW.cjs.map +1 -0
  20. package/dist/chunk-TFLMPBX7.js +262 -0
  21. package/dist/chunk-TFLMPBX7.js.map +1 -0
  22. package/dist/chunk-XNR42GCJ.js +547 -0
  23. package/dist/chunk-XNR42GCJ.js.map +1 -0
  24. package/dist/cli/index.cjs +571 -0
  25. package/dist/cli/index.cjs.map +1 -0
  26. package/dist/cli/index.d.cts +1 -0
  27. package/dist/cli/index.d.ts +1 -0
  28. package/dist/cli/index.js +563 -0
  29. package/dist/cli/index.js.map +1 -0
  30. package/dist/database-B0vplyA4.d.cts +41 -0
  31. package/dist/database-B0vplyA4.d.ts +41 -0
  32. package/dist/edge-BzsYe2Ed.d.cts +269 -0
  33. package/dist/edge-BzsYe2Ed.d.ts +269 -0
  34. package/dist/index.cjs +895 -0
  35. package/dist/index.cjs.map +1 -0
  36. package/dist/index.d.cts +1484 -0
  37. package/dist/index.d.ts +1484 -0
  38. package/dist/index.js +654 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/migration/index.cjs +32 -0
  41. package/dist/migration/index.cjs.map +1 -0
  42. package/dist/migration/index.d.cts +51 -0
  43. package/dist/migration/index.d.ts +51 -0
  44. package/dist/migration/index.js +3 -0
  45. package/dist/migration/index.js.map +1 -0
  46. package/dist/query-helpers-D8po5Mn-.d.cts +777 -0
  47. package/dist/query-helpers-DvQTA2_Z.d.ts +777 -0
  48. package/dist/visualization/index.cjs +485 -0
  49. package/dist/visualization/index.cjs.map +1 -0
  50. package/dist/visualization/index.d.cts +134 -0
  51. package/dist/visualization/index.d.ts +134 -0
  52. package/dist/visualization/index.js +460 -0
  53. package/dist/visualization/index.js.map +1 -0
  54. package/docker/docker-compose.template.yml +28 -0
  55. package/package.json +116 -0
@@ -0,0 +1,592 @@
1
+ 'use strict';
2
+
3
+ var chunkCOO66N7H_cjs = require('./chunk-COO66N7H.cjs');
4
+ var slugify = require('slugify');
5
+ var zod = require('zod');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var slugify__default = /*#__PURE__*/_interopDefault(slugify);
10
+
11
+ // src/core/types/settings.ts
12
+ var DEFAULT_VISUALIZATION_SETTINGS = {
13
+ domainColors: {},
14
+ defaultDomainColor: "#c0c5ff",
15
+ edgeColor: "#4d4d55",
16
+ edgeActiveColor: "#c6d4ff",
17
+ backgroundColor: "#020314",
18
+ defaultCameraPosition: [4, 8, 20],
19
+ defaultCameraTarget: [0, 0, 0],
20
+ minZoomDistance: 4,
21
+ maxZoomDistance: 42,
22
+ enableStarfield: true,
23
+ starfieldCount: 1200,
24
+ labelDistance: 26,
25
+ maxVisibleLabels: 50,
26
+ performanceMode: "auto",
27
+ nodeCountThreshold: 120,
28
+ pixelRatioCap: 2,
29
+ enableAnimations: true,
30
+ focusTweenDuration: 800,
31
+ filterTransitionDuration: 650,
32
+ enableHover: true,
33
+ enableClick: true,
34
+ enableDoubleClick: true,
35
+ enablePan: true,
36
+ enableZoom: true,
37
+ enableRotate: true
38
+ };
39
+ var DEFAULT_ANALYSIS_SETTINGS = {
40
+ embeddingModel: "text-embedding-3-small",
41
+ embeddingDimensions: 1536,
42
+ embeddingBatchSize: 20,
43
+ embeddingCacheTTL: 86400,
44
+ clusteringAlgorithm: "kmeans",
45
+ defaultClusterCount: 8,
46
+ minClusterSize: 3,
47
+ clusterSimilarityThreshold: 0.75,
48
+ relationshipInferenceModel: "gpt-4o-mini",
49
+ relationshipMinConfidence: 0.7,
50
+ relationshipMaxPerNode: 10,
51
+ openaiRateLimit: 60,
52
+ maxConcurrentAnalysis: 5
53
+ };
54
+ var slugTransform = (label) => slugify__default.default(label, { lower: true, strict: true, trim: true }).slice(0, 255);
55
+ var nodeTierSchema = zod.z.enum(["primary", "secondary", "tertiary", "insight"]);
56
+ var nodeCreateSchema = zod.z.object({
57
+ slug: zod.z.string().min(1).max(255).optional(),
58
+ label: zod.z.string().min(1).max(500),
59
+ nodeType: zod.z.string().min(1).max(100).optional(),
60
+ domain: zod.z.string().min(1).max(100).optional(),
61
+ summary: zod.z.string().max(1e3).optional(),
62
+ description: zod.z.string().optional(),
63
+ content: zod.z.string().optional(),
64
+ metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
65
+ tier: nodeTierSchema.optional()
66
+ }).transform((data) => ({
67
+ ...data,
68
+ slug: data.slug ?? slugTransform(data.label)
69
+ }));
70
+ var nodeUpdateSchema = zod.z.object({
71
+ label: zod.z.string().min(1).max(500).optional(),
72
+ summary: zod.z.string().max(1e3).optional(),
73
+ description: zod.z.string().optional(),
74
+ content: zod.z.string().optional(),
75
+ metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
76
+ domain: zod.z.string().min(1).max(100).optional(),
77
+ tier: nodeTierSchema.optional(),
78
+ positionOverride: zod.z.tuple([zod.z.number(), zod.z.number(), zod.z.number()]).nullable().optional()
79
+ });
80
+ var nodeBatchCreateSchema = zod.z.object({
81
+ nodes: zod.z.array(nodeCreateSchema),
82
+ options: zod.z.object({
83
+ skipDuplicates: zod.z.boolean().optional(),
84
+ updateOnConflict: zod.z.boolean().optional(),
85
+ autoAnalyze: zod.z.boolean().optional(),
86
+ analysisDepth: zod.z.enum(["embeddings", "cluster", "full"]).optional()
87
+ }).optional()
88
+ });
89
+ var nodeFilterSchema = zod.z.object({
90
+ page: zod.z.coerce.number().int().min(1).optional(),
91
+ limit: zod.z.coerce.number().int().min(1).max(1e3).optional(),
92
+ nodeType: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional(),
93
+ domain: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional(),
94
+ clusterId: zod.z.string().uuid().optional(),
95
+ analysisStatus: zod.z.string().optional(),
96
+ search: zod.z.string().optional(),
97
+ sortBy: zod.z.enum(["createdAt", "updatedAt", "label", "connectionCount"]).optional(),
98
+ sortOrder: zod.z.enum(["asc", "desc"]).optional(),
99
+ includeEmbeddings: zod.z.coerce.boolean().optional(),
100
+ includeStats: zod.z.coerce.boolean().optional()
101
+ });
102
+ var edgeEvidenceSchema = zod.z.object({
103
+ type: zod.z.enum(["text", "url", "citation", "ai_inference"]),
104
+ content: zod.z.string().min(1),
105
+ confidence: zod.z.number().min(0).max(1).optional(),
106
+ sourceId: zod.z.string().optional(),
107
+ metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
108
+ });
109
+ var edgeCreateSchema = zod.z.object({
110
+ fromNodeId: zod.z.string().uuid(),
111
+ toNodeId: zod.z.string().uuid(),
112
+ relationshipType: zod.z.string().optional(),
113
+ strength: zod.z.number().min(0).max(1).optional(),
114
+ confidence: zod.z.number().min(0).max(1).optional(),
115
+ evidence: zod.z.array(edgeEvidenceSchema).optional(),
116
+ label: zod.z.string().max(255).optional(),
117
+ description: zod.z.string().optional(),
118
+ metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
119
+ bidirectional: zod.z.boolean().optional()
120
+ });
121
+ var edgeUpdateSchema = zod.z.object({
122
+ strength: zod.z.number().min(0).max(1).optional(),
123
+ confidence: zod.z.number().min(0).max(1).optional(),
124
+ relationshipType: zod.z.string().optional(),
125
+ label: zod.z.string().max(255).optional(),
126
+ description: zod.z.string().optional(),
127
+ evidence: zod.z.array(edgeEvidenceSchema).optional(),
128
+ metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
129
+ });
130
+ var edgeFilterSchema = zod.z.object({
131
+ page: zod.z.coerce.number().int().min(1).optional(),
132
+ limit: zod.z.coerce.number().int().min(1).max(1e3).optional(),
133
+ fromNodeId: zod.z.string().uuid().optional(),
134
+ toNodeId: zod.z.string().uuid().optional(),
135
+ nodeId: zod.z.string().uuid().optional(),
136
+ relationshipType: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional(),
137
+ source: zod.z.enum(["manual", "ai_inferred", "imported"]).optional(),
138
+ minStrength: zod.z.coerce.number().min(0).max(1).optional(),
139
+ minConfidence: zod.z.coerce.number().min(0).max(1).optional()
140
+ });
141
+ var analysisOptionsSchema = zod.z.object({
142
+ nodeIds: zod.z.array(zod.z.string().uuid()).optional(),
143
+ forceRecompute: zod.z.boolean().optional(),
144
+ skipEmbeddings: zod.z.boolean().optional(),
145
+ embeddingModel: zod.z.string().optional(),
146
+ skipClustering: zod.z.boolean().optional(),
147
+ clusterCount: zod.z.coerce.number().int().min(1).optional(),
148
+ clusteringAlgorithm: zod.z.enum(["kmeans", "dbscan", "hierarchical"]).optional(),
149
+ skipRelationships: zod.z.boolean().optional(),
150
+ relationshipThreshold: zod.z.coerce.number().min(0).max(1).optional(),
151
+ maxRelationshipsPerNode: zod.z.coerce.number().int().min(1).optional()
152
+ });
153
+ var analysisRequestSchema = zod.z.object({
154
+ action: zod.z.enum(["embeddings", "cluster", "infer_relationships", "full"]),
155
+ options: analysisOptionsSchema.optional()
156
+ });
157
+ var colorSchema = zod.z.string().min(1);
158
+ var nodeTypeConfigSchema = zod.z.object({
159
+ type: zod.z.string().min(1),
160
+ label: zod.z.string().min(1),
161
+ description: zod.z.string().optional(),
162
+ defaultDomain: zod.z.string().min(1),
163
+ icon: zod.z.string().optional(),
164
+ color: colorSchema.optional(),
165
+ analysisPrompt: zod.z.string().optional()
166
+ });
167
+ var domainConfigSchema = zod.z.object({
168
+ key: zod.z.string().min(1),
169
+ label: zod.z.string().min(1),
170
+ color: colorSchema,
171
+ description: zod.z.string().optional()
172
+ });
173
+ var relationshipTypeConfigSchema = zod.z.object({
174
+ type: zod.z.string().min(1),
175
+ label: zod.z.string().min(1),
176
+ description: zod.z.string().optional(),
177
+ bidirectional: zod.z.boolean(),
178
+ color: colorSchema.optional()
179
+ });
180
+ var visualizationSettingsSchema = zod.z.object({
181
+ domainColors: zod.z.record(zod.z.string(), colorSchema),
182
+ defaultDomainColor: colorSchema,
183
+ edgeColor: colorSchema,
184
+ edgeActiveColor: colorSchema,
185
+ backgroundColor: colorSchema,
186
+ defaultCameraPosition: zod.z.tuple([zod.z.number(), zod.z.number(), zod.z.number()]),
187
+ defaultCameraTarget: zod.z.tuple([zod.z.number(), zod.z.number(), zod.z.number()]),
188
+ minZoomDistance: zod.z.number(),
189
+ maxZoomDistance: zod.z.number(),
190
+ enableStarfield: zod.z.boolean(),
191
+ starfieldCount: zod.z.number().int().min(0),
192
+ labelDistance: zod.z.number().min(0),
193
+ maxVisibleLabels: zod.z.number().int().min(0),
194
+ performanceMode: zod.z.enum(["auto", "normal", "degraded", "fallback"]),
195
+ nodeCountThreshold: zod.z.number().int().min(0),
196
+ pixelRatioCap: zod.z.number().min(0.5),
197
+ enableAnimations: zod.z.boolean(),
198
+ focusTweenDuration: zod.z.number().int().min(0),
199
+ filterTransitionDuration: zod.z.number().int().min(0),
200
+ enableHover: zod.z.boolean(),
201
+ enableClick: zod.z.boolean(),
202
+ enableDoubleClick: zod.z.boolean(),
203
+ enablePan: zod.z.boolean(),
204
+ enableZoom: zod.z.boolean(),
205
+ enableRotate: zod.z.boolean()
206
+ });
207
+ var analysisSettingsSchema = zod.z.object({
208
+ embeddingModel: zod.z.enum(["text-embedding-ada-002", "text-embedding-3-small", "text-embedding-3-large"]),
209
+ embeddingDimensions: zod.z.number().int().min(1),
210
+ embeddingBatchSize: zod.z.number().int().min(1),
211
+ embeddingCacheTTL: zod.z.number().int().min(0),
212
+ clusteringAlgorithm: zod.z.enum(["kmeans", "dbscan", "hierarchical"]),
213
+ defaultClusterCount: zod.z.number().int().min(1),
214
+ minClusterSize: zod.z.number().int().min(1),
215
+ clusterSimilarityThreshold: zod.z.number().min(0).max(1),
216
+ relationshipInferenceModel: zod.z.string().min(1),
217
+ relationshipMinConfidence: zod.z.number().min(0).max(1),
218
+ relationshipMaxPerNode: zod.z.number().int().min(1),
219
+ openaiRateLimit: zod.z.number().int().min(1),
220
+ maxConcurrentAnalysis: zod.z.number().int().min(1)
221
+ });
222
+ var instanceSettingsSchema = zod.z.object({
223
+ name: zod.z.string().min(1),
224
+ version: zod.z.string().min(1),
225
+ repoName: zod.z.string().min(1)
226
+ });
227
+ var databaseSettingsSchema = zod.z.object({
228
+ mode: zod.z.enum(["docker", "external"]),
229
+ port: zod.z.number().int().min(1).max(65535),
230
+ containerName: zod.z.string().optional(),
231
+ image: zod.z.string().optional(),
232
+ user: zod.z.string().optional(),
233
+ password: zod.z.string().optional(),
234
+ database: zod.z.string().optional(),
235
+ url: zod.z.string().optional(),
236
+ pool: zod.z.object({
237
+ min: zod.z.number().int().min(0),
238
+ max: zod.z.number().int().min(1),
239
+ idleTimeoutMs: zod.z.number().int().min(0),
240
+ connectionTimeoutMs: zod.z.number().int().min(0)
241
+ }).optional(),
242
+ resources: zod.z.object({
243
+ memoryLimit: zod.z.string().min(1),
244
+ cpuLimit: zod.z.string().optional()
245
+ }).optional()
246
+ });
247
+ var apiSettingsSchema = zod.z.object({
248
+ basePath: zod.z.string().min(1),
249
+ enableCors: zod.z.boolean(),
250
+ rateLimit: zod.z.object({
251
+ windowMs: zod.z.number().int().min(1),
252
+ max: zod.z.number().int().min(1)
253
+ }).optional()
254
+ });
255
+ var loggingSettingsSchema = zod.z.object({
256
+ level: zod.z.enum(["debug", "info", "warn", "error"]),
257
+ prettyPrint: zod.z.boolean()
258
+ });
259
+ var neuronSettingsSchema = zod.z.object({
260
+ instance: instanceSettingsSchema,
261
+ visualization: visualizationSettingsSchema,
262
+ analysis: analysisSettingsSchema,
263
+ nodeTypes: zod.z.array(nodeTypeConfigSchema),
264
+ domains: zod.z.array(domainConfigSchema),
265
+ relationshipTypes: zod.z.array(relationshipTypeConfigSchema)
266
+ });
267
+ var neuronSettingsUpdateSchema = zod.z.object({
268
+ visualization: visualizationSettingsSchema.partial().optional(),
269
+ analysis: analysisSettingsSchema.partial().optional(),
270
+ nodeTypes: zod.z.array(nodeTypeConfigSchema).optional(),
271
+ domains: zod.z.array(domainConfigSchema).optional(),
272
+ relationshipTypes: zod.z.array(relationshipTypeConfigSchema).optional()
273
+ });
274
+ var neuronConfigSchema = neuronSettingsSchema.extend({
275
+ openai: zod.z.object({
276
+ apiKey: zod.z.string().min(1),
277
+ organization: zod.z.string().optional(),
278
+ requestsPerMinute: zod.z.number().int().min(1).optional(),
279
+ maxRetries: zod.z.number().int().min(0).optional()
280
+ }),
281
+ database: databaseSettingsSchema,
282
+ api: apiSettingsSchema,
283
+ logging: loggingSettingsSchema
284
+ });
285
+ var paginationSchema = zod.z.object({
286
+ page: zod.z.coerce.number().int().min(1).optional(),
287
+ limit: zod.z.coerce.number().int().min(1).max(1e3).optional()
288
+ });
289
+ var listNodesParamsSchema = paginationSchema.extend({
290
+ nodeType: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional(),
291
+ domain: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional(),
292
+ clusterId: zod.z.string().uuid().optional(),
293
+ analysisStatus: zod.z.string().optional(),
294
+ search: zod.z.string().optional(),
295
+ sortBy: zod.z.enum(["createdAt", "updatedAt", "label", "connectionCount"]).optional(),
296
+ sortOrder: zod.z.enum(["asc", "desc"]).optional(),
297
+ includeEmbeddings: zod.z.coerce.boolean().optional(),
298
+ includeStats: zod.z.coerce.boolean().optional()
299
+ });
300
+ var listEdgesParamsSchema = paginationSchema.extend({
301
+ fromNodeId: zod.z.string().uuid().optional(),
302
+ toNodeId: zod.z.string().uuid().optional(),
303
+ nodeId: zod.z.string().uuid().optional(),
304
+ relationshipType: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional(),
305
+ source: zod.z.enum(["manual", "ai_inferred", "imported"]).optional(),
306
+ minStrength: zod.z.coerce.number().min(0).max(1).optional(),
307
+ minConfidence: zod.z.coerce.number().min(0).max(1).optional()
308
+ });
309
+ var getGraphParamsSchema = zod.z.object({
310
+ nodeTypes: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional(),
311
+ domains: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional(),
312
+ clusterIds: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional(),
313
+ nodeIds: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional(),
314
+ depth: zod.z.coerce.number().int().min(1).optional(),
315
+ minEdgeStrength: zod.z.coerce.number().min(0).max(1).optional(),
316
+ relationshipTypes: zod.z.union([zod.z.string(), zod.z.array(zod.z.string())]).optional(),
317
+ maxNodes: zod.z.coerce.number().int().min(1).optional(),
318
+ includeOrphanNodes: zod.z.coerce.boolean().optional()
319
+ });
320
+ var expandGraphRequestSchema = zod.z.object({
321
+ fromNodeIds: zod.z.array(zod.z.string().uuid()),
322
+ depth: zod.z.coerce.number().int().min(1),
323
+ direction: zod.z.enum(["outbound", "inbound", "both"]),
324
+ maxNodes: zod.z.coerce.number().int().min(1).optional()
325
+ });
326
+ var findPathRequestSchema = zod.z.object({
327
+ fromNodeId: zod.z.string().uuid(),
328
+ toNodeId: zod.z.string().uuid(),
329
+ maxDepth: zod.z.coerce.number().int().min(1).optional(),
330
+ algorithm: zod.z.enum(["shortest", "all"]).optional()
331
+ });
332
+ var semanticSearchRequestSchema = zod.z.object({
333
+ query: zod.z.string().min(1),
334
+ nodeTypes: zod.z.array(zod.z.string()).optional(),
335
+ domains: zod.z.array(zod.z.string()).optional(),
336
+ limit: zod.z.coerce.number().int().min(1).optional()
337
+ });
338
+ var findSimilarRequestSchema = zod.z.object({
339
+ nodeId: zod.z.string().uuid(),
340
+ limit: zod.z.coerce.number().int().min(1).optional(),
341
+ excludeConnected: zod.z.coerce.boolean().optional()
342
+ });
343
+
344
+ // src/core/analysis/scoring-engine.ts
345
+ var DEFAULT_CONFIG = {
346
+ similarityWeight: 0.6,
347
+ connectionWeight: 0.2,
348
+ recencyWeight: 0.1,
349
+ domainBoost: 0.1
350
+ };
351
+ var ScoringEngine = class {
352
+ constructor(db, config) {
353
+ this.db = db;
354
+ this.config = { ...DEFAULT_CONFIG, ...config ?? {} };
355
+ }
356
+ config;
357
+ cosineSimilarity(a, b) {
358
+ let dot = 0;
359
+ let magA = 0;
360
+ let magB = 0;
361
+ for (let i = 0; i < a.length; i += 1) {
362
+ dot += a[i] * b[i];
363
+ magA += a[i] * a[i];
364
+ magB += b[i] * b[i];
365
+ }
366
+ if (magA === 0 || magB === 0) return 0;
367
+ return dot / (Math.sqrt(magA) * Math.sqrt(magB));
368
+ }
369
+ async semanticSimilarity(nodeA, nodeB) {
370
+ const rows = await this.db.query(
371
+ "SELECT 1 - (a.embedding <=> b.embedding) as similarity FROM nodes a JOIN nodes b ON b.id = $2 WHERE a.id = $1",
372
+ [nodeA, nodeB]
373
+ );
374
+ return rows[0]?.similarity ?? 0;
375
+ }
376
+ async scoreForQuery(queryEmbedding, nodeIds) {
377
+ const filterClause = nodeIds?.length ? "AND id = ANY($2)" : "";
378
+ const values = nodeIds?.length ? [queryEmbedding, nodeIds] : [queryEmbedding];
379
+ const nodes = await this.db.query(
380
+ `SELECT *, 1 - (embedding <=> $1) as similarity FROM nodes WHERE embedding IS NOT NULL ${filterClause} ORDER BY embedding <=> $1`,
381
+ values
382
+ );
383
+ return nodes.map((node) => this.applyScoring(node, node.similarity ?? 0));
384
+ }
385
+ async findSimilar(nodeId, limit = 10, excludeConnected = false) {
386
+ const base = excludeConnected ? `SELECT id FROM nodes WHERE id NOT IN (SELECT to_node_id FROM edges WHERE from_node_id = $1)` : `SELECT id FROM nodes WHERE id != $1`;
387
+ const nodes = await this.db.query(
388
+ `SELECT n.*, 1 - (n.embedding <=> (SELECT embedding FROM nodes WHERE id = $1)) as similarity
389
+ FROM nodes n
390
+ WHERE n.embedding IS NOT NULL AND n.id IN (${base})
391
+ ORDER BY n.embedding <=> (SELECT embedding FROM nodes WHERE id = $1)
392
+ LIMIT $2`,
393
+ [nodeId, limit]
394
+ );
395
+ return nodes.map((node) => this.applyScoring(node, node.similarity ?? 0));
396
+ }
397
+ async calculateNodeImportance(nodeId) {
398
+ const row = await this.db.queryOne(
399
+ `WITH edge_weights AS (
400
+ SELECT to_node_id, SUM(strength) as total_inbound
401
+ FROM edges
402
+ GROUP BY to_node_id
403
+ )
404
+ SELECT COALESCE(ew.total_inbound, 0) + (n.connection_count * 0.1) as importance
405
+ FROM nodes n
406
+ LEFT JOIN edge_weights ew ON n.id = ew.to_node_id
407
+ WHERE n.id = $1`,
408
+ [nodeId]
409
+ );
410
+ return row?.importance ?? 0;
411
+ }
412
+ async rankAllNodes() {
413
+ const rows = await this.db.query(
414
+ `WITH edge_weights AS (
415
+ SELECT to_node_id, SUM(strength) as total_inbound
416
+ FROM edges
417
+ GROUP BY to_node_id
418
+ )
419
+ SELECT n.id, COALESCE(ew.total_inbound, 0) + (n.connection_count * 0.1) as importance
420
+ FROM nodes n
421
+ LEFT JOIN edge_weights ew ON n.id = ew.to_node_id
422
+ ORDER BY importance DESC`
423
+ );
424
+ return rows.map((row) => ({ nodeId: row.id, importance: row.importance }));
425
+ }
426
+ async scoreRelevance(sourceNodeId, candidateNodeIds, context) {
427
+ const nodes = await this.db.query(
428
+ `SELECT *, 1 - (embedding <=> (SELECT embedding FROM nodes WHERE id = $1)) as similarity
429
+ FROM nodes
430
+ WHERE embedding IS NOT NULL AND id = ANY($2)
431
+ ORDER BY embedding <=> (SELECT embedding FROM nodes WHERE id = $1)`,
432
+ [sourceNodeId, candidateNodeIds]
433
+ );
434
+ return nodes.map((node) => {
435
+ const base = this.applyScoring(node, node.similarity ?? 0);
436
+ if (context) {
437
+ base.score += this.config.domainBoost * 0.1;
438
+ }
439
+ return base;
440
+ });
441
+ }
442
+ applyScoring(node, similarity) {
443
+ const connections = node.connectionCount ?? 0;
444
+ const recency = node.updatedAt ? Math.max(0, 1 - (Date.now() - new Date(node.updatedAt).getTime()) / (1e3 * 60 * 60 * 24 * 30)) : 0;
445
+ const domainMatch = 0;
446
+ const score = similarity * this.config.similarityWeight + connections * this.config.connectionWeight + recency * this.config.recencyWeight + domainMatch * this.config.domainBoost;
447
+ return {
448
+ node,
449
+ score,
450
+ breakdown: {
451
+ similarity,
452
+ connections,
453
+ recency,
454
+ domainMatch
455
+ }
456
+ };
457
+ }
458
+ };
459
+
460
+ // src/storage/factory.ts
461
+ var singleton = null;
462
+ function createDatabase(config) {
463
+ const dbConfig = {
464
+ connectionString: config.database.url,
465
+ host: config.database.mode === "docker" ? "localhost" : void 0,
466
+ port: config.database.port,
467
+ user: config.database.user,
468
+ password: config.database.password,
469
+ database: config.database.database,
470
+ pool: config.database.pool
471
+ };
472
+ return new chunkCOO66N7H_cjs.Database(dbConfig);
473
+ }
474
+ function createDatabaseFromEnv() {
475
+ const dbConfig = {
476
+ connectionString: process.env.DATABASE_URL,
477
+ host: process.env.DB_HOST,
478
+ port: process.env.DB_PORT ? Number(process.env.DB_PORT) : void 0,
479
+ user: process.env.DB_USER,
480
+ password: process.env.DB_PASSWORD,
481
+ database: process.env.DB_NAME
482
+ };
483
+ return new chunkCOO66N7H_cjs.Database(dbConfig);
484
+ }
485
+ function getDatabase(config) {
486
+ if (!singleton) {
487
+ singleton = new chunkCOO66N7H_cjs.Database(config ?? {});
488
+ }
489
+ return singleton;
490
+ }
491
+ function resetDatabaseSingleton() {
492
+ singleton = null;
493
+ }
494
+
495
+ // src/storage/query-helpers.ts
496
+ var buildWhereClause = (where, startIndex = 1) => {
497
+ if (!where || Object.keys(where).length === 0) {
498
+ return { clause: "", values: [], nextIndex: startIndex };
499
+ }
500
+ const keys = Object.keys(where);
501
+ const values = [];
502
+ const conditions = keys.map((key, idx) => {
503
+ values.push(where[key]);
504
+ return `${key} = $${startIndex + idx}`;
505
+ });
506
+ return {
507
+ clause: `WHERE ${conditions.join(" AND ")}`,
508
+ values,
509
+ nextIndex: startIndex + keys.length
510
+ };
511
+ };
512
+ var buildInsert = (table, data) => {
513
+ const keys = Object.keys(data);
514
+ const values = Object.values(data);
515
+ const columns = keys.map((key) => `"${key}"`).join(", ");
516
+ const placeholders = keys.map((_, idx) => `$${idx + 1}`).join(", ");
517
+ return {
518
+ sql: `INSERT INTO ${table} (${columns}) VALUES (${placeholders}) RETURNING *`,
519
+ values
520
+ };
521
+ };
522
+ var buildUpdate = (table, data, where) => {
523
+ const keys = Object.keys(data);
524
+ const values = Object.values(data);
525
+ const setClause = keys.map((key, idx) => `"${key}" = $${idx + 1}`).join(", ");
526
+ const whereResult = buildWhereClause(where, keys.length + 1);
527
+ return {
528
+ sql: `UPDATE ${table} SET ${setClause} ${whereResult.clause} RETURNING *`,
529
+ values: [...values, ...whereResult.values]
530
+ };
531
+ };
532
+ var buildSelect = (table, columns, where, options) => {
533
+ const columnList = columns === "*" ? "*" : columns.map((col) => `"${col}"`).join(", ");
534
+ const whereResult = buildWhereClause(where);
535
+ const orderClause = options?.orderBy ? `ORDER BY ${options.orderBy} ${options.orderDirection ?? "asc"}` : "";
536
+ const limitClause = options?.limit ? `LIMIT ${options.limit}` : "";
537
+ const offsetClause = options?.offset ? `OFFSET ${options.offset}` : "";
538
+ return {
539
+ sql: `SELECT ${columnList} FROM ${table} ${whereResult.clause} ${orderClause} ${limitClause} ${offsetClause}`.trim(),
540
+ values: whereResult.values
541
+ };
542
+ };
543
+ var buildDelete = (table, where) => {
544
+ const whereResult = buildWhereClause(where);
545
+ return {
546
+ sql: `DELETE FROM ${table} ${whereResult.clause}`,
547
+ values: whereResult.values
548
+ };
549
+ };
550
+
551
+ exports.DEFAULT_ANALYSIS_SETTINGS = DEFAULT_ANALYSIS_SETTINGS;
552
+ exports.DEFAULT_VISUALIZATION_SETTINGS = DEFAULT_VISUALIZATION_SETTINGS;
553
+ exports.ScoringEngine = ScoringEngine;
554
+ exports.analysisOptionsSchema = analysisOptionsSchema;
555
+ exports.analysisRequestSchema = analysisRequestSchema;
556
+ exports.analysisSettingsSchema = analysisSettingsSchema;
557
+ exports.buildDelete = buildDelete;
558
+ exports.buildInsert = buildInsert;
559
+ exports.buildSelect = buildSelect;
560
+ exports.buildUpdate = buildUpdate;
561
+ exports.buildWhereClause = buildWhereClause;
562
+ exports.createDatabase = createDatabase;
563
+ exports.createDatabaseFromEnv = createDatabaseFromEnv;
564
+ exports.databaseSettingsSchema = databaseSettingsSchema;
565
+ exports.domainConfigSchema = domainConfigSchema;
566
+ exports.edgeCreateSchema = edgeCreateSchema;
567
+ exports.edgeEvidenceSchema = edgeEvidenceSchema;
568
+ exports.edgeFilterSchema = edgeFilterSchema;
569
+ exports.edgeUpdateSchema = edgeUpdateSchema;
570
+ exports.expandGraphRequestSchema = expandGraphRequestSchema;
571
+ exports.findPathRequestSchema = findPathRequestSchema;
572
+ exports.findSimilarRequestSchema = findSimilarRequestSchema;
573
+ exports.getDatabase = getDatabase;
574
+ exports.getGraphParamsSchema = getGraphParamsSchema;
575
+ exports.listEdgesParamsSchema = listEdgesParamsSchema;
576
+ exports.listNodesParamsSchema = listNodesParamsSchema;
577
+ exports.neuronConfigSchema = neuronConfigSchema;
578
+ exports.neuronSettingsSchema = neuronSettingsSchema;
579
+ exports.neuronSettingsUpdateSchema = neuronSettingsUpdateSchema;
580
+ exports.nodeBatchCreateSchema = nodeBatchCreateSchema;
581
+ exports.nodeCreateSchema = nodeCreateSchema;
582
+ exports.nodeFilterSchema = nodeFilterSchema;
583
+ exports.nodeTierSchema = nodeTierSchema;
584
+ exports.nodeTypeConfigSchema = nodeTypeConfigSchema;
585
+ exports.nodeUpdateSchema = nodeUpdateSchema;
586
+ exports.paginationSchema = paginationSchema;
587
+ exports.relationshipTypeConfigSchema = relationshipTypeConfigSchema;
588
+ exports.resetDatabaseSingleton = resetDatabaseSingleton;
589
+ exports.semanticSearchRequestSchema = semanticSearchRequestSchema;
590
+ exports.visualizationSettingsSchema = visualizationSettingsSchema;
591
+ //# sourceMappingURL=chunk-RTSFO7BW.cjs.map
592
+ //# sourceMappingURL=chunk-RTSFO7BW.cjs.map