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