@apart-tech/intelligence-core 1.11.5 → 1.12.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/auth/ability.d.ts +4 -4
- package/dist/auth/ability.d.ts.map +1 -1
- package/dist/auth/ability.js +17 -11
- package/dist/auth/ability.js.map +1 -1
- package/dist/auth/ability.test.js +25 -12
- package/dist/auth/ability.test.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +5 -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 +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.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__/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/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/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/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/user-service.d.ts +1 -0
- package/dist/services/user-service.d.ts.map +1 -1
- package/dist/services/user-service.test.js +72 -1
- package/dist/services/user-service.test.js.map +1 -1
- 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 +67 -2
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/prisma/schema.prisma +180 -3
|
@@ -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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"}
|
|
@@ -3,13 +3,15 @@ import type { Node, NodeStatus, EmbeddingProvider } from "../types/index.js";
|
|
|
3
3
|
import { type TenantContext } from "../db/tenant.js";
|
|
4
4
|
import type { PiiEncryptionService } from "./pii-encryption-service.js";
|
|
5
5
|
import type { PiiEncryptionOptions } from "./pii-encryption-service.js";
|
|
6
|
+
import type { ChunkService } from "./chunk-service.js";
|
|
6
7
|
export declare class NodeService {
|
|
7
8
|
private db;
|
|
8
9
|
private embeddings;
|
|
9
10
|
private piiEncryption?;
|
|
10
11
|
private piiOptions?;
|
|
12
|
+
private chunkService?;
|
|
11
13
|
private tenantCtx;
|
|
12
|
-
constructor(db: PrismaClient, embeddings: EmbeddingProvider, tenantCtx?: TenantContext, piiEncryption?: PiiEncryptionService | undefined, piiOptions?: PiiEncryptionOptions | undefined);
|
|
14
|
+
constructor(db: PrismaClient, embeddings: EmbeddingProvider, tenantCtx?: TenantContext, piiEncryption?: PiiEncryptionService | undefined, piiOptions?: PiiEncryptionOptions | undefined, chunkService?: ChunkService | undefined);
|
|
13
15
|
create(input: {
|
|
14
16
|
type: string;
|
|
15
17
|
title: string;
|
|
@@ -51,6 +53,15 @@ export declare class NodeService {
|
|
|
51
53
|
type: string;
|
|
52
54
|
count: number;
|
|
53
55
|
}[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Strip PII from text before embedding to prevent PII reaching the provider.
|
|
58
|
+
* Returns stripped text if PII is configured and mode != disabled; else original.
|
|
59
|
+
*/
|
|
60
|
+
private stripForEmbedding;
|
|
61
|
+
/**
|
|
62
|
+
* Returns the current PII mode string for provenance tracking, or null if disabled/unconfigured.
|
|
63
|
+
*/
|
|
64
|
+
private resolvePiiMode;
|
|
54
65
|
/**
|
|
55
66
|
* Apply PII detection/encryption to node fields.
|
|
56
67
|
* Returns processed fields and whether PII was found.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-service.d.ts","sourceRoot":"","sources":["../../src/services/node-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAU,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EACV,IAAI,EACJ,UAAU,EACV,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAC3B,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;
|
|
1
|
+
{"version":3,"file":"node-service.d.ts","sourceRoot":"","sources":["../../src/services/node-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAU,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EACV,IAAI,EACJ,UAAU,EACV,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAC3B,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;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,qBAAa,WAAW;IAIpB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,UAAU;IAElB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,UAAU,CAAC;IACnB,OAAO,CAAC,YAAY,CAAC;IARvB,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,EACjC,YAAY,CAAC,EAAE,YAAY,YAAA;IAK/B,MAAM,CAAC,KAAK,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDX,mBAAmB,CACvB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,EACD,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC;IA0CV,mBAAmB,CACvB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;QACL,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,EACD,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA+CjB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAsBrD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAMzC,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;QACL,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GACA,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAsDjB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAa/D,UAAU,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAcpC,SAAS,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAS7D;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;;OAGG;IACH,OAAO,CAAC,QAAQ;CAgCjB"}
|
|
@@ -4,20 +4,24 @@ export class NodeService {
|
|
|
4
4
|
embeddings;
|
|
5
5
|
piiEncryption;
|
|
6
6
|
piiOptions;
|
|
7
|
+
chunkService;
|
|
7
8
|
tenantCtx;
|
|
8
|
-
constructor(db, embeddings, tenantCtx, piiEncryption, piiOptions) {
|
|
9
|
+
constructor(db, embeddings, tenantCtx, piiEncryption, piiOptions, chunkService) {
|
|
9
10
|
this.db = db;
|
|
10
11
|
this.embeddings = embeddings;
|
|
11
12
|
this.piiEncryption = piiEncryption;
|
|
12
13
|
this.piiOptions = piiOptions;
|
|
14
|
+
this.chunkService = chunkService;
|
|
13
15
|
this.tenantCtx = tenantCtx ?? { organizationId: SINGLE_TENANT_ORG_ID };
|
|
14
16
|
}
|
|
15
17
|
async create(input) {
|
|
16
|
-
//
|
|
17
|
-
const
|
|
18
|
+
// Strip PII before embedding to prevent PII reaching the provider
|
|
19
|
+
const textForEmbedding = this.stripForEmbedding(`${input.title}\n\n${input.content}`);
|
|
20
|
+
const embedding = await this.embeddings.embed(textForEmbedding);
|
|
18
21
|
const embeddingStr = `[${embedding.join(",")}]`;
|
|
19
|
-
// Process PII if configured
|
|
22
|
+
// Process PII if configured (encrypt for storage)
|
|
20
23
|
const { title, content, metadata, hasPii } = this.applyPii(input.title, input.content, input.metadata);
|
|
24
|
+
const piiMode = this.resolvePiiMode();
|
|
21
25
|
const node = await this.db.node.create({
|
|
22
26
|
data: {
|
|
23
27
|
type: input.type,
|
|
@@ -31,20 +35,26 @@ export class NodeService {
|
|
|
31
35
|
organizationId: this.tenantCtx.organizationId,
|
|
32
36
|
},
|
|
33
37
|
});
|
|
34
|
-
// Update embedding and
|
|
38
|
+
// Update embedding, tsvector, and PII mode via raw SQL
|
|
35
39
|
const orgFilter = tenantWhere(this.tenantCtx);
|
|
36
40
|
await this.db.$executeRaw `
|
|
37
41
|
UPDATE nodes
|
|
38
42
|
SET embedding = ${embeddingStr}::vector,
|
|
39
|
-
search_vector = to_tsvector('english', ${input.title} || ' ' || ${input.content})
|
|
43
|
+
search_vector = to_tsvector('english', ${input.title} || ' ' || ${input.content}),
|
|
44
|
+
embedding_pii_mode = ${piiMode}
|
|
40
45
|
WHERE id = ${node.id}::uuid
|
|
41
46
|
AND ${orgFilter}
|
|
42
47
|
`;
|
|
48
|
+
// Chunk the node content for granular retrieval
|
|
49
|
+
if (this.chunkService) {
|
|
50
|
+
await this.chunkService.chunkAndEmbed(node.id, input.title, input.content);
|
|
51
|
+
}
|
|
43
52
|
return node;
|
|
44
53
|
}
|
|
45
54
|
async createWithEmbedding(input, embedding) {
|
|
46
55
|
const embeddingStr = `[${embedding.join(",")}]`;
|
|
47
56
|
const { title, content, metadata, hasPii } = this.applyPii(input.title, input.content, input.metadata);
|
|
57
|
+
const piiMode = this.resolvePiiMode();
|
|
48
58
|
const node = await this.db.node.create({
|
|
49
59
|
data: {
|
|
50
60
|
type: input.type,
|
|
@@ -62,10 +72,14 @@ export class NodeService {
|
|
|
62
72
|
await this.db.$executeRaw `
|
|
63
73
|
UPDATE nodes
|
|
64
74
|
SET embedding = ${embeddingStr}::vector,
|
|
65
|
-
search_vector = to_tsvector('english', ${input.title} || ' ' || ${input.content})
|
|
75
|
+
search_vector = to_tsvector('english', ${input.title} || ' ' || ${input.content}),
|
|
76
|
+
embedding_pii_mode = ${piiMode}
|
|
66
77
|
WHERE id = ${node.id}::uuid
|
|
67
78
|
AND ${orgFilter}
|
|
68
79
|
`;
|
|
80
|
+
if (this.chunkService) {
|
|
81
|
+
await this.chunkService.chunkAndEmbed(node.id, input.title, input.content);
|
|
82
|
+
}
|
|
69
83
|
return node;
|
|
70
84
|
}
|
|
71
85
|
async updateWithEmbedding(id, input, embedding) {
|
|
@@ -75,6 +89,7 @@ export class NodeService {
|
|
|
75
89
|
const originalTitle = input.title ?? existing.title;
|
|
76
90
|
const originalContent = input.content ?? existing.content;
|
|
77
91
|
const { title, content, metadata, hasPii } = this.applyPii(input.title ?? existing.title, input.content ?? existing.content, input.metadata);
|
|
92
|
+
const piiMode = this.resolvePiiMode();
|
|
78
93
|
const updated = await this.db.node.update({
|
|
79
94
|
where: { id },
|
|
80
95
|
data: {
|
|
@@ -93,10 +108,14 @@ export class NodeService {
|
|
|
93
108
|
await this.db.$executeRaw `
|
|
94
109
|
UPDATE nodes
|
|
95
110
|
SET embedding = ${embeddingStr}::vector,
|
|
96
|
-
search_vector = to_tsvector('english', ${originalTitle} || ' ' || ${originalContent})
|
|
111
|
+
search_vector = to_tsvector('english', ${originalTitle} || ' ' || ${originalContent}),
|
|
112
|
+
embedding_pii_mode = ${piiMode}
|
|
97
113
|
WHERE id = ${id}::uuid
|
|
98
114
|
AND ${orgFilter}
|
|
99
115
|
`;
|
|
116
|
+
if (this.chunkService) {
|
|
117
|
+
await this.chunkService.chunkAndEmbed(id, originalTitle, originalContent);
|
|
118
|
+
}
|
|
100
119
|
return updated;
|
|
101
120
|
}
|
|
102
121
|
async resolveId(idOrPrefix) {
|
|
@@ -145,18 +164,24 @@ export class NodeService {
|
|
|
145
164
|
version: existing.version + 1,
|
|
146
165
|
},
|
|
147
166
|
});
|
|
148
|
-
// Re-embed and update tsvector if content changed
|
|
167
|
+
// Re-embed and update tsvector if content changed
|
|
149
168
|
if (input.title || input.content) {
|
|
150
|
-
const
|
|
169
|
+
const textForEmbedding = this.stripForEmbedding(`${originalTitle}\n\n${originalContent}`);
|
|
170
|
+
const embedding = await this.embeddings.embed(textForEmbedding);
|
|
151
171
|
const embeddingStr = `[${embedding.join(",")}]`;
|
|
172
|
+
const piiMode = this.resolvePiiMode();
|
|
152
173
|
const orgFilter = tenantWhere(this.tenantCtx);
|
|
153
174
|
await this.db.$executeRaw `
|
|
154
175
|
UPDATE nodes
|
|
155
176
|
SET embedding = ${embeddingStr}::vector,
|
|
156
|
-
search_vector = to_tsvector('english', ${originalTitle} || ' ' || ${originalContent})
|
|
177
|
+
search_vector = to_tsvector('english', ${originalTitle} || ' ' || ${originalContent}),
|
|
178
|
+
embedding_pii_mode = ${piiMode}
|
|
157
179
|
WHERE id = ${id}::uuid
|
|
158
180
|
AND ${orgFilter}
|
|
159
181
|
`;
|
|
182
|
+
if (this.chunkService) {
|
|
183
|
+
await this.chunkService.chunkAndEmbed(id, originalTitle, originalContent);
|
|
184
|
+
}
|
|
160
185
|
}
|
|
161
186
|
return updated;
|
|
162
187
|
}
|
|
@@ -204,6 +229,24 @@ export class NodeService {
|
|
|
204
229
|
});
|
|
205
230
|
return result.map((r) => ({ type: r.type, count: r._count.type }));
|
|
206
231
|
}
|
|
232
|
+
/**
|
|
233
|
+
* Strip PII from text before embedding to prevent PII reaching the provider.
|
|
234
|
+
* Returns stripped text if PII is configured and mode != disabled; else original.
|
|
235
|
+
*/
|
|
236
|
+
stripForEmbedding(text) {
|
|
237
|
+
if (!this.piiEncryption || !this.piiOptions || this.piiOptions.mode === "disabled") {
|
|
238
|
+
return text;
|
|
239
|
+
}
|
|
240
|
+
return this.piiEncryption.stripPii(text, this.piiOptions.allowedPiiTypes).text;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Returns the current PII mode string for provenance tracking, or null if disabled/unconfigured.
|
|
244
|
+
*/
|
|
245
|
+
resolvePiiMode() {
|
|
246
|
+
if (!this.piiOptions || this.piiOptions.mode === "disabled")
|
|
247
|
+
return null;
|
|
248
|
+
return this.piiOptions.mode;
|
|
249
|
+
}
|
|
207
250
|
/**
|
|
208
251
|
* Apply PII detection/encryption to node fields.
|
|
209
252
|
* Returns processed fields and whether PII was found.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-service.js","sourceRoot":"","sources":["../../src/services/node-service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAsB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"node-service.js","sourceRoot":"","sources":["../../src/services/node-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ export declare class PiiDetectorService {
|
|
|
16
16
|
* Detect PII in a text string. Returns matches with their positions.
|
|
17
17
|
*/
|
|
18
18
|
detect(text: string): PiiDetectionResult;
|
|
19
|
+
private detectNorwegianPatterns;
|
|
19
20
|
/**
|
|
20
21
|
* Detect PII in all string values of an object (shallow — top-level keys only).
|
|
21
22
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pii-detector-service.d.ts","sourceRoot":"","sources":["../../src/services/pii-detector-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"pii-detector-service.d.ts","sourceRoot":"","sources":["../../src/services/pii-detector-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAyED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAAe;gBAEpB,cAAc,CAAC,EAAE,UAAU,EAAE;IAOzC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB;IA0CxC,OAAO,CAAC,uBAAuB;IA6B/B;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC;CASjF"}
|