@lucern/graph-sync 1.0.29 → 1.0.30
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/CHANGELOG.md +5 -0
- package/dist/index.d.ts +198 -17
- package/dist/index.js +465 -373
- package/dist/index.js.map +1 -1
- package/dist/neo4jDriver.js +2 -4
- package/dist/neo4jDriver.js.map +1 -1
- package/dist/neo4jEdgeAPI.d.ts +93 -5
- package/dist/neo4jEdgeAPI.js +118 -107
- package/dist/neo4jEdgeAPI.js.map +1 -1
- package/dist/neo4jQueries-D14Putpd.d.ts +839 -0
- package/dist/neo4jQueries.d.ts +2 -1
- package/dist/neo4jQueries.js +72 -44
- package/dist/neo4jQueries.js.map +1 -1
- package/dist/neo4jQueryRoute.js +92 -45
- package/dist/neo4jQueryRoute.js.map +1 -1
- package/dist/neo4jSync.d.ts +106 -10
- package/dist/neo4jSync.js +159 -162
- package/dist/neo4jSync.js.map +1 -1
- package/dist/neo4jSyncHelpers-DWr-lF-A.d.ts +208 -0
- package/dist/neo4jSyncHelpers.d.ts +3 -1
- package/dist/neo4jSyncHelpers.js +44 -26
- package/dist/neo4jSyncHelpers.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/package.json +3 -3
- package/dist/neo4jQueries-j3LrFKpY.d.ts +0 -301
- package/dist/neo4jSyncHelpers-vxe1-Gvw.d.ts +0 -58
package/dist/neo4jSyncHelpers.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import { v } from 'convex/values';
|
|
2
1
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
2
|
+
import { v } from 'convex/values';
|
|
3
|
+
import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
|
|
3
4
|
import { internalMutationGeneric, internalQueryGeneric } from 'convex/server';
|
|
4
5
|
|
|
5
6
|
// src/neo4jSyncHelpers.ts
|
|
7
|
+
unsafeConvexAnyApi(
|
|
8
|
+
"graph-sync top-level module bundle lacks a committed Convex _generated/api surface"
|
|
9
|
+
);
|
|
6
10
|
var internalMutation = internalMutationGeneric;
|
|
7
11
|
var internalQuery = internalQueryGeneric;
|
|
8
12
|
|
|
@@ -14,6 +18,16 @@ function logRetryTargetFallback(context, error) {
|
|
|
14
18
|
}
|
|
15
19
|
console.debug("[graph-sync][neo4jSyncHelpers]", context, error);
|
|
16
20
|
}
|
|
21
|
+
function readString(value) {
|
|
22
|
+
if (typeof value !== "string") {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const trimmed = value.trim();
|
|
26
|
+
return trimmed.length > 0 ? trimmed : void 0;
|
|
27
|
+
}
|
|
28
|
+
function isSyncEdgeDoc(value) {
|
|
29
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) && "edgeType" in value && typeof value.edgeType === "string" && "fromNodeId" in value;
|
|
30
|
+
}
|
|
17
31
|
var logSyncEvent = internalMutation({
|
|
18
32
|
args: {
|
|
19
33
|
eventType: v.union(
|
|
@@ -33,7 +47,7 @@ var logSyncEvent = internalMutation({
|
|
|
33
47
|
error: v.optional(v.string())
|
|
34
48
|
},
|
|
35
49
|
returns: permissiveReturn,
|
|
36
|
-
handler:
|
|
50
|
+
handler: (_ctx, args) => {
|
|
37
51
|
console.log(
|
|
38
52
|
`[Neo4j Sync] ${args.eventType} ${args.entityType}:${args.entityId} - ${args.status}`,
|
|
39
53
|
args.error || ""
|
|
@@ -43,9 +57,7 @@ var logSyncEvent = internalMutation({
|
|
|
43
57
|
var getNodeForSync = internalQuery({
|
|
44
58
|
args: { nodeId: v.id("epistemicNodes") },
|
|
45
59
|
returns: permissiveReturn,
|
|
46
|
-
handler: async (ctx, args) =>
|
|
47
|
-
return await ctx.db.get(args.nodeId);
|
|
48
|
-
}
|
|
60
|
+
handler: async (ctx, args) => await ctx.db.get(args.nodeId)
|
|
49
61
|
});
|
|
50
62
|
var getEmbeddingForSync = internalQuery({
|
|
51
63
|
args: { nodeId: v.id("epistemicNodes") },
|
|
@@ -68,11 +80,9 @@ var getAllNodesForResync = internalQuery({
|
|
|
68
80
|
numItems: limit,
|
|
69
81
|
cursor: args.cursor ?? null
|
|
70
82
|
};
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
(q) => q.eq("nodeType", args.nodeType)
|
|
75
|
-
).paginate(paginationOpts);
|
|
83
|
+
const nodeType = args.nodeType;
|
|
84
|
+
if (nodeType) {
|
|
85
|
+
const result2 = await ctx.db.query("epistemicNodes").withIndex("by_nodeType", (q) => q.eq("nodeType", nodeType)).paginate(paginationOpts);
|
|
76
86
|
return {
|
|
77
87
|
nodes: result2.page,
|
|
78
88
|
hasMore: !result2.isDone,
|
|
@@ -101,8 +111,8 @@ var getEdgeForSync = internalQuery({
|
|
|
101
111
|
...edge,
|
|
102
112
|
// Cross-graph edges may not have toNodeId/fromNodeId in Convex mirror.
|
|
103
113
|
// Fall back to denormalized global IDs when node lookup is unavailable.
|
|
104
|
-
fromGlobalId: fromNode?.globalId
|
|
105
|
-
toGlobalId: toNode?.globalId
|
|
114
|
+
fromGlobalId: readString(fromNode?.globalId) ?? edge.sourceGlobalId,
|
|
115
|
+
toGlobalId: readString(toNode?.globalId) ?? edge.targetGlobalId
|
|
106
116
|
};
|
|
107
117
|
}
|
|
108
118
|
});
|
|
@@ -159,12 +169,12 @@ var getEdgeBatchForSync = internalQuery({
|
|
|
159
169
|
const result = await ctx.db.query("epistemicEdges").order("asc").paginate(paginationOpts);
|
|
160
170
|
const enrichedEdges = await Promise.all(
|
|
161
171
|
result.page.map(async (edge) => {
|
|
162
|
-
const fromNode = await ctx.db.get(edge.fromNodeId);
|
|
172
|
+
const fromNode = edge.fromNodeId ? await ctx.db.get(edge.fromNodeId) : null;
|
|
163
173
|
const toNode = edge.toNodeId ? await ctx.db.get(edge.toNodeId) : null;
|
|
164
174
|
return {
|
|
165
175
|
...edge,
|
|
166
|
-
fromGlobalId: fromNode?.globalId
|
|
167
|
-
toGlobalId: toNode?.globalId
|
|
176
|
+
fromGlobalId: readString(fromNode?.globalId) ?? edge.sourceGlobalId,
|
|
177
|
+
toGlobalId: readString(toNode?.globalId) ?? edge.targetGlobalId
|
|
168
178
|
};
|
|
169
179
|
})
|
|
170
180
|
);
|
|
@@ -182,13 +192,17 @@ var resolveEdgeRetryTarget = internalQuery({
|
|
|
182
192
|
returns: permissiveReturn,
|
|
183
193
|
handler: async (ctx, args) => {
|
|
184
194
|
try {
|
|
185
|
-
const
|
|
186
|
-
if (
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
195
|
+
const directEdgeId = ctx.db.normalizeId("epistemicEdges", args.entityId);
|
|
196
|
+
if (directEdgeId) {
|
|
197
|
+
const byId = await ctx.db.get(directEdgeId);
|
|
198
|
+
if (isSyncEdgeDoc(byId)) {
|
|
199
|
+
const edgeGlobalId = readString(byId.globalId) ?? args.entityId;
|
|
200
|
+
return {
|
|
201
|
+
mode: "convex_id",
|
|
202
|
+
edgeId: byId._id,
|
|
203
|
+
edgeGlobalId
|
|
204
|
+
};
|
|
205
|
+
}
|
|
192
206
|
}
|
|
193
207
|
} catch (error) {
|
|
194
208
|
logRetryTargetFallback(
|
|
@@ -257,9 +271,7 @@ var getPendingRetries = internalQuery({
|
|
|
257
271
|
limit: v.number()
|
|
258
272
|
},
|
|
259
273
|
returns: permissiveReturn,
|
|
260
|
-
handler: async (ctx, args) =>
|
|
261
|
-
return await ctx.db.query("neo4jSyncQueue").withIndex("by_status", (q) => q.eq("status", "pending")).take(args.limit);
|
|
262
|
-
}
|
|
274
|
+
handler: async (ctx, args) => await ctx.db.query("neo4jSyncQueue").withIndex("by_status", (q) => q.eq("status", "pending")).take(args.limit)
|
|
263
275
|
});
|
|
264
276
|
var updateQueueStatus = internalMutation({
|
|
265
277
|
args: {
|
|
@@ -315,12 +327,18 @@ var checkSyncHealth = internalQuery({
|
|
|
315
327
|
const recentEdges = await ctx.db.query("epistemicEdges").filter((q) => q.gte(q.field("createdAt"), oneHourAgo)).collect();
|
|
316
328
|
const pendingRetries = await ctx.db.query("neo4jSyncQueue").withIndex("by_status", (q) => q.eq("status", "pending")).collect();
|
|
317
329
|
const failedRetries = await ctx.db.query("neo4jSyncQueue").withIndex("by_status", (q) => q.eq("status", "failed")).collect();
|
|
330
|
+
let healthStatus = "healthy";
|
|
331
|
+
if (failedRetries.length > 10) {
|
|
332
|
+
healthStatus = "unhealthy";
|
|
333
|
+
} else if (pendingRetries.length > 50) {
|
|
334
|
+
healthStatus = "degraded";
|
|
335
|
+
}
|
|
318
336
|
return {
|
|
319
337
|
recentNodesUpdated: recentNodes.length,
|
|
320
338
|
recentEdgesUpdated: recentEdges.length,
|
|
321
339
|
pendingRetries: pendingRetries.length,
|
|
322
340
|
failedRetries: failedRetries.length,
|
|
323
|
-
healthStatus
|
|
341
|
+
healthStatus,
|
|
324
342
|
checkedAt: now
|
|
325
343
|
};
|
|
326
344
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convex.ts","../src/neo4jSyncHelpers.ts"],"names":["result"],"mappings":"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","file":"neo4jSyncHelpers.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const internal = anyApi as any;\n\ntype TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\ntype ConvexFunctionBuilder = <Definition extends {\n handler?: (...args: any[]) => any;\n}>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder;\n","/**\n * Neo4j Sync Helpers - Queries and Mutations\n *\n * These are Convex queries and mutations that support the Neo4j sync process.\n * Separated from neo4jSync.ts because that file uses \"use node\" directive\n * which only supports actions.\n */\n\nimport { v } from \"convex/values\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { internalMutation, internalQuery } from \"./convex\";\n\nfunction logRetryTargetFallback(context: string, error: unknown): void {\n const env = (globalThis as {\n process?: { env?: Record<string, string | undefined> };\n }).process?.env;\n if (env?.LUCERN_GRAPH_SYNC_DEBUG !== \"1\") {\n return;\n }\n\n console.debug(\"[graph-sync][neo4jSyncHelpers]\", context, error);\n}\n\n// =============================================================================\n// SYNC LOG (for debugging)\n// =============================================================================\n\nexport const logSyncEvent = internalMutation({\n args: {\n eventType: v.union(\n v.literal(\"node_created\"),\n v.literal(\"node_updated\"),\n v.literal(\"node_deleted\"),\n v.literal(\"edge_created\"),\n v.literal(\"edge_deleted\")\n ),\n entityId: v.string(),\n entityType: v.string(),\n status: v.union(\n v.literal(\"pending\"),\n v.literal(\"success\"),\n v.literal(\"failed\")\n ),\n error: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (_ctx, args) => {\n console.log(\n `[Neo4j Sync] ${args.eventType} ${args.entityType}:${args.entityId} - ${args.status}`,\n args.error || \"\"\n );\n },\n});\n\n// =============================================================================\n// NODE/EDGE QUERIES\n// =============================================================================\n\nexport const getNodeForSync = internalQuery({\n args: { nodeId: v.id(\"epistemicNodes\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db.get(args.nodeId);\n },\n});\n\n/**\n * Get the embedding vector for a node, if it exists.\n * Used by neo4jSync to include embeddings in node upserts.\n */\nexport const getEmbeddingForSync = internalQuery({\n args: { nodeId: v.id(\"epistemicNodes\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const record = await ctx.db\n .query(\"epistemicNodeEmbeddings\")\n .withIndex(\"by_nodeId\", (q: any) => q.eq(\"nodeId\", args.nodeId))\n .first();\n return record?.embedding ?? null;\n },\n});\n\n/**\n * Get all nodes for re-sync with optional type filter (paginated)\n */\nexport const getAllNodesForResync = internalQuery({\n args: {\n nodeType: v.optional(v.string()),\n limit: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const limit = args.limit ?? 100;\n\n const paginationOpts = {\n numItems: limit,\n cursor: args.cursor ?? null,\n };\n\n if (args.nodeType) {\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_nodeType\", (q: any) =>\n q.eq(\"nodeType\", args.nodeType as any)\n )\n .paginate(paginationOpts);\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n }\n\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getEdgeForSync = internalQuery({\n args: { edgeId: v.id(\"epistemicEdges\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edge = await ctx.db.get(args.edgeId);\n if (!edge) {\n return null;\n }\n\n const fromNode = edge.fromNodeId ? await ctx.db.get(edge.fromNodeId) : null;\n const toNode = edge.toNodeId ? await ctx.db.get(edge.toNodeId) : null;\n\n return {\n ...edge,\n // Cross-graph edges may not have toNodeId/fromNodeId in Convex mirror.\n // Fall back to denormalized global IDs when node lookup is unavailable.\n fromGlobalId: (fromNode as any)?.globalId || edge.sourceGlobalId,\n toGlobalId: (toNode as any)?.globalId || edge.targetGlobalId,\n };\n },\n});\n\n/**\n * Get all edges for re-sync (paginated)\n */\nexport const getAllEdgesForResync = internalQuery({\n args: {\n limit: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const limit = args.limit ?? 100;\n\n const paginationOpts = {\n numItems: limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicEdges\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n edges: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getNodeBatchForSync = internalQuery({\n args: {\n limit: v.number(),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const paginationOpts = {\n numItems: args.limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getEdgeBatchForSync = internalQuery({\n args: {\n limit: v.number(),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const paginationOpts = {\n numItems: args.limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicEdges\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n // Enrich edges with globalIds\n const enrichedEdges = await Promise.all(\n result.page.map(async (edge: any) => {\n const fromNode = await ctx.db.get(edge.fromNodeId);\n const toNode = edge.toNodeId ? await ctx.db.get(edge.toNodeId) : null;\n return {\n ...edge,\n fromGlobalId: fromNode?.globalId || edge.sourceGlobalId,\n toGlobalId: toNode?.globalId || edge.targetGlobalId,\n };\n })\n );\n\n return {\n edges: enrichedEdges,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\n/**\n * Resolve retry queue entityId for edge operations.\n *\n * Queue entries can contain either:\n * - Convex edge document IDs (legacy sync retries)\n * - Edge globalIds (projection retries from Neo4j-first writes)\n */\nexport const resolveEdgeRetryTarget = internalQuery({\n args: {\n entityId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // First, attempt direct Convex edge ID lookup.\n try {\n const byId = await ctx.db.get(args.entityId as any);\n if (byId && \"edgeType\" in byId && \"fromNodeId\" in byId) {\n return {\n mode: \"convex_id\" as const,\n edgeId: byId._id,\n edgeGlobalId: byId.globalId,\n };\n }\n } catch (error) {\n logRetryTargetFallback(\n `direct edge lookup fallback for entityId=${args.entityId}`,\n error\n );\n }\n\n // Then attempt lookup by edge globalId.\n const byGlobalId = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q: any) => q.eq(\"globalId\", args.entityId))\n .first();\n\n if (byGlobalId) {\n return {\n mode: \"global_id_in_convex\" as const,\n edgeId: byGlobalId._id,\n edgeGlobalId: byGlobalId.globalId,\n };\n }\n\n // Neo4j-only edge (projection may have failed and never mirrored).\n return {\n mode: \"global_id_only\" as const,\n edgeGlobalId: args.entityId,\n };\n },\n});\n\n// =============================================================================\n// RETRY QUEUE MUTATIONS\n// =============================================================================\n\nexport const queueForRetry = internalMutation({\n args: {\n entityType: v.union(v.literal(\"node\"), v.literal(\"edge\")),\n entityId: v.string(),\n operation: v.union(v.literal(\"upsert\"), v.literal(\"delete\")),\n error: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const now = Date.now();\n\n const existing = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_entity\", (q: any) =>\n q.eq(\"entityType\", args.entityType).eq(\"entityId\", args.entityId)\n )\n .first();\n\n if (existing) {\n const attempts = existing.attempts ?? 0;\n const maxAttempts = existing.maxAttempts ?? 5;\n await ctx.db.patch(existing._id, {\n attempts: attempts + 1,\n maxAttempts,\n lastAttemptAt: now,\n lastError: args.error,\n status:\n attempts + 1 >= maxAttempts ? \"failed\" : \"pending\",\n updatedAt: now,\n });\n return { queued: true, updated: true, queueId: existing._id };\n }\n\n const queueId = await ctx.db.insert(\"neo4jSyncQueue\", {\n entityType: args.entityType,\n entityId: args.entityId,\n operation: args.operation,\n attempts: 1,\n maxAttempts: 5,\n lastAttemptAt: now,\n lastError: args.error,\n status: \"pending\",\n createdAt: now,\n updatedAt: now,\n });\n\n return { queued: true, updated: false, queueId };\n },\n});\n\nexport const getPendingRetries = internalQuery({\n args: {\n limit: v.number(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"pending\"))\n .take(args.limit);\n },\n});\n\nexport const updateQueueStatus = internalMutation({\n args: {\n queueId: v.id(\"neo4jSyncQueue\"),\n status: v.union(\n v.literal(\"pending\"),\n v.literal(\"in_progress\"),\n v.literal(\"failed\"),\n v.literal(\"succeeded\")\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n await ctx.db.patch(args.queueId, {\n status: args.status,\n updatedAt: Date.now(),\n });\n },\n});\n\nexport const incrementAttempts = internalMutation({\n args: {\n queueId: v.id(\"neo4jSyncQueue\"),\n error: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const item = await ctx.db.get(args.queueId);\n if (!item) {\n return { failed: false };\n }\n\n const attempts = item.attempts ?? 0;\n const maxAttempts = item.maxAttempts ?? 5;\n const newAttempts = attempts + 1;\n const isFailed = newAttempts >= maxAttempts;\n\n await ctx.db.patch(args.queueId, {\n attempts: newAttempts,\n maxAttempts,\n lastAttemptAt: Date.now(),\n lastError: args.error,\n status: isFailed ? \"failed\" : \"pending\",\n updatedAt: Date.now(),\n });\n\n return { failed: isFailed };\n },\n});\n\n// =============================================================================\n// HEALTH CHECK QUERY\n// =============================================================================\n\nexport const checkSyncHealth = internalQuery({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx) => {\n const now = Date.now();\n const oneHourAgo = now - 60 * 60 * 1000;\n\n const recentNodes = await ctx.db\n .query(\"epistemicNodes\")\n .filter((q: any) => q.gte(q.field(\"updatedAt\"), oneHourAgo))\n .collect();\n\n const recentEdges = await ctx.db\n .query(\"epistemicEdges\")\n .filter((q: any) => q.gte(q.field(\"createdAt\"), oneHourAgo))\n .collect();\n\n const pendingRetries = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"pending\"))\n .collect();\n\n const failedRetries = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"failed\"))\n .collect();\n\n return {\n recentNodesUpdated: recentNodes.length,\n recentEdgesUpdated: recentEdges.length,\n pendingRetries: pendingRetries.length,\n failedRetries: failedRetries.length,\n healthStatus:\n failedRetries.length > 10\n ? \"unhealthy\"\n : pendingRetries.length > 50\n ? \"degraded\"\n : \"healthy\",\n checkedAt: now,\n };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/convex.ts","../src/neo4jSyncHelpers.ts"],"names":["result"],"mappings":"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","file":"neo4jSyncHelpers.js","sourcesContent":["import { unsafeConvexAnyApi } from \"@lucern/contracts/convex/unsafeAnyApi\";\nimport {\n type ActionBuilder,\n actionGeneric,\n type GenericActionCtx,\n type GenericDataModel,\n type GenericDocument,\n type GenericMutationCtx,\n type GenericQueryCtx,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n type MutationBuilder,\n type QueryBuilder,\n} from \"convex/server\";\nimport type { GenericId, Value } from \"convex/values\";\n\nexport const internal = unsafeConvexAnyApi(\n \"graph-sync top-level module bundle lacks a committed Convex _generated/api surface\"\n);\n\ntype TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\ntype GraphSyncDocument<TableName extends string> = GenericDocument & {\n _creationTime: number;\n _id: GenericId<TableName>;\n};\n\ninterface GraphSyncTableInfo<\n Document extends GenericDocument,\n Indexes extends Record<string, string[]>,\n> {\n document: Document;\n fieldPaths: string;\n indexes: Indexes;\n searchIndexes: Record<string, never>;\n vectorIndexes: Record<string, never>;\n}\n\ntype EpistemicNodeDocument = GraphSyncDocument<\"epistemicNodes\"> & {\n globalId: string;\n nodeType: string;\n projectId?: string;\n updatedAt?: number;\n};\n\ntype EpistemicNodeEmbeddingDocument =\n GraphSyncDocument<\"epistemicNodeEmbeddings\"> & {\n embedding?: number[];\n nodeId: GenericId<\"epistemicNodes\">;\n };\n\ntype EpistemicEdgeDocument = GraphSyncDocument<\"epistemicEdges\"> & {\n edgeType: string;\n fromNodeId?: GenericId<\"epistemicNodes\"> | null;\n globalId?: string;\n sourceGlobalId?: string;\n targetGlobalId?: string;\n toNodeId?: GenericId<\"epistemicNodes\"> | null;\n};\n\ntype Neo4jSyncQueueDocument = GraphSyncDocument<\"neo4jSyncQueue\"> & {\n attempts?: number;\n createdAt?: number;\n entityId: string;\n entityType: \"node\" | \"edge\";\n lastAttemptAt?: number;\n lastError?: string;\n maxAttempts?: number;\n operation: \"upsert\" | \"delete\";\n status: \"pending\" | \"in_progress\" | \"failed\" | \"succeeded\";\n updatedAt?: number;\n};\n\ninterface GraphSyncDataModel extends GenericDataModel {\n epistemicEdges: GraphSyncTableInfo<\n EpistemicEdgeDocument,\n {\n by_globalId: [\"globalId\"];\n }\n >;\n epistemicNodeEmbeddings: GraphSyncTableInfo<\n EpistemicNodeEmbeddingDocument,\n {\n by_nodeId: [\"nodeId\"];\n }\n >;\n epistemicNodes: GraphSyncTableInfo<\n EpistemicNodeDocument,\n {\n by_nodeType: [\"nodeType\"];\n }\n >;\n neo4jSyncQueue: GraphSyncTableInfo<\n Neo4jSyncQueueDocument,\n {\n by_entity: [\"entityType\", \"entityId\"];\n by_status: [\"status\"];\n }\n >;\n}\n\nexport type GraphSyncRecord = Record<string, Value>;\nexport type ActionCtx = GenericActionCtx<GraphSyncDataModel>;\nexport type MutationCtx = GenericMutationCtx<GraphSyncDataModel>;\nexport type QueryCtx = GenericQueryCtx<GraphSyncDataModel>;\n\nexport const action = actionGeneric as ActionBuilder<\n GraphSyncDataModel,\n \"public\"\n>;\nexport const internalAction = internalActionGeneric as ActionBuilder<\n GraphSyncDataModel,\n \"internal\"\n>;\nexport const internalMutation = internalMutationGeneric as MutationBuilder<\n GraphSyncDataModel,\n \"internal\"\n>;\nexport const internalQuery = internalQueryGeneric as QueryBuilder<\n GraphSyncDataModel,\n \"internal\"\n>;\n","// biome-ignore-all lint/style/useFilenamingConvention: Published @lucern/graph-sync/neo4jSyncHelpers subpath and Convex helper module; rename needs export-map/generated API migration.\n/**\n * Neo4j Sync Helpers - Queries and Mutations\n *\n * These are Convex queries and mutations that support the Neo4j sync process.\n * Separated from neo4jSync.ts because that file uses \"use node\" directive\n * which only supports actions.\n */\n\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id } from \"./convex\";\nimport { internalMutation, internalQuery } from \"./convex\";\n\ninterface SyncEdgeDocLike extends Record<string, unknown> {\n _id: Id<\"epistemicEdges\">;\n edgeType: string;\n fromNodeId?: Id<\"epistemicNodes\"> | null;\n globalId?: string;\n sourceGlobalId?: string;\n targetGlobalId?: string;\n toNodeId?: Id<\"epistemicNodes\"> | null;\n}\n\nfunction logRetryTargetFallback(context: string, error: unknown): void {\n const env = (\n globalThis as {\n process?: { env?: Record<string, string | undefined> };\n }\n ).process?.env;\n if (env?.LUCERN_GRAPH_SYNC_DEBUG !== \"1\") {\n return;\n }\n\n console.debug(\"[graph-sync][neo4jSyncHelpers]\", context, error);\n}\n\nfunction readString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction isSyncEdgeDoc(value: unknown): value is SyncEdgeDocLike {\n return (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n \"edgeType\" in value &&\n typeof (value as { edgeType?: unknown }).edgeType === \"string\" &&\n \"fromNodeId\" in value\n );\n}\n\n// =============================================================================\n// SYNC LOG (for debugging)\n// =============================================================================\n\nexport const logSyncEvent = internalMutation({\n args: {\n eventType: v.union(\n v.literal(\"node_created\"),\n v.literal(\"node_updated\"),\n v.literal(\"node_deleted\"),\n v.literal(\"edge_created\"),\n v.literal(\"edge_deleted\")\n ),\n entityId: v.string(),\n entityType: v.string(),\n status: v.union(\n v.literal(\"pending\"),\n v.literal(\"success\"),\n v.literal(\"failed\")\n ),\n error: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: (_ctx, args) => {\n console.log(\n `[Neo4j Sync] ${args.eventType} ${args.entityType}:${args.entityId} - ${args.status}`,\n args.error || \"\"\n );\n },\n});\n\n// =============================================================================\n// NODE/EDGE QUERIES\n// =============================================================================\n\nexport const getNodeForSync = internalQuery({\n args: { nodeId: v.id(\"epistemicNodes\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => await ctx.db.get(args.nodeId),\n});\n\n/**\n * Get the embedding vector for a node, if it exists.\n * Used by neo4jSync to include embeddings in node upserts.\n */\nexport const getEmbeddingForSync = internalQuery({\n args: { nodeId: v.id(\"epistemicNodes\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const record = await ctx.db\n .query(\"epistemicNodeEmbeddings\")\n .withIndex(\"by_nodeId\", (q) => q.eq(\"nodeId\", args.nodeId))\n .first();\n return record?.embedding ?? null;\n },\n});\n\n/**\n * Get all nodes for re-sync with optional type filter (paginated)\n */\nexport const getAllNodesForResync = internalQuery({\n args: {\n nodeType: v.optional(v.string()),\n limit: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const limit = args.limit ?? 100;\n\n const paginationOpts = {\n numItems: limit,\n cursor: args.cursor ?? null,\n };\n\n const nodeType = args.nodeType;\n if (nodeType) {\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_nodeType\", (q) => q.eq(\"nodeType\", nodeType))\n .paginate(paginationOpts);\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n }\n\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getEdgeForSync = internalQuery({\n args: { edgeId: v.id(\"epistemicEdges\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edge = await ctx.db.get(args.edgeId);\n if (!edge) {\n return null;\n }\n\n const fromNode = edge.fromNodeId ? await ctx.db.get(edge.fromNodeId) : null;\n const toNode = edge.toNodeId ? await ctx.db.get(edge.toNodeId) : null;\n\n return {\n ...edge,\n // Cross-graph edges may not have toNodeId/fromNodeId in Convex mirror.\n // Fall back to denormalized global IDs when node lookup is unavailable.\n fromGlobalId: readString(fromNode?.globalId) ?? edge.sourceGlobalId,\n toGlobalId: readString(toNode?.globalId) ?? edge.targetGlobalId,\n };\n },\n});\n\n/**\n * Get all edges for re-sync (paginated)\n */\nexport const getAllEdgesForResync = internalQuery({\n args: {\n limit: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const limit = args.limit ?? 100;\n\n const paginationOpts = {\n numItems: limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicEdges\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n edges: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getNodeBatchForSync = internalQuery({\n args: {\n limit: v.number(),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const paginationOpts = {\n numItems: args.limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getEdgeBatchForSync = internalQuery({\n args: {\n limit: v.number(),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const paginationOpts = {\n numItems: args.limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicEdges\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n // Enrich edges with globalIds\n const enrichedEdges = await Promise.all(\n result.page.map(async (edge: SyncEdgeDocLike) => {\n const fromNode = edge.fromNodeId\n ? await ctx.db.get(edge.fromNodeId)\n : null;\n const toNode = edge.toNodeId ? await ctx.db.get(edge.toNodeId) : null;\n return {\n ...edge,\n fromGlobalId: readString(fromNode?.globalId) ?? edge.sourceGlobalId,\n toGlobalId: readString(toNode?.globalId) ?? edge.targetGlobalId,\n };\n })\n );\n\n return {\n edges: enrichedEdges,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\n/**\n * Resolve retry queue entityId for edge operations.\n *\n * Queue entries can contain either:\n * - Convex edge document IDs (legacy sync retries)\n * - Edge globalIds (projection retries from Neo4j-first writes)\n */\nexport const resolveEdgeRetryTarget = internalQuery({\n args: {\n entityId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // First, attempt direct Convex edge ID lookup.\n try {\n const directEdgeId = ctx.db.normalizeId(\"epistemicEdges\", args.entityId);\n if (directEdgeId) {\n const byId = await ctx.db.get(directEdgeId);\n if (isSyncEdgeDoc(byId)) {\n const edgeGlobalId = readString(byId.globalId) ?? args.entityId;\n return {\n mode: \"convex_id\" as const,\n edgeId: byId._id,\n edgeGlobalId,\n };\n }\n }\n } catch (error) {\n logRetryTargetFallback(\n `direct edge lookup fallback for entityId=${args.entityId}`,\n error\n );\n }\n\n // Then attempt lookup by edge globalId.\n const byGlobalId = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.entityId))\n .first();\n\n if (byGlobalId) {\n return {\n mode: \"global_id_in_convex\" as const,\n edgeId: byGlobalId._id,\n edgeGlobalId: byGlobalId.globalId,\n };\n }\n\n // Neo4j-only edge (projection may have failed and never mirrored).\n return {\n mode: \"global_id_only\" as const,\n edgeGlobalId: args.entityId,\n };\n },\n});\n\n// =============================================================================\n// RETRY QUEUE MUTATIONS\n// =============================================================================\n\nexport const queueForRetry = internalMutation({\n args: {\n entityType: v.union(v.literal(\"node\"), v.literal(\"edge\")),\n entityId: v.string(),\n operation: v.union(v.literal(\"upsert\"), v.literal(\"delete\")),\n error: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const now = Date.now();\n\n const existing = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_entity\", (q) =>\n q.eq(\"entityType\", args.entityType).eq(\"entityId\", args.entityId)\n )\n .first();\n\n if (existing) {\n const attempts = existing.attempts ?? 0;\n const maxAttempts = existing.maxAttempts ?? 5;\n await ctx.db.patch(existing._id, {\n attempts: attempts + 1,\n maxAttempts,\n lastAttemptAt: now,\n lastError: args.error,\n status: attempts + 1 >= maxAttempts ? \"failed\" : \"pending\",\n updatedAt: now,\n });\n return { queued: true, updated: true, queueId: existing._id };\n }\n\n const queueId = await ctx.db.insert(\"neo4jSyncQueue\", {\n entityType: args.entityType,\n entityId: args.entityId,\n operation: args.operation,\n attempts: 1,\n maxAttempts: 5,\n lastAttemptAt: now,\n lastError: args.error,\n status: \"pending\",\n createdAt: now,\n updatedAt: now,\n });\n\n return { queued: true, updated: false, queueId };\n },\n});\n\nexport const getPendingRetries = internalQuery({\n args: {\n limit: v.number(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) =>\n await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q) => q.eq(\"status\", \"pending\"))\n .take(args.limit),\n});\n\nexport const updateQueueStatus = internalMutation({\n args: {\n queueId: v.id(\"neo4jSyncQueue\"),\n status: v.union(\n v.literal(\"pending\"),\n v.literal(\"in_progress\"),\n v.literal(\"failed\"),\n v.literal(\"succeeded\")\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n await ctx.db.patch(args.queueId, {\n status: args.status,\n updatedAt: Date.now(),\n });\n },\n});\n\nexport const incrementAttempts = internalMutation({\n args: {\n queueId: v.id(\"neo4jSyncQueue\"),\n error: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const item = await ctx.db.get(args.queueId);\n if (!item) {\n return { failed: false };\n }\n\n const attempts = item.attempts ?? 0;\n const maxAttempts = item.maxAttempts ?? 5;\n const newAttempts = attempts + 1;\n const isFailed = newAttempts >= maxAttempts;\n\n await ctx.db.patch(args.queueId, {\n attempts: newAttempts,\n maxAttempts,\n lastAttemptAt: Date.now(),\n lastError: args.error,\n status: isFailed ? \"failed\" : \"pending\",\n updatedAt: Date.now(),\n });\n\n return { failed: isFailed };\n },\n});\n\n// =============================================================================\n// HEALTH CHECK QUERY\n// =============================================================================\n\nexport const checkSyncHealth = internalQuery({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx) => {\n const now = Date.now();\n const oneHourAgo = now - 60 * 60 * 1000;\n\n const recentNodes = await ctx.db\n .query(\"epistemicNodes\")\n .filter((q) => q.gte(q.field(\"updatedAt\"), oneHourAgo))\n .collect();\n\n const recentEdges = await ctx.db\n .query(\"epistemicEdges\")\n .filter((q) => q.gte(q.field(\"createdAt\"), oneHourAgo))\n .collect();\n\n const pendingRetries = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q) => q.eq(\"status\", \"pending\"))\n .collect();\n\n const failedRetries = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q) => q.eq(\"status\", \"failed\"))\n .collect();\n\n let healthStatus: \"healthy\" | \"degraded\" | \"unhealthy\" = \"healthy\";\n if (failedRetries.length > 10) {\n healthStatus = \"unhealthy\";\n } else if (pendingRetries.length > 50) {\n healthStatus = \"degraded\";\n }\n\n return {\n recentNodesUpdated: recentNodes.length,\n recentEdgesUpdated: recentEdges.length,\n pendingRetries: pendingRetries.length,\n failedRetries: failedRetries.length,\n healthStatus,\n checkedAt: now,\n };\n },\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lucern/graph-sync",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.30",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"typecheck": "tsc --noEmit"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@lucern/contracts": "1.0.
|
|
54
|
-
"@lucern/graph-primitives": "1.0.
|
|
53
|
+
"@lucern/contracts": "1.0.30",
|
|
54
|
+
"@lucern/graph-primitives": "1.0.30",
|
|
55
55
|
"convex": "^1.39.1",
|
|
56
56
|
"neo4j-driver": "^5.28.1"
|
|
57
57
|
},
|
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Neo4j Graph Queries - advanced query surfaces.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Get high-priority questions (critical/high) that test beliefs
|
|
6
|
-
*/
|
|
7
|
-
declare const getHighPriorityQuestions: any;
|
|
8
|
-
/**
|
|
9
|
-
* Get evidence filtered by methodology (expert_interview, customer_interview, etc.)
|
|
10
|
-
*/
|
|
11
|
-
declare const getEvidenceByMethodology: any;
|
|
12
|
-
/**
|
|
13
|
-
* Get proprietary/early evidence (information asymmetry advantage)
|
|
14
|
-
*/
|
|
15
|
-
declare const getProprietaryEvidence: any;
|
|
16
|
-
/**
|
|
17
|
-
* Get beliefs by epistemic status (hypothesis, emerging, established, challenged, etc.)
|
|
18
|
-
*/
|
|
19
|
-
declare const getBeliefsByEpistemicStatus: any;
|
|
20
|
-
/**
|
|
21
|
-
* Get challenged beliefs that need attention
|
|
22
|
-
*/
|
|
23
|
-
declare const getChallengedBeliefs: any;
|
|
24
|
-
/**
|
|
25
|
-
* Get predictions with deadlines
|
|
26
|
-
*/
|
|
27
|
-
declare const getPredictions: any;
|
|
28
|
-
/**
|
|
29
|
-
* Get causal chains (edges with causal reasoning method)
|
|
30
|
-
*/
|
|
31
|
-
declare const getCausalChains: any;
|
|
32
|
-
/**
|
|
33
|
-
* Get necessary evidence for beliefs (logicalRole = necessary or necessary_sufficient)
|
|
34
|
-
*/
|
|
35
|
-
declare const getNecessaryEvidence: any;
|
|
36
|
-
/**
|
|
37
|
-
* Get falsification questions (designed to disprove beliefs)
|
|
38
|
-
*/
|
|
39
|
-
declare const getFalsificationQuestions: any;
|
|
40
|
-
/**
|
|
41
|
-
* Detect confirmation bias in beliefs.
|
|
42
|
-
* Returns beliefs with high supporting:contradicting evidence ratio.
|
|
43
|
-
*/
|
|
44
|
-
declare const getConfirmationBiasScore: any;
|
|
45
|
-
/**
|
|
46
|
-
* Detect anchoring bias - old beliefs that never got challenged or forked.
|
|
47
|
-
*/
|
|
48
|
-
declare const getAnchoringBiasDetection: any;
|
|
49
|
-
/**
|
|
50
|
-
* Detect source concentration risk - beliefs where all evidence traces to single source.
|
|
51
|
-
*/
|
|
52
|
-
declare const getSourceConcentrationRisk: any;
|
|
53
|
-
/**
|
|
54
|
-
* Find the minimum falsification set - smallest set of beliefs that would collapse the thesis.
|
|
55
|
-
*/
|
|
56
|
-
declare const getMinimumFalsificationSet: any;
|
|
57
|
-
/**
|
|
58
|
-
* Get contradiction tension map - all unresolved tensions in the graph.
|
|
59
|
-
*/
|
|
60
|
-
declare const getContradictionTensionMap: any;
|
|
61
|
-
/**
|
|
62
|
-
* Get reasoning depth score - how deep is the evidence chain for each belief?
|
|
63
|
-
*/
|
|
64
|
-
declare const getReasoningDepthScore: any;
|
|
65
|
-
/**
|
|
66
|
-
* Get knowledge frontier - open questions on the boundary of what we know.
|
|
67
|
-
*/
|
|
68
|
-
declare const getKnowledgeFrontier: any;
|
|
69
|
-
/**
|
|
70
|
-
* Get belief half-life analysis - how long do beliefs survive before being superseded?
|
|
71
|
-
*/
|
|
72
|
-
declare const getBeliefHalfLife: any;
|
|
73
|
-
/**
|
|
74
|
-
* Get meeting prep brief for a person at a company.
|
|
75
|
-
*/
|
|
76
|
-
declare const getMeetingPrepBrief: any;
|
|
77
|
-
/**
|
|
78
|
-
* Get proprietary signals - our unique insights not in public discourse.
|
|
79
|
-
*/
|
|
80
|
-
declare const getProprietarySignals: any;
|
|
81
|
-
/**
|
|
82
|
-
* Get portfolio conviction dashboard - aggregate conviction metrics across all themes.
|
|
83
|
-
*/
|
|
84
|
-
declare const getPortfolioConviction: any;
|
|
85
|
-
/**
|
|
86
|
-
* Get stale themes - themes with no recent activity.
|
|
87
|
-
*/
|
|
88
|
-
declare const getStaleThemes: any;
|
|
89
|
-
/**
|
|
90
|
-
* Get missing question detection - high-confidence beliefs with no testing questions.
|
|
91
|
-
*/
|
|
92
|
-
declare const getMissingQuestionDetection: any;
|
|
93
|
-
/**
|
|
94
|
-
* Get surprise detection - evidence that surprised us (high surprise score).
|
|
95
|
-
*/
|
|
96
|
-
declare const getSurpriseDetection: any;
|
|
97
|
-
/**
|
|
98
|
-
* Get non-consensus beliefs - beliefs where we diverge from market consensus.
|
|
99
|
-
*/
|
|
100
|
-
declare const getNonConsensusBeliefs: any;
|
|
101
|
-
/**
|
|
102
|
-
* Semantic search with graph context — find nodes by embedding similarity
|
|
103
|
-
* and return their graph neighborhood for context.
|
|
104
|
-
*/
|
|
105
|
-
declare const semanticSearch: any;
|
|
106
|
-
/**
|
|
107
|
-
* Find semantic orphans — nodes structurally connected but semantically
|
|
108
|
-
* distant from their graph neighbors.
|
|
109
|
-
*/
|
|
110
|
-
declare const getSemanticOrphans: any;
|
|
111
|
-
/**
|
|
112
|
-
* Find soft contradictions — beliefs about the same topic (high embedding similarity)
|
|
113
|
-
* but with divergent evidence or confidence.
|
|
114
|
-
*/
|
|
115
|
-
declare const getSoftContradictions: any;
|
|
116
|
-
/**
|
|
117
|
-
* Find semantic bridges — nodes semantically similar but graph-distant.
|
|
118
|
-
* These represent potential missing connections.
|
|
119
|
-
*/
|
|
120
|
-
declare const getSemanticBridges: any;
|
|
121
|
-
/**
|
|
122
|
-
* Graph-aware RAG search — semantic search that expands along graph structure
|
|
123
|
-
* to pull in supporting context (evidence, themes, sources).
|
|
124
|
-
*/
|
|
125
|
-
declare const graphAwareSearch: any;
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Neo4j Graph Queries
|
|
129
|
-
*
|
|
130
|
-
* Convex actions that execute graph queries against Neo4j.
|
|
131
|
-
* These provide graph intelligence that's hard/impossible in Convex alone:
|
|
132
|
-
* - Multi-hop traversals
|
|
133
|
-
* - Path finding
|
|
134
|
-
* - Cross-theme patterns
|
|
135
|
-
* - Contradiction detection
|
|
136
|
-
*
|
|
137
|
-
* Architecture:
|
|
138
|
-
* - Convex action calls a tenant-owned query proxy route
|
|
139
|
-
* - Query proxy executes a predefined Cypher query
|
|
140
|
-
* - Results return to the Convex caller
|
|
141
|
-
*/
|
|
142
|
-
/**
|
|
143
|
-
* Get the full lineage of a node (what it was derived/extracted from)
|
|
144
|
-
* Uses Neo4j for efficient multi-hop traversal up to 10 levels deep
|
|
145
|
-
*/
|
|
146
|
-
declare const getNodeLineageGraph: any;
|
|
147
|
-
/**
|
|
148
|
-
* Get nodes connected to a given node within N hops
|
|
149
|
-
* Much more powerful than Convex's single-hop queries
|
|
150
|
-
*/
|
|
151
|
-
declare const getConnectedNodesGraph: any;
|
|
152
|
-
/**
|
|
153
|
-
* Get all beliefs that belong to a theme
|
|
154
|
-
*/
|
|
155
|
-
declare const getThemeBeliefsGraph: any;
|
|
156
|
-
/**
|
|
157
|
-
* Get evidence that supports a belief (through question chain OR direct link)
|
|
158
|
-
*/
|
|
159
|
-
declare const getBeliefEvidenceGraph: any;
|
|
160
|
-
/**
|
|
161
|
-
* Find beliefs that appear in multiple themes (cross-cutting insights)
|
|
162
|
-
*/
|
|
163
|
-
declare const getCrossThemeBeliefs: any;
|
|
164
|
-
/**
|
|
165
|
-
* Find potential contradictions in the knowledge graph
|
|
166
|
-
* Evidence that tests conflicting beliefs
|
|
167
|
-
*/
|
|
168
|
-
declare const findPotentialContradictions: any;
|
|
169
|
-
/**
|
|
170
|
-
* Get the full subgraph for a theme (all connected beliefs, questions, evidence)
|
|
171
|
-
*/
|
|
172
|
-
declare const getThemeSubgraph: any;
|
|
173
|
-
/**
|
|
174
|
-
* Find the path from evidence to a belief (how does this evidence support this belief?)
|
|
175
|
-
*/
|
|
176
|
-
declare const getEvidenceToBeliefPath: any;
|
|
177
|
-
/**
|
|
178
|
-
* Get stats for a theme (counts of beliefs, questions, evidence)
|
|
179
|
-
*/
|
|
180
|
-
declare const getThemeStats: any;
|
|
181
|
-
/**
|
|
182
|
-
* Get candidate theme-to-valuechain mappings
|
|
183
|
-
* Returns all themes and value chains for manual or AI-assisted matching
|
|
184
|
-
*/
|
|
185
|
-
declare const getThemeValueChainCandidates: any;
|
|
186
|
-
/**
|
|
187
|
-
* Find themes that impact a specific company
|
|
188
|
-
*/
|
|
189
|
-
declare const getThemesImpactingCompany: any;
|
|
190
|
-
/**
|
|
191
|
-
* Find companies related to a theme
|
|
192
|
-
*/
|
|
193
|
-
declare const getCompaniesByTheme: any;
|
|
194
|
-
/**
|
|
195
|
-
* Find questions about a value chain
|
|
196
|
-
*/
|
|
197
|
-
declare const getQuestionsByValueChain: any;
|
|
198
|
-
/**
|
|
199
|
-
* Find questions about a theme
|
|
200
|
-
*/
|
|
201
|
-
declare const getQuestionsByTheme: any;
|
|
202
|
-
/**
|
|
203
|
-
* Find people/contacts related to a theme
|
|
204
|
-
*/
|
|
205
|
-
declare const getPeopleByTheme: any;
|
|
206
|
-
/**
|
|
207
|
-
* Find people at a specific company
|
|
208
|
-
*/
|
|
209
|
-
declare const getPeopleByCompany: any;
|
|
210
|
-
/**
|
|
211
|
-
* Find value chains for a theme
|
|
212
|
-
*/
|
|
213
|
-
declare const getValueChainsByTheme: any;
|
|
214
|
-
/**
|
|
215
|
-
* Find functions in a value chain
|
|
216
|
-
*/
|
|
217
|
-
declare const getFunctionsByValueChain: any;
|
|
218
|
-
/**
|
|
219
|
-
* Find beliefs about a company
|
|
220
|
-
*/
|
|
221
|
-
declare const getBeliefsByCompany: any;
|
|
222
|
-
/**
|
|
223
|
-
* Find evidence about a company
|
|
224
|
-
*/
|
|
225
|
-
declare const getEvidenceByCompany: any;
|
|
226
|
-
/**
|
|
227
|
-
* Search all nodes by text
|
|
228
|
-
*/
|
|
229
|
-
declare const searchAllNodes: any;
|
|
230
|
-
/**
|
|
231
|
-
* Get all relationships from a node
|
|
232
|
-
*/
|
|
233
|
-
declare const getNodeRelationships: any;
|
|
234
|
-
/**
|
|
235
|
-
* Get graph statistics (node counts by type)
|
|
236
|
-
*/
|
|
237
|
-
declare const getGraphStats: any;
|
|
238
|
-
/**
|
|
239
|
-
* Flexible graph query - routes to appropriate query based on intent
|
|
240
|
-
* This is the main entry point for natural language graph queries
|
|
241
|
-
*/
|
|
242
|
-
declare const queryGraph: any;
|
|
243
|
-
|
|
244
|
-
declare const neo4jQueries_findPotentialContradictions: typeof findPotentialContradictions;
|
|
245
|
-
declare const neo4jQueries_getAnchoringBiasDetection: typeof getAnchoringBiasDetection;
|
|
246
|
-
declare const neo4jQueries_getBeliefEvidenceGraph: typeof getBeliefEvidenceGraph;
|
|
247
|
-
declare const neo4jQueries_getBeliefHalfLife: typeof getBeliefHalfLife;
|
|
248
|
-
declare const neo4jQueries_getBeliefsByCompany: typeof getBeliefsByCompany;
|
|
249
|
-
declare const neo4jQueries_getBeliefsByEpistemicStatus: typeof getBeliefsByEpistemicStatus;
|
|
250
|
-
declare const neo4jQueries_getCausalChains: typeof getCausalChains;
|
|
251
|
-
declare const neo4jQueries_getChallengedBeliefs: typeof getChallengedBeliefs;
|
|
252
|
-
declare const neo4jQueries_getCompaniesByTheme: typeof getCompaniesByTheme;
|
|
253
|
-
declare const neo4jQueries_getConfirmationBiasScore: typeof getConfirmationBiasScore;
|
|
254
|
-
declare const neo4jQueries_getConnectedNodesGraph: typeof getConnectedNodesGraph;
|
|
255
|
-
declare const neo4jQueries_getContradictionTensionMap: typeof getContradictionTensionMap;
|
|
256
|
-
declare const neo4jQueries_getCrossThemeBeliefs: typeof getCrossThemeBeliefs;
|
|
257
|
-
declare const neo4jQueries_getEvidenceByCompany: typeof getEvidenceByCompany;
|
|
258
|
-
declare const neo4jQueries_getEvidenceByMethodology: typeof getEvidenceByMethodology;
|
|
259
|
-
declare const neo4jQueries_getEvidenceToBeliefPath: typeof getEvidenceToBeliefPath;
|
|
260
|
-
declare const neo4jQueries_getFalsificationQuestions: typeof getFalsificationQuestions;
|
|
261
|
-
declare const neo4jQueries_getFunctionsByValueChain: typeof getFunctionsByValueChain;
|
|
262
|
-
declare const neo4jQueries_getGraphStats: typeof getGraphStats;
|
|
263
|
-
declare const neo4jQueries_getHighPriorityQuestions: typeof getHighPriorityQuestions;
|
|
264
|
-
declare const neo4jQueries_getKnowledgeFrontier: typeof getKnowledgeFrontier;
|
|
265
|
-
declare const neo4jQueries_getMeetingPrepBrief: typeof getMeetingPrepBrief;
|
|
266
|
-
declare const neo4jQueries_getMinimumFalsificationSet: typeof getMinimumFalsificationSet;
|
|
267
|
-
declare const neo4jQueries_getMissingQuestionDetection: typeof getMissingQuestionDetection;
|
|
268
|
-
declare const neo4jQueries_getNecessaryEvidence: typeof getNecessaryEvidence;
|
|
269
|
-
declare const neo4jQueries_getNodeLineageGraph: typeof getNodeLineageGraph;
|
|
270
|
-
declare const neo4jQueries_getNodeRelationships: typeof getNodeRelationships;
|
|
271
|
-
declare const neo4jQueries_getNonConsensusBeliefs: typeof getNonConsensusBeliefs;
|
|
272
|
-
declare const neo4jQueries_getPeopleByCompany: typeof getPeopleByCompany;
|
|
273
|
-
declare const neo4jQueries_getPeopleByTheme: typeof getPeopleByTheme;
|
|
274
|
-
declare const neo4jQueries_getPortfolioConviction: typeof getPortfolioConviction;
|
|
275
|
-
declare const neo4jQueries_getPredictions: typeof getPredictions;
|
|
276
|
-
declare const neo4jQueries_getProprietaryEvidence: typeof getProprietaryEvidence;
|
|
277
|
-
declare const neo4jQueries_getProprietarySignals: typeof getProprietarySignals;
|
|
278
|
-
declare const neo4jQueries_getQuestionsByTheme: typeof getQuestionsByTheme;
|
|
279
|
-
declare const neo4jQueries_getQuestionsByValueChain: typeof getQuestionsByValueChain;
|
|
280
|
-
declare const neo4jQueries_getReasoningDepthScore: typeof getReasoningDepthScore;
|
|
281
|
-
declare const neo4jQueries_getSemanticBridges: typeof getSemanticBridges;
|
|
282
|
-
declare const neo4jQueries_getSemanticOrphans: typeof getSemanticOrphans;
|
|
283
|
-
declare const neo4jQueries_getSoftContradictions: typeof getSoftContradictions;
|
|
284
|
-
declare const neo4jQueries_getSourceConcentrationRisk: typeof getSourceConcentrationRisk;
|
|
285
|
-
declare const neo4jQueries_getStaleThemes: typeof getStaleThemes;
|
|
286
|
-
declare const neo4jQueries_getSurpriseDetection: typeof getSurpriseDetection;
|
|
287
|
-
declare const neo4jQueries_getThemeBeliefsGraph: typeof getThemeBeliefsGraph;
|
|
288
|
-
declare const neo4jQueries_getThemeStats: typeof getThemeStats;
|
|
289
|
-
declare const neo4jQueries_getThemeSubgraph: typeof getThemeSubgraph;
|
|
290
|
-
declare const neo4jQueries_getThemeValueChainCandidates: typeof getThemeValueChainCandidates;
|
|
291
|
-
declare const neo4jQueries_getThemesImpactingCompany: typeof getThemesImpactingCompany;
|
|
292
|
-
declare const neo4jQueries_getValueChainsByTheme: typeof getValueChainsByTheme;
|
|
293
|
-
declare const neo4jQueries_graphAwareSearch: typeof graphAwareSearch;
|
|
294
|
-
declare const neo4jQueries_queryGraph: typeof queryGraph;
|
|
295
|
-
declare const neo4jQueries_searchAllNodes: typeof searchAllNodes;
|
|
296
|
-
declare const neo4jQueries_semanticSearch: typeof semanticSearch;
|
|
297
|
-
declare namespace neo4jQueries {
|
|
298
|
-
export { neo4jQueries_findPotentialContradictions as findPotentialContradictions, neo4jQueries_getAnchoringBiasDetection as getAnchoringBiasDetection, neo4jQueries_getBeliefEvidenceGraph as getBeliefEvidenceGraph, neo4jQueries_getBeliefHalfLife as getBeliefHalfLife, neo4jQueries_getBeliefsByCompany as getBeliefsByCompany, neo4jQueries_getBeliefsByEpistemicStatus as getBeliefsByEpistemicStatus, neo4jQueries_getCausalChains as getCausalChains, neo4jQueries_getChallengedBeliefs as getChallengedBeliefs, neo4jQueries_getCompaniesByTheme as getCompaniesByTheme, neo4jQueries_getConfirmationBiasScore as getConfirmationBiasScore, neo4jQueries_getConnectedNodesGraph as getConnectedNodesGraph, neo4jQueries_getContradictionTensionMap as getContradictionTensionMap, neo4jQueries_getCrossThemeBeliefs as getCrossThemeBeliefs, neo4jQueries_getEvidenceByCompany as getEvidenceByCompany, neo4jQueries_getEvidenceByMethodology as getEvidenceByMethodology, neo4jQueries_getEvidenceToBeliefPath as getEvidenceToBeliefPath, neo4jQueries_getFalsificationQuestions as getFalsificationQuestions, neo4jQueries_getFunctionsByValueChain as getFunctionsByValueChain, neo4jQueries_getGraphStats as getGraphStats, neo4jQueries_getHighPriorityQuestions as getHighPriorityQuestions, neo4jQueries_getKnowledgeFrontier as getKnowledgeFrontier, neo4jQueries_getMeetingPrepBrief as getMeetingPrepBrief, neo4jQueries_getMinimumFalsificationSet as getMinimumFalsificationSet, neo4jQueries_getMissingQuestionDetection as getMissingQuestionDetection, neo4jQueries_getNecessaryEvidence as getNecessaryEvidence, neo4jQueries_getNodeLineageGraph as getNodeLineageGraph, neo4jQueries_getNodeRelationships as getNodeRelationships, neo4jQueries_getNonConsensusBeliefs as getNonConsensusBeliefs, neo4jQueries_getPeopleByCompany as getPeopleByCompany, neo4jQueries_getPeopleByTheme as getPeopleByTheme, neo4jQueries_getPortfolioConviction as getPortfolioConviction, neo4jQueries_getPredictions as getPredictions, neo4jQueries_getProprietaryEvidence as getProprietaryEvidence, neo4jQueries_getProprietarySignals as getProprietarySignals, neo4jQueries_getQuestionsByTheme as getQuestionsByTheme, neo4jQueries_getQuestionsByValueChain as getQuestionsByValueChain, neo4jQueries_getReasoningDepthScore as getReasoningDepthScore, neo4jQueries_getSemanticBridges as getSemanticBridges, neo4jQueries_getSemanticOrphans as getSemanticOrphans, neo4jQueries_getSoftContradictions as getSoftContradictions, neo4jQueries_getSourceConcentrationRisk as getSourceConcentrationRisk, neo4jQueries_getStaleThemes as getStaleThemes, neo4jQueries_getSurpriseDetection as getSurpriseDetection, neo4jQueries_getThemeBeliefsGraph as getThemeBeliefsGraph, neo4jQueries_getThemeStats as getThemeStats, neo4jQueries_getThemeSubgraph as getThemeSubgraph, neo4jQueries_getThemeValueChainCandidates as getThemeValueChainCandidates, neo4jQueries_getThemesImpactingCompany as getThemesImpactingCompany, neo4jQueries_getValueChainsByTheme as getValueChainsByTheme, neo4jQueries_graphAwareSearch as graphAwareSearch, neo4jQueries_queryGraph as queryGraph, neo4jQueries_searchAllNodes as searchAllNodes, neo4jQueries_semanticSearch as semanticSearch };
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
export { semanticSearch as $, getNodeLineageGraph as A, getNodeRelationships as B, getNonConsensusBeliefs as C, getPeopleByCompany as D, getPeopleByTheme as E, getPortfolioConviction as F, getPredictions as G, getProprietaryEvidence as H, getProprietarySignals as I, getQuestionsByTheme as J, getQuestionsByValueChain as K, getReasoningDepthScore as L, getSemanticBridges as M, getSemanticOrphans as N, getSoftContradictions as O, getSourceConcentrationRisk as P, getStaleThemes as Q, getSurpriseDetection as R, getThemeBeliefsGraph as S, getThemeStats as T, getThemeSubgraph as U, getThemeValueChainCandidates as V, getThemesImpactingCompany as W, getValueChainsByTheme as X, graphAwareSearch as Y, queryGraph as Z, searchAllNodes as _, getBeliefEvidenceGraph as a, getBeliefHalfLife as b, getBeliefsByCompany as c, getBeliefsByEpistemicStatus as d, getCausalChains as e, findPotentialContradictions as f, getAnchoringBiasDetection as g, getChallengedBeliefs as h, getCompaniesByTheme as i, getConfirmationBiasScore as j, getConnectedNodesGraph as k, getContradictionTensionMap as l, getCrossThemeBeliefs as m, neo4jQueries as n, getEvidenceByCompany as o, getEvidenceByMethodology as p, getEvidenceToBeliefPath as q, getFalsificationQuestions as r, getFunctionsByValueChain as s, getGraphStats as t, getHighPriorityQuestions as u, getKnowledgeFrontier as v, getMeetingPrepBrief as w, getMinimumFalsificationSet as x, getMissingQuestionDetection as y, getNecessaryEvidence as z };
|