@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.
Files changed (62) hide show
  1. package/dist/config/index.d.ts +3 -0
  2. package/dist/config/index.d.ts.map +1 -0
  3. package/dist/config/index.js +97 -0
  4. package/dist/config/index.js.map +1 -0
  5. package/dist/db/connection.d.ts +7 -0
  6. package/dist/db/connection.d.ts.map +1 -0
  7. package/dist/db/connection.js +49 -0
  8. package/dist/db/connection.js.map +1 -0
  9. package/dist/db/schema.d.ts +507 -0
  10. package/dist/db/schema.d.ts.map +1 -0
  11. package/dist/db/schema.js +77 -0
  12. package/dist/db/schema.js.map +1 -0
  13. package/dist/db/tenant.d.ts +8 -0
  14. package/dist/db/tenant.d.ts.map +1 -0
  15. package/dist/db/tenant.js +92 -0
  16. package/dist/db/tenant.js.map +1 -0
  17. package/dist/index.d.ts +16 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +18 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/providers/index.d.ts +5 -0
  22. package/dist/providers/index.d.ts.map +1 -0
  23. package/dist/providers/index.js +16 -0
  24. package/dist/providers/index.js.map +1 -0
  25. package/dist/providers/openai.d.ts +9 -0
  26. package/dist/providers/openai.d.ts.map +1 -0
  27. package/dist/providers/openai.js +34 -0
  28. package/dist/providers/openai.js.map +1 -0
  29. package/dist/services/cleaning-service.d.ts +152 -0
  30. package/dist/services/cleaning-service.d.ts.map +1 -0
  31. package/dist/services/cleaning-service.js +632 -0
  32. package/dist/services/cleaning-service.js.map +1 -0
  33. package/dist/services/context-service.d.ts +13 -0
  34. package/dist/services/context-service.d.ts.map +1 -0
  35. package/dist/services/context-service.js +74 -0
  36. package/dist/services/context-service.js.map +1 -0
  37. package/dist/services/domain-seed-data.d.ts +8 -0
  38. package/dist/services/domain-seed-data.d.ts.map +1 -0
  39. package/dist/services/domain-seed-data.js +84 -0
  40. package/dist/services/domain-seed-data.js.map +1 -0
  41. package/dist/services/domain-service.d.ts +26 -0
  42. package/dist/services/domain-service.d.ts.map +1 -0
  43. package/dist/services/domain-service.js +101 -0
  44. package/dist/services/domain-service.js.map +1 -0
  45. package/dist/services/edge-service.d.ts +25 -0
  46. package/dist/services/edge-service.d.ts.map +1 -0
  47. package/dist/services/edge-service.js +90 -0
  48. package/dist/services/edge-service.js.map +1 -0
  49. package/dist/services/node-service.d.ts +34 -0
  50. package/dist/services/node-service.d.ts.map +1 -0
  51. package/dist/services/node-service.js +113 -0
  52. package/dist/services/node-service.js.map +1 -0
  53. package/dist/services/search-service.d.ts +15 -0
  54. package/dist/services/search-service.d.ts.map +1 -0
  55. package/dist/services/search-service.js +118 -0
  56. package/dist/services/search-service.js.map +1 -0
  57. package/dist/types/index.d.ts +74 -0
  58. package/dist/types/index.d.ts.map +1 -0
  59. package/dist/types/index.js +2 -0
  60. package/dist/types/index.js.map +1 -0
  61. package/package.json +42 -0
  62. 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":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -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
+ }