sxng-cli 1.2.3 → 1.2.5
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/README.md +89 -15
- package/dist/claims/deterministic-checks.d.ts +3 -2
- package/dist/claims/deterministic-checks.d.ts.map +1 -1
- package/dist/claims/deterministic-checks.js +33 -16
- package/dist/claims/deterministic-checks.js.map +1 -1
- package/dist/claims/policy.js +5 -5
- package/dist/claims/policy.js.map +1 -1
- package/dist/claims/types.d.ts +4 -4
- package/dist/claims/types.d.ts.map +1 -1
- package/dist/commands/doc-index.d.ts.map +1 -1
- package/dist/commands/doc-index.js +28 -29
- package/dist/commands/doc-index.js.map +1 -1
- package/dist/commands/doc-search.d.ts.map +1 -1
- package/dist/commands/doc-search.js +1 -0
- package/dist/commands/doc-search.js.map +1 -1
- package/dist/commands/evidence.d.ts.map +1 -1
- package/dist/commands/evidence.js +14 -6
- package/dist/commands/evidence.js.map +1 -1
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +9 -21
- package/dist/commands/extract.js.map +1 -1
- package/dist/commands/graph-add.d.ts.map +1 -1
- package/dist/commands/graph-add.js +13 -3
- package/dist/commands/graph-add.js.map +1 -1
- package/dist/commands/results-add.d.ts +1 -0
- package/dist/commands/results-add.d.ts.map +1 -1
- package/dist/commands/results-add.js +6 -2
- package/dist/commands/results-add.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +2 -4
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +5 -0
- package/dist/commands/session.js.map +1 -1
- package/dist/deep/dedupe.d.ts +9 -4
- package/dist/deep/dedupe.d.ts.map +1 -1
- package/dist/deep/dedupe.js +54 -11
- package/dist/deep/dedupe.js.map +1 -1
- package/dist/deep/graph-preprocess.d.ts +6 -0
- package/dist/deep/graph-preprocess.d.ts.map +1 -1
- package/dist/deep/graph-preprocess.js +8 -0
- package/dist/deep/graph-preprocess.js.map +1 -1
- package/dist/deep/graph.d.ts +1 -1
- package/dist/deep/graph.d.ts.map +1 -1
- package/dist/deep/graph.js +8 -4
- package/dist/deep/graph.js.map +1 -1
- package/dist/deep/index.d.ts +1 -1
- package/dist/deep/index.d.ts.map +1 -1
- package/dist/deep/index.js +1 -1
- package/dist/deep/index.js.map +1 -1
- package/dist/deep/iteration-data.d.ts.map +1 -1
- package/dist/deep/iteration-data.js +2 -2
- package/dist/deep/iteration-data.js.map +1 -1
- package/dist/deep/local-doc/indexer.d.ts +16 -1
- package/dist/deep/local-doc/indexer.d.ts.map +1 -1
- package/dist/deep/local-doc/indexer.js +305 -22
- package/dist/deep/local-doc/indexer.js.map +1 -1
- package/dist/deep/local-doc/scanner.d.ts +6 -6
- package/dist/deep/local-doc/scanner.d.ts.map +1 -1
- package/dist/deep/local-doc/scanner.js +123 -128
- package/dist/deep/local-doc/scanner.js.map +1 -1
- package/dist/deep/local-doc/searcher.d.ts +1 -0
- package/dist/deep/local-doc/searcher.d.ts.map +1 -1
- package/dist/deep/local-doc/searcher.js +25 -7
- package/dist/deep/local-doc/searcher.js.map +1 -1
- package/dist/deep/local-doc/types.d.ts +21 -0
- package/dist/deep/local-doc/types.d.ts.map +1 -1
- package/dist/deep/local-doc/types.js.map +1 -1
- package/dist/deep/quality-assess.d.ts +6 -4
- package/dist/deep/quality-assess.d.ts.map +1 -1
- package/dist/deep/quality-assess.js +37 -29
- package/dist/deep/quality-assess.js.map +1 -1
- package/dist/deep/session.d.ts +10 -2
- package/dist/deep/session.d.ts.map +1 -1
- package/dist/deep/session.js +54 -39
- package/dist/deep/session.js.map +1 -1
- package/dist/runCli.d.ts.map +1 -1
- package/dist/runCli.js +47 -17
- package/dist/runCli.js.map +1 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +3 -35
- package/dist/service.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,170 +1,165 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Scanner
|
|
3
|
-
*
|
|
4
|
-
* Scans a directory for documents, parses YAML frontmatter,
|
|
5
|
-
* and splits content into chunks using chunk-smart (markdown)
|
|
6
|
-
* or paragraph splitting (plain text).
|
|
2
|
+
* Scanner - file scanning and structure-aware chunking.
|
|
7
3
|
*/
|
|
8
4
|
import { readFileSync, statSync, readdirSync } from 'fs';
|
|
9
|
-
import { resolve, extname, join } from 'path';
|
|
5
|
+
import { resolve, extname, join, relative, isAbsolute, sep } from 'path';
|
|
10
6
|
import { createHash } from 'crypto';
|
|
11
7
|
import { chunk } from 'chunk-smart';
|
|
12
8
|
const DEFAULT_OPTIONS = {
|
|
13
9
|
extensions: ['md', 'txt'],
|
|
14
|
-
maxFileSize: 10 * 1024 * 1024,
|
|
10
|
+
maxFileSize: 10 * 1024 * 1024,
|
|
15
11
|
};
|
|
16
12
|
function parseFrontmatter(content) {
|
|
17
13
|
const match = content.match(/^---\n([\s\S]*?)\n---\n/);
|
|
18
|
-
if (!match)
|
|
14
|
+
if (!match)
|
|
19
15
|
return { title: '', body: content };
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const title = titleMatch ? titleMatch[1].trim().replace(/^['"](.*)['"]$/, '$1') : '';
|
|
26
|
-
return { title, body };
|
|
16
|
+
const titleMatch = match[1].match(/^title:\s*(.+)$/m);
|
|
17
|
+
return {
|
|
18
|
+
title: titleMatch ? titleMatch[1].trim().replace(/^['"](.*)['"]$/, '$1') : '',
|
|
19
|
+
body: content.slice(match[0].length),
|
|
20
|
+
};
|
|
27
21
|
}
|
|
28
|
-
/**
|
|
29
|
-
* Split plain text by paragraph boundaries (double newlines).
|
|
30
|
-
* chunk-smart's 'paragraph' mode may return one single chunk;
|
|
31
|
-
* this provides a reliable fallback.
|
|
32
|
-
*/
|
|
33
22
|
function splitParagraphs(text) {
|
|
34
|
-
const parts = text.split(/\n\n+/).map(
|
|
23
|
+
const parts = text.split(/\n\n+/).map(part => part.trim()).filter(Boolean);
|
|
35
24
|
if (parts.length === 0)
|
|
36
|
-
return [
|
|
37
|
-
return parts.map(
|
|
25
|
+
return [];
|
|
26
|
+
return parts.map(content => ({ content, headings: [] }));
|
|
38
27
|
}
|
|
39
|
-
// ── ID generation ─────────────────────────────────────────────────────
|
|
40
28
|
function makeId(filePath, chunkIndex) {
|
|
41
29
|
return createHash('sha256').update(`${filePath}\0${chunkIndex}`).digest('hex').slice(0, 16);
|
|
42
30
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
31
|
+
function createScanContext(rootPath, options) {
|
|
32
|
+
const resolvedOptions = { ...DEFAULT_OPTIONS, ...options };
|
|
46
33
|
const absRoot = resolve(rootPath);
|
|
47
|
-
// Verify path exists
|
|
48
34
|
try {
|
|
49
35
|
statSync(absRoot);
|
|
50
36
|
}
|
|
51
37
|
catch {
|
|
52
|
-
throw new Error(`Path not found: ${absRoot}`);
|
|
38
|
+
throw Object.assign(new Error(`Path not found: ${absRoot}`), { code: 'PATH_NOT_FOUND' });
|
|
53
39
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
for (const entry of entries) {
|
|
69
|
-
const abs = join(dir, entry);
|
|
70
|
-
try {
|
|
71
|
-
const st = statSync(abs);
|
|
72
|
-
if (st.isDirectory()) {
|
|
73
|
-
walk(abs);
|
|
74
|
-
}
|
|
75
|
-
else if (st.isFile() && extSet.has(extname(abs).toLowerCase())) {
|
|
76
|
-
files.push(abs);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
// Skip unreadable entries
|
|
81
|
-
}
|
|
82
|
-
}
|
|
40
|
+
return {
|
|
41
|
+
absRoot,
|
|
42
|
+
options: resolvedOptions,
|
|
43
|
+
extensions: new Set(resolvedOptions.extensions.map(ext => ext.startsWith('.') ? ext.toLowerCase() : `.${ext.toLowerCase()}`)),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function* findFiles(dir, extensions) {
|
|
47
|
+
let entries;
|
|
48
|
+
try {
|
|
49
|
+
entries = readdirSync(dir);
|
|
83
50
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
return [];
|
|
51
|
+
catch {
|
|
52
|
+
return;
|
|
87
53
|
}
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
for (const absFile of files) {
|
|
91
|
-
const relFile = absFile.startsWith(absRoot) ? absFile.slice(absRoot.length + 1) : absFile;
|
|
92
|
-
// File size check
|
|
54
|
+
for (const entry of entries) {
|
|
55
|
+
const absPath = join(dir, entry);
|
|
93
56
|
try {
|
|
94
|
-
const
|
|
95
|
-
if (
|
|
96
|
-
|
|
97
|
-
|
|
57
|
+
const stat = statSync(absPath);
|
|
58
|
+
if (stat.isDirectory()) {
|
|
59
|
+
yield* findFiles(absPath, extensions);
|
|
60
|
+
}
|
|
61
|
+
else if (stat.isFile() && extensions.has(extname(absPath).toLowerCase())) {
|
|
62
|
+
yield absPath;
|
|
98
63
|
}
|
|
99
64
|
}
|
|
100
65
|
catch {
|
|
101
|
-
|
|
66
|
+
// Skip entries which disappear or cannot be inspected.
|
|
102
67
|
}
|
|
103
|
-
|
|
104
|
-
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function scanFile(absFile, context) {
|
|
71
|
+
const relFile = relative(context.absRoot, absFile).replace(/\\/g, '/');
|
|
72
|
+
try {
|
|
73
|
+
const stat = statSync(absFile);
|
|
74
|
+
if (stat.size > context.options.maxFileSize) {
|
|
75
|
+
console.warn(`[doc-index] Skipping file larger than ${context.options.maxFileSize} bytes: ${relFile}`);
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
let content;
|
|
83
|
+
try {
|
|
84
|
+
content = readFileSync(absFile, 'utf-8');
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
console.warn(`[doc-index] Skipping unreadable file: ${relFile}`);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
if (!content.trim())
|
|
91
|
+
return null;
|
|
92
|
+
const { title: frontmatterTitle, body } = parseFrontmatter(content);
|
|
93
|
+
const title = frontmatterTitle || relFile;
|
|
94
|
+
let rawChunks;
|
|
95
|
+
if (extname(absFile).toLowerCase() === '.md') {
|
|
105
96
|
try {
|
|
106
|
-
|
|
97
|
+
rawChunks = chunk(body, { mode: 'markdown' }).map((item) => ({
|
|
98
|
+
content: item.content,
|
|
99
|
+
headings: (item.metadata?.headings || []).map((heading) => heading),
|
|
100
|
+
}));
|
|
107
101
|
}
|
|
108
102
|
catch {
|
|
109
|
-
console.warn(`[doc-index] Skipping unreadable file: ${relFile}`);
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
if (!content.trim()) {
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
// Parse frontmatter
|
|
116
|
-
const { title: fmTitle, body } = parseFrontmatter(content);
|
|
117
|
-
const docTitle = fmTitle || relFile;
|
|
118
|
-
// Chunk based on file type
|
|
119
|
-
const ext = extname(absFile).toLowerCase();
|
|
120
|
-
const isMarkdown = ext === '.md';
|
|
121
|
-
let rawChunks;
|
|
122
|
-
if (isMarkdown) {
|
|
123
|
-
try {
|
|
124
|
-
// (chunk-smart types may not include 'mode' — cast as needed)
|
|
125
|
-
const mdChunks = chunk(body, { mode: 'markdown' });
|
|
126
|
-
rawChunks = mdChunks.map((c) => ({
|
|
127
|
-
content: c.content,
|
|
128
|
-
headings: (c.metadata?.headings || []).map((h) => h),
|
|
129
|
-
}));
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
// Fallback: treat as plain text
|
|
133
|
-
rawChunks = splitParagraphs(body);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
103
|
rawChunks = splitParagraphs(body);
|
|
138
104
|
}
|
|
139
|
-
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
rawChunks = splitParagraphs(body);
|
|
108
|
+
}
|
|
109
|
+
const chunks = [];
|
|
110
|
+
for (let index = 0; index < rawChunks.length; index++) {
|
|
111
|
+
const rawChunk = rawChunks[index];
|
|
112
|
+
const chunkContent = rawChunk.content.trim();
|
|
113
|
+
if (!chunkContent)
|
|
140
114
|
continue;
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
if (docTitle && fmTitle)
|
|
151
|
-
allHeadings.push(docTitle);
|
|
152
|
-
allHeadings.push(...rc.headings);
|
|
153
|
-
const id = makeId(relFile, i);
|
|
154
|
-
chunks.push({
|
|
155
|
-
id,
|
|
156
|
-
filePath: relFile,
|
|
157
|
-
title: docTitle,
|
|
158
|
-
content: chunkContent,
|
|
159
|
-
headings: allHeadings,
|
|
160
|
-
chunkIndex: i,
|
|
161
|
-
totalChunks: rawChunks.length,
|
|
162
|
-
});
|
|
163
|
-
}
|
|
115
|
+
chunks.push({
|
|
116
|
+
id: makeId(relFile, index),
|
|
117
|
+
filePath: relFile,
|
|
118
|
+
title,
|
|
119
|
+
content: chunkContent,
|
|
120
|
+
headings: frontmatterTitle ? [title, ...rawChunk.headings] : rawChunk.headings,
|
|
121
|
+
chunkIndex: index,
|
|
122
|
+
totalChunks: rawChunks.length,
|
|
123
|
+
});
|
|
164
124
|
}
|
|
165
|
-
|
|
166
|
-
|
|
125
|
+
return chunks.length > 0 ? {
|
|
126
|
+
filePath: relFile,
|
|
127
|
+
contentHash: createHash('sha256').update(content).digest('hex'),
|
|
128
|
+
chunks,
|
|
129
|
+
} : null;
|
|
130
|
+
}
|
|
131
|
+
function isPathWithinRoot(absPath, absRoot) {
|
|
132
|
+
const pathFromRoot = relative(absRoot, absPath);
|
|
133
|
+
return pathFromRoot !== ''
|
|
134
|
+
&& !isAbsolute(pathFromRoot)
|
|
135
|
+
&& pathFromRoot !== '..'
|
|
136
|
+
&& !pathFromRoot.startsWith(`..${sep}`);
|
|
137
|
+
}
|
|
138
|
+
/** Yield one file at a time, with a hash for incremental change detection. */
|
|
139
|
+
export function* scanFiles(rootPath, options, filePaths) {
|
|
140
|
+
const context = createScanContext(rootPath, options);
|
|
141
|
+
const candidates = filePaths
|
|
142
|
+
? Array.from(filePaths, filePath => join(context.absRoot, ...filePath.split('/')))
|
|
143
|
+
: findFiles(context.absRoot, context.extensions);
|
|
144
|
+
for (const absFile of candidates) {
|
|
145
|
+
if (!isPathWithinRoot(absFile, context.absRoot)
|
|
146
|
+
|| !context.extensions.has(extname(absFile).toLowerCase()))
|
|
147
|
+
continue;
|
|
148
|
+
const scanned = scanFile(absFile, context);
|
|
149
|
+
if (scanned)
|
|
150
|
+
yield scanned;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** Yield one file batch at a time so callers can index and release them. */
|
|
154
|
+
export function* scanBatches(rootPath, options) {
|
|
155
|
+
for (const file of scanFiles(rootPath, options)) {
|
|
156
|
+
yield file.chunks;
|
|
167
157
|
}
|
|
158
|
+
}
|
|
159
|
+
export function scan(rootPath, options) {
|
|
160
|
+
const chunks = [];
|
|
161
|
+
for (const batch of scanBatches(rootPath, options))
|
|
162
|
+
chunks.push(...batch);
|
|
168
163
|
return chunks;
|
|
169
164
|
}
|
|
170
165
|
//# sourceMappingURL=scanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/deep/local-doc/scanner.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/deep/local-doc/scanner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,eAAe,GAA6B;IAChD,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;IACzB,WAAW,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;CAC9B,CAAC;AAkBF,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAEhD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtD,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;QAC7E,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,MAAM,CAAC,QAAgB,EAAE,UAAkB;IAClD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,KAAK,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,OAAwB;IACnE,MAAM,eAAe,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAElC,IAAI,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO;QACL,OAAO;QACP,OAAO,EAAE,eAAe;QACxB,UAAU,EAAE,IAAI,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACvD,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAClE,CAAC;KACH,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAW,EAAE,UAAuB;IACtD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACxC,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC3E,MAAM,OAAO,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;QACzD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,OAAoB;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEvE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,yCAAyC,OAAO,CAAC,OAAO,CAAC,WAAW,WAAW,OAAO,EAAE,CAAC,CAAC;YACvG,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,gBAAgB,IAAI,OAAO,CAAC;IAC1C,IAAI,SAAqB,CAAC;IAE1B,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,SAAS,GAAI,KAAa,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;gBACzE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC;aAC5E,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,YAAY;YAAE,SAAS;QAE5B,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;YAC1B,QAAQ,EAAE,OAAO;YACjB,KAAK;YACL,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ;YAC9E,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,SAAS,CAAC,MAAM;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/D,MAAM;KACP,CAAC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,OAAe;IACxD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,YAAY,KAAK,EAAE;WACrB,CAAC,UAAU,CAAC,YAAY,CAAC;WACzB,YAAY,KAAK,IAAI;WACrB,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,8EAA8E;AAC9E,MAAM,SAAS,CAAC,CAAC,SAAS,CACxB,QAAgB,EAChB,OAAwB,EACxB,SAA4B;IAE5B,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,SAAS;QAC1B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAEnD,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;eAC1C,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAAE,SAAS;QACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO;YAAE,MAAM,OAAO,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,SAAS,CAAC,CAAC,WAAW,CAAC,QAAgB,EAAE,OAAwB;IACrE,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,QAAgB,EAAE,OAAwB;IAC7D,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1E,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searcher.d.ts","sourceRoot":"","sources":["../../../src/deep/local-doc/searcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"searcher.d.ts","sourceRoot":"","sources":["../../../src/deep/local-doc/searcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,OAAO,EAML,aAAa,EACd,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,iBAAS,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASvD;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA0IhF;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { resolve } from 'path';
|
|
9
9
|
import { search as oramaSearch } from '@orama/orama';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
10
|
+
import { scanFiles } from './scanner.js';
|
|
11
|
+
import { buildIndexFromScannedFiles, getIndexMemoryBudget, getIndexMeta, hasIndex, loadIndex, refreshIndexIfStale, } from './indexer.js';
|
|
12
12
|
import { DEFAULT_BOOST } from './types.js';
|
|
13
|
-
import { appendSessionResults, getPendingResults, initSessionDir, resolveSessionPath, } from '../session.js';
|
|
13
|
+
import { appendSessionResults, getPendingResults, injectApprovedResults, initSessionDir, resolveSessionPath, } from '../session.js';
|
|
14
14
|
/**
|
|
15
15
|
* Parse boost string like "title:3,headings:2,content:1"
|
|
16
16
|
* into an object { title: 3, headings: 2, content: 1 }
|
|
@@ -38,12 +38,26 @@ export async function docSearch(opts) {
|
|
|
38
38
|
}
|
|
39
39
|
// Auto-index if needed
|
|
40
40
|
if (!hasIndex(absPath)) {
|
|
41
|
-
const
|
|
42
|
-
|
|
41
|
+
const memoryBudgetBytes = getIndexMemoryBudget();
|
|
42
|
+
try {
|
|
43
|
+
await buildIndexFromScannedFiles(absPath, scanFiles(absPath, { maxFileSize: Math.min(10 * 1024 * 1024, Math.floor(memoryBudgetBytes / 8)) }), memoryBudgetBytes);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
if (err.code === 'NO_INDEXABLE_FILES') {
|
|
47
|
+
throw Object.assign(new Error(`No indexable files found in ${absPath} (supported: .md, .txt)`), { code: 'NO_INDEXABLE_FILES' });
|
|
48
|
+
}
|
|
49
|
+
if (err.code === 'MEMORY_LIMIT_REACHED') {
|
|
50
|
+
throw Object.assign(new Error('Not enough free memory to index any local documents.'), {
|
|
51
|
+
code: 'MEMORY_LIMIT_REACHED',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
if (!hasIndex(absPath)) {
|
|
43
57
|
throw Object.assign(new Error(`No indexable files found in ${absPath} (supported: .md, .txt)`), { code: 'NO_INDEXABLE_FILES' });
|
|
44
58
|
}
|
|
45
|
-
await buildIndex(absPath, chunks);
|
|
46
59
|
}
|
|
60
|
+
await refreshIndexIfStale(absPath);
|
|
47
61
|
// Load index
|
|
48
62
|
let db;
|
|
49
63
|
try {
|
|
@@ -74,6 +88,7 @@ export async function docSearch(opts) {
|
|
|
74
88
|
path: absPath,
|
|
75
89
|
added: 0,
|
|
76
90
|
totalPending: 0,
|
|
91
|
+
partial: getIndexMeta(absPath)?.partial ?? false,
|
|
77
92
|
results: [],
|
|
78
93
|
};
|
|
79
94
|
}
|
|
@@ -105,15 +120,17 @@ export async function docSearch(opts) {
|
|
|
105
120
|
filePath: doc.filePath,
|
|
106
121
|
headings: doc.headings || [],
|
|
107
122
|
chunkIndex: doc.chunkIndex,
|
|
123
|
+
origins: [{ query }],
|
|
108
124
|
status: undefined, // set to 'pending' by appendSessionResults
|
|
109
125
|
});
|
|
110
126
|
}
|
|
111
127
|
// Inject into session (skip round increment — merged with current web round)
|
|
112
128
|
const sessionDir = resolveSessionPath(opts.session);
|
|
113
129
|
initSessionDir(sessionDir); // ensure meta.json exists
|
|
114
|
-
const { added, total } = appendSessionResults(sessionDir, results, {
|
|
130
|
+
const { added, total, approvedResults } = appendSessionResults(sessionDir, results, {
|
|
115
131
|
skipRoundIncrement: true,
|
|
116
132
|
});
|
|
133
|
+
injectApprovedResults(sessionDir, approvedResults);
|
|
117
134
|
const pendingCount = getPendingResults(sessionDir).length;
|
|
118
135
|
return {
|
|
119
136
|
session: sessionDir,
|
|
@@ -121,6 +138,7 @@ export async function docSearch(opts) {
|
|
|
121
138
|
path: absPath,
|
|
122
139
|
added,
|
|
123
140
|
totalPending: pendingCount,
|
|
141
|
+
partial: getIndexMeta(absPath)?.partial ?? false,
|
|
124
142
|
results,
|
|
125
143
|
};
|
|
126
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searcher.js","sourceRoot":"","sources":["../../../src/deep/local-doc/searcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"searcher.js","sourceRoot":"","sources":["../../../src/deep/local-doc/searcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,12 @@ export interface ScannedChunk {
|
|
|
10
10
|
chunkIndex: number;
|
|
11
11
|
totalChunks: number;
|
|
12
12
|
}
|
|
13
|
+
/** A scanned source file and the chunks derived from its current contents. */
|
|
14
|
+
export interface ScannedFile {
|
|
15
|
+
filePath: string;
|
|
16
|
+
contentHash: string;
|
|
17
|
+
chunks: ScannedChunk[];
|
|
18
|
+
}
|
|
13
19
|
export interface ScannerOptions {
|
|
14
20
|
extensions?: string[];
|
|
15
21
|
maxFileSize?: number;
|
|
@@ -21,6 +27,21 @@ export interface IndexLocation {
|
|
|
21
27
|
files: number;
|
|
22
28
|
chunks: number;
|
|
23
29
|
indexedAt: number;
|
|
30
|
+
partial: boolean;
|
|
31
|
+
memoryBudgetBytes: number;
|
|
32
|
+
tokenizer: string;
|
|
33
|
+
source?: IndexSourceMetadata;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface IndexedFileMetadata {
|
|
37
|
+
contentHash: string;
|
|
38
|
+
chunkIds: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface IndexSourceMetadata {
|
|
41
|
+
files: Record<string, IndexedFileMetadata>;
|
|
42
|
+
extensions: string[];
|
|
43
|
+
git?: {
|
|
44
|
+
head: string;
|
|
24
45
|
};
|
|
25
46
|
}
|
|
26
47
|
export declare const ORAMA_SCHEMA: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/deep/local-doc/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/deep/local-doc/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,8EAA8E;AAC9E,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,mBAAmB,CAAC;KAC9B,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC3C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACxB;AAED,eAAO,MAAM,YAAY;;;;;;;;CAQf,CAAC;AAEX,eAAO,MAAM,aAAa;;;;CAIhB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/deep/local-doc/types.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/deep/local-doc/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiDH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,EAAE,EAAE,QAAQ;IACZ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,UAAU;IACpB,UAAU,EAAE,QAAQ;IACpB,WAAW,EAAE,QAAQ;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;CACF,CAAC"}
|
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
* Three indicators (independent thresholds, no weighted sum):
|
|
9
9
|
* - contentDepth: average extracted content length
|
|
10
10
|
* - sourceDiversity: number of distinct domains
|
|
11
|
-
* - novelty: fraction not similar to
|
|
11
|
+
* - novelty: fraction not similar to earlier approved results (Jaccard)
|
|
12
12
|
*
|
|
13
13
|
* Verdict logic:
|
|
14
14
|
* - good: all pass
|
|
15
15
|
* - acceptable: 1 fails
|
|
16
|
-
* - poor:
|
|
16
|
+
* - poor: 鈮? fail
|
|
17
17
|
*/
|
|
18
18
|
import { SessionResult } from './session.js';
|
|
19
19
|
export interface IndicatorResult {
|
|
@@ -36,9 +36,11 @@ export interface QualityThresholds {
|
|
|
36
36
|
sourceDiversity: number;
|
|
37
37
|
novelty: number;
|
|
38
38
|
}
|
|
39
|
+
/** Assess results from the newest recorded round against earlier approved results. */
|
|
40
|
+
export declare function assessLatestResultQuality(sessionResults: SessionResult[], thresholds?: Partial<QualityThresholds>): QualityScore;
|
|
39
41
|
/** Assess the quality of results against session context.
|
|
40
|
-
* Programmatic pre-filter only
|
|
41
|
-
* All indicators use independent thresholds
|
|
42
|
+
* Programmatic pre-filter only 鈥?Agent makes final quality decision.
|
|
43
|
+
* All indicators use independent thresholds 鈥?no weighted sum.
|
|
42
44
|
*/
|
|
43
45
|
export declare function assessResultQuality(results: SessionResult[], sessionResults: SessionResult[], thresholds?: Partial<QualityThresholds>): QualityScore;
|
|
44
46
|
//# sourceMappingURL=quality-assess.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-assess.d.ts","sourceRoot":"","sources":["../../src/deep/quality-assess.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7C,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,YAAY,EAAE,eAAe,CAAC;IAC9B,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC;IACxC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"quality-assess.d.ts","sourceRoot":"","sources":["../../src/deep/quality-assess.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7C,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,YAAY,EAAE,eAAe,CAAC;IAC9B,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC;IACxC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACnB;AA0ED,sFAAsF;AACtF,wBAAgB,yBAAyB,CACrC,cAAc,EAAE,aAAa,EAAE,EAC/B,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACxC,YAAY,CAoBd;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,aAAa,EAAE,EACxB,cAAc,EAAE,aAAa,EAAE,EAC/B,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACxC,YAAY,CAEd"}
|