@apart-tech/intelligence-core 1.11.4 → 1.11.6
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/auth/ability.d.ts +148 -0
- package/dist/auth/ability.d.ts.map +1 -0
- package/dist/auth/ability.js +291 -0
- package/dist/auth/ability.js.map +1 -0
- package/dist/auth/ability.test.d.ts +2 -0
- package/dist/auth/ability.test.d.ts.map +1 -0
- package/dist/auth/ability.test.js +693 -0
- package/dist/auth/ability.test.js.map +1 -0
- package/dist/auth/delegation-jwt.d.ts +167 -0
- package/dist/auth/delegation-jwt.d.ts.map +1 -0
- package/dist/auth/delegation-jwt.js +237 -0
- package/dist/auth/delegation-jwt.js.map +1 -0
- package/dist/auth/delegation-jwt.test.d.ts +2 -0
- package/dist/auth/delegation-jwt.test.d.ts.map +1 -0
- package/dist/auth/delegation-jwt.test.js +283 -0
- package/dist/auth/delegation-jwt.test.js.map +1 -0
- package/dist/auth/principal.d.ts +94 -0
- package/dist/auth/principal.d.ts.map +1 -0
- package/dist/auth/principal.js +33 -0
- package/dist/auth/principal.js.map +1 -0
- package/dist/config/config.test.d.ts +2 -0
- package/dist/config/config.test.d.ts.map +1 -0
- package/dist/config/config.test.js +57 -0
- package/dist/config/config.test.js.map +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +22 -1
- package/dist/config/index.js.map +1 -1
- package/dist/db/tenant.d.ts.map +1 -1
- package/dist/db/tenant.js +8 -0
- package/dist/db/tenant.js.map +1 -1
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/__tests__/jwt.test.d.ts +2 -0
- package/dist/lib/__tests__/jwt.test.d.ts.map +1 -0
- package/dist/lib/__tests__/jwt.test.js +97 -0
- package/dist/lib/__tests__/jwt.test.js.map +1 -0
- package/dist/lib/jwt.d.ts +20 -0
- package/dist/lib/jwt.d.ts.map +1 -1
- package/dist/lib/jwt.js +56 -3
- package/dist/lib/jwt.js.map +1 -1
- package/dist/services/__tests__/chunk-service.test.d.ts +2 -0
- package/dist/services/__tests__/chunk-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/chunk-service.test.js +111 -0
- package/dist/services/__tests__/chunk-service.test.js.map +1 -0
- package/dist/services/__tests__/chunker.test.d.ts +2 -0
- package/dist/services/__tests__/chunker.test.d.ts.map +1 -0
- package/dist/services/__tests__/chunker.test.js +113 -0
- package/dist/services/__tests__/chunker.test.js.map +1 -0
- package/dist/services/__tests__/delegation-cleanup-service.test.d.ts +2 -0
- package/dist/services/__tests__/delegation-cleanup-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/delegation-cleanup-service.test.js +211 -0
- package/dist/services/__tests__/delegation-cleanup-service.test.js.map +1 -0
- package/dist/services/__tests__/node-service.test.d.ts +2 -0
- package/dist/services/__tests__/node-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/node-service.test.js +207 -0
- package/dist/services/__tests__/node-service.test.js.map +1 -0
- package/dist/services/__tests__/pii-detector-service.test.js +51 -0
- package/dist/services/__tests__/pii-detector-service.test.js.map +1 -1
- package/dist/services/__tests__/pii-encryption-service.test.js +37 -0
- package/dist/services/__tests__/pii-encryption-service.test.js.map +1 -1
- package/dist/services/__tests__/search-service.test.d.ts +2 -0
- package/dist/services/__tests__/search-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/search-service.test.js +163 -0
- package/dist/services/__tests__/search-service.test.js.map +1 -0
- package/dist/services/agent-run-service.d.ts +44 -7
- package/dist/services/agent-run-service.d.ts.map +1 -1
- package/dist/services/agent-run-service.js +14 -0
- package/dist/services/agent-run-service.js.map +1 -1
- package/dist/services/agent-schedule-service.d.ts +21 -0
- package/dist/services/agent-schedule-service.d.ts.map +1 -1
- package/dist/services/agent-schedule-service.js +12 -0
- package/dist/services/agent-schedule-service.js.map +1 -1
- package/dist/services/audit-event-service.d.ts +76 -0
- package/dist/services/audit-event-service.d.ts.map +1 -0
- package/dist/services/audit-event-service.js +48 -0
- package/dist/services/audit-event-service.js.map +1 -0
- package/dist/services/backfill-chunks.d.ts +30 -0
- package/dist/services/backfill-chunks.d.ts.map +1 -0
- package/dist/services/backfill-chunks.js +55 -0
- package/dist/services/backfill-chunks.js.map +1 -0
- package/dist/services/chunk-service.d.ts +45 -0
- package/dist/services/chunk-service.d.ts.map +1 -0
- package/dist/services/chunk-service.js +111 -0
- package/dist/services/chunk-service.js.map +1 -0
- package/dist/services/chunker.d.ts +32 -0
- package/dist/services/chunker.d.ts.map +1 -0
- package/dist/services/chunker.js +289 -0
- package/dist/services/chunker.js.map +1 -0
- package/dist/services/context-service.d.ts +3 -1
- package/dist/services/context-service.d.ts.map +1 -1
- package/dist/services/context-service.js +17 -1
- package/dist/services/context-service.js.map +1 -1
- package/dist/services/delegation-cleanup-service.d.ts +133 -0
- package/dist/services/delegation-cleanup-service.d.ts.map +1 -0
- package/dist/services/delegation-cleanup-service.js +111 -0
- package/dist/services/delegation-cleanup-service.js.map +1 -0
- package/dist/services/edge-service.d.ts.map +1 -1
- package/dist/services/edge-service.js +3 -0
- package/dist/services/edge-service.js.map +1 -1
- package/dist/services/node-service.d.ts +12 -1
- package/dist/services/node-service.d.ts.map +1 -1
- package/dist/services/node-service.js +54 -11
- package/dist/services/node-service.js.map +1 -1
- package/dist/services/org-agent-type-service.d.ts +15 -0
- package/dist/services/org-agent-type-service.d.ts.map +1 -1
- package/dist/services/org-agent-type-service.js +2 -0
- package/dist/services/org-agent-type-service.js.map +1 -1
- package/dist/services/pii-detector-service.d.ts +1 -0
- package/dist/services/pii-detector-service.d.ts.map +1 -1
- package/dist/services/pii-detector-service.js +95 -2
- package/dist/services/pii-detector-service.js.map +1 -1
- package/dist/services/pii-encryption-service.d.ts +10 -0
- package/dist/services/pii-encryption-service.d.ts.map +1 -1
- package/dist/services/pii-encryption-service.js +32 -0
- package/dist/services/pii-encryption-service.js.map +1 -1
- package/dist/services/search-service.d.ts +30 -1
- package/dist/services/search-service.d.ts.map +1 -1
- package/dist/services/search-service.js +262 -45
- package/dist/services/search-service.js.map +1 -1
- package/dist/services/tag-service.d.ts +78 -0
- package/dist/services/tag-service.d.ts.map +1 -0
- package/dist/services/tag-service.js +639 -0
- package/dist/services/tag-service.js.map +1 -0
- package/dist/services/tag-service.test.d.ts +2 -0
- package/dist/services/tag-service.test.d.ts.map +1 -0
- package/dist/services/tag-service.test.js +448 -0
- package/dist/services/tag-service.test.js.map +1 -0
- package/dist/services/usage-service.d.ts +48 -0
- package/dist/services/usage-service.d.ts.map +1 -0
- package/dist/services/usage-service.js +116 -0
- package/dist/services/usage-service.js.map +1 -0
- package/dist/services/user-service.d.ts.map +1 -1
- package/dist/services/user-service.js +24 -6
- package/dist/services/user-service.js.map +1 -1
- package/dist/services/user-service.test.d.ts +2 -0
- package/dist/services/user-service.test.d.ts.map +1 -0
- package/dist/services/user-service.test.js +86 -0
- package/dist/services/user-service.test.js.map +1 -0
- package/dist/services/workspace-service.d.ts +2 -0
- package/dist/services/workspace-service.d.ts.map +1 -1
- package/dist/services/workspace-service.js +7 -1
- package/dist/services/workspace-service.js.map +1 -1
- package/dist/types/index.d.ts +80 -2
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +3 -2
- package/prisma/schema.prisma +335 -82
- package/dist/db/schema.d.ts +0 -507
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/db/schema.js +0 -77
- package/dist/db/schema.js.map +0 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { PrismaClient } from "@prisma/client";
|
|
2
|
+
import type { EmbeddingProvider } from "../types/index.js";
|
|
3
|
+
import { type TenantContext } from "../db/tenant.js";
|
|
4
|
+
import type { PiiEncryptionService } from "./pii-encryption-service.js";
|
|
5
|
+
import type { PiiEncryptionOptions } from "./pii-encryption-service.js";
|
|
6
|
+
export declare class ChunkService {
|
|
7
|
+
private db;
|
|
8
|
+
private embeddings;
|
|
9
|
+
private piiEncryption?;
|
|
10
|
+
private piiOptions?;
|
|
11
|
+
private tenantCtx;
|
|
12
|
+
constructor(db: PrismaClient, embeddings: EmbeddingProvider, tenantCtx?: TenantContext, piiEncryption?: PiiEncryptionService | undefined, piiOptions?: PiiEncryptionOptions | undefined);
|
|
13
|
+
/**
|
|
14
|
+
* Chunk a node's content, embed each chunk, and store in node_chunks.
|
|
15
|
+
* Replaces any existing chunks for the node (atomic replace).
|
|
16
|
+
*/
|
|
17
|
+
chunkAndEmbed(nodeId: string, title: string, content: string): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Delete all chunks for a node.
|
|
20
|
+
*/
|
|
21
|
+
deleteByNodeId(nodeId: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Get all chunks for a node, ordered by chunk_index.
|
|
24
|
+
*/
|
|
25
|
+
getByNodeId(nodeId: string): Promise<Array<{
|
|
26
|
+
id: string;
|
|
27
|
+
nodeId: string;
|
|
28
|
+
chunkIndex: number;
|
|
29
|
+
content: string;
|
|
30
|
+
tokenCount: number;
|
|
31
|
+
headingContext: string | null;
|
|
32
|
+
startOffset: number;
|
|
33
|
+
endOffset: number;
|
|
34
|
+
overlapPrev: number;
|
|
35
|
+
embeddingPiiMode: string | null;
|
|
36
|
+
}>>;
|
|
37
|
+
/**
|
|
38
|
+
* Insert chunks with embeddings via raw SQL.
|
|
39
|
+
* Uses gen_random_uuid() in VALUES (Accelerate proxy gotcha).
|
|
40
|
+
*/
|
|
41
|
+
private insertChunksBatch;
|
|
42
|
+
private stripForEmbedding;
|
|
43
|
+
private resolvePiiMode;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=chunk-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-service.d.ts","sourceRoot":"","sources":["../../src/services/chunk-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAqC,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGxE,qBAAa,YAAY;IAIrB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,UAAU;IAElB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,UAAU,CAAC;IAPrB,OAAO,CAAC,SAAS,CAAgB;gBAGvB,EAAE,EAAE,YAAY,EAChB,UAAU,EAAE,iBAAiB,EACrC,SAAS,CAAC,EAAE,aAAa,EACjB,aAAa,CAAC,EAAE,oBAAoB,YAAA,EACpC,UAAU,CAAC,EAAE,oBAAoB,YAAA;IAK3C;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBlF;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASnD;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC/C,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC,CAAC;IAgBH;;;OAGG;YACW,iBAAiB;IA6C/B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,cAAc;CAIvB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { tenantWhere, SINGLE_TENANT_ORG_ID } from "../db/tenant.js";
|
|
2
|
+
import { chunkText } from "./chunker.js";
|
|
3
|
+
export class ChunkService {
|
|
4
|
+
db;
|
|
5
|
+
embeddings;
|
|
6
|
+
piiEncryption;
|
|
7
|
+
piiOptions;
|
|
8
|
+
tenantCtx;
|
|
9
|
+
constructor(db, embeddings, tenantCtx, piiEncryption, piiOptions) {
|
|
10
|
+
this.db = db;
|
|
11
|
+
this.embeddings = embeddings;
|
|
12
|
+
this.piiEncryption = piiEncryption;
|
|
13
|
+
this.piiOptions = piiOptions;
|
|
14
|
+
this.tenantCtx = tenantCtx ?? { organizationId: SINGLE_TENANT_ORG_ID };
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Chunk a node's content, embed each chunk, and store in node_chunks.
|
|
18
|
+
* Replaces any existing chunks for the node (atomic replace).
|
|
19
|
+
*/
|
|
20
|
+
async chunkAndEmbed(nodeId, title, content) {
|
|
21
|
+
// Strip PII before chunking to prevent PII reaching the provider
|
|
22
|
+
const strippedText = this.stripForEmbedding(`${title}\n\n${content}`);
|
|
23
|
+
const chunks = chunkText(strippedText);
|
|
24
|
+
if (chunks.length === 0)
|
|
25
|
+
return;
|
|
26
|
+
// Prepend heading context to each chunk for embedding
|
|
27
|
+
const textsForEmbedding = chunks.map((c) => c.headingContext ? `${c.headingContext}: ${c.content}` : c.content);
|
|
28
|
+
const embeddings = await this.embeddings.embedBatch(textsForEmbedding, {
|
|
29
|
+
inputType: "document",
|
|
30
|
+
});
|
|
31
|
+
// Atomic replace: delete existing, then insert new
|
|
32
|
+
await this.deleteByNodeId(nodeId);
|
|
33
|
+
await this.insertChunksBatch(nodeId, chunks, embeddings);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Delete all chunks for a node.
|
|
37
|
+
*/
|
|
38
|
+
async deleteByNodeId(nodeId) {
|
|
39
|
+
const orgFilter = tenantWhere(this.tenantCtx);
|
|
40
|
+
await this.db.$executeRaw `
|
|
41
|
+
DELETE FROM node_chunks
|
|
42
|
+
WHERE node_id = ${nodeId}::uuid
|
|
43
|
+
AND ${orgFilter}
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get all chunks for a node, ordered by chunk_index.
|
|
48
|
+
*/
|
|
49
|
+
async getByNodeId(nodeId) {
|
|
50
|
+
const orgFilter = tenantWhere(this.tenantCtx);
|
|
51
|
+
return this.db.$queryRaw `
|
|
52
|
+
SELECT id, node_id as "nodeId", chunk_index as "chunkIndex",
|
|
53
|
+
content, token_count as "tokenCount",
|
|
54
|
+
heading_context as "headingContext",
|
|
55
|
+
start_offset as "startOffset", end_offset as "endOffset",
|
|
56
|
+
overlap_prev as "overlapPrev",
|
|
57
|
+
embedding_pii_mode as "embeddingPiiMode"
|
|
58
|
+
FROM node_chunks
|
|
59
|
+
WHERE node_id = ${nodeId}::uuid
|
|
60
|
+
AND ${orgFilter}
|
|
61
|
+
ORDER BY chunk_index ASC
|
|
62
|
+
`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Insert chunks with embeddings via raw SQL.
|
|
66
|
+
* Uses gen_random_uuid() in VALUES (Accelerate proxy gotcha).
|
|
67
|
+
*/
|
|
68
|
+
async insertChunksBatch(nodeId, chunks, embeddings) {
|
|
69
|
+
if (chunks.length === 0)
|
|
70
|
+
return;
|
|
71
|
+
const piiMode = this.resolvePiiMode();
|
|
72
|
+
const orgId = this.tenantCtx.organizationId;
|
|
73
|
+
const values = [];
|
|
74
|
+
const params = [];
|
|
75
|
+
let paramIdx = 1;
|
|
76
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
77
|
+
const chunk = chunks[i];
|
|
78
|
+
const embeddingStr = `[${embeddings[i].join(",")}]`;
|
|
79
|
+
values.push(`(gen_random_uuid(), $${paramIdx}::uuid, $${paramIdx + 1}, $${paramIdx + 2}, $${paramIdx + 3}, $${paramIdx + 4}, $${paramIdx + 5}, $${paramIdx + 6}, $${paramIdx + 7}, $${paramIdx + 8}::vector, $${paramIdx + 9}, $${paramIdx + 10}::uuid, NOW())`);
|
|
80
|
+
params.push(nodeId, // node_id
|
|
81
|
+
chunk.chunkIndex, // chunk_index
|
|
82
|
+
chunk.content, // content
|
|
83
|
+
chunk.tokenCount, // token_count
|
|
84
|
+
chunk.headingContext, // heading_context
|
|
85
|
+
chunk.startOffset, // start_offset
|
|
86
|
+
chunk.endOffset, // end_offset
|
|
87
|
+
chunk.overlapPrev, // overlap_prev
|
|
88
|
+
embeddingStr, // embedding
|
|
89
|
+
piiMode, // embedding_pii_mode
|
|
90
|
+
orgId);
|
|
91
|
+
paramIdx += 11;
|
|
92
|
+
}
|
|
93
|
+
const sql = `
|
|
94
|
+
INSERT INTO node_chunks (id, node_id, chunk_index, content, token_count, heading_context, start_offset, end_offset, overlap_prev, embedding, embedding_pii_mode, organization_id, created_at)
|
|
95
|
+
VALUES ${values.join(", ")}
|
|
96
|
+
`;
|
|
97
|
+
await this.db.$queryRawUnsafe(sql, ...params);
|
|
98
|
+
}
|
|
99
|
+
stripForEmbedding(text) {
|
|
100
|
+
if (!this.piiEncryption || !this.piiOptions || this.piiOptions.mode === "disabled") {
|
|
101
|
+
return text;
|
|
102
|
+
}
|
|
103
|
+
return this.piiEncryption.stripPii(text, this.piiOptions.allowedPiiTypes).text;
|
|
104
|
+
}
|
|
105
|
+
resolvePiiMode() {
|
|
106
|
+
if (!this.piiOptions || this.piiOptions.mode === "disabled")
|
|
107
|
+
return null;
|
|
108
|
+
return this.piiOptions.mode;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=chunk-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-service.js","sourceRoot":"","sources":["../../src/services/chunk-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure text splitting function for content chunking.
|
|
3
|
+
* No I/O — takes text, returns chunk descriptors.
|
|
4
|
+
*/
|
|
5
|
+
export interface ChunkInput {
|
|
6
|
+
content: string;
|
|
7
|
+
chunkIndex: number;
|
|
8
|
+
tokenCount: number;
|
|
9
|
+
headingContext: string | null;
|
|
10
|
+
startOffset: number;
|
|
11
|
+
endOffset: number;
|
|
12
|
+
overlapPrev: number;
|
|
13
|
+
}
|
|
14
|
+
/** Target chunk size in estimated tokens */
|
|
15
|
+
export declare const TARGET_CHUNK_TOKENS = 400;
|
|
16
|
+
/** Hard cap — never exceed this */
|
|
17
|
+
export declare const MAX_CHUNK_TOKENS = 600;
|
|
18
|
+
/** Rough token estimate: ~4 chars per token */
|
|
19
|
+
export declare function estimateTokens(text: string): number;
|
|
20
|
+
/**
|
|
21
|
+
* Main entry point: split text into chunks suitable for embedding.
|
|
22
|
+
*
|
|
23
|
+
* Algorithm:
|
|
24
|
+
* 1. Parse markdown headings into sections
|
|
25
|
+
* 2. Within each section, split into paragraphs
|
|
26
|
+
* 3. Accumulate paragraphs into chunks up to ~TARGET_CHUNK_TOKENS
|
|
27
|
+
* 4. Structural boundaries (headings, paragraph breaks) → overlap = 0
|
|
28
|
+
* 5. Forced mid-paragraph splits → overlap = trailing sentences
|
|
29
|
+
* 6. Code blocks are atomic — never split within
|
|
30
|
+
*/
|
|
31
|
+
export declare function chunkText(text: string): ChunkInput[];
|
|
32
|
+
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/services/chunker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,4CAA4C;AAC5C,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,mCAAmC;AACnC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAsND;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAgGpD"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure text splitting function for content chunking.
|
|
3
|
+
* No I/O — takes text, returns chunk descriptors.
|
|
4
|
+
*/
|
|
5
|
+
/** Target chunk size in estimated tokens */
|
|
6
|
+
export const TARGET_CHUNK_TOKENS = 400;
|
|
7
|
+
/** Hard cap — never exceed this */
|
|
8
|
+
export const MAX_CHUNK_TOKENS = 600;
|
|
9
|
+
/** Rough token estimate: ~4 chars per token */
|
|
10
|
+
export function estimateTokens(text) {
|
|
11
|
+
return Math.ceil(text.length / 4);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parse markdown text into sections by headings.
|
|
15
|
+
* Each section carries its heading context and start offset.
|
|
16
|
+
*/
|
|
17
|
+
function parseSections(text) {
|
|
18
|
+
const sections = [];
|
|
19
|
+
const headingRe = /^(#{1,6})\s+(.+)$/gm;
|
|
20
|
+
let lastIndex = 0;
|
|
21
|
+
let currentHeading = null;
|
|
22
|
+
let match;
|
|
23
|
+
while ((match = headingRe.exec(text)) !== null) {
|
|
24
|
+
// Content before this heading belongs to the previous section
|
|
25
|
+
if (match.index > lastIndex) {
|
|
26
|
+
const content = text.slice(lastIndex, match.index);
|
|
27
|
+
if (content.trim()) {
|
|
28
|
+
sections.push({
|
|
29
|
+
heading: currentHeading,
|
|
30
|
+
content,
|
|
31
|
+
startOffset: lastIndex,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
currentHeading = match[2].trim();
|
|
36
|
+
lastIndex = match.index + match[0].length;
|
|
37
|
+
// Skip the newline after the heading
|
|
38
|
+
if (text[lastIndex] === "\n")
|
|
39
|
+
lastIndex++;
|
|
40
|
+
}
|
|
41
|
+
// Remaining content after last heading
|
|
42
|
+
if (lastIndex < text.length) {
|
|
43
|
+
const content = text.slice(lastIndex);
|
|
44
|
+
if (content.trim()) {
|
|
45
|
+
sections.push({
|
|
46
|
+
heading: currentHeading,
|
|
47
|
+
content,
|
|
48
|
+
startOffset: lastIndex,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// If no headings found, treat entire text as one section
|
|
53
|
+
if (sections.length === 0 && text.trim()) {
|
|
54
|
+
sections.push({ heading: null, content: text, startOffset: 0 });
|
|
55
|
+
}
|
|
56
|
+
return sections;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if a line starts a fenced code block (``` or ~~~).
|
|
60
|
+
*/
|
|
61
|
+
function isCodeFence(line) {
|
|
62
|
+
const trimmed = line.trimStart();
|
|
63
|
+
return trimmed.startsWith("```") || trimmed.startsWith("~~~");
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Split section content into paragraphs, keeping code blocks atomic.
|
|
67
|
+
* Returns array of paragraph strings.
|
|
68
|
+
*/
|
|
69
|
+
function splitParagraphs(text) {
|
|
70
|
+
const lines = text.split("\n");
|
|
71
|
+
const paragraphs = [];
|
|
72
|
+
let current = [];
|
|
73
|
+
let inCodeBlock = false;
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
if (isCodeFence(line)) {
|
|
76
|
+
if (inCodeBlock) {
|
|
77
|
+
// Closing fence — end of code block
|
|
78
|
+
current.push(line);
|
|
79
|
+
inCodeBlock = false;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Opening fence — if we have accumulated text, flush it
|
|
84
|
+
if (current.length > 0 && current.some((l) => l.trim())) {
|
|
85
|
+
paragraphs.push(current.join("\n"));
|
|
86
|
+
current = [];
|
|
87
|
+
}
|
|
88
|
+
inCodeBlock = true;
|
|
89
|
+
current.push(line);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (inCodeBlock) {
|
|
94
|
+
current.push(line);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
// Empty line = paragraph boundary
|
|
98
|
+
if (line.trim() === "") {
|
|
99
|
+
if (current.length > 0 && current.some((l) => l.trim())) {
|
|
100
|
+
paragraphs.push(current.join("\n"));
|
|
101
|
+
current = [];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
current.push(line);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Flush remaining
|
|
109
|
+
if (current.length > 0 && current.some((l) => l.trim())) {
|
|
110
|
+
paragraphs.push(current.join("\n"));
|
|
111
|
+
}
|
|
112
|
+
return paragraphs;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Find the last sentence boundary in text.
|
|
116
|
+
* Returns the index after the sentence-ending punctuation + space,
|
|
117
|
+
* or -1 if no boundary found.
|
|
118
|
+
*/
|
|
119
|
+
function lastSentenceBoundary(text) {
|
|
120
|
+
// Look for ". " or "! " or "? " from the end
|
|
121
|
+
const sentenceEndRe = /[.!?]\s/g;
|
|
122
|
+
let lastIdx = -1;
|
|
123
|
+
let m;
|
|
124
|
+
while ((m = sentenceEndRe.exec(text)) !== null) {
|
|
125
|
+
lastIdx = m.index + m[0].length;
|
|
126
|
+
}
|
|
127
|
+
return lastIdx;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Split a single long paragraph into chunks at sentence boundaries.
|
|
131
|
+
* Returns chunks with overlap information.
|
|
132
|
+
*/
|
|
133
|
+
function splitLongParagraph(text, heading, baseOffset) {
|
|
134
|
+
const chunks = [];
|
|
135
|
+
let remaining = text;
|
|
136
|
+
let offset = baseOffset;
|
|
137
|
+
let chunkIndex = 0;
|
|
138
|
+
let overlapText = "";
|
|
139
|
+
while (remaining.length > 0) {
|
|
140
|
+
const withOverlap = overlapText + remaining;
|
|
141
|
+
const overlapLen = overlapText.length;
|
|
142
|
+
if (estimateTokens(withOverlap) <= MAX_CHUNK_TOKENS) {
|
|
143
|
+
// Fits in one chunk
|
|
144
|
+
chunks.push({
|
|
145
|
+
content: withOverlap.trim(),
|
|
146
|
+
chunkIndex,
|
|
147
|
+
tokenCount: estimateTokens(withOverlap.trim()),
|
|
148
|
+
headingContext: heading,
|
|
149
|
+
startOffset: offset - overlapLen,
|
|
150
|
+
endOffset: offset + remaining.length,
|
|
151
|
+
overlapPrev: overlapLen,
|
|
152
|
+
});
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
// Need to split — find a good boundary within TARGET_CHUNK_TOKENS
|
|
156
|
+
const targetChars = TARGET_CHUNK_TOKENS * 4;
|
|
157
|
+
const candidateEnd = Math.min(targetChars, withOverlap.length);
|
|
158
|
+
const candidate = withOverlap.slice(0, candidateEnd);
|
|
159
|
+
const boundary = lastSentenceBoundary(candidate);
|
|
160
|
+
let splitAt;
|
|
161
|
+
if (boundary > overlapLen && boundary > candidate.length * 0.3) {
|
|
162
|
+
splitAt = boundary;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
// No good sentence boundary — split at target size
|
|
166
|
+
splitAt = candidateEnd;
|
|
167
|
+
}
|
|
168
|
+
const chunkContent = withOverlap.slice(0, splitAt).trim();
|
|
169
|
+
const consumedFromRemaining = splitAt - overlapLen;
|
|
170
|
+
chunks.push({
|
|
171
|
+
content: chunkContent,
|
|
172
|
+
chunkIndex,
|
|
173
|
+
tokenCount: estimateTokens(chunkContent),
|
|
174
|
+
headingContext: heading,
|
|
175
|
+
startOffset: offset - overlapLen,
|
|
176
|
+
endOffset: offset + consumedFromRemaining,
|
|
177
|
+
overlapPrev: overlapLen,
|
|
178
|
+
});
|
|
179
|
+
// Build overlap for next chunk: last 1-2 sentences
|
|
180
|
+
const overlapCandidate = withOverlap.slice(Math.max(0, splitAt - 240), splitAt);
|
|
181
|
+
const overlapBoundary = lastSentenceBoundary(overlapCandidate);
|
|
182
|
+
if (overlapBoundary > 0) {
|
|
183
|
+
overlapText = overlapCandidate.slice(overlapBoundary);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
overlapText = "";
|
|
187
|
+
}
|
|
188
|
+
remaining = remaining.slice(consumedFromRemaining);
|
|
189
|
+
offset += consumedFromRemaining;
|
|
190
|
+
chunkIndex++;
|
|
191
|
+
}
|
|
192
|
+
return chunks;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Main entry point: split text into chunks suitable for embedding.
|
|
196
|
+
*
|
|
197
|
+
* Algorithm:
|
|
198
|
+
* 1. Parse markdown headings into sections
|
|
199
|
+
* 2. Within each section, split into paragraphs
|
|
200
|
+
* 3. Accumulate paragraphs into chunks up to ~TARGET_CHUNK_TOKENS
|
|
201
|
+
* 4. Structural boundaries (headings, paragraph breaks) → overlap = 0
|
|
202
|
+
* 5. Forced mid-paragraph splits → overlap = trailing sentences
|
|
203
|
+
* 6. Code blocks are atomic — never split within
|
|
204
|
+
*/
|
|
205
|
+
export function chunkText(text) {
|
|
206
|
+
if (!text || !text.trim())
|
|
207
|
+
return [];
|
|
208
|
+
const sections = parseSections(text);
|
|
209
|
+
const allChunks = [];
|
|
210
|
+
let globalChunkIndex = 0;
|
|
211
|
+
for (const section of sections) {
|
|
212
|
+
const paragraphs = splitParagraphs(section.content);
|
|
213
|
+
let currentParagraphs = [];
|
|
214
|
+
let currentTokens = 0;
|
|
215
|
+
let chunkStartOffset = section.startOffset;
|
|
216
|
+
for (const para of paragraphs) {
|
|
217
|
+
const paraTokens = estimateTokens(para);
|
|
218
|
+
// Single paragraph exceeds max — split it
|
|
219
|
+
if (paraTokens > MAX_CHUNK_TOKENS) {
|
|
220
|
+
// Flush accumulated paragraphs first
|
|
221
|
+
if (currentParagraphs.length > 0) {
|
|
222
|
+
const content = currentParagraphs.join("\n\n").trim();
|
|
223
|
+
if (content) {
|
|
224
|
+
allChunks.push({
|
|
225
|
+
content,
|
|
226
|
+
chunkIndex: globalChunkIndex++,
|
|
227
|
+
tokenCount: estimateTokens(content),
|
|
228
|
+
headingContext: section.heading,
|
|
229
|
+
startOffset: chunkStartOffset,
|
|
230
|
+
endOffset: chunkStartOffset + content.length,
|
|
231
|
+
overlapPrev: 0,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
currentParagraphs = [];
|
|
235
|
+
currentTokens = 0;
|
|
236
|
+
}
|
|
237
|
+
// Split the long paragraph
|
|
238
|
+
const paraOffset = section.startOffset +
|
|
239
|
+
section.content.indexOf(para);
|
|
240
|
+
const subChunks = splitLongParagraph(para, section.heading, paraOffset);
|
|
241
|
+
for (const sub of subChunks) {
|
|
242
|
+
allChunks.push({
|
|
243
|
+
...sub,
|
|
244
|
+
chunkIndex: globalChunkIndex++,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
chunkStartOffset = paraOffset + para.length;
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
// Would exceed target — flush current
|
|
251
|
+
if (currentTokens + paraTokens > TARGET_CHUNK_TOKENS && currentParagraphs.length > 0) {
|
|
252
|
+
const content = currentParagraphs.join("\n\n").trim();
|
|
253
|
+
if (content) {
|
|
254
|
+
allChunks.push({
|
|
255
|
+
content,
|
|
256
|
+
chunkIndex: globalChunkIndex++,
|
|
257
|
+
tokenCount: estimateTokens(content),
|
|
258
|
+
headingContext: section.heading,
|
|
259
|
+
startOffset: chunkStartOffset,
|
|
260
|
+
endOffset: chunkStartOffset + content.length,
|
|
261
|
+
overlapPrev: 0,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
chunkStartOffset = section.startOffset + section.content.indexOf(para);
|
|
265
|
+
currentParagraphs = [];
|
|
266
|
+
currentTokens = 0;
|
|
267
|
+
}
|
|
268
|
+
currentParagraphs.push(para);
|
|
269
|
+
currentTokens += paraTokens;
|
|
270
|
+
}
|
|
271
|
+
// Flush remaining paragraphs in section
|
|
272
|
+
if (currentParagraphs.length > 0) {
|
|
273
|
+
const content = currentParagraphs.join("\n\n").trim();
|
|
274
|
+
if (content) {
|
|
275
|
+
allChunks.push({
|
|
276
|
+
content,
|
|
277
|
+
chunkIndex: globalChunkIndex++,
|
|
278
|
+
tokenCount: estimateTokens(content),
|
|
279
|
+
headingContext: section.heading,
|
|
280
|
+
startOffset: chunkStartOffset,
|
|
281
|
+
endOffset: chunkStartOffset + content.length,
|
|
282
|
+
overlapPrev: 0,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return allChunks;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/services/chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import type { EdgeService } from "./edge-service.js";
|
|
|
4
4
|
import type { NodeService } from "./node-service.js";
|
|
5
5
|
import type { WorkspaceService } from "./workspace-service.js";
|
|
6
6
|
import type { DomainService } from "./domain-service.js";
|
|
7
|
+
import type { ChunkService } from "./chunk-service.js";
|
|
7
8
|
export declare class ContextService {
|
|
8
9
|
private nodeService;
|
|
9
10
|
private edgeService;
|
|
@@ -11,7 +12,8 @@ export declare class ContextService {
|
|
|
11
12
|
private config;
|
|
12
13
|
private workspaceService?;
|
|
13
14
|
private domainService?;
|
|
14
|
-
|
|
15
|
+
private chunkService?;
|
|
16
|
+
constructor(nodeService: NodeService, edgeService: EdgeService, searchService: SearchService, config: ApartConfig, workspaceService?: WorkspaceService | undefined, domainService?: DomainService | undefined, chunkService?: ChunkService | undefined);
|
|
15
17
|
assemble(options: ContextOptions): Promise<ContextPackage>;
|
|
16
18
|
}
|
|
17
19
|
//# sourceMappingURL=context-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-service.d.ts","sourceRoot":"","sources":["../../src/services/context-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,WAAW,EAGZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"context-service.d.ts","sourceRoot":"","sources":["../../src/services/context-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,WAAW,EAGZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,qBAAa,cAAc;IAEvB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,gBAAgB,CAAC;IACzB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,YAAY,CAAC;gBANb,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,WAAW,EACnB,gBAAgB,CAAC,EAAE,gBAAgB,YAAA,EACnC,aAAa,CAAC,EAAE,aAAa,YAAA,EAC7B,YAAY,CAAC,EAAE,YAAY,YAAA;IAG/B,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;CAoHjE"}
|
|
@@ -5,13 +5,15 @@ export class ContextService {
|
|
|
5
5
|
config;
|
|
6
6
|
workspaceService;
|
|
7
7
|
domainService;
|
|
8
|
-
|
|
8
|
+
chunkService;
|
|
9
|
+
constructor(nodeService, edgeService, searchService, config, workspaceService, domainService, chunkService) {
|
|
9
10
|
this.nodeService = nodeService;
|
|
10
11
|
this.edgeService = edgeService;
|
|
11
12
|
this.searchService = searchService;
|
|
12
13
|
this.config = config;
|
|
13
14
|
this.workspaceService = workspaceService;
|
|
14
15
|
this.domainService = domainService;
|
|
16
|
+
this.chunkService = chunkService;
|
|
15
17
|
}
|
|
16
18
|
async assemble(options) {
|
|
17
19
|
// Resolve workspace filter and merge into options (workspace values as defaults, explicit options override)
|
|
@@ -91,12 +93,26 @@ export class ContextService {
|
|
|
91
93
|
edgeIds.add(e.id);
|
|
92
94
|
return true;
|
|
93
95
|
});
|
|
96
|
+
// Fetch chunks for context nodes if chunk service is available
|
|
97
|
+
let chunks;
|
|
98
|
+
if (this.chunkService) {
|
|
99
|
+
chunks = {};
|
|
100
|
+
for (const node of allNodes) {
|
|
101
|
+
const nodeChunks = await this.chunkService.getByNodeId(node.id);
|
|
102
|
+
if (nodeChunks.length > 0) {
|
|
103
|
+
chunks[node.id] = nodeChunks.map((c) => c.content);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (Object.keys(chunks).length === 0)
|
|
107
|
+
chunks = undefined;
|
|
108
|
+
}
|
|
94
109
|
return {
|
|
95
110
|
nodes: allNodes,
|
|
96
111
|
edges: uniqueEdges,
|
|
97
112
|
query: options.query,
|
|
98
113
|
assembledAt: new Date().toISOString(),
|
|
99
114
|
...(workspaceInfo && { workspace: workspaceInfo }),
|
|
115
|
+
...(chunks && { chunks }),
|
|
100
116
|
};
|
|
101
117
|
}
|
|
102
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-service.js","sourceRoot":"","sources":["../../src/services/context-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context-service.js","sourceRoot":"","sources":["../../src/services/context-service.ts"],"names":[],"mappings":"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"}
|