@jcode.labs/ragmir 2.16.2 → 2.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +37 -172
  2. package/dist/access-log.d.ts +1 -0
  3. package/dist/access-log.d.ts.map +1 -1
  4. package/dist/access-log.js +57 -24
  5. package/dist/access-log.js.map +1 -1
  6. package/dist/cli.js +15 -1
  7. package/dist/cli.js.map +1 -1
  8. package/dist/client.d.ts +3 -3
  9. package/dist/client.d.ts.map +1 -1
  10. package/dist/client.js +4 -4
  11. package/dist/client.js.map +1 -1
  12. package/dist/config.js +6 -14
  13. package/dist/config.js.map +1 -1
  14. package/dist/context-resources.d.ts +3 -3
  15. package/dist/context-resources.d.ts.map +1 -1
  16. package/dist/context-resources.js +13 -4
  17. package/dist/context-resources.js.map +1 -1
  18. package/dist/destroy.d.ts.map +1 -1
  19. package/dist/destroy.js +10 -6
  20. package/dist/destroy.js.map +1 -1
  21. package/dist/doctor.d.ts +2 -2
  22. package/dist/doctor.d.ts.map +1 -1
  23. package/dist/doctor.js +11 -3
  24. package/dist/doctor.js.map +1 -1
  25. package/dist/embeddings.d.ts +4 -0
  26. package/dist/embeddings.d.ts.map +1 -1
  27. package/dist/embeddings.js +68 -9
  28. package/dist/embeddings.js.map +1 -1
  29. package/dist/evaluate.d.ts +5 -0
  30. package/dist/evaluate.d.ts.map +1 -1
  31. package/dist/evaluate.js +50 -9
  32. package/dist/evaluate.js.map +1 -1
  33. package/dist/files.d.ts +3 -10
  34. package/dist/files.d.ts.map +1 -1
  35. package/dist/files.js +49 -15
  36. package/dist/files.js.map +1 -1
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/ingest.d.ts +2 -2
  42. package/dist/ingest.d.ts.map +1 -1
  43. package/dist/ingest.js +356 -163
  44. package/dist/ingest.js.map +1 -1
  45. package/dist/ingestion-state.d.ts +53 -0
  46. package/dist/ingestion-state.d.ts.map +1 -0
  47. package/dist/ingestion-state.js +257 -0
  48. package/dist/ingestion-state.js.map +1 -0
  49. package/dist/mcp-output.d.ts +14 -0
  50. package/dist/mcp-output.d.ts.map +1 -1
  51. package/dist/mcp-output.js +121 -0
  52. package/dist/mcp-output.js.map +1 -1
  53. package/dist/mcp.d.ts +8 -0
  54. package/dist/mcp.d.ts.map +1 -1
  55. package/dist/mcp.js +362 -116
  56. package/dist/mcp.js.map +1 -1
  57. package/dist/ocr.d.ts.map +1 -1
  58. package/dist/ocr.js +6 -12
  59. package/dist/ocr.js.map +1 -1
  60. package/dist/operation.d.ts.map +1 -1
  61. package/dist/operation.js +3 -2
  62. package/dist/operation.js.map +1 -1
  63. package/dist/parsing.d.ts +1 -0
  64. package/dist/parsing.d.ts.map +1 -1
  65. package/dist/parsing.js +86 -27
  66. package/dist/parsing.js.map +1 -1
  67. package/dist/project-config-file.d.ts +11 -0
  68. package/dist/project-config-file.d.ts.map +1 -0
  69. package/dist/project-config-file.js +55 -0
  70. package/dist/project-config-file.js.map +1 -0
  71. package/dist/query.d.ts.map +1 -1
  72. package/dist/query.js +12 -4
  73. package/dist/query.js.map +1 -1
  74. package/dist/research.d.ts.map +1 -1
  75. package/dist/research.js +3 -2
  76. package/dist/research.js.map +1 -1
  77. package/dist/security.d.ts +2 -2
  78. package/dist/security.d.ts.map +1 -1
  79. package/dist/security.js +57 -21
  80. package/dist/security.js.map +1 -1
  81. package/dist/semantic-config.d.ts.map +1 -1
  82. package/dist/semantic-config.js +16 -20
  83. package/dist/semantic-config.js.map +1 -1
  84. package/dist/skill.d.ts +2 -13
  85. package/dist/skill.d.ts.map +1 -1
  86. package/dist/skill.js.map +1 -1
  87. package/dist/sources.d.ts.map +1 -1
  88. package/dist/sources.js +24 -40
  89. package/dist/sources.js.map +1 -1
  90. package/dist/store.d.ts +5 -0
  91. package/dist/store.d.ts.map +1 -1
  92. package/dist/store.js +45 -13
  93. package/dist/store.js.map +1 -1
  94. package/dist/types.d.ts +39 -3
  95. package/dist/types.d.ts.map +1 -1
  96. package/dist/version.d.ts +1 -1
  97. package/dist/version.js +1 -1
  98. package/package.json +7 -6
  99. package/skills/ragmir/SKILL.md +5 -3
  100. package/skills/ragmir-audio-summary/listening-style.md +11 -11
  101. package/skills/ragmir-audio-summary/narration-templates.md +22 -22
  102. package/skills/ragmir-audio-summary/split-lines.py +2 -1
package/README.md CHANGED
@@ -5,38 +5,19 @@
5
5
  [![Node.js](https://img.shields.io/node/v/@jcode.labs/ragmir)](https://www.npmjs.com/package/@jcode.labs/ragmir)
6
6
  [![MIT](https://img.shields.io/npm/l/@jcode.labs/ragmir)](https://github.com/jcode-works/jcode-ragmir/blob/main/LICENSE)
7
7
 
8
- **Confidential local RAG for your coding agents.**
8
+ Confidential local RAG for coding agents and Node.js applications.
9
9
 
10
- `@jcode.labs/ragmir` indexes the project files you select on your machine and retrieves bounded,
11
- cited evidence offline by default. The corpus and generated index remain local, so confidential
12
- source files are not uploaded to a hosted RAG service. Your coding agent or local script gets the
13
- context it needs without an account, API key, or model download.
10
+ *Stop sending confidential documents directly to the cloud.*
14
11
 
15
- Core is model-agnostic. Connect the coding agent or local script you already use through generated
16
- project skills, local MCP, or the JSON CLI. Use the typed Node.js API when your application owns the
17
- control flow.
12
+ Core indexes the project files you select and retrieves bounded, cited evidence offline by default.
13
+ It does not upload the corpus, call an LLM, or open an HTTP port.
18
14
 
19
15
  [Project overview](https://github.com/jcode-works/jcode-ragmir#readme) ·
20
- [Documentation](https://github.com/jcode-works/jcode-ragmir/wiki) ·
21
16
  [CLI reference](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/cli-reference.md) ·
22
- [API reference](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/api-reference.md)
17
+ [API reference](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/api-reference.md) ·
18
+ [Agent integration](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/agent-integration.md)
23
19
 
24
- ## What your coding agent gains
25
-
26
- | Goal | Core interface |
27
- | --- | --- |
28
- | Search repository documents with citations | `rgr search` |
29
- | Audit a local knowledge base | `rgr audit`, `rgr doctor`, and `rgr security-audit` |
30
- | Add retrieval to a Node.js application | Typed `ingest`, `search`, `ask`, and `research` exports |
31
- | Give an agent bounded project context | Local stdio MCP server and generated helpers |
32
- | Index scanned PDFs | Embedded text first, with optional page-aware local OCR |
33
-
34
- Core retrieves cited evidence. It does not require a generative model or generate answers. Use
35
- [Ragmir Chat](https://www.npmjs.com/package/@jcode.labs/ragmir-chat) only when local GGUF synthesis
36
- is useful, or [Ragmir TTS](https://www.npmjs.com/package/@jcode.labs/ragmir-tts) when you need audio
37
- output. Core declares both as optional peer integrations and does not install either add-on.
38
-
39
- ## Connect a coding agent in minutes
20
+ ## Install and retrieve
40
21
 
41
22
  Requires Node.js 20 or later.
42
23
 
@@ -45,70 +26,24 @@ npm install --save-dev @jcode.labs/ragmir
45
26
  npx rgr setup --agents codex,claude,kimi,opencode,cline
46
27
  npx rgr sources add "README.md" "docs/**/*.md"
47
28
  npx rgr ingest
48
- npx rgr doctor
49
- ```
50
-
51
- Then ask the selected agent:
52
-
53
- ```text
54
- Use Ragmir to find the rollout decision. Cite every claim and expand the strongest citation before
55
- you recommend a change.
56
- ```
57
-
58
- Setup installs project-scoped native skills and writes a local stdio MCP helper for each selected
59
- client. The generated runner pins the current project, so an agent in a monorepo does not silently
60
- query a sibling index. No Ragmir-specific model is required.
61
-
62
- The same setup works with any compatible MCP client. Hermes can launch `.ragmir/run.cjs`; local
63
- scripts, CI, and internal tools can call the JSON CLI or the TypeScript API without a dedicated
64
- connector.
65
-
66
- ## Use the same evidence from an automation
67
-
68
- ```bash
69
- npx rgr search "Should this renewal require approval?" --compact --json
70
- ```
71
-
72
- Use that command from a local shell script, a Node.js worker, or a CI step after mounting the project
73
- and its local `.ragmir/` state. The process returns machine-readable cited passages; the workflow
74
- decides whether to continue, request human approval, or stop.
75
-
76
- For long-running agent integrations, start the local stdio server with `npx rgr serve-mcp`. For a
77
- Node.js worker that owns the control flow, use `createRagmirClient()` and reuse one client per project
78
- root. Ragmir does not open an HTTP port or define an authentication layer.
79
-
80
- ## Search directly from the CLI
81
-
82
- ```bash
83
29
  npx rgr search "Which decision changed the rollout?"
84
30
  ```
85
31
 
86
- The project owns an ignored `.ragmir/` directory containing configuration and generated local
87
- state. Ingestion is incremental, and every result identifies the source path, chunk, line range, and
88
- PDF page when one is available.
32
+ Setup keeps configuration, the index, helpers, reports, and metadata-only access logs under ignored
33
+ `.ragmir/` state. Ingestion is incremental and resumable. Run `npx rgr audit --unsupported` to
34
+ compare the selected files with the index and see what was skipped.
89
35
 
90
- ## CLI essentials
36
+ ## Choose an interface
91
37
 
92
- ```bash
93
- # Readiness and source coverage
94
- npx rgr doctor
95
- npx rgr audit --unsupported
96
- npx rgr security-audit
97
-
98
- # Retrieval
99
- npx rgr preview --path docs --max-chunks 3
100
- npx rgr search "deployment decision"
101
- npx rgr search "deployment decision" --explain
102
- npx rgr search "deployment decision" --context-path "Operations > Deployment"
103
- npx rgr ask "What evidence supports the deployment decision?"
104
- npx rgr research "deployment obligations" --compact
105
-
106
- # Machine-readable output
107
- npx rgr search "deployment decision" --json
108
- ```
38
+ | Interface | Use |
39
+ | --- | --- |
40
+ | `rgr` CLI | Setup, ingest, search, audit, and JSON automation |
41
+ | TypeScript API | Typed retrieval in a script or stateful Node.js worker |
42
+ | Local stdio MCP | Bounded context for compatible coding agents |
109
43
 
110
- `ask` returns cited retrieval context, not LLM synthesis. `research` performs an audit-backed,
111
- multi-query retrieval pass and reports missing or weak evidence.
44
+ The default `local-hash` provider needs no model download. It is lexical/hash retrieval, not
45
+ semantic embeddings. Enable local Transformers.js embeddings explicitly with `rgr setup --semantic`
46
+ and rebuild the index.
112
47
 
113
48
  ## TypeScript API
114
49
 
@@ -118,7 +53,6 @@ import { createRagmirClient } from "@jcode.labs/ragmir"
118
53
  const ragmir = await createRagmirClient({ cwd: process.cwd() })
119
54
  try {
120
55
  await ragmir.ingest({ timeoutMs: 120_000 })
121
-
122
56
  const results = await ragmir.search("Which decision changed the rollout?", {
123
57
  topK: 5,
124
58
  timeoutMs: 10_000,
@@ -132,98 +66,29 @@ try {
132
66
  }
133
67
  ```
134
68
 
135
- The persistent client reuses one local database connection, supports cooperative cancellation, and
136
- waits for active work before shutdown. The top-level functions remain the smallest API for one-shot
137
- scripts.
138
-
139
- Frequently used exports:
140
-
141
- | Export | Purpose |
142
- | --- | --- |
143
- | `setupProject`, `addSourceEntries` | Initialize project state and select files |
144
- | `discoverKnowledgeBases`, `knowledgeBaseIdentity` | Route root and nested monorepo bases |
145
- | `getKnowledgeBaseContext`, `getKnowledgeBaseSourceCatalog` | Give agents bounded readiness and source context |
146
- | `createRagmirClient`, `RagmirClient` | Reuse local retrieval safely in a stateful Node.js process |
147
- | `ingest`, `audit` | Build the index and compare it with files on disk |
148
- | `previewChunks` | Inspect redacted chunks and distributions without writing storage |
149
- | `search`, `ask`, `research`, `expandCitation` | Retrieve or expand cited passages |
150
- | `doctor`, `securityAudit` | Inspect readiness and local privacy posture |
151
- | `createMcpServer`, `connectMcpServer`, `serveMcp` | Construct, connect, or start the read-focused local MCP server |
152
- | `configurePdfOcr`, `inspectPdfOcr` | Configure and inspect local PDF OCR |
153
-
154
- See the [complete API reference](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/api-reference.md)
155
- for options and result shapes.
156
-
157
- Any compatible CLI, TypeScript, or MCP client can consume the same cited results. A hosted AI
158
- receives returned passages under its provider's data policy. OpenCode or another local consumer can
159
- keep the handoff on the workstation. Optional Ragmir Chat adds local answer generation, but Qwen,
160
- Gemma, and every other generative model remain outside Core.
161
-
162
- For a monorepo with root and app-specific bases, run `rgr bases --json` before retrieval when scope
163
- is unclear. The nearest configured base is active, nested MCP helpers get unique names, and every
164
- helper pins `RAGMIR_PROJECT_ROOT` so clients cannot drift to a sibling index.
165
-
166
- ## Retrieval modes
167
-
168
- | Mode | Network requirement | Best for |
169
- | --- | --- | --- |
170
- | `local-hash` | None | Default offline retrieval, setup-free projects, and deterministic evaluation |
171
- | `transformers` | Explicit model preload or download | Higher-quality semantic matching with local inference |
172
-
173
- Enable semantic retrieval explicitly:
174
-
175
- ```bash
176
- npx rgr setup --semantic
177
- npx rgr ingest --rebuild
178
- ```
69
+ Reuse one client per project root in long-running processes and close it during shutdown. Top-level
70
+ `ingest`, `search`, `ask`, and `research` functions remain available for one-shot scripts. `ask`
71
+ returns cited retrieval context, not a generated answer.
179
72
 
180
- `local-hash` is lexical/hash retrieval. It should not be presented as equivalent to semantic
181
- embeddings.
73
+ Core also exports setup, preview, audit, evaluation, source-routing, privacy, OCR, MCP, and agent
74
+ integration helpers. See the [complete API reference](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/api-reference.md)
75
+ for public options and result types.
182
76
 
183
- ## Documents and OCR
77
+ ## Optional packages and boundaries
184
78
 
185
- Core parses common source, text, structured-data, Office, OpenDocument, EPUB, HTML, email, notebook,
186
- and PDF formats. Projects can add custom text extensions. Run `rgr audit --unsupported` to see every
187
- skipped file and recommendation.
79
+ - [`@jcode.labs/ragmir-chat`](https://www.npmjs.com/package/@jcode.labs/ragmir-chat) adds local GGUF
80
+ answer generation from retrieved passages.
81
+ - [`@jcode.labs/ragmir-tts`](https://www.npmjs.com/package/@jcode.labs/ragmir-tts) renders reviewed
82
+ text as local audio or explicit online speech.
188
83
 
189
- For scanned PDFs:
84
+ Core installs and starts without either add-on. A hosted agent receives only the passages your
85
+ integration gives it, under that provider's data policy. Use a local consumer when no passage may
86
+ leave the workstation. Ragmir has no hosted storage or cloud-sync layer; teams synchronize source
87
+ files separately and build one local index per developer.
190
88
 
191
- ```bash
192
- npx rgr ocr setup --engine auto
193
- npx rgr ingest --rebuild
194
- ```
195
-
196
- Ragmir prefers embedded PDF text and invokes OCR only for blank pages. OCR runs through a configured
197
- local executable, never a shell string or cloud OCR service.
198
-
199
- ## Local data and privacy
200
-
201
- - Project paths resolve from `cwd` or explicit configuration, not the npm installation directory.
202
- - Generated indexes, models, reports, audio, and access logs belong under ignored `.ragmir/` state.
203
- - Redaction runs before indexing when configured, but it is not a compliance certification.
204
- - External extractors and model downloads are opt-in system boundaries.
205
- - MCP retrieval is bounded by `mcpMaxOutputBytes`; access logs contain byte metrics, not query text
206
- or retrieved passages.
207
-
208
- Read [configuration and privacy](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/configuration.md)
209
- and [security hardening](https://github.com/jcode-works/jcode-ragmir/blob/main/SECURITY-HARDENING.md)
89
+ Read the [configuration guide](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/configuration.md),
90
+ [security hardening guide](https://github.com/jcode-works/jcode-ragmir/blob/main/SECURITY-HARDENING.md),
91
+ and [troubleshooting guide](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/troubleshooting.md)
210
92
  before indexing sensitive material.
211
93
 
212
- ## Runnable examples
213
-
214
- | Example | Demonstrates |
215
- | --- | --- |
216
- | [Confidential local RAG demo](https://github.com/jcode-works/jcode-ragmir/tree/main/packages/ragmir-core/examples/sovereign-rag-demo) | CLI ingestion, search, audit, redaction, and evaluation |
217
- | [Library API demo](https://github.com/jcode-works/jcode-ragmir/tree/main/packages/ragmir-core/examples/library-api-demo) | The public library surface against fictional files |
218
- | [Document evidence benchmark](https://github.com/jcode-works/jcode-ragmir/tree/main/packages/ragmir-core/examples/document-evidence-benchmark) | Recall and exact citation evaluation |
219
-
220
- ## Documentation
221
-
222
- - [Project documentation](https://github.com/jcode-works/jcode-ragmir/wiki)
223
- - [CLI reference](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/cli-reference.md)
224
- - [TypeScript API reference](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/api-reference.md)
225
- - [Configuration](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/configuration.md)
226
- - [Agent integration](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/agent-integration.md)
227
- - [Troubleshooting](https://github.com/jcode-works/jcode-ragmir/blob/main/docs/troubleshooting.md)
228
-
229
94
  Ragmir Core is open source under the [MIT License](https://github.com/jcode-works/jcode-ragmir/blob/main/LICENSE).
@@ -13,6 +13,7 @@ export interface McpOutputLogEvent {
13
13
  compacted: boolean;
14
14
  truncated: boolean;
15
15
  }
16
+ export declare const MAX_USAGE_REPORT_DAYS = 3650;
16
17
  export declare function recordAccess(config: Config, event: AccessLogEvent): Promise<void>;
17
18
  export declare function recordMcpOutput(config: Config, event: McpOutputLogEvent): Promise<void>;
18
19
  export declare function accessLogUsageReport(options?: AccessLogUsageOptions): Promise<AccessLogUsageReport>;
@@ -1 +1 @@
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,EACN,aAAa,EACd,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;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;CACnB;AAsDD,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvF;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB7F;AA2BD,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAoF/B"}
1
+ {"version":3,"file":"access-log.d.ts","sourceRoot":"","sources":["../src/access-log.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,MAAM,EACN,aAAa,EACd,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;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;CACnB;AA2CD,eAAO,MAAM,qBAAqB,OAAQ,CAAA;AAa1C,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBvF;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B7F;AA8CD,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAiG/B"}
@@ -3,6 +3,7 @@ import { existsSync } from "node:fs";
3
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 { operationSignal, throwIfAborted } from "./operation.js";
6
7
  import { ensurePrivateDirectory, hardenPrivateFile } from "./permissions.js";
7
8
  const ACCESS_LOG_ACTIONS = [
8
9
  "ingest",
@@ -21,6 +22,7 @@ const MCP_OUTPUT_TOOLS = [
21
22
  ];
22
23
  const MCP_OUTPUT_TOOL_SET = new Set(MCP_OUTPUT_TOOLS);
23
24
  const DEFAULT_USAGE_REPORT_DAYS = 7;
25
+ export const MAX_USAGE_REPORT_DAYS = 3_650;
24
26
  const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;
25
27
  /**
26
28
  * Soft cap above which the access log is trimmed to its most recent lines.
@@ -31,18 +33,21 @@ const MAX_ACCESS_LOG_BYTES = 10 * 1024 * 1024;
31
33
  /** Number of most recent lines retained when the log exceeds the byte cap. */
32
34
  const TRIMMED_ACCESS_LOG_LINES = 50_000;
33
35
  const ACCESS_LOG_SALT_FILE = ".ragmir-access-log.salt";
36
+ const accessLogWriteQueues = new Map();
34
37
  export async function recordAccess(config, event) {
35
38
  if (!config.accessLog) {
36
39
  return;
37
40
  }
38
41
  try {
39
- await ensurePrivateDirectory(path.dirname(config.accessLogPath));
40
- await trimAccessLogIfNeeded(config.accessLogPath);
41
- await appendFile(config.accessLogPath, `${JSON.stringify(await toLogLine(config, event))}\n`, {
42
- encoding: "utf8",
43
- mode: 0o600,
42
+ await withAccessLogWriteQueue(config.accessLogPath, async () => {
43
+ await ensurePrivateDirectory(path.dirname(config.accessLogPath));
44
+ await trimAccessLogIfNeeded(config.accessLogPath);
45
+ await appendFile(config.accessLogPath, `${JSON.stringify(await toLogLine(config, event))}\n`, {
46
+ encoding: "utf8",
47
+ mode: 0o600,
48
+ });
49
+ await hardenPrivateFile(config.accessLogPath);
44
50
  });
45
- await hardenPrivateFile(config.accessLogPath);
46
51
  }
47
52
  catch {
48
53
  // Access logging is best-effort so read-only workspaces do not block local use.
@@ -53,27 +58,41 @@ export async function recordMcpOutput(config, event) {
53
58
  return;
54
59
  }
55
60
  try {
56
- await ensurePrivateDirectory(path.dirname(config.accessLogPath));
57
- await trimAccessLogIfNeeded(config.accessLogPath);
58
- const line = {
59
- timestamp: new Date().toISOString(),
60
- kind: "mcp-output",
61
- tool: event.tool,
62
- retrievedBytes: event.retrievedBytes,
63
- returnedBytes: event.returnedBytes,
64
- compacted: event.compacted,
65
- truncated: event.truncated,
66
- };
67
- await appendFile(config.accessLogPath, `${JSON.stringify(line)}\n`, {
68
- encoding: "utf8",
69
- mode: 0o600,
61
+ await withAccessLogWriteQueue(config.accessLogPath, async () => {
62
+ await ensurePrivateDirectory(path.dirname(config.accessLogPath));
63
+ await trimAccessLogIfNeeded(config.accessLogPath);
64
+ const line = {
65
+ timestamp: new Date().toISOString(),
66
+ kind: "mcp-output",
67
+ tool: event.tool,
68
+ retrievedBytes: event.retrievedBytes,
69
+ returnedBytes: event.returnedBytes,
70
+ compacted: event.compacted,
71
+ truncated: event.truncated,
72
+ };
73
+ await appendFile(config.accessLogPath, `${JSON.stringify(line)}\n`, {
74
+ encoding: "utf8",
75
+ mode: 0o600,
76
+ });
77
+ await hardenPrivateFile(config.accessLogPath);
70
78
  });
71
- await hardenPrivateFile(config.accessLogPath);
72
79
  }
73
80
  catch {
74
81
  // Output metrics are best-effort and must never block local retrieval.
75
82
  }
76
83
  }
84
+ function withAccessLogWriteQueue(accessLogPath, operation) {
85
+ const previous = accessLogWriteQueues.get(accessLogPath) ?? Promise.resolve();
86
+ const current = previous.then(operation);
87
+ const settled = current.then(() => undefined, () => undefined);
88
+ accessLogWriteQueues.set(accessLogPath, settled);
89
+ void settled.then(() => {
90
+ if (accessLogWriteQueues.get(accessLogPath) === settled) {
91
+ accessLogWriteQueues.delete(accessLogPath);
92
+ }
93
+ });
94
+ return current;
95
+ }
77
96
  async function trimAccessLogIfNeeded(accessLogPath) {
78
97
  let size = 0;
79
98
  try {
@@ -97,7 +116,10 @@ function isNodeError(error) {
97
116
  return error instanceof Error && "code" in error;
98
117
  }
99
118
  export async function accessLogUsageReport(options = {}) {
119
+ const signal = operationSignal(options);
120
+ throwIfAborted(signal);
100
121
  const config = await loadConfig(String(options.cwd ?? process.cwd()));
122
+ throwIfAborted(signal);
101
123
  const days = normalizeUsageReportDays(options.days);
102
124
  const until = new Date();
103
125
  const since = new Date(until.getTime() - days * MILLISECONDS_PER_DAY);
@@ -115,8 +137,18 @@ export async function accessLogUsageReport(options = {}) {
115
137
  let truncatedResponses = 0;
116
138
  let lastEventAt = null;
117
139
  if (existsSync(config.accessLogPath)) {
118
- const lines = (await readFile(config.accessLogPath, "utf8")).split(/\r?\n/u).filter(Boolean);
140
+ let content;
141
+ try {
142
+ content = await readFile(config.accessLogPath, { encoding: "utf8", signal });
143
+ }
144
+ catch (error) {
145
+ throwIfAborted(signal);
146
+ throw error;
147
+ }
148
+ throwIfAborted(signal);
149
+ const lines = content.split(/\r?\n/u).filter(Boolean);
119
150
  for (const line of lines) {
151
+ throwIfAborted(signal);
120
152
  const event = parseAccessLogLine(line);
121
153
  if (!event) {
122
154
  invalidLines += 1;
@@ -155,6 +187,7 @@ export async function accessLogUsageReport(options = {}) {
155
187
  }
156
188
  }
157
189
  }
190
+ throwIfAborted(signal);
158
191
  return {
159
192
  accessLogEnabled: config.accessLog,
160
193
  since: since.toISOString(),
@@ -251,8 +284,8 @@ function normalizeUsageReportDays(days) {
251
284
  if (days === undefined) {
252
285
  return DEFAULT_USAGE_REPORT_DAYS;
253
286
  }
254
- if (!Number.isInteger(days) || days <= 0) {
255
- throw new Error("usage-report days must be a positive integer.");
287
+ if (!Number.isSafeInteger(days) || days <= 0 || days > MAX_USAGE_REPORT_DAYS) {
288
+ throw new Error(`usage-report days must be an integer between 1 and ${MAX_USAGE_REPORT_DAYS}.`);
256
289
  }
257
290
  return days;
258
291
  }
@@ -1 +1 @@
1
- {"version":3,"file":"access-log.js","sourceRoot":"","sources":["../src/access-log.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"access-log.js","sourceRoot":"","sources":["../src/access-log.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -13,6 +13,7 @@ import { evaluateGoldenQueries } from "./evaluate.js";
13
13
  import { countSkippedByReason } from "./files.js";
14
14
  import { getIndexFreshnessWarning, getLexicalScanWarning } from "./index-diagnostics.js";
15
15
  import { audit, ingest } from "./ingest.js";
16
+ import { getIngestionProgress } from "./ingestion-state.js";
16
17
  import { initProject } from "./init.js";
17
18
  import { discoverKnowledgeBases, knowledgeBaseIdentity } from "./knowledge-bases.js";
18
19
  import { ingestionLimits } from "./limits.js";
@@ -271,11 +272,13 @@ program
271
272
  .command("ingest")
272
273
  .description("Parse changed documents, redact, chunk, embed locally, and update LanceDB.")
273
274
  .option("--rebuild", "Force a full local index rebuild instead of reusing unchanged rows.")
275
+ .option("--batch-size <number>", "Files committed per resumable batch.", parsePositiveInt)
274
276
  .option("--json", "Print machine-readable JSON.")
275
277
  .action(async (options, command) => {
276
278
  const cwd = projectRoot(command);
277
279
  const ingestOptions = { cwd };
278
280
  addOption(ingestOptions, "rebuild", options.rebuild);
281
+ addOption(ingestOptions, "batchSize", options.batchSize);
279
282
  const result = await ingest(ingestOptions);
280
283
  if (options.json) {
281
284
  console.log(JSON.stringify(result, null, 2));
@@ -284,7 +287,7 @@ program
284
287
  }
285
288
  return;
286
289
  }
287
- console.log(pc.green(`Done. discoveredFiles=${result.discoveredFiles} supportedFiles=${result.supportedFiles} supportedBytes=${result.supportedBytes} largestFileBytes=${result.largestFileBytes} indexedFiles=${result.indexedFiles} rebuiltFiles=${result.rebuiltFiles} reusedFiles=${result.reusedFiles} chunks=${result.chunks} skippedFiles=${result.skippedFiles} unsupportedFiles=${result.unsupportedFiles} oversizedFiles=${result.oversizedFiles} sensitiveFiles=${result.sensitiveFiles} emptyTextFiles=${result.emptyTextFiles.length} redactions=${result.redactions} errors=${result.errors.length}`));
290
+ console.log(pc.green(`Done. runId=${result.runId} resumed=${result.resumed} batchSize=${result.batchSize} discoveredFiles=${result.discoveredFiles} supportedFiles=${result.supportedFiles} supportedBytes=${result.supportedBytes} largestFileBytes=${result.largestFileBytes} indexedFiles=${result.indexedFiles} rebuiltFiles=${result.rebuiltFiles} reusedFiles=${result.reusedFiles} chunks=${result.chunks} skippedFiles=${result.skippedFiles} unsupportedFiles=${result.unsupportedFiles} oversizedFiles=${result.oversizedFiles} sensitiveFiles=${result.sensitiveFiles} emptyTextFiles=${result.emptyTextFiles.length} redactions=${result.redactions} errors=${result.errors.length}`));
288
291
  printUnsupportedSummary(result.unsupportedExtensions);
289
292
  printEmptyTextFiles(result.emptyTextFiles);
290
293
  if (result.vectorIndexWarning) {
@@ -678,6 +681,7 @@ program
678
681
  const config = await loadConfig(cwd);
679
682
  const identity = knowledgeBaseIdentity(config.projectRoot);
680
683
  const rows = await countRows(config);
684
+ const ingestion = await getIngestionProgress(config);
681
685
  const status = {
682
686
  knowledgeBaseId: identity?.id ?? null,
683
687
  projectRoot: config.projectRoot,
@@ -707,6 +711,7 @@ program
707
711
  legacyWordCommand: config.legacyWordCommand,
708
712
  legacyWordTimeoutMs: config.legacyWordTimeoutMs,
709
713
  chunksIndexed: rows,
714
+ ingestion,
710
715
  };
711
716
  if (options.json) {
712
717
  console.log(JSON.stringify(status, null, 2));
@@ -740,6 +745,15 @@ program
740
745
  console.log(`legacyWordCommand=${config.legacyWordCommand.join(" ")}`);
741
746
  console.log(`legacyWordTimeoutMs=${config.legacyWordTimeoutMs}`);
742
747
  console.log(`chunksIndexed=${rows}`);
748
+ if (ingestion) {
749
+ console.log(`ingestionRunId=${ingestion.runId}`);
750
+ console.log(`ingestionStatus=${ingestion.status}`);
751
+ console.log(`ingestionMode=${ingestion.mode}`);
752
+ console.log(`ingestionResumed=${ingestion.resumed}`);
753
+ console.log(`ingestionBatchSize=${ingestion.batchSize}`);
754
+ console.log(`ingestionProgress=${ingestion.indexedFiles}/${ingestion.totalFiles} indexed, ${ingestion.errorFiles} errors, ${ingestion.pendingFiles} pending`);
755
+ console.log(`ingestionLastActivityAt=${ingestion.lastActivityAt}`);
756
+ }
743
757
  });
744
758
  program
745
759
  .command("security-audit")