@apart-tech/intelligence-core 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/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +97 -0
- package/dist/config/index.js.map +1 -0
- package/dist/db/connection.d.ts +7 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +49 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/schema.d.ts +507 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +77 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/tenant.d.ts +8 -0
- package/dist/db/tenant.d.ts.map +1 -0
- package/dist/db/tenant.js +92 -0
- package/dist/db/tenant.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +16 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +9 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +34 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/services/cleaning-service.d.ts +152 -0
- package/dist/services/cleaning-service.d.ts.map +1 -0
- package/dist/services/cleaning-service.js +632 -0
- package/dist/services/cleaning-service.js.map +1 -0
- package/dist/services/context-service.d.ts +13 -0
- package/dist/services/context-service.d.ts.map +1 -0
- package/dist/services/context-service.js +74 -0
- package/dist/services/context-service.js.map +1 -0
- package/dist/services/domain-seed-data.d.ts +8 -0
- package/dist/services/domain-seed-data.d.ts.map +1 -0
- package/dist/services/domain-seed-data.js +84 -0
- package/dist/services/domain-seed-data.js.map +1 -0
- package/dist/services/domain-service.d.ts +26 -0
- package/dist/services/domain-service.d.ts.map +1 -0
- package/dist/services/domain-service.js +101 -0
- package/dist/services/domain-service.js.map +1 -0
- package/dist/services/edge-service.d.ts +25 -0
- package/dist/services/edge-service.d.ts.map +1 -0
- package/dist/services/edge-service.js +90 -0
- package/dist/services/edge-service.js.map +1 -0
- package/dist/services/node-service.d.ts +34 -0
- package/dist/services/node-service.d.ts.map +1 -0
- package/dist/services/node-service.js +113 -0
- package/dist/services/node-service.js.map +1 -0
- package/dist/services/search-service.d.ts +15 -0
- package/dist/services/search-service.d.ts.map +1 -0
- package/dist/services/search-service.js +118 -0
- package/dist/services/search-service.js.map +1 -0
- package/dist/types/index.d.ts +74 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +42 -0
- package/prisma/schema.prisma +114 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { pgTable, uuid, varchar, text, jsonb, integer, real, timestamp, index, customType, } from "drizzle-orm/pg-core";
|
|
2
|
+
// Custom type for pgvector
|
|
3
|
+
const vector = customType({
|
|
4
|
+
dataType() {
|
|
5
|
+
return "vector(1536)";
|
|
6
|
+
},
|
|
7
|
+
toDriver(value) {
|
|
8
|
+
return `[${value.join(",")}]`;
|
|
9
|
+
},
|
|
10
|
+
fromDriver(value) {
|
|
11
|
+
return JSON.parse(value);
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
// Custom type for tsvector
|
|
15
|
+
const tsvector = customType({
|
|
16
|
+
dataType() {
|
|
17
|
+
return "tsvector";
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
// ── Nodes ──────────────────────────────────────────────────────────────────
|
|
21
|
+
export const nodes = pgTable("nodes", {
|
|
22
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
23
|
+
type: varchar("type", { length: 100 }).notNull(),
|
|
24
|
+
title: varchar("title", { length: 500 }).notNull(),
|
|
25
|
+
content: text("content").notNull().default(""),
|
|
26
|
+
embedding: vector("embedding"),
|
|
27
|
+
searchVector: tsvector("search_vector"),
|
|
28
|
+
metadata: jsonb("metadata").$type().default({}),
|
|
29
|
+
status: varchar("status", { length: 20 }).notNull().default("draft"),
|
|
30
|
+
createdBy: varchar("created_by", { length: 255 }).notNull(),
|
|
31
|
+
createdAt: timestamp("created_at", { withTimezone: true })
|
|
32
|
+
.notNull()
|
|
33
|
+
.defaultNow(),
|
|
34
|
+
updatedAt: timestamp("updated_at", { withTimezone: true })
|
|
35
|
+
.notNull()
|
|
36
|
+
.defaultNow(),
|
|
37
|
+
version: integer("version").notNull().default(1),
|
|
38
|
+
}, (table) => [
|
|
39
|
+
index("idx_nodes_type").on(table.type),
|
|
40
|
+
index("idx_nodes_status").on(table.status),
|
|
41
|
+
index("idx_nodes_created_by").on(table.createdBy),
|
|
42
|
+
index("idx_nodes_created_at").on(table.createdAt),
|
|
43
|
+
]);
|
|
44
|
+
// ── Edges ──────────────────────────────────────────────────────────────────
|
|
45
|
+
export const edges = pgTable("edges", {
|
|
46
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
47
|
+
sourceNodeId: uuid("source_node_id")
|
|
48
|
+
.notNull()
|
|
49
|
+
.references(() => nodes.id, { onDelete: "cascade" }),
|
|
50
|
+
targetNodeId: uuid("target_node_id")
|
|
51
|
+
.notNull()
|
|
52
|
+
.references(() => nodes.id, { onDelete: "cascade" }),
|
|
53
|
+
relationshipType: varchar("relationship_type", { length: 100 }).notNull(),
|
|
54
|
+
weight: real("weight").notNull().default(1.0),
|
|
55
|
+
metadata: jsonb("metadata").$type().default({}),
|
|
56
|
+
createdBy: varchar("created_by", { length: 255 }).notNull(),
|
|
57
|
+
createdAt: timestamp("created_at", { withTimezone: true })
|
|
58
|
+
.notNull()
|
|
59
|
+
.defaultNow(),
|
|
60
|
+
}, (table) => [
|
|
61
|
+
index("idx_edges_source").on(table.sourceNodeId),
|
|
62
|
+
index("idx_edges_target").on(table.targetNodeId),
|
|
63
|
+
index("idx_edges_relationship_type").on(table.relationshipType),
|
|
64
|
+
]);
|
|
65
|
+
// ── API Keys ───────────────────────────────────────────────────────────────
|
|
66
|
+
export const apiKeys = pgTable("api_keys", {
|
|
67
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
68
|
+
name: varchar("name", { length: 255 }).notNull(),
|
|
69
|
+
keyHash: varchar("key_hash", { length: 255 }).notNull().unique(),
|
|
70
|
+
createdBy: varchar("created_by", { length: 255 }).notNull(),
|
|
71
|
+
createdAt: timestamp("created_at", { withTimezone: true })
|
|
72
|
+
.notNull()
|
|
73
|
+
.defaultNow(),
|
|
74
|
+
lastUsedAt: timestamp("last_used_at", { withTimezone: true }),
|
|
75
|
+
active: integer("active").notNull().default(1),
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,KAAK,EACL,OAAO,EACP,IAAI,EACJ,SAAS,EACT,KAAK,EACL,UAAU,GACX,MAAM,qBAAqB,CAAC;AAE7B,2BAA2B;AAC3B,MAAM,MAAM,GAAG,UAAU,CAA0C;IACjE,QAAQ;QACN,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,QAAQ,CAAC,KAAe;QACtB,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC,CAAC;IACD,UAAU,CAAC,KAAc;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAe,CAAa,CAAC;IACjD,CAAC;CACF,CAAC,CAAC;AAEH,2BAA2B;AAC3B,MAAM,QAAQ,GAAG,UAAU,CAAwC;IACjE,QAAQ;QACN,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC,CAAC;AAEH,8EAA8E;AAE9E,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAC1B,OAAO,EACP;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;IAC3C,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IAChD,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IAClD,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC;IAC9B,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,EAA2B,CAAC,OAAO,CAAC,EAAE,CAAC;IACxE,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IACpE,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IAC3D,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;SACvD,OAAO,EAAE;SACT,UAAU,EAAE;IACf,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;SACvD,OAAO,EAAE;SACT,UAAU,EAAE;IACf,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;CACjD,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;IACtC,KAAK,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1C,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IACjD,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAClD,CACF,CAAC;AAEF,8EAA8E;AAE9E,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAC1B,OAAO,EACP;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;IAC3C,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC;SACjC,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtD,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC;SACjC,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtD,gBAAgB,EAAE,OAAO,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IACzE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IAC7C,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,EAA2B,CAAC,OAAO,CAAC,EAAE,CAAC;IACxE,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IAC3D,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;SACvD,OAAO,EAAE;SACT,UAAU,EAAE;CAChB,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;IAChD,KAAK,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;IAChD,KAAK,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC;CAChE,CACF,CAAC;AAEF,8EAA8E;AAE9E,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE;IACzC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;IAC3C,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IAChD,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IAChE,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IAC3D,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;SACvD,OAAO,EAAE;SACT,UAAU,EAAE;IACf,UAAU,EAAE,SAAS,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAC7D,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;CAC/C,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Prisma, PrismaClient } from "@prisma/client";
|
|
2
|
+
export interface TenantContext {
|
|
3
|
+
organizationId: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const SINGLE_TENANT_ORG_ID = "00000000-0000-0000-0000-000000000000";
|
|
6
|
+
export declare function createTenantClient(base: PrismaClient, ctx: TenantContext): PrismaClient;
|
|
7
|
+
export declare function tenantWhere(ctx: TenantContext, alias?: string): Prisma.Sql;
|
|
8
|
+
//# sourceMappingURL=tenant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../src/db/tenant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,oBAAoB,yCAAyC,CAAC;AA8E3E,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,YAAY,EAClB,GAAG,EAAE,aAAa,GACjB,YAAY,CAUd;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,CAK1E"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Prisma } from "@prisma/client";
|
|
2
|
+
export const SINGLE_TENANT_ORG_ID = "00000000-0000-0000-0000-000000000000";
|
|
3
|
+
const TENANT_MODELS = [
|
|
4
|
+
"node",
|
|
5
|
+
"edge",
|
|
6
|
+
"domain",
|
|
7
|
+
"apiKey",
|
|
8
|
+
];
|
|
9
|
+
function isTenantModel(model) {
|
|
10
|
+
return TENANT_MODELS.includes(model);
|
|
11
|
+
}
|
|
12
|
+
// Per-model tenant operations — $allModels doesn't compose with Prisma Accelerate,
|
|
13
|
+
// so we define operations explicitly for each tenant-scoped model.
|
|
14
|
+
function tenantOps(ctx) {
|
|
15
|
+
return {
|
|
16
|
+
async findMany({ args, query }) {
|
|
17
|
+
args.where = { ...args.where, organizationId: ctx.organizationId };
|
|
18
|
+
return query(args);
|
|
19
|
+
},
|
|
20
|
+
async findFirst({ args, query }) {
|
|
21
|
+
args.where = { ...args.where, organizationId: ctx.organizationId };
|
|
22
|
+
return query(args);
|
|
23
|
+
},
|
|
24
|
+
async findUnique({ args, query }) {
|
|
25
|
+
args.where = { ...args.where, organizationId: ctx.organizationId };
|
|
26
|
+
return query(args);
|
|
27
|
+
},
|
|
28
|
+
async create({ args, query }) {
|
|
29
|
+
args.data = { ...args.data, organizationId: ctx.organizationId };
|
|
30
|
+
return query(args);
|
|
31
|
+
},
|
|
32
|
+
async createMany({ args, query }) {
|
|
33
|
+
if (Array.isArray(args.data)) {
|
|
34
|
+
args.data = args.data.map((d) => ({
|
|
35
|
+
...d,
|
|
36
|
+
organizationId: ctx.organizationId,
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
args.data = { ...args.data, organizationId: ctx.organizationId };
|
|
41
|
+
}
|
|
42
|
+
return query(args);
|
|
43
|
+
},
|
|
44
|
+
async update({ args, query }) {
|
|
45
|
+
args.where = { ...args.where, organizationId: ctx.organizationId };
|
|
46
|
+
return query(args);
|
|
47
|
+
},
|
|
48
|
+
async updateMany({ args, query }) {
|
|
49
|
+
args.where = { ...args.where, organizationId: ctx.organizationId };
|
|
50
|
+
return query(args);
|
|
51
|
+
},
|
|
52
|
+
async delete({ args, query }) {
|
|
53
|
+
args.where = { ...args.where, organizationId: ctx.organizationId };
|
|
54
|
+
return query(args);
|
|
55
|
+
},
|
|
56
|
+
async deleteMany({ args, query }) {
|
|
57
|
+
args.where = { ...args.where, organizationId: ctx.organizationId };
|
|
58
|
+
return query(args);
|
|
59
|
+
},
|
|
60
|
+
async count({ args, query }) {
|
|
61
|
+
args.where = { ...args.where, organizationId: ctx.organizationId };
|
|
62
|
+
return query(args);
|
|
63
|
+
},
|
|
64
|
+
async groupBy({ args, query }) {
|
|
65
|
+
args.where = { ...args.where, organizationId: ctx.organizationId };
|
|
66
|
+
return query(args);
|
|
67
|
+
},
|
|
68
|
+
async upsert({ args, query }) {
|
|
69
|
+
args.where = { ...args.where, organizationId: ctx.organizationId };
|
|
70
|
+
args.create = { ...args.create, organizationId: ctx.organizationId };
|
|
71
|
+
return query(args);
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export function createTenantClient(base, ctx) {
|
|
76
|
+
const ops = tenantOps(ctx);
|
|
77
|
+
return base.$extends({
|
|
78
|
+
query: {
|
|
79
|
+
node: ops,
|
|
80
|
+
edge: ops,
|
|
81
|
+
domain: ops,
|
|
82
|
+
apiKey: ops,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
export function tenantWhere(ctx, alias) {
|
|
87
|
+
const col = alias
|
|
88
|
+
? Prisma.raw(`${alias}.organization_id`)
|
|
89
|
+
: Prisma.raw(`organization_id`);
|
|
90
|
+
return Prisma.sql `${col} = ${ctx.organizationId}::uuid`;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=tenant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.js","sourceRoot":"","sources":["../../src/db/tenant.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { getDb, getTenantDb, closeDb } from "./db/connection.js";
|
|
2
|
+
export type { Database } from "./db/connection.js";
|
|
3
|
+
export { PrismaClient } from "@prisma/client";
|
|
4
|
+
export { createTenantClient, tenantWhere, SINGLE_TENANT_ORG_ID } from "./db/tenant.js";
|
|
5
|
+
export type { TenantContext } from "./db/tenant.js";
|
|
6
|
+
export * from "./types/index.js";
|
|
7
|
+
export { loadConfig } from "./config/index.js";
|
|
8
|
+
export { NodeService } from "./services/node-service.js";
|
|
9
|
+
export { EdgeService } from "./services/edge-service.js";
|
|
10
|
+
export { SearchService } from "./services/search-service.js";
|
|
11
|
+
export { ContextService } from "./services/context-service.js";
|
|
12
|
+
export { DomainService } from "./services/domain-service.js";
|
|
13
|
+
export { CleaningService } from "./services/cleaning-service.js";
|
|
14
|
+
export type { OrphanNode, DuplicatePair, HealthReport, LinkSuggestion, Island, IslandBridge, ValidationReport, ValidationIssue, ValidationCategory, ValidationSeverity, NormalizeSuggestion, NormalizeReport } from "./services/cleaning-service.js";
|
|
15
|
+
export { createEmbeddingProvider, OpenAIEmbeddingProvider } from "./providers/index.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACjE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACvF,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGrP,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Database
|
|
2
|
+
export { getDb, getTenantDb, closeDb } from "./db/connection.js";
|
|
3
|
+
export { PrismaClient } from "@prisma/client";
|
|
4
|
+
export { createTenantClient, tenantWhere, SINGLE_TENANT_ORG_ID } from "./db/tenant.js";
|
|
5
|
+
// Types
|
|
6
|
+
export * from "./types/index.js";
|
|
7
|
+
// Config
|
|
8
|
+
export { loadConfig } from "./config/index.js";
|
|
9
|
+
// Services
|
|
10
|
+
export { NodeService } from "./services/node-service.js";
|
|
11
|
+
export { EdgeService } from "./services/edge-service.js";
|
|
12
|
+
export { SearchService } from "./services/search-service.js";
|
|
13
|
+
export { ContextService } from "./services/context-service.js";
|
|
14
|
+
export { DomainService } from "./services/domain-service.js";
|
|
15
|
+
export { CleaningService } from "./services/cleaning-service.js";
|
|
16
|
+
// Providers
|
|
17
|
+
export { createEmbeddingProvider, OpenAIEmbeddingProvider } from "./providers/index.js";
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGvF,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,YAAY;AACZ,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { EmbeddingProvider, ApartConfig } from "../types/index.js";
|
|
2
|
+
import { OpenAIEmbeddingProvider } from "./openai.js";
|
|
3
|
+
export declare function createEmbeddingProvider(config: ApartConfig): EmbeddingProvider;
|
|
4
|
+
export { OpenAIEmbeddingProvider };
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,WAAW,GAClB,iBAAiB,CAgBnB;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { OpenAIEmbeddingProvider } from "./openai.js";
|
|
2
|
+
export function createEmbeddingProvider(config) {
|
|
3
|
+
switch (config.embeddings.provider) {
|
|
4
|
+
case "openai": {
|
|
5
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
6
|
+
if (!apiKey) {
|
|
7
|
+
throw new Error("OPENAI_API_KEY environment variable is required for OpenAI embeddings");
|
|
8
|
+
}
|
|
9
|
+
return new OpenAIEmbeddingProvider(apiKey, config.embeddings.model);
|
|
10
|
+
}
|
|
11
|
+
default:
|
|
12
|
+
throw new Error(`Unknown embedding provider: ${config.embeddings.provider}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export { OpenAIEmbeddingProvider };
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,uBAAuB,CACrC,MAAmB;IAEnB,QAAQ,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACnC,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAC5D,CAAC;IACN,CAAC;AACH,CAAC;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from "../types/index.js";
|
|
2
|
+
export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
3
|
+
private apiKey;
|
|
4
|
+
private model;
|
|
5
|
+
constructor(apiKey: string, model?: string);
|
|
6
|
+
embed(text: string): Promise<number[]>;
|
|
7
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,SAA2B;IAKtD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CA0BvD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export class OpenAIEmbeddingProvider {
|
|
2
|
+
apiKey;
|
|
3
|
+
model;
|
|
4
|
+
constructor(apiKey, model = "text-embedding-3-small") {
|
|
5
|
+
this.apiKey = apiKey;
|
|
6
|
+
this.model = model;
|
|
7
|
+
}
|
|
8
|
+
async embed(text) {
|
|
9
|
+
const [result] = await this.embedBatch([text]);
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
async embedBatch(texts) {
|
|
13
|
+
const response = await fetch("https://api.openai.com/v1/embeddings", {
|
|
14
|
+
method: "POST",
|
|
15
|
+
headers: {
|
|
16
|
+
"Content-Type": "application/json",
|
|
17
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
18
|
+
},
|
|
19
|
+
body: JSON.stringify({
|
|
20
|
+
input: texts,
|
|
21
|
+
model: this.model,
|
|
22
|
+
}),
|
|
23
|
+
});
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
const error = await response.text();
|
|
26
|
+
throw new Error(`OpenAI embedding request failed: ${error}`);
|
|
27
|
+
}
|
|
28
|
+
const data = (await response.json());
|
|
29
|
+
return data.data
|
|
30
|
+
.sort((a, b) => a.index - b.index)
|
|
31
|
+
.map((d) => d.embedding);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,uBAAuB;IAC1B,MAAM,CAAS;IACf,KAAK,CAAS;IAEtB,YAAY,MAAc,EAAE,KAAK,GAAG,wBAAwB;QAC1D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sCAAsC,EAAE;YACnE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACvC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { PrismaClient } from "@prisma/client";
|
|
2
|
+
import type { Node, Edge, EmbeddingProvider } from "../types/index.js";
|
|
3
|
+
import { type TenantContext } from "../db/tenant.js";
|
|
4
|
+
export interface OrphanNode {
|
|
5
|
+
node: Node;
|
|
6
|
+
}
|
|
7
|
+
export interface DuplicatePair {
|
|
8
|
+
nodeA: Node;
|
|
9
|
+
nodeB: Node;
|
|
10
|
+
similarity: number;
|
|
11
|
+
}
|
|
12
|
+
export interface LinkSuggestion {
|
|
13
|
+
source: Node;
|
|
14
|
+
target: Node;
|
|
15
|
+
similarity: number;
|
|
16
|
+
}
|
|
17
|
+
export interface Island {
|
|
18
|
+
id: number;
|
|
19
|
+
size: number;
|
|
20
|
+
nodes: Node[];
|
|
21
|
+
}
|
|
22
|
+
export interface IslandBridge {
|
|
23
|
+
from: Island;
|
|
24
|
+
to: Island;
|
|
25
|
+
suggestion: LinkSuggestion;
|
|
26
|
+
}
|
|
27
|
+
export type ValidationSeverity = "error" | "warning" | "info";
|
|
28
|
+
export type ValidationCategory = "self-loop" | "duplicate-edge" | "low-relevance" | "contradictory" | "rare-relationship-type";
|
|
29
|
+
export interface ValidationIssue {
|
|
30
|
+
severity: ValidationSeverity;
|
|
31
|
+
category: ValidationCategory;
|
|
32
|
+
message: string;
|
|
33
|
+
edges: Edge[];
|
|
34
|
+
sourceNode?: Node;
|
|
35
|
+
targetNode?: Node;
|
|
36
|
+
similarity?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface ValidationReport {
|
|
39
|
+
issues: ValidationIssue[];
|
|
40
|
+
summary: Record<ValidationCategory, number>;
|
|
41
|
+
totalIssues: number;
|
|
42
|
+
totalEdgesChecked: number;
|
|
43
|
+
}
|
|
44
|
+
export interface NormalizeSuggestion {
|
|
45
|
+
fromType: string;
|
|
46
|
+
fromCount: number;
|
|
47
|
+
toType: string;
|
|
48
|
+
toCount: number;
|
|
49
|
+
similarity: number;
|
|
50
|
+
}
|
|
51
|
+
export interface NormalizeReport {
|
|
52
|
+
suggestions: NormalizeSuggestion[];
|
|
53
|
+
allTypes: {
|
|
54
|
+
relationshipType: string;
|
|
55
|
+
count: number;
|
|
56
|
+
}[];
|
|
57
|
+
}
|
|
58
|
+
export interface HealthReport {
|
|
59
|
+
nodes: {
|
|
60
|
+
total: number;
|
|
61
|
+
byStatus: {
|
|
62
|
+
status: string;
|
|
63
|
+
count: number;
|
|
64
|
+
}[];
|
|
65
|
+
byType: {
|
|
66
|
+
type: string;
|
|
67
|
+
count: number;
|
|
68
|
+
}[];
|
|
69
|
+
orphanCount: number;
|
|
70
|
+
undomainedCount: number;
|
|
71
|
+
staleCount: number;
|
|
72
|
+
};
|
|
73
|
+
edges: {
|
|
74
|
+
total: number;
|
|
75
|
+
byRelationshipType: {
|
|
76
|
+
relationshipType: string;
|
|
77
|
+
count: number;
|
|
78
|
+
}[];
|
|
79
|
+
selfLoopCount: number;
|
|
80
|
+
duplicateCount: number;
|
|
81
|
+
};
|
|
82
|
+
graph: {
|
|
83
|
+
avgEdgesPerNode: number;
|
|
84
|
+
connectedComponents: number;
|
|
85
|
+
largestComponentSize: number;
|
|
86
|
+
};
|
|
87
|
+
duplicateCandidates: number;
|
|
88
|
+
}
|
|
89
|
+
export declare class CleaningService {
|
|
90
|
+
private db;
|
|
91
|
+
private tenantCtx;
|
|
92
|
+
constructor(db: PrismaClient, tenantCtx?: TenantContext);
|
|
93
|
+
/**
|
|
94
|
+
* Find nodes with zero edges.
|
|
95
|
+
*/
|
|
96
|
+
findOrphans(): Promise<OrphanNode[]>;
|
|
97
|
+
/**
|
|
98
|
+
* Find node pairs with cosine similarity above threshold.
|
|
99
|
+
*/
|
|
100
|
+
findDuplicates(threshold?: number, limit?: number): Promise<DuplicatePair[]>;
|
|
101
|
+
/**
|
|
102
|
+
* Comprehensive graph health report.
|
|
103
|
+
*/
|
|
104
|
+
getHealthReport(staleDays?: number): Promise<HealthReport>;
|
|
105
|
+
/**
|
|
106
|
+
* Validate edges for integrity issues.
|
|
107
|
+
*/
|
|
108
|
+
validateEdges({ lowRelevanceThreshold, rareTypeThreshold }?: {
|
|
109
|
+
lowRelevanceThreshold?: number;
|
|
110
|
+
rareTypeThreshold?: number;
|
|
111
|
+
}): Promise<ValidationReport>;
|
|
112
|
+
/**
|
|
113
|
+
* Suggest links for a specific node based on embedding similarity,
|
|
114
|
+
* excluding nodes already connected to it.
|
|
115
|
+
*/
|
|
116
|
+
suggestLinksForNode(nodeId: string, { limit, minSimilarity }?: {
|
|
117
|
+
limit?: number;
|
|
118
|
+
minSimilarity?: number;
|
|
119
|
+
}): Promise<LinkSuggestion[]>;
|
|
120
|
+
/**
|
|
121
|
+
* Scan the full graph for high-similarity unconnected pairs.
|
|
122
|
+
*/
|
|
123
|
+
suggestLinksGlobal({ limit, minSimilarity }?: {
|
|
124
|
+
limit?: number;
|
|
125
|
+
minSimilarity?: number;
|
|
126
|
+
}): Promise<LinkSuggestion[]>;
|
|
127
|
+
/**
|
|
128
|
+
* Find all disconnected clusters (islands) in the graph.
|
|
129
|
+
* Returns islands sorted by size descending, excluding orphan nodes (size 1).
|
|
130
|
+
*/
|
|
131
|
+
findIslands(): Promise<Island[]>;
|
|
132
|
+
/**
|
|
133
|
+
* Suggest bridges between the top islands using embedding similarity.
|
|
134
|
+
*/
|
|
135
|
+
suggestBridges(maxBridges?: number): Promise<IslandBridge[]>;
|
|
136
|
+
/**
|
|
137
|
+
* Analyze relationship types and suggest normalizations using embedding similarity.
|
|
138
|
+
* Compares type names semantically to find ones that likely mean the same thing.
|
|
139
|
+
*/
|
|
140
|
+
analyzeRelationshipTypes(embeddings: EmbeddingProvider, { minSimilarity }?: {
|
|
141
|
+
minSimilarity?: number;
|
|
142
|
+
}): Promise<NormalizeReport>;
|
|
143
|
+
/**
|
|
144
|
+
* Union-find returning a map of nodeId -> component root.
|
|
145
|
+
*/
|
|
146
|
+
private computeComponentMap;
|
|
147
|
+
/**
|
|
148
|
+
* Summarize component map into counts for the health report.
|
|
149
|
+
*/
|
|
150
|
+
private summarizeComponents;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=cleaning-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleaning-service.d.ts","sourceRoot":"","sources":["../../src/services/cleaning-service.ts"],"names":[],"mappings":"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"}
|