@lucern/graph-primitives 1.0.17 → 1.0.19

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 (51) hide show
  1. package/dist/entityLifecycle.js +1 -12
  2. package/dist/entityLifecycle.js.map +1 -1
  3. package/dist/epistemicAnswers.js +1 -12
  4. package/dist/epistemicAnswers.js.map +1 -1
  5. package/dist/epistemicBeliefs.core.js +4 -15
  6. package/dist/epistemicBeliefs.core.js.map +1 -1
  7. package/dist/epistemicBeliefs.internal.js +4 -15
  8. package/dist/epistemicBeliefs.internal.js.map +1 -1
  9. package/dist/epistemicBeliefs.js +62 -19
  10. package/dist/epistemicBeliefs.js.map +1 -1
  11. package/dist/epistemicBeliefs.links.js +59 -16
  12. package/dist/epistemicBeliefs.links.js.map +1 -1
  13. package/dist/epistemicBeliefs.topicAnchor.js +3 -3
  14. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
  15. package/dist/epistemicContracts.handlers.js +1 -12
  16. package/dist/epistemicContracts.handlers.js.map +1 -1
  17. package/dist/epistemicContracts.js +1 -12
  18. package/dist/epistemicContracts.js.map +1 -1
  19. package/dist/epistemicEdgeCreation.js +1 -12
  20. package/dist/epistemicEdgeCreation.js.map +1 -1
  21. package/dist/epistemicEdges.helpers.d.ts +1 -1
  22. package/dist/epistemicEvidence.js +1 -12
  23. package/dist/epistemicEvidence.js.map +1 -1
  24. package/dist/epistemicEvidenceMutations.js +1 -12
  25. package/dist/epistemicEvidenceMutations.js.map +1 -1
  26. package/dist/epistemicHelpers.js +1 -12
  27. package/dist/epistemicHelpers.js.map +1 -1
  28. package/dist/epistemicNodeCreation.js +1 -10
  29. package/dist/epistemicNodeCreation.js.map +1 -1
  30. package/dist/epistemicQuestions.create.js +1 -12
  31. package/dist/epistemicQuestions.create.js.map +1 -1
  32. package/dist/epistemicQuestions.evidence.js +1 -12
  33. package/dist/epistemicQuestions.evidence.js.map +1 -1
  34. package/dist/epistemicQuestions.js +1 -12
  35. package/dist/epistemicQuestions.js.map +1 -1
  36. package/dist/epistemicQuestions.tail.js +1 -12
  37. package/dist/epistemicQuestions.tail.js.map +1 -1
  38. package/dist/epistemicSources.js +1 -12
  39. package/dist/epistemicSources.js.map +1 -1
  40. package/dist/globalId-4y9SPpC_.d.ts +10 -0
  41. package/dist/globalId.d.ts +1 -1
  42. package/dist/globalId.js +1 -13
  43. package/dist/globalId.js.map +1 -1
  44. package/dist/helpers.js +1 -12
  45. package/dist/helpers.js.map +1 -1
  46. package/dist/index.d.ts +2 -1
  47. package/dist/index.js +65 -18
  48. package/dist/index.js.map +1 -1
  49. package/dist/proof-attestation.json +1 -1
  50. package/package.json +4 -4
  51. package/dist/globalId-DKh9d_uD.d.ts +0 -20
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/epistemicBeliefs.topicAnchor.ts"],"names":[],"mappings":"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","file":"epistemicBeliefs.topicAnchor.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","import type { Doc, Id, MutationCtx } from \"./convex\";\nimport { internal } from \"./convex\";\n\ntype TopicAnchorInput = {\n topicId?: string;\n topicNodeId?: string;\n topicGlobalId?: string;\n};\n\ntype TopicNodeDoc = Doc<\"epistemicNodes\"> & {\n globalId: string;\n nodeType: \"topic\";\n};\n\nfunction cleanString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction topicNodeCandidates(topicRef: string): string[] {\n const normalized = topicRef.trim();\n if (!normalized) {\n return [];\n }\n const candidates = [normalized];\n if (normalized.startsWith(\"top_\")) {\n candidates.push(normalized.slice(4));\n }\n return [...new Set(candidates)];\n}\n\nexport function readTopicNodeRef(args: TopicAnchorInput): string | undefined {\n return (\n cleanString(args.topicGlobalId) ??\n cleanString(args.topicNodeId) ??\n cleanString(args.topicId)\n );\n}\n\nexport async function resolveRequiredTopicAnchor(\n ctx: MutationCtx,\n topicRef: string,\n): Promise<TopicNodeDoc> {\n for (const candidate of topicNodeCandidates(topicRef)) {\n try {\n const direct = await ctx.db.get(candidate as Id<\"epistemicNodes\">);\n if (direct?.nodeType === \"topic\" && cleanString(direct.globalId)) {\n return direct as TopicNodeDoc;\n }\n } catch (_) {\n // Not a component-local epistemicNodes _id; try the globalId index next.\n }\n\n const byGlobalId = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", candidate))\n .first();\n if (byGlobalId?.nodeType === \"topic\" && cleanString(byGlobalId.globalId)) {\n return byGlobalId as TopicNodeDoc;\n }\n }\n\n throw new Error(\n \"Belief creation requires topicGlobalId or topicNodeId for a topic node in epistemicNodes. Legacy topics-table IDs are not valid belief anchors.\",\n );\n}\n\nexport function scopeFromTopicAnchor(topicNode: TopicNodeDoc) {\n return {\n topicId: topicNode.globalId,\n projectId: cleanString(topicNode.projectId),\n tenantId: cleanString(topicNode.tenantId),\n workspaceId: cleanString(topicNode.workspaceId),\n source: \"topic\" as const,\n };\n}\n\nexport async function createRequiredBeliefTopicEdge(\n ctx: MutationCtx,\n args: {\n beliefNodeId: Id<\"epistemicNodes\">;\n beliefGlobalId: string;\n topicNode: TopicNodeDoc;\n createdBy: string;\n },\n) {\n const topicGlobalId = args.topicNode.globalId;\n const edgeGlobalId = `edge:${args.beliefGlobalId}:${topicGlobalId}:scoped_by`;\n const now = Date.now();\n\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", edgeGlobalId))\n .first();\n if (!existing) {\n await ctx.db.insert(\"epistemicEdges\", {\n globalId: edgeGlobalId,\n fromNodeId: String(args.beliefNodeId),\n toNodeId: String(args.topicNode._id),\n sourceGlobalId: args.beliefGlobalId,\n targetGlobalId: topicGlobalId,\n edgeType: \"scoped_by\",\n weight: 1,\n confidence: 1,\n context: \"Belief creation topic anchor invariant.\",\n reasoningMethod: \"implicit\",\n derivationType: \"topic_scope_invariant\",\n metadata: { invariant: \"belief.topic_edge_required\" },\n createdBy: args.createdBy,\n createdAt: now,\n updatedAt: now,\n projectId: cleanString(args.topicNode.projectId),\n topicId: topicGlobalId,\n tenantId: cleanString(args.topicNode.tenantId),\n workspaceId: cleanString(args.topicNode.workspaceId),\n fromNodeType: \"belief\",\n toNodeType: \"topic\",\n fromLayer: \"L3\",\n toLayer: args.topicNode.epistemicLayer ?? \"ontological\",\n } as any);\n }\n\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: args.beliefGlobalId,\n toGlobalId: topicGlobalId,\n edgeType: \"scoped_by\",\n weight: 1,\n confidence: 1,\n context: \"Belief creation topic anchor invariant.\",\n projectId: cleanString(args.topicNode.projectId),\n topicId: topicGlobalId,\n createdBy: args.createdBy,\n fromNodeType: \"belief\",\n toNodeType: \"topic\",\n fromLayer: \"L3\",\n toLayer: args.topicNode.epistemicLayer ?? \"ontological\",\n metadata: { invariant: \"belief.topic_edge_required\" },\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/convex.ts","../src/epistemicBeliefs.topicAnchor.ts"],"names":[],"mappings":";;;AAc0B,iBAAA;AACnB,IAAM,QAAA,GAAW,MAAA;;;ACDxB,SAAS,YAAY,KAAA,EAAoC;AACvD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA,GACtD,KAAA,CAAM,IAAA,EAAK,GACX,MAAA;AACN;AAEA,SAAS,oBAAoB,QAAA,EAA4B;AACvD,EAAA,MAAM,UAAA,GAAa,SAAS,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,UAAU,CAAA;AAC9B,EAAA,IAAI,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA,EAAG;AACjC,IAAA,UAAA,CAAW,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,UAAU,CAAC,CAAA;AAChC;AAEO,SAAS,iBAAiB,IAAA,EAA4C;AAC3E,EAAA,OACE,WAAA,CAAY,IAAA,CAAK,aAAa,CAAA,IAC9B,WAAA,CAAY,KAAK,WAAW,CAAA,IAC5B,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AAE5B;AAEA,eAAsB,0BAAA,CACpB,KACA,QAAA,EACuB;AACvB,EAAA,KAAA,MAAW,SAAA,IAAa,mBAAA,CAAoB,QAAQ,CAAA,EAAG;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,EAAA,CAAG,IAAI,SAAiC,CAAA;AACjE,MAAA,IAAI,QAAQ,QAAA,KAAa,OAAA,IAAW,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAA,EAAG;AAChE,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF,SAAS,CAAA,EAAG;AAAA,IAEZ;AAEA,IAAA,MAAM,aAAa,MAAM,GAAA,CAAI,EAAA,CAC1B,KAAA,CAAM,gBAAgB,CAAA,CACtB,SAAA,CAAU,aAAA,EAAe,CAAC,MAAM,CAAA,CAAE,EAAA,CAAG,YAAY,SAAS,CAAC,EAC3D,KAAA,EAAM;AACT,IAAA,IAAI,YAAY,QAAA,KAAa,OAAA,IAAW,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA,EAAG;AACxE,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAEO,SAAS,qBAAqB,SAAA,EAAyB;AAC5D,EAAA,OAAO;AAAA,IACL,SAAS,SAAA,CAAU,QAAA;AAAA,IACnB,SAAA,EAAW,WAAA,CAAY,SAAA,CAAU,SAAS,CAAA;AAAA,IAC1C,QAAA,EAAU,WAAA,CAAY,SAAA,CAAU,QAAQ,CAAA;AAAA,IACxC,WAAA,EAAa,WAAA,CAAY,SAAA,CAAU,WAAW,CAAA;AAAA,IAC9C,MAAA,EAAQ;AAAA,GACV;AACF;AAEA,eAAsB,6BAAA,CACpB,KACA,IAAA,EAMA;AACA,EAAA,MAAM,aAAA,GAAgB,KAAK,SAAA,CAAU,QAAA;AACrC,EAAA,MAAM,YAAA,GAAe,CAAA,KAAA,EAAQ,IAAA,CAAK,cAAc,IAAI,aAAa,CAAA,WAAA,CAAA;AACjE,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,EAAA,MAAM,WAAW,MAAM,GAAA,CAAI,EAAA,CACxB,KAAA,CAAM,gBAAgB,CAAA,CACtB,SAAA,CAAU,aAAA,EAAe,CAAC,MAAM,CAAA,CAAE,EAAA,CAAG,YAAY,YAAY,CAAC,EAC9D,KAAA,EAAM;AACT,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,MAAA,CAAO,gBAAA,EAAkB;AAAA,MACpC,QAAA,EAAU,YAAA;AAAA,MACV,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA;AAAA,MACpC,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,MACnC,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,cAAA,EAAgB,aAAA;AAAA,MAChB,QAAA,EAAU,YAAA;AAAA,MACV,MAAA,EAAQ,CAAA;AAAA,MACR,UAAA,EAAY,CAAA;AAAA,MACZ,OAAA,EAAS,yCAAA;AAAA,MACT,eAAA,EAAiB,UAAA;AAAA,MACjB,cAAA,EAAgB,uBAAA;AAAA,MAChB,QAAA,EAAU,EAAE,SAAA,EAAW,4BAAA,EAA6B;AAAA,MACpD,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,MAC/C,OAAA,EAAS,aAAA;AAAA,MACT,QAAA,EAAU,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,MAC7C,WAAA,EAAa,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AAAA,MACnD,YAAA,EAAc,QAAA;AAAA,MACd,UAAA,EAAY,OAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,cAAA,IAAkB;AAAA,KACpC,CAAA;AAAA,EACV;AAEA,EAAA,MAAM,IAAI,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,aAAa,UAAA,EAAY;AAAA,IAChE,QAAA,EAAU,YAAA;AAAA,IACV,cAAc,IAAA,CAAK,cAAA;AAAA,IACnB,UAAA,EAAY,aAAA;AAAA,IACZ,QAAA,EAAU,YAAA;AAAA,IACV,MAAA,EAAQ,CAAA;AAAA,IACR,UAAA,EAAY,CAAA;AAAA,IACZ,OAAA,EAAS,yCAAA;AAAA,IACT,SAAA,EAAW,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,IAC/C,OAAA,EAAS,aAAA;AAAA,IACT,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,YAAA,EAAc,QAAA;AAAA,IACd,UAAA,EAAY,OAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,cAAA,IAAkB,aAAA;AAAA,IAC1C,QAAA,EAAU,EAAE,SAAA,EAAW,4BAAA;AAA6B,GACrD,CAAA;AACH","file":"epistemicBeliefs.topicAnchor.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","import type { Doc, Id, MutationCtx } from \"./convex\";\nimport { internal } from \"./convex\";\n\ntype TopicAnchorInput = {\n topicId?: string;\n topicNodeId?: string;\n topicGlobalId?: string;\n};\n\ntype TopicNodeDoc = Doc<\"epistemicNodes\"> & {\n globalId: string;\n nodeType: \"topic\";\n};\n\nfunction cleanString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction topicNodeCandidates(topicRef: string): string[] {\n const normalized = topicRef.trim();\n if (!normalized) {\n return [];\n }\n const candidates = [normalized];\n if (normalized.startsWith(\"top_\")) {\n candidates.push(normalized.slice(4));\n }\n return [...new Set(candidates)];\n}\n\nexport function readTopicNodeRef(args: TopicAnchorInput): string | undefined {\n return (\n cleanString(args.topicGlobalId) ??\n cleanString(args.topicNodeId) ??\n cleanString(args.topicId)\n );\n}\n\nexport async function resolveRequiredTopicAnchor(\n ctx: MutationCtx,\n topicRef: string,\n): Promise<TopicNodeDoc> {\n for (const candidate of topicNodeCandidates(topicRef)) {\n try {\n const direct = await ctx.db.get(candidate as Id<\"epistemicNodes\">);\n if (direct?.nodeType === \"topic\" && cleanString(direct.globalId)) {\n return direct as TopicNodeDoc;\n }\n } catch (_) {\n // Not a component-local epistemicNodes _id; try the globalId index next.\n }\n\n const byGlobalId = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", candidate))\n .first();\n if (byGlobalId?.nodeType === \"topic\" && cleanString(byGlobalId.globalId)) {\n return byGlobalId as TopicNodeDoc;\n }\n }\n\n throw new Error(\n \"Belief creation requires topicGlobalId or topicNodeId for a topic node in epistemicNodes. Legacy topics-table IDs are not valid belief anchors.\",\n );\n}\n\nexport function scopeFromTopicAnchor(topicNode: TopicNodeDoc) {\n return {\n topicId: topicNode.globalId,\n projectId: cleanString(topicNode.projectId),\n tenantId: cleanString(topicNode.tenantId),\n workspaceId: cleanString(topicNode.workspaceId),\n source: \"topic\" as const,\n };\n}\n\nexport async function createRequiredBeliefTopicEdge(\n ctx: MutationCtx,\n args: {\n beliefNodeId: Id<\"epistemicNodes\">;\n beliefGlobalId: string;\n topicNode: TopicNodeDoc;\n createdBy: string;\n },\n) {\n const topicGlobalId = args.topicNode.globalId;\n const edgeGlobalId = `edge:${args.beliefGlobalId}:${topicGlobalId}:belongs_to`;\n const now = Date.now();\n\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", edgeGlobalId))\n .first();\n if (!existing) {\n await ctx.db.insert(\"epistemicEdges\", {\n globalId: edgeGlobalId,\n fromNodeId: String(args.beliefNodeId),\n toNodeId: String(args.topicNode._id),\n sourceGlobalId: args.beliefGlobalId,\n targetGlobalId: topicGlobalId,\n edgeType: \"belongs_to\",\n weight: 1,\n confidence: 1,\n context: \"Belief creation topic anchor invariant.\",\n reasoningMethod: \"implicit\",\n derivationType: \"topic_scope_invariant\",\n metadata: { invariant: \"belief.topic_edge_required\" },\n createdBy: args.createdBy,\n createdAt: now,\n updatedAt: now,\n projectId: cleanString(args.topicNode.projectId),\n topicId: topicGlobalId,\n tenantId: cleanString(args.topicNode.tenantId),\n workspaceId: cleanString(args.topicNode.workspaceId),\n fromNodeType: \"belief\",\n toNodeType: \"topic\",\n fromLayer: \"L3\",\n toLayer: args.topicNode.epistemicLayer ?? \"ontological\",\n } as any);\n }\n\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: args.beliefGlobalId,\n toGlobalId: topicGlobalId,\n edgeType: \"belongs_to\",\n weight: 1,\n confidence: 1,\n context: \"Belief creation topic anchor invariant.\",\n projectId: cleanString(args.topicNode.projectId),\n topicId: topicGlobalId,\n createdBy: args.createdBy,\n fromNodeType: \"belief\",\n toNodeType: \"topic\",\n fromLayer: \"L3\",\n toLayer: args.topicNode.epistemicLayer ?? \"ontological\",\n metadata: { invariant: \"belief.topic_edge_required\" },\n });\n}\n"]}
@@ -6,6 +6,7 @@ import { normalizeTupleContradictionPolicy, mkOpinion, conditionalDeduction, pro
6
6
  import '@lucern/access-control/audience';
7
7
  import { componentsGeneric, internalMutationGeneric, anyApi, queryGeneric, mutationGeneric } from 'convex/server';
8
8
  import '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
9
+ import { generateGlobalId } from '@lucern/contracts/ids';
9
10
 
10
11
  // src/epistemicContracts.handlers.ts
11
12
 
@@ -1728,18 +1729,6 @@ internalMutation({
1728
1729
  }
1729
1730
  });
1730
1731
 
1731
- // src/globalId.ts
1732
- function generateGlobalId() {
1733
- const bytes = new Uint8Array(16);
1734
- crypto.getRandomValues(bytes);
1735
- bytes[6] = bytes[6] & 15 | 64;
1736
- bytes[8] = bytes[8] & 63 | 128;
1737
- const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(
1738
- ""
1739
- );
1740
- return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
1741
- }
1742
-
1743
1732
  // src/epistemicContracts.evaluators.ts
1744
1733
  var evaluatorRegistry = /* @__PURE__ */ new Map();
1745
1734
  var BUILT_IN_EVIDENTIAL_ALIASES2 = METRIC_COMPARATOR_EVALUATOR_NAMES.evidentialAliases;