@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,15 @@
|
|
|
1
|
+
import { type PrismaClient } from "@prisma/client";
|
|
2
|
+
import type { SearchOptions, SearchResult, EmbeddingProvider, ApartConfig } from "../types/index.js";
|
|
3
|
+
import { type TenantContext } from "../db/tenant.js";
|
|
4
|
+
export declare class SearchService {
|
|
5
|
+
private db;
|
|
6
|
+
private embeddings;
|
|
7
|
+
private config;
|
|
8
|
+
private tenantCtx;
|
|
9
|
+
constructor(db: PrismaClient, embeddings: EmbeddingProvider, config: ApartConfig, tenantCtx?: TenantContext);
|
|
10
|
+
search(options: SearchOptions): Promise<SearchResult[]>;
|
|
11
|
+
private semanticSearch;
|
|
12
|
+
private keywordSearch;
|
|
13
|
+
private reciprocalRankFusion;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=search-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-service.d.ts","sourceRoot":"","sources":["../../src/services/search-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,WAAW,EAGZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAqC,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKxF,qBAAa,aAAa;IAItB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IALhB,OAAO,CAAC,SAAS,CAAgB;gBAGvB,EAAE,EAAE,YAAY,EAChB,UAAU,EAAE,iBAAiB,EAC7B,MAAM,EAAE,WAAW,EAC3B,SAAS,CAAC,EAAE,aAAa;IAKrB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAsB/C,cAAc;YA0Cd,aAAa;IAuC3B,OAAO,CAAC,oBAAoB;CAoC7B"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Prisma } from "@prisma/client";
|
|
2
|
+
import { tenantWhere, SINGLE_TENANT_ORG_ID } from "../db/tenant.js";
|
|
3
|
+
// Columns safe to select in raw queries (excludes Unsupported types: embedding, search_vector)
|
|
4
|
+
const NODE_COLUMNS = Prisma.sql `id, type, title, content, metadata, status, created_by, created_at, updated_at, version, domain_id, organization_id`;
|
|
5
|
+
export class SearchService {
|
|
6
|
+
db;
|
|
7
|
+
embeddings;
|
|
8
|
+
config;
|
|
9
|
+
tenantCtx;
|
|
10
|
+
constructor(db, embeddings, config, tenantCtx) {
|
|
11
|
+
this.db = db;
|
|
12
|
+
this.embeddings = embeddings;
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.tenantCtx = tenantCtx ?? { organizationId: SINGLE_TENANT_ORG_ID };
|
|
15
|
+
}
|
|
16
|
+
async search(options) {
|
|
17
|
+
const limit = options.limit ?? this.config.search.defaultLimit;
|
|
18
|
+
const statuses = options.statuses ??
|
|
19
|
+
(options.includeDrafts ?? this.config.search.includeDrafts
|
|
20
|
+
? ["draft", "reviewed", "approved"]
|
|
21
|
+
: ["approved"]);
|
|
22
|
+
// Run semantic and keyword search in parallel
|
|
23
|
+
const [semanticResults, keywordResults] = await Promise.all([
|
|
24
|
+
this.semanticSearch(options.query, limit, statuses, options.types, options.domainIds),
|
|
25
|
+
this.keywordSearch(options.query, limit, statuses, options.types, options.domainIds),
|
|
26
|
+
]);
|
|
27
|
+
// Reciprocal rank fusion
|
|
28
|
+
return this.reciprocalRankFusion(semanticResults, keywordResults, limit, this.config.search.semanticWeight);
|
|
29
|
+
}
|
|
30
|
+
async semanticSearch(query, limit, statuses, types, domainIds) {
|
|
31
|
+
const queryEmbedding = await this.embeddings.embed(query);
|
|
32
|
+
const embeddingStr = `[${queryEmbedding.join(",")}]`;
|
|
33
|
+
let typeCondition = Prisma.sql `TRUE`;
|
|
34
|
+
if (types?.length) {
|
|
35
|
+
typeCondition = Prisma.sql `type = ANY(${types}::text[])`;
|
|
36
|
+
}
|
|
37
|
+
let domainCondition = Prisma.sql `TRUE`;
|
|
38
|
+
if (domainIds?.length) {
|
|
39
|
+
domainCondition = Prisma.sql `domain_id = ANY(${domainIds}::uuid[])`;
|
|
40
|
+
}
|
|
41
|
+
const orgCondition = tenantWhere(this.tenantCtx);
|
|
42
|
+
const results = await this.db.$queryRaw `
|
|
43
|
+
SELECT ${NODE_COLUMNS},
|
|
44
|
+
1 - (embedding <=> ${embeddingStr}::vector) as similarity
|
|
45
|
+
FROM nodes
|
|
46
|
+
WHERE status = ANY(${statuses}::text[])
|
|
47
|
+
AND embedding IS NOT NULL
|
|
48
|
+
AND ${typeCondition}
|
|
49
|
+
AND ${domainCondition}
|
|
50
|
+
AND ${orgCondition}
|
|
51
|
+
ORDER BY embedding <=> ${embeddingStr}::vector
|
|
52
|
+
LIMIT ${limit}
|
|
53
|
+
`;
|
|
54
|
+
return results.map((row) => ({
|
|
55
|
+
node: row,
|
|
56
|
+
score: Number(row.similarity),
|
|
57
|
+
matchType: "semantic",
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
async keywordSearch(query, limit, statuses, types, domainIds) {
|
|
61
|
+
let typeCondition = Prisma.sql `TRUE`;
|
|
62
|
+
if (types?.length) {
|
|
63
|
+
typeCondition = Prisma.sql `type = ANY(${types}::text[])`;
|
|
64
|
+
}
|
|
65
|
+
let domainCondition = Prisma.sql `TRUE`;
|
|
66
|
+
if (domainIds?.length) {
|
|
67
|
+
domainCondition = Prisma.sql `domain_id = ANY(${domainIds}::uuid[])`;
|
|
68
|
+
}
|
|
69
|
+
const orgCondition = tenantWhere(this.tenantCtx);
|
|
70
|
+
const results = await this.db.$queryRaw `
|
|
71
|
+
SELECT ${NODE_COLUMNS},
|
|
72
|
+
ts_rank(search_vector, plainto_tsquery('english', ${query})) as rank
|
|
73
|
+
FROM nodes
|
|
74
|
+
WHERE status = ANY(${statuses}::text[])
|
|
75
|
+
AND search_vector @@ plainto_tsquery('english', ${query})
|
|
76
|
+
AND ${typeCondition}
|
|
77
|
+
AND ${domainCondition}
|
|
78
|
+
AND ${orgCondition}
|
|
79
|
+
ORDER BY rank DESC
|
|
80
|
+
LIMIT ${limit}
|
|
81
|
+
`;
|
|
82
|
+
return results.map((row) => ({
|
|
83
|
+
node: row,
|
|
84
|
+
score: Number(row.rank),
|
|
85
|
+
matchType: "keyword",
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
reciprocalRankFusion(semanticResults, keywordResults, limit, semanticWeight) {
|
|
89
|
+
const k = 60; // RRF constant
|
|
90
|
+
const scores = new Map();
|
|
91
|
+
for (let i = 0; i < semanticResults.length; i++) {
|
|
92
|
+
const r = semanticResults[i];
|
|
93
|
+
const rrf = semanticWeight * (1 / (k + i + 1));
|
|
94
|
+
scores.set(r.node.id, { score: rrf, result: { ...r, matchType: "hybrid" } });
|
|
95
|
+
}
|
|
96
|
+
const keywordWeight = 1 - semanticWeight;
|
|
97
|
+
for (let i = 0; i < keywordResults.length; i++) {
|
|
98
|
+
const r = keywordResults[i];
|
|
99
|
+
const rrf = keywordWeight * (1 / (k + i + 1));
|
|
100
|
+
const existing = scores.get(r.node.id);
|
|
101
|
+
if (existing) {
|
|
102
|
+
existing.score += rrf;
|
|
103
|
+
existing.result.matchType = "hybrid";
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
scores.set(r.node.id, {
|
|
107
|
+
score: rrf,
|
|
108
|
+
result: { ...r, matchType: "hybrid" },
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return [...scores.values()]
|
|
113
|
+
.sort((a, b) => b.score - a.score)
|
|
114
|
+
.slice(0, limit)
|
|
115
|
+
.map((s) => ({ ...s.result, score: s.score }));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=search-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-service.js","sourceRoot":"","sources":["../../src/services/search-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Node as PrismaNode, Edge as PrismaEdge, Domain as PrismaDomain } from "@prisma/client";
|
|
2
|
+
export type Node = PrismaNode;
|
|
3
|
+
export type Domain = PrismaDomain;
|
|
4
|
+
export type NewNode = Omit<Node, "id" | "createdAt" | "updatedAt" | "embedding" | "searchVector"> & {
|
|
5
|
+
embedding?: unknown;
|
|
6
|
+
searchVector?: unknown;
|
|
7
|
+
};
|
|
8
|
+
export type NodeStatus = "draft" | "reviewed" | "approved" | "archived";
|
|
9
|
+
export type Edge = PrismaEdge;
|
|
10
|
+
export type NewEdge = Omit<Edge, "id" | "createdAt">;
|
|
11
|
+
export interface SearchOptions {
|
|
12
|
+
query: string;
|
|
13
|
+
limit?: number;
|
|
14
|
+
types?: string[];
|
|
15
|
+
statuses?: NodeStatus[];
|
|
16
|
+
includeDrafts?: boolean;
|
|
17
|
+
domainIds?: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface SearchResult {
|
|
20
|
+
node: Node;
|
|
21
|
+
score: number;
|
|
22
|
+
matchType: "semantic" | "keyword" | "hybrid";
|
|
23
|
+
}
|
|
24
|
+
export interface ContextOptions {
|
|
25
|
+
query: string;
|
|
26
|
+
maxDepth?: number;
|
|
27
|
+
maxNodes?: number;
|
|
28
|
+
minRelevance?: number;
|
|
29
|
+
includeDrafts?: boolean;
|
|
30
|
+
types?: string[];
|
|
31
|
+
domainIds?: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface ContextPackage {
|
|
34
|
+
nodes: Node[];
|
|
35
|
+
edges: Edge[];
|
|
36
|
+
query: string;
|
|
37
|
+
assembledAt: string;
|
|
38
|
+
domains?: Domain[];
|
|
39
|
+
}
|
|
40
|
+
export interface EmbeddingProvider {
|
|
41
|
+
embed(text: string): Promise<number[]>;
|
|
42
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
43
|
+
}
|
|
44
|
+
/** @deprecated Use ApartConfig instead */
|
|
45
|
+
export type CollectiveConfig = ApartConfig;
|
|
46
|
+
export interface ApartConfig {
|
|
47
|
+
database: {
|
|
48
|
+
url: string;
|
|
49
|
+
};
|
|
50
|
+
embeddings: {
|
|
51
|
+
provider: string;
|
|
52
|
+
model: string;
|
|
53
|
+
dimensions: number;
|
|
54
|
+
};
|
|
55
|
+
search: {
|
|
56
|
+
semanticWeight: number;
|
|
57
|
+
defaultLimit: number;
|
|
58
|
+
includeDrafts: boolean;
|
|
59
|
+
};
|
|
60
|
+
context: {
|
|
61
|
+
maxDepth: number;
|
|
62
|
+
maxNodes: number;
|
|
63
|
+
minRelevance: number;
|
|
64
|
+
};
|
|
65
|
+
mcp: {
|
|
66
|
+
port: number;
|
|
67
|
+
auth: string;
|
|
68
|
+
};
|
|
69
|
+
tenancy: {
|
|
70
|
+
mode: "self-hosted" | "cloud";
|
|
71
|
+
organizationId?: string;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,IAAI,UAAU,EAClB,IAAI,IAAI,UAAU,EAClB,MAAM,IAAI,YAAY,EACvB,MAAM,gBAAgB,CAAC;AAIxB,MAAM,MAAM,IAAI,GAAG,UAAU,CAAC;AAE9B,MAAM,MAAM,MAAM,GAAG,YAAY,CAAC;AAElC,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,cAAc,CAAC,GAAG;IAClG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAIxE,MAAM,MAAM,IAAI,GAAG,UAAU,CAAC;AAE9B,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC;AAIrD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;CAC9C;AAID,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAID,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CAClD;AAID,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE;QACR,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,MAAM,EAAE;QACN,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,GAAG,EAAE;QACH,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,OAAO,EAAE;QACP,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@apart-tech/intelligence-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Core library: database, services, and providers for Apart Intelligence",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"prisma/schema.prisma"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"dev": "tsc --watch",
|
|
24
|
+
"lint": "tsc --noEmit",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"db:generate": "prisma generate",
|
|
27
|
+
"db:migrate": "prisma migrate dev",
|
|
28
|
+
"db:push": "prisma db push"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@prisma/client": "^6.6.0",
|
|
32
|
+
"@prisma/extension-accelerate": "^3.0.1",
|
|
33
|
+
"yaml": "^2.6.0",
|
|
34
|
+
"zod": "^3.24.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^25.5.0",
|
|
38
|
+
"prisma": "^6.6.0",
|
|
39
|
+
"typescript": "^5.7.0",
|
|
40
|
+
"vitest": "^3.0.0"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
generator client {
|
|
2
|
+
provider = "prisma-client-js"
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
datasource db {
|
|
6
|
+
provider = "postgresql"
|
|
7
|
+
url = env("DATABASE_URL")
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
model Organization {
|
|
11
|
+
id String @id @default(uuid()) @db.Uuid
|
|
12
|
+
name String @db.VarChar(200)
|
|
13
|
+
slug String @unique @db.VarChar(200)
|
|
14
|
+
metadata Json @default("{}")
|
|
15
|
+
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
16
|
+
|
|
17
|
+
nodes Node[]
|
|
18
|
+
edges Edge[]
|
|
19
|
+
domains Domain[]
|
|
20
|
+
apiKeys ApiKey[]
|
|
21
|
+
|
|
22
|
+
@@map("organizations")
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
model Domain {
|
|
26
|
+
id String @id @default(uuid()) @db.Uuid
|
|
27
|
+
name String @db.VarChar(200)
|
|
28
|
+
slug String @db.VarChar(200)
|
|
29
|
+
description String @default("") @db.Text
|
|
30
|
+
parentId String? @map("parent_id") @db.Uuid
|
|
31
|
+
sortOrder Int @default(0) @map("sort_order")
|
|
32
|
+
metadata Json @default("{}")
|
|
33
|
+
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
34
|
+
organizationId String @map("organization_id") @db.Uuid
|
|
35
|
+
|
|
36
|
+
parent Domain? @relation("DomainHierarchy", fields: [parentId], references: [id], onDelete: SetNull)
|
|
37
|
+
children Domain[] @relation("DomainHierarchy")
|
|
38
|
+
nodes Node[]
|
|
39
|
+
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
40
|
+
|
|
41
|
+
@@unique([slug, organizationId], map: "uq_domains_slug_org")
|
|
42
|
+
@@index([parentId], map: "idx_domains_parent")
|
|
43
|
+
@@index([slug], map: "idx_domains_slug")
|
|
44
|
+
@@index([organizationId], map: "idx_domains_organization")
|
|
45
|
+
@@map("domains")
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
model Node {
|
|
49
|
+
id String @id @default(uuid()) @db.Uuid
|
|
50
|
+
type String @db.VarChar(100)
|
|
51
|
+
title String @db.VarChar(500)
|
|
52
|
+
content String @default("") @db.Text
|
|
53
|
+
embedding Unsupported("vector(1536)")?
|
|
54
|
+
searchVector Unsupported("tsvector")? @map("search_vector")
|
|
55
|
+
metadata Json @default("{}")
|
|
56
|
+
status String @default("draft") @db.VarChar(20)
|
|
57
|
+
createdBy String @map("created_by") @db.VarChar(255)
|
|
58
|
+
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
59
|
+
updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz
|
|
60
|
+
version Int @default(1)
|
|
61
|
+
domainId String? @map("domain_id") @db.Uuid
|
|
62
|
+
organizationId String @map("organization_id") @db.Uuid
|
|
63
|
+
|
|
64
|
+
sourceEdges Edge[] @relation("SourceNode")
|
|
65
|
+
targetEdges Edge[] @relation("TargetNode")
|
|
66
|
+
domain Domain? @relation(fields: [domainId], references: [id], onDelete: SetNull)
|
|
67
|
+
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
68
|
+
|
|
69
|
+
@@index([type], map: "idx_nodes_type")
|
|
70
|
+
@@index([status], map: "idx_nodes_status")
|
|
71
|
+
@@index([createdBy], map: "idx_nodes_created_by")
|
|
72
|
+
@@index([createdAt], map: "idx_nodes_created_at")
|
|
73
|
+
@@index([domainId], map: "idx_nodes_domain")
|
|
74
|
+
@@index([organizationId], map: "idx_nodes_organization")
|
|
75
|
+
@@map("nodes")
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
model Edge {
|
|
79
|
+
id String @id @default(uuid()) @db.Uuid
|
|
80
|
+
sourceNodeId String @map("source_node_id") @db.Uuid
|
|
81
|
+
targetNodeId String @map("target_node_id") @db.Uuid
|
|
82
|
+
relationshipType String @map("relationship_type") @db.VarChar(100)
|
|
83
|
+
weight Float @default(1.0) @db.Real
|
|
84
|
+
metadata Json @default("{}")
|
|
85
|
+
createdBy String @map("created_by") @db.VarChar(255)
|
|
86
|
+
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
87
|
+
organizationId String @map("organization_id") @db.Uuid
|
|
88
|
+
|
|
89
|
+
sourceNode Node @relation("SourceNode", fields: [sourceNodeId], references: [id], onDelete: Cascade)
|
|
90
|
+
targetNode Node @relation("TargetNode", fields: [targetNodeId], references: [id], onDelete: Cascade)
|
|
91
|
+
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
92
|
+
|
|
93
|
+
@@index([sourceNodeId], map: "idx_edges_source")
|
|
94
|
+
@@index([targetNodeId], map: "idx_edges_target")
|
|
95
|
+
@@index([relationshipType], map: "idx_edges_relationship_type")
|
|
96
|
+
@@index([organizationId], map: "idx_edges_organization")
|
|
97
|
+
@@map("edges")
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
model ApiKey {
|
|
101
|
+
id String @id @default(uuid()) @db.Uuid
|
|
102
|
+
name String @db.VarChar(255)
|
|
103
|
+
keyHash String @unique @map("key_hash") @db.VarChar(255)
|
|
104
|
+
createdBy String @map("created_by") @db.VarChar(255)
|
|
105
|
+
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
|
|
106
|
+
lastUsedAt DateTime? @map("last_used_at") @db.Timestamptz
|
|
107
|
+
active Int @default(1)
|
|
108
|
+
organizationId String @map("organization_id") @db.Uuid
|
|
109
|
+
|
|
110
|
+
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
111
|
+
|
|
112
|
+
@@index([organizationId], map: "idx_api_keys_organization")
|
|
113
|
+
@@map("api_keys")
|
|
114
|
+
}
|