@jcode.labs/ragmir 2.7.0 → 2.9.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/README.md +9 -103
- package/dist/access-log.d.ts.map +1 -1
- package/dist/access-log.js +65 -8
- package/dist/access-log.js.map +1 -1
- package/dist/chunking.d.ts.map +1 -1
- package/dist/chunking.js +29 -3
- package/dist/chunking.js.map +1 -1
- package/dist/cli.js +166 -22
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +73 -29
- package/dist/config.js.map +1 -1
- package/dist/defaults.d.ts +1 -0
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +6 -1
- package/dist/defaults.js.map +1 -1
- package/dist/destroy.d.ts.map +1 -1
- package/dist/destroy.js +23 -1
- package/dist/destroy.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +40 -9
- package/dist/doctor.js.map +1 -1
- package/dist/embeddings.d.ts +4 -1
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +62 -14
- package/dist/embeddings.js.map +1 -1
- package/dist/evaluate.d.ts.map +1 -1
- package/dist/evaluate.js +48 -4
- package/dist/evaluate.js.map +1 -1
- package/dist/files.d.ts +8 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +44 -8
- package/dist/files.js.map +1 -1
- package/dist/index-diagnostics.d.ts +1 -1
- package/dist/index-diagnostics.d.ts.map +1 -1
- package/dist/index-diagnostics.js +8 -3
- package/dist/index-diagnostics.js.map +1 -1
- package/dist/index-policy.d.ts +3 -0
- package/dist/index-policy.d.ts.map +1 -0
- package/dist/index-policy.js +28 -0
- package/dist/index-policy.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/ingest.d.ts.map +1 -1
- package/dist/ingest.js +112 -54
- package/dist/ingest.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +15 -3
- package/dist/init.js.map +1 -1
- package/dist/limits.d.ts +9 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +25 -0
- package/dist/limits.js.map +1 -0
- package/dist/mcp.d.ts +3 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +71 -14
- package/dist/mcp.js.map +1 -1
- package/dist/ocr.d.ts +46 -0
- package/dist/ocr.d.ts.map +1 -0
- package/dist/ocr.js +340 -0
- package/dist/ocr.js.map +1 -0
- package/dist/parsing.d.ts.map +1 -1
- package/dist/parsing.js +124 -24
- package/dist/parsing.js.map +1 -1
- package/dist/permissions.d.ts +3 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +13 -0
- package/dist/permissions.js.map +1 -0
- package/dist/query.d.ts +2 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +198 -39
- package/dist/query.js.map +1 -1
- package/dist/research.d.ts.map +1 -1
- package/dist/research.js +33 -4
- package/dist/research.js.map +1 -1
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +110 -14
- package/dist/security.js.map +1 -1
- package/dist/store.d.ts +3 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +71 -72
- package/dist/store.js.map +1 -1
- package/dist/text.d.ts.map +1 -1
- package/dist/text.js +13 -1
- package/dist/text.js.map +1 -1
- package/dist/types.d.ts +94 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/examples/document-evidence-benchmark/.ragmir/config.json +2 -1
- package/examples/document-evidence-benchmark/README.md +5 -2
- package/examples/document-evidence-benchmark/golden-queries.json +7 -1
- package/examples/document-evidence-benchmark/raw/contracts/pdf-control-evidence.pdf +32 -0
- package/examples/document-evidence-benchmark/raw/runbooks/incident-response-runbook.md +3 -3
- package/examples/sovereign-rag-demo/.ragmir/config.json +2 -1
- package/examples/sovereign-rag-demo/README.md +9 -1
- package/package.json +3 -3
- package/skills/ragmir/SKILL.md +59 -326
- package/skills/ragmir-audio-summary/SKILL.md +49 -204
package/README.md
CHANGED
|
@@ -1,110 +1,16 @@
|
|
|
1
|
-
# Ragmir Core
|
|
1
|
+
# Ragmir Core
|
|
2
2
|
|
|
3
|
-
`@jcode.labs/ragmir`
|
|
4
|
-
|
|
5
|
-
only the useful cited passages, over MCP, without burning tokens on your whole repo.
|
|
6
|
-
|
|
7
|
-
**Full documentation:** https://github.com/jcode-works/jcode-ragmir#readme
|
|
8
|
-
|
|
9
|
-
This npm README is intentionally short because package READMEs are displayed separately on npm. The
|
|
10
|
-
GitHub root README is the canonical product documentation.
|
|
11
|
-
|
|
12
|
-
## What It Does
|
|
13
|
-
|
|
14
|
-
Ragmir lets a Node.js repository keep a local knowledge base next to its private documents. It indexes
|
|
15
|
-
supported local files, stores the generated retrieval index in the target repository, and exposes the
|
|
16
|
-
same evidence through:
|
|
17
|
-
|
|
18
|
-
- the `rgr` CLI;
|
|
19
|
-
- a TypeScript library API;
|
|
20
|
-
- a local MCP stdio server for compatible AI agents;
|
|
21
|
-
- portable agent skills copied by `rgr setup`, including audio, Markdown-report, and legal-dossier
|
|
22
|
-
workflows.
|
|
23
|
-
|
|
24
|
-
Ragmir does not send documents to a hosted RAG service and does not generate final LLM answers in
|
|
25
|
-
core. It complements agent memory with a read-focused local evidence layer, then returns cited
|
|
26
|
-
retrieval context with line-aware citations so the agent or model you trust can write from local
|
|
27
|
-
evidence.
|
|
28
|
-
|
|
29
|
-
## Use It For
|
|
30
|
-
|
|
31
|
-
- private project, legal, operational, research, or institutional dossiers;
|
|
32
|
-
- codebase and architecture context retrieval;
|
|
33
|
-
- local-first agent workflows with bounded MCP access;
|
|
34
|
-
- cited summaries, audits, briefs, and decision support.
|
|
35
|
-
|
|
36
|
-
## Install
|
|
3
|
+
`@jcode.labs/ragmir` provides the `rgr` CLI, TypeScript API, MCP server, and portable agent skills for
|
|
4
|
+
local cited retrieval.
|
|
37
5
|
|
|
38
6
|
```bash
|
|
39
7
|
npm install --save-dev @jcode.labs/ragmir
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## Quick Start
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
8
|
npx rgr setup
|
|
46
|
-
npx rgr
|
|
47
|
-
npx rgr
|
|
48
|
-
|
|
49
|
-
# Claude Code
|
|
50
|
-
claude mcp add-json --scope local ragmir "$(cat .ragmir/claude-mcp-server.json)"
|
|
51
|
-
|
|
52
|
-
# Codex
|
|
53
|
-
cat .ragmir/codex-mcp.toml
|
|
54
|
-
|
|
55
|
-
# Kimi Code CLI
|
|
56
|
-
kimi --mcp-config-file .ragmir/kimi-mcp.json
|
|
57
|
-
|
|
58
|
-
# OpenCode
|
|
59
|
-
cat .ragmir/opencode.jsonc
|
|
60
|
-
|
|
61
|
-
# Cline
|
|
62
|
-
cat .ragmir/cline-mcp.json
|
|
9
|
+
npx rgr sources add "docs/**/*.md"
|
|
10
|
+
npx rgr ingest
|
|
11
|
+
npx rgr search "your question"
|
|
63
12
|
```
|
|
64
13
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
Use `npx rgr setup --agents claude,codex --mcp-command ./scripts/serve-mcp.sh` when a
|
|
70
|
-
repository should generate only selected MCP helpers or launch through a local wrapper.
|
|
71
|
-
|
|
72
|
-
By default, Ragmir keeps local config, raw documents, generated indexes, access logs, models, reports,
|
|
73
|
-
audio, and agent helper files under a single ignored `.ragmir/` project folder. It reports
|
|
74
|
-
unsupported/skipped files during ingestion and reports supported files that produced no extractable
|
|
75
|
-
text. `rgr setup` adds the matching Git ignore entry for local Ragmir state.
|
|
76
|
-
|
|
77
|
-
The primary workflow is agent-first: Claude Code, Codex, Kimi, OpenCode, Cline, or another
|
|
78
|
-
MCP-capable assistant asks Ragmir for cited local context, then writes or reasons from those
|
|
79
|
-
citations. For terminal checks, use `npx rgr search "your question"` or
|
|
80
|
-
`npx rgr ask "your question"`. Add `--context-radius 1` when a matched passage needs bounded
|
|
81
|
-
neighboring chunks. For broader implementation or review work, use
|
|
82
|
-
`npx rgr research "your topic" --compact` before asking the agent to synthesize.
|
|
83
|
-
Agent hooks can call `npx rgr route-prompt "..." --json` first to decide whether a prompt needs
|
|
84
|
-
Ragmir local context without storing prompt text or calling an LLM.
|
|
85
|
-
|
|
86
|
-
Run `npx rgr doctor --fix` later to repair missing setup or rebuild stale indexes.
|
|
87
|
-
For better semantic Q&A, run `npx rgr models pull --enable`, then run
|
|
88
|
-
`npx rgr ingest --rebuild`.
|
|
89
|
-
|
|
90
|
-
## Entry Points
|
|
91
|
-
|
|
92
|
-
- CLI: `rgr`
|
|
93
|
-
- Library import: `@jcode.labs/ragmir`
|
|
94
|
-
- MCP server: `npx rgr serve-mcp`
|
|
95
|
-
- Bundled skills: `npx rgr setup` or `npx rgr install-skill`
|
|
96
|
-
|
|
97
|
-
The public TypeScript API reference is maintained in the root repository at
|
|
98
|
-
[`docs/api-reference.md`](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/api-reference.md).
|
|
99
|
-
|
|
100
|
-
## Main Agent Setup
|
|
101
|
-
|
|
102
|
-
After `npx rgr setup`, use `npx rgr install-agent --agents claude`, `--agents kimi`,
|
|
103
|
-
`--agents cline`, or a comma-separated list for native agent skill discovery. Native agent folders
|
|
104
|
-
link back to `.ragmir/skills/` by default so there is one original skill source. Ragmir Core also
|
|
105
|
-
generates MCP helpers for Claude Code, Codex, Kimi, OpenCode, and Cline under `.ragmir/`. See the
|
|
106
|
-
canonical GitHub README for the full agent demo.
|
|
107
|
-
|
|
108
|
-
## License
|
|
109
|
-
|
|
110
|
-
MIT (c) Jean-Baptiste Thery.
|
|
14
|
+
The generated `.ragmir/` state stays local and ignored by Git. See the
|
|
15
|
+
[root README](https://github.com/jcode-works/jcode-ragmir#readme) for the API, agent setup, and
|
|
16
|
+
focused documentation.
|
package/dist/access-log.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-log.d.ts","sourceRoot":"","sources":["../src/access-log.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"access-log.d.ts","sourceRoot":"","sources":["../src/access-log.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,MAAM,EACP,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,eAAe,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAmCD,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvF;AA2BD,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CA2D/B"}
|
package/dist/access-log.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createHmac, randomBytes } from "node:crypto";
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
|
-
import { appendFile,
|
|
3
|
+
import { appendFile, readFile, stat, writeFile } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { loadConfig } from "./config.js";
|
|
6
|
+
import { ensurePrivateDirectory, hardenPrivateFile } from "./permissions.js";
|
|
6
7
|
const ACCESS_LOG_ACTIONS = [
|
|
7
8
|
"ingest",
|
|
8
9
|
"search",
|
|
@@ -22,14 +23,19 @@ const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
|
22
23
|
const MAX_ACCESS_LOG_BYTES = 10 * 1024 * 1024;
|
|
23
24
|
/** Number of most recent lines retained when the log exceeds the byte cap. */
|
|
24
25
|
const TRIMMED_ACCESS_LOG_LINES = 50_000;
|
|
26
|
+
const ACCESS_LOG_SALT_FILE = ".ragmir-access-log.salt";
|
|
25
27
|
export async function recordAccess(config, event) {
|
|
26
28
|
if (!config.accessLog) {
|
|
27
29
|
return;
|
|
28
30
|
}
|
|
29
31
|
try {
|
|
30
|
-
await
|
|
32
|
+
await ensurePrivateDirectory(path.dirname(config.accessLogPath));
|
|
31
33
|
await trimAccessLogIfNeeded(config.accessLogPath);
|
|
32
|
-
await appendFile(config.accessLogPath, `${JSON.stringify(toLogLine(event))}\n`,
|
|
34
|
+
await appendFile(config.accessLogPath, `${JSON.stringify(await toLogLine(config, event))}\n`, {
|
|
35
|
+
encoding: "utf8",
|
|
36
|
+
mode: 0o600,
|
|
37
|
+
});
|
|
38
|
+
await hardenPrivateFile(config.accessLogPath);
|
|
33
39
|
}
|
|
34
40
|
catch {
|
|
35
41
|
// Access logging is best-effort so read-only workspaces do not block local use.
|
|
@@ -64,6 +70,7 @@ export async function accessLogUsageReport(options = {}) {
|
|
|
64
70
|
const since = new Date(until.getTime() - days * MILLISECONDS_PER_DAY);
|
|
65
71
|
const eventsByAction = emptyEventsByAction();
|
|
66
72
|
const queryHashes = new Set();
|
|
73
|
+
const resultCountsByAction = emptyResultCountsByAction();
|
|
67
74
|
let totalEvents = 0;
|
|
68
75
|
let invalidLines = 0;
|
|
69
76
|
let resultCountTotal = 0;
|
|
@@ -91,6 +98,8 @@ export async function accessLogUsageReport(options = {}) {
|
|
|
91
98
|
if (typeof event.resultCount === "number") {
|
|
92
99
|
resultCountTotal += event.resultCount;
|
|
93
100
|
resultCountEvents += 1;
|
|
101
|
+
resultCountsByAction[event.action].total += event.resultCount;
|
|
102
|
+
resultCountsByAction[event.action].events += 1;
|
|
94
103
|
}
|
|
95
104
|
if (lastEventAt === null || event.timestamp > lastEventAt) {
|
|
96
105
|
lastEventAt = event.timestamp;
|
|
@@ -106,21 +115,69 @@ export async function accessLogUsageReport(options = {}) {
|
|
|
106
115
|
eventsByAction,
|
|
107
116
|
uniqueQueryHashes: queryHashes.size,
|
|
108
117
|
averageResultCount: resultCountEvents === 0 ? null : resultCountTotal / resultCountEvents,
|
|
118
|
+
averageResultCountByAction: averageResultCounts(resultCountsByAction),
|
|
109
119
|
lastEventAt,
|
|
110
120
|
};
|
|
111
121
|
}
|
|
112
|
-
function
|
|
122
|
+
function emptyResultCountsByAction() {
|
|
123
|
+
return {
|
|
124
|
+
ingest: { total: 0, events: 0 },
|
|
125
|
+
search: { total: 0, events: 0 },
|
|
126
|
+
ask: { total: 0, events: 0 },
|
|
127
|
+
research: { total: 0, events: 0 },
|
|
128
|
+
evaluate: { total: 0, events: 0 },
|
|
129
|
+
"destroy-index": { total: 0, events: 0 },
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function averageResultCounts(stats) {
|
|
133
|
+
return {
|
|
134
|
+
ingest: averageResultCount(stats.ingest),
|
|
135
|
+
search: averageResultCount(stats.search),
|
|
136
|
+
ask: averageResultCount(stats.ask),
|
|
137
|
+
research: averageResultCount(stats.research),
|
|
138
|
+
evaluate: averageResultCount(stats.evaluate),
|
|
139
|
+
"destroy-index": averageResultCount(stats["destroy-index"]),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function averageResultCount(stats) {
|
|
143
|
+
return stats.events === 0 ? null : stats.total / stats.events;
|
|
144
|
+
}
|
|
145
|
+
async function toLogLine(config, event) {
|
|
113
146
|
return {
|
|
114
147
|
timestamp: new Date().toISOString(),
|
|
115
148
|
action: event.action,
|
|
116
|
-
queryHash: event.query ? hashQuery(event.query) : undefined,
|
|
149
|
+
queryHash: event.query ? await hashQuery(config, event.query) : undefined,
|
|
117
150
|
topK: event.topK,
|
|
118
151
|
resultCount: event.resultCount,
|
|
119
152
|
redactions: event.redactions,
|
|
120
153
|
};
|
|
121
154
|
}
|
|
122
|
-
function hashQuery(query) {
|
|
123
|
-
|
|
155
|
+
async function hashQuery(config, query) {
|
|
156
|
+
const salt = await accessLogSalt(config);
|
|
157
|
+
return createHmac("sha256", salt).update(query).digest("hex");
|
|
158
|
+
}
|
|
159
|
+
async function accessLogSalt(config) {
|
|
160
|
+
const saltPath = path.join(path.dirname(config.accessLogPath), ACCESS_LOG_SALT_FILE);
|
|
161
|
+
try {
|
|
162
|
+
return await readFile(saltPath);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (!isNodeError(error) || error.code !== "ENOENT") {
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const salt = randomBytes(32);
|
|
170
|
+
try {
|
|
171
|
+
await writeFile(saltPath, salt, { flag: "wx", mode: 0o600 });
|
|
172
|
+
await hardenPrivateFile(saltPath);
|
|
173
|
+
return salt;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (isNodeError(error) && error.code === "EEXIST") {
|
|
177
|
+
return readFile(saltPath);
|
|
178
|
+
}
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
124
181
|
}
|
|
125
182
|
function emptyEventsByAction() {
|
|
126
183
|
return {
|
package/dist/access-log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-log.js","sourceRoot":"","sources":["../src/access-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"access-log.js","sourceRoot":"","sources":["../src/access-log.ts"],"names":[],"mappings":"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"}
|
package/dist/chunking.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunking.d.ts","sourceRoot":"","sources":["../src/chunking.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"chunking.d.ts","sourceRoot":"","sources":["../src/chunking.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAQ3D,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,SAAS,EAAE,CA2Cb"}
|
package/dist/chunking.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
const PARAGRAPH_BREAK_MIN_RATIO = 0.45;
|
|
3
3
|
const SENTENCE_BREAK_MIN_RATIO = 0.55;
|
|
4
|
+
const LINE_BREAK_MIN_RATIO = 0.65;
|
|
4
5
|
const WHITESPACE_BREAK_MIN_RATIO = 0.75;
|
|
6
|
+
const SENTENCE_BOUNDARIES = [". ", "? ", "! ", "。", "?", "!"];
|
|
5
7
|
export function chunkDocument(document, chunkSize, chunkOverlap) {
|
|
6
8
|
if (!document.text) {
|
|
7
9
|
return [];
|
|
@@ -27,6 +29,7 @@ export function chunkDocument(document, chunkSize, chunkOverlap) {
|
|
|
27
29
|
charEnd: span.end,
|
|
28
30
|
lineStart: lineNumberForOffset(lineStarts, span.start),
|
|
29
31
|
lineEnd: lineNumberForOffset(lineStarts, Math.max(span.start, span.end - 1)),
|
|
32
|
+
...pageRangeForSpan(document, span.start, span.end),
|
|
30
33
|
checksum: document.file.checksum,
|
|
31
34
|
bytes: document.file.bytes,
|
|
32
35
|
mtimeMs: document.file.mtimeMs,
|
|
@@ -40,6 +43,15 @@ export function chunkDocument(document, chunkSize, chunkOverlap) {
|
|
|
40
43
|
}
|
|
41
44
|
return chunks;
|
|
42
45
|
}
|
|
46
|
+
function pageRangeForSpan(document, start, end) {
|
|
47
|
+
if (!document.pages || document.pages.length === 0) {
|
|
48
|
+
return {};
|
|
49
|
+
}
|
|
50
|
+
const overlapping = document.pages.filter((page) => page.charStart < end && page.charEnd > start);
|
|
51
|
+
const first = overlapping[0];
|
|
52
|
+
const last = overlapping.at(-1);
|
|
53
|
+
return first && last ? { pageStart: first.pageNumber, pageEnd: last.pageNumber } : {};
|
|
54
|
+
}
|
|
43
55
|
function chooseChunkEnd(text, cursor, chunkSize) {
|
|
44
56
|
const hardEnd = Math.min(cursor + chunkSize, text.length);
|
|
45
57
|
if (hardEnd === text.length) {
|
|
@@ -50,9 +62,13 @@ function chooseChunkEnd(text, cursor, chunkSize) {
|
|
|
50
62
|
if (paragraphBreak > chunkSize * PARAGRAPH_BREAK_MIN_RATIO) {
|
|
51
63
|
return cursor + paragraphBreak;
|
|
52
64
|
}
|
|
53
|
-
const
|
|
54
|
-
if (
|
|
55
|
-
return cursor +
|
|
65
|
+
const sentenceBreakEnd = lastSentenceBreakEnd(window);
|
|
66
|
+
if (sentenceBreakEnd > chunkSize * SENTENCE_BREAK_MIN_RATIO) {
|
|
67
|
+
return cursor + sentenceBreakEnd;
|
|
68
|
+
}
|
|
69
|
+
const lineBreak = window.lastIndexOf("\n");
|
|
70
|
+
if (lineBreak > chunkSize * LINE_BREAK_MIN_RATIO) {
|
|
71
|
+
return cursor + lineBreak;
|
|
56
72
|
}
|
|
57
73
|
const whitespace = window.lastIndexOf(" ");
|
|
58
74
|
if (whitespace > chunkSize * WHITESPACE_BREAK_MIN_RATIO) {
|
|
@@ -60,6 +76,16 @@ function chooseChunkEnd(text, cursor, chunkSize) {
|
|
|
60
76
|
}
|
|
61
77
|
return hardEnd;
|
|
62
78
|
}
|
|
79
|
+
function lastSentenceBreakEnd(text) {
|
|
80
|
+
let end = -1;
|
|
81
|
+
for (const boundary of SENTENCE_BOUNDARIES) {
|
|
82
|
+
const index = text.lastIndexOf(boundary);
|
|
83
|
+
if (index >= 0) {
|
|
84
|
+
end = Math.max(end, index + (boundary.endsWith(" ") ? boundary.length - 1 : boundary.length));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return end;
|
|
88
|
+
}
|
|
63
89
|
function trimmedSpan(text, start, end) {
|
|
64
90
|
let trimmedStart = start;
|
|
65
91
|
let trimmedEnd = end;
|
package/dist/chunking.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunking.js","sourceRoot":"","sources":["../src/chunking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC,MAAM,yBAAyB,GAAG,IAAI,CAAA;AACtC,MAAM,wBAAwB,GAAG,IAAI,CAAA;AACrC,MAAM,0BAA0B,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"chunking.js","sourceRoot":"","sources":["../src/chunking.ts"],"names":[],"mappings":"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"}
|