@autorag/librarian 2.10.1 → 2.10.3

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 (73) hide show
  1. package/NOTICE +0 -3
  2. package/README.md +76 -33
  3. package/dist/agent/agent.d.ts +96 -18
  4. package/dist/agent/evidence-ledger.d.ts +54 -5
  5. package/dist/agent/evidence-persistence.d.ts +24 -0
  6. package/dist/agent/jev-extension.d.ts +5 -3
  7. package/dist/agent/search-documents.d.ts +1 -1
  8. package/dist/agent/system-prompt.d.ts +0 -2
  9. package/dist/agent/tool-burst-guard.d.ts +26 -0
  10. package/dist/cli/config.d.ts +37 -23
  11. package/dist/cli/index.js +2122 -1153
  12. package/dist/cloud/config.d.ts +16 -10
  13. package/dist/cloud/credential.d.ts +17 -0
  14. package/dist/cloud/errors.d.ts +6 -6
  15. package/dist/cloud/index.d.ts +5 -4
  16. package/dist/cloud/jev-backend.d.ts +15 -13
  17. package/dist/cloud/models.d.ts +4 -4
  18. package/dist/cloud/oauth-login.d.ts +3 -3
  19. package/dist/cloud/provider.d.ts +16 -11
  20. package/dist/cloud/token.d.ts +2 -2
  21. package/dist/core.d.ts +2 -1
  22. package/dist/core.js +2265 -1313
  23. package/dist/datasource/aliased-skill.d.ts +2 -2
  24. package/dist/datasource/connector-skill.d.ts +2 -2
  25. package/dist/datasource/crawler-skill.d.ts +2 -2
  26. package/dist/datasource/described-skill.d.ts +2 -2
  27. package/dist/datasource/index.d.ts +1 -1
  28. package/dist/datasource/retry.d.ts +49 -0
  29. package/dist/datasource/skills/clawgallery/skill.d.ts +4 -4
  30. package/dist/datasource/skills/discrawl/skill.d.ts +5 -5
  31. package/dist/datasource/skills/github-gist/skill.d.ts +2 -2
  32. package/dist/datasource/skills/lazykatok/skill.d.ts +5 -5
  33. package/dist/datasource/skills/mailcrawl/skill.d.ts +2 -2
  34. package/dist/datasource/skills/obsidian/skill.d.ts +5 -5
  35. package/dist/datasource/types.d.ts +13 -1
  36. package/dist/embedding-runtime/cache.d.ts +9 -0
  37. package/dist/index.d.ts +1 -2
  38. package/dist/index.js +2338 -1387
  39. package/dist/jikji/client.d.ts +13 -2
  40. package/dist/jikji/index.d.ts +1 -1
  41. package/dist/jikji/path-map.d.ts +9 -0
  42. package/dist/jikji/prepare-budget.d.ts +18 -0
  43. package/dist/jikji/serial-queue.d.ts +17 -0
  44. package/dist/jikji/types.d.ts +17 -0
  45. package/dist/mcp/index.js +2326 -1374
  46. package/dist/minsync/client.d.ts +3 -1
  47. package/dist/minsync/index.d.ts +1 -1
  48. package/dist/minsync/installer.d.ts +1 -1
  49. package/dist/minsync/method.d.ts +1 -1
  50. package/dist/minsync/types.d.ts +8 -1
  51. package/dist/mirror/atomic-write.d.ts +6 -0
  52. package/dist/mirror/index-store.d.ts +8 -1
  53. package/dist/mirror/index.d.ts +2 -2
  54. package/dist/mirror/sync.d.ts +57 -1
  55. package/dist/p2p/simplex-server.d.ts +0 -1
  56. package/dist/parser/defaults.d.ts +8 -0
  57. package/dist/parser/errors.d.ts +10 -0
  58. package/dist/parser/isolated.d.ts +77 -0
  59. package/dist/parser/kordoc.d.ts +1 -0
  60. package/dist/parser/parse-worker.d.ts +1 -0
  61. package/dist/parser/parse-worker.js +780 -0
  62. package/dist/parser/types.d.ts +5 -0
  63. package/dist/process/abort-reason.d.ts +2 -0
  64. package/dist/retrieval/index.d.ts +1 -1
  65. package/dist/retrieval/rerank.d.ts +16 -10
  66. package/package.json +5 -5
  67. package/skills/autorag/SKILL.md +2 -1
  68. package/skills/autorag-doctor/SKILL.md +7 -0
  69. package/skills/autorag-lite-setup/SKILL.md +2 -2
  70. package/skills/autorag-setup/SKILL.md +42 -17
  71. package/dist/manifest/index.d.ts +0 -2
  72. package/dist/manifest/loader.d.ts +0 -3
  73. package/dist/manifest/types.d.ts +0 -8
@@ -17,5 +17,10 @@ export interface ParseDiagnostic {
17
17
  export declare abstract class Parser {
18
18
  abstract readonly name: string;
19
19
  abstract readonly extensions: readonly string[];
20
+ /**
21
+ * Stamp recorded next to a per-file skip. Refresh retries a source a parser failed on exactly
22
+ * once when this changes, so bump it whenever parse behavior changes (including the engine behind it).
23
+ */
24
+ readonly version: string;
20
25
  abstract parse(input: ParseInput): Promise<ParseOutput>;
21
26
  }
@@ -0,0 +1,2 @@
1
+ /** The rejection for work its caller aborted: the signal's reason when it is an error, else an `AbortError`. */
2
+ export declare function abortReason(signal: AbortSignal): Error;
@@ -3,7 +3,7 @@ export { RetrievalEngine, type RetrievalEngineOptions } from "./engine.js";
3
3
  export type { MergeOptions } from "./merger.js";
4
4
  export { ParallelRetriever, ResultMerger } from "./merger.js";
5
5
  export { RetrievalMethodRegistry } from "./registry.js";
6
- export { type CreateRerankerOptions, createReranker, DEFAULT_AUTORAG_RERANK_API_KEY_ENV, DEFAULT_AUTORAG_RERANK_MODEL, DEFAULT_RERANK_API_KEY_ENV, DEFAULT_RERANK_MODEL, DEFAULT_RERANK_PROVIDER, DEFAULT_RERANK_TOP_N, defaultRerankApiKeyEnv, defaultRerankModel, OpenRouterReranker, type OpenRouterRerankerOptions, type Reranker, type RerankerDescriptor, type RerankOptions, SUPPORTED_RERANK_PROVIDERS, } from "./rerank.js";
6
+ export { type CreateRerankerOptions, createReranker, DEFAULT_DAZZI_RERANK_MODEL, DEFAULT_RERANK_API_KEY_ENV, DEFAULT_RERANK_MODEL, DEFAULT_RERANK_PROVIDER, DEFAULT_RERANK_TOP_N, defaultRerankApiKeyEnv, defaultRerankModel, OpenRouterReranker, type OpenRouterRerankerOptions, type Reranker, type RerankerDescriptor, type RerankOptions, SUPPORTED_RERANK_PROVIDERS, } from "./rerank.js";
7
7
  export { matchesVirtualPathScope, normalizeVirtualPath, normalizeVirtualPathScope, virtualPathScopeToRegExp, } from "./scope.js";
8
8
  export { type DatasourceCatalogEntry, derivedDatasourceIds, type RetrievalSelection, RetrievalSelectionError, type RetrievalSelectionErrorCode, resolveSelectedMethods, } from "./selection.js";
9
9
  export { describeRetrievalError, groupUnsearchedSurfaces, MINSYNC_SURFACE, type RetrievalSkip, retrievalSurfaceFor, } from "./skip.js";
@@ -19,21 +19,22 @@ export declare const DEFAULT_RERANK_PROVIDER = "openrouter";
19
19
  /** Default environment variable holding the OpenRouter API key. */
20
20
  export declare const DEFAULT_RERANK_API_KEY_ENV = "OPENROUTER_API_KEY";
21
21
  /**
22
- * Default rerank model for the hosted AutoRAG (Dazzi) provider — the id the
22
+ * Default rerank model for the hosted Dazzi Models provider — the id the
23
23
  * server lists under `GET <root>/v1/models?operation=rerank`. Rerankers are not
24
24
  * chat LLMs, so the project's 2026+ model rule does not cover them.
25
25
  */
26
- export declare const DEFAULT_AUTORAG_RERANK_MODEL = "qwen/qwen3-reranker-8b";
27
- /** Environment variable holding the AutoRAG account key for the `autorag` rerank provider. */
28
- export declare const DEFAULT_AUTORAG_RERANK_API_KEY_ENV = "AUTORAG_API_KEY";
26
+ export declare const DEFAULT_DAZZI_RERANK_MODEL = "qwen/qwen3-reranker-8b";
29
27
  /** Default number of merged chunks kept after reranking. */
30
28
  export declare const DEFAULT_RERANK_TOP_N = 25;
31
29
  /** Rerank providers {@link createReranker} can build. */
32
30
  export declare const SUPPORTED_RERANK_PROVIDERS: readonly string[];
33
31
  /** Default wire model for a rerank provider. */
34
32
  export declare function defaultRerankModel(provider: string): string;
35
- /** Default API-key environment variable for a rerank provider. */
36
- export declare function defaultRerankApiKeyEnv(provider: string): string;
33
+ /**
34
+ * Default API-key environment variable for a rerank provider, or `undefined`
35
+ * for Dazzi Models, which authenticates with the stored `/login` credential.
36
+ */
37
+ export declare function defaultRerankApiKeyEnv(provider: string): string | undefined;
37
38
  /** Static description of a reranker, used for diagnostics and inspection. */
38
39
  export interface RerankerDescriptor {
39
40
  /** Stable label (e.g. `openrouter`). */
@@ -92,10 +93,15 @@ export interface OpenRouterRerankerOptions {
92
93
  readonly provider?: string;
93
94
  /** Wire model id. @default DEFAULT_RERANK_MODEL */
94
95
  readonly model?: string;
95
- /** API key. When omitted, read from `apiKeyEnv` in the environment. */
96
+ /**
97
+ * API key. When omitted, `openrouter` reads `apiKeyEnv` from the environment
98
+ * and `dazzi` uses the stored `/login` credential.
99
+ */
96
100
  readonly apiKey?: string;
97
- /** Environment variable holding the API key. @default DEFAULT_RERANK_API_KEY_ENV */
101
+ /** Environment variable holding the API key (`openrouter` only). @default DEFAULT_RERANK_API_KEY_ENV */
98
102
  readonly apiKeyEnv?: string;
103
+ /** Pi agent home whose `auth.json` holds the Dazzi `/login` credential (`dazzi` only). Default: Pi's agent dir. */
104
+ readonly agentDir?: string;
99
105
  /** Override the OpenRouter base URL (e.g. a self-hosted or gateway endpoint). */
100
106
  readonly baseUrl?: string;
101
107
  /** Per-request timeout in milliseconds. */
@@ -119,9 +125,9 @@ export declare function createReranker(config: CreateRerankerOptions | false | u
119
125
  /**
120
126
  * Reranker backed by an OpenRouter-compatible rerank router.
121
127
  *
122
- * OpenRouter is the default provider; the hosted AutoRAG (Dazzi) plan serves the
128
+ * OpenRouter is the default provider; the hosted Dazzi Models plan serves the
123
129
  * same wire shape at `<root>/v1/rerank`, so {@link createReranker} reuses this
124
- * client with that base URL and key env. Documents are sent as their `content`;
130
+ * client with that base URL and the stored login token. Documents are sent as their `content`;
125
131
  * the original `RetrievalResult` for each returned index is preserved and
126
132
  * re-scored with the provider's relevance score.
127
133
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autorag/librarian",
3
- "version": "2.10.1",
3
+ "version": "2.10.3",
4
4
  "description": "Self-evolving librarian agent on Pi framework with pluggable retrieval methods",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -36,7 +36,7 @@
36
36
  "access": "public"
37
37
  },
38
38
  "scripts": {
39
- "build": "bun build src/index.ts src/core.ts src/cli/index.ts src/mcp/index.ts --outdir dist --target node --packages external && tsc -p tsconfig.build.json && node scripts/fixup-dts.mjs",
39
+ "build": "bun build src/index.ts src/core.ts src/cli/index.ts src/mcp/index.ts src/parser/parse-worker.ts --outdir dist --target node --packages external && tsc -p tsconfig.build.json && node scripts/fixup-dts.mjs",
40
40
  "prepublishOnly": "bun run typecheck && bun run build",
41
41
  "prepare": "bun run build",
42
42
  "test": "node scripts/run-test-files.mjs",
@@ -69,8 +69,7 @@
69
69
  "slides-grab": "^1.5.2",
70
70
  "smol-toml": "1.9.1",
71
71
  "tesseract.js": "^7.0.0",
72
- "typebox": "^1.3.37",
73
- "yaml": "^2.9.1"
72
+ "typebox": "^1.3.37"
74
73
  },
75
74
  "devDependencies": {
76
75
  "@biomejs/biome": "2.5.15",
@@ -80,6 +79,7 @@
80
79
  "@types/ws": "^8.18.2",
81
80
  "typescript": "^7.0.2",
82
81
  "vitest": "^5.0.4",
83
- "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz"
82
+ "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
83
+ "yaml": "^2.9.1"
84
84
  }
85
85
  }
@@ -16,7 +16,8 @@ sources, judges evidence, and curates the final answer. There is no subagent or
16
16
  separate model role.
17
17
 
18
18
  AutoRAG reads source documents and writes indexes only under the configured
19
- workspace `.autorag/` directory and Jikji's per-source `.jikji/` caches. Never
19
+ workspace `.autorag/` directory and Jikji's central store (`<OS data dir>/jikji/`,
20
+ plus a `.jikji_agent_map.md` guide in each indexed root). Never
20
21
  move, rename, edit, or delete source files.
21
22
 
22
23
  ## Preflight
@@ -192,6 +192,11 @@ Use `--force` only when incremental refresh does not clear it. For continuous
192
192
  freshness install an hourly `autorag watch --once` job (cron, launchd, systemd
193
193
  timer, or Task Scheduler).
194
194
 
195
+ A file the parser failed on (corrupt PDF, encrypted HWP) or that was unreadable is not
196
+ re-parsed on every refresh: it is skipped until its mtime, size or parser version changes.
197
+ After fixing the cause (permissions, OCR setup), run `autorag refresh --retry-failed --json`
198
+ to retry those files once without re-indexing healthy ones.
199
+
195
200
  ### Missing or wrong setup
196
201
 
197
202
  - `unknown-datasource-skill`: the config key is not a builtin template and has
@@ -216,6 +221,8 @@ timer, or Task Scheduler).
216
221
  | `stale-index` | Sources changed since last refresh | `autorag refresh --method parsed,minsync` |
217
222
  | `index-not-ready` | Index missing or never built | `autorag refresh --json` |
218
223
  | `minsync-sync-failed` | MinSync indexing failed; the message carries MinSync's own reason | Fix the reported cause, then `autorag refresh --method minsync` |
224
+ | `minsync-file-skipped` | MinSync skipped one file (unreadable, unparsable, or rejected by the embedder) and kept its older chunks; retried on the next sync | Fix that file's permissions/content, then `autorag refresh --method minsync` |
225
+ | `minsync-lock-held` | Another `minsync` run holds `.minsync/lock`, often an orphan left by a killed host; retryable | Wait for it to finish or stop that `minsync` process, then `autorag refresh --method minsync` |
219
226
  | `jikji-unavailable` | Jikji binary missing or install failed | Check cargo, retry refresh |
220
227
  | `everything-index-failed` | Windows Everything instance could not start or index; message carries ES exit code and stderr | Fix the reported cause, `autorag refresh --method everything --json` |
221
228
  | `embedding-identity-mismatch` | Indexed vectors use a different embedder | `autorag index rebuild --method minsync` |
@@ -19,7 +19,7 @@ Use `autorag-setup` instead when the model-backed librarian must be configured.
19
19
  environment-variable names such as `tokenEnv` or `apiKeyEnv`.
20
20
  - Never move, rename, edit, or delete source documents. Lite commands write
21
21
  indexes only under the configured workspace `.autorag/` directory and
22
- Jikji's per-source `.jikji/` caches.
22
+ Jikji's central store (`<OS data dir>/jikji/`).
23
23
  - Do not index system trees, app bundles, caches, credential stores,
24
24
  `node_modules`, `.git`, `dist`, `build`, `target`, `.cache`, `.autorag`, or
25
25
  `.jikji`.
@@ -169,7 +169,7 @@ AUTORAG_CONFIG=/absolute/path/to/.autorag/config.json autorag lite refresh --jso
169
169
  are missing or broken, run a full refresh or return to setup rather than
170
170
  silently degrading to lexical-only search.
171
171
  - MinSync's default embedder is in-process native Qwen3 embeddings
172
- (`native:Qwen/Qwen3-Embedding-0.6B`, 1024 dimensions, MinSync 0.4.7): no
172
+ (`native:Qwen/Qwen3-Embedding-0.6B`, 1024 dimensions, MinSync 0.4.8): no
173
173
  embedder flags, no API key, and no external daemon (such as Ollama) are
174
174
  needed, and no corpus text leaves the machine. For gateway-profiled
175
175
  embeddings, prefetch with `autorag models prefetch --profile qwen3-embedding-0.6b`.
@@ -164,15 +164,21 @@ GitHub release into `<workspace>/.autorag/bin` (`minSync.autoInstall` defaults
164
164
  to true), and Jikji installs `jikji-cli` through cargo (`jikji.autoInstall`
165
165
  defaults to true; requires the Rust toolchain). Set `"autoInstall": false` only
166
166
  when managing the binary yourself. Refresh is incremental: MinSync syncs only
167
- changed parsed mirrors, and `jikji prepare` reuses unchanged documents. Roots
168
- prepare in parallel.
169
-
170
- Jikji stores its prepared corpus metadata in a hidden `.jikji` directory
171
- inside each indexed source root — that is Jikji's native index layout and
172
- intended behavior, not a misplaced artifact. Tell the user before the first
173
- `refresh` that `<root>/.jikji` will be created inside every approved document
174
- root (one per root, alongside the documents), and never delete or edit its
175
- contents; removing it only forces a full Jikji re-prepare on the next refresh.
167
+ changed parsed mirrors, and `jikji prepare` reuses unchanged documents. Jikji
168
+ roots prepare one at a time (they share one central SQLite file that rejects
169
+ concurrent writers). A search root nested inside, or duplicating, another root
170
+ is skipped for Jikji because the outer root's index already covers it.
171
+
172
+ Jikji keeps its prepared corpus (search index, parsed text, wiki, routes) in one
173
+ central store, not inside your documents: `<OS data dir>/jikji/index.sqlite`
174
+ plus `<OS data dir>/jikji/roots/<id>/` (macOS `~/Library/Application Support`,
175
+ Linux `$XDG_DATA_HOME` or `~/.local/share`, Windows `%LOCALAPPDATA%`; override
176
+ with the `JIKJI_DATA_DIR` environment variable). The only file `refresh` adds
177
+ inside an approved document root is the `.jikji_agent_map.md` guide. Tell the
178
+ user that before the first `refresh`, and never delete or edit Jikji's central
179
+ store by hand; removing it only forces a full Jikji re-prepare on the next
180
+ refresh. Older Jikji versions wrote a `<root>/.jikji` directory instead; such a
181
+ leftover is now unused and safe for the user to delete.
176
182
 
177
183
  Exact duplicate exclusion is enabled by default. AutoRAG invokes the external
178
184
  `dupey` CLI before parsed-mirror indexing, keeps the newest filesystem copy for
@@ -184,7 +190,7 @@ told duplicate exclusion is off. Set `"excludeExactDuplicates": false` to
184
190
  index every copy.
185
191
 
186
192
  MinSync's default embedder is in-process native Qwen3 embeddings
187
- (`native:Qwen/Qwen3-Embedding-0.6B`, 1024 dimensions, MinSync 0.4.7). The
193
+ (`native:Qwen/Qwen3-Embedding-0.6B`, 1024 dimensions, MinSync 0.4.8). The
188
194
  default needs no embedder flags, no API key, and no external daemon (such as
189
195
  Ollama) — all embeddings run in-process locally and privately. For workspaces
190
196
  using the loopback llama-server gateway, prefetch the verified model with
@@ -216,8 +222,9 @@ size must be positive integers, and the dimension must match the embedder
216
222
  Leave both enabled. They are the recommended setup: they make simple questions
217
223
  fast and multi-part questions thorough.
218
224
 
219
- - **Jev** (`jev`, default `{ "backend": "openrouter" }`, model
220
- `typesafe/jev-1.13`) runs before the fast answer. It routes each question to
225
+ - **Jev** (`jev`, default `{ "backend": "dazzi" }` when signed in to Dazzi
226
+ Models, else `{ "backend": "openrouter" }`; model `jev-1.13` on Dazzi,
227
+ `typesafe/jev-1.13` on OpenRouter) runs before the fast answer. It routes each question to
221
228
  local search, web search, a direct answer (general knowledge or small
222
229
  talk skips retrieval entirely), or the `config` branch, and decides whether
223
230
  to decompose it. On
@@ -232,14 +239,16 @@ fast and multi-part questions thorough.
232
239
  decides whether verification is needed, so a complete, evidence-backed fast
233
240
  answer ends the run.
234
241
  - **Question decomposition** (`queryDecomposition`, default model
242
+ `dazzi/openai/gpt-6-luna` when signed in to Dazzi Models, else
235
243
  `openrouter/qwen/qwen3.7-flash`) splits a multi-part question into at most
236
244
  five search queries that run in parallel.
237
245
 
238
- Both use the user's `OPENROUTER_API_KEY`; confirm it is set (`test -n
239
- "$OPENROUTER_API_KEY"`, never print it) and tell the user Jev routing is on.
240
- Without the key, routing falls back to a single local search and the run
241
- always verifies, so searches still work. A `query-route-fallback` diagnostic
242
- (`autorag search --debug`) shows that state.
246
+ Both need a credential for the chosen backend: a Dazzi Models `/login` (check with
247
+ `autorag models list --provider dazzi --available`), or the user's
248
+ `OPENROUTER_API_KEY` (`test -n "$OPENROUTER_API_KEY"`, never print it). Tell the
249
+ user Jev routing is on. Without a credential, routing falls back to a single
250
+ local search and the run always verifies, so searches still work. A
251
+ `query-route-fallback` diagnostic (`autorag search --debug`) shows that state.
243
252
 
244
253
  ```json
245
254
  {
@@ -309,6 +318,22 @@ and are never settable from model/tool arguments: `maxDocuments`,
309
318
  `bandwidthLimit`, and `dryRun` (cloud-drive/rclone). `maxContentChars` defaults
310
319
  to 20000 for RSS and 100000 for Spotlight and cloud-drive.
311
320
 
321
+ ### Refresh safety limits
322
+
323
+ `refresh` guards the parsed-mirror refresh against deleting a corpus because a
324
+ search root became unavailable. Every field is optional; unknown keys fail
325
+ config resolution.
326
+
327
+ | Field | Default | Controls |
328
+ |---|---|---|
329
+ | `maxDeleteRatio` | 0.3 | Largest share (0–1) of indexed documents one refresh may delete; a bigger deletion above 100 documents is suppressed (`mass-delete-suppressed`) unless the refresh is forced |
330
+ | `maxScannedEntries` | 2000000 | Directory entries examined per search root before `walk-truncated` |
331
+ | `maxDepth` | 64 | Deepest directory level walked below a root before `walk-truncated` |
332
+
333
+ A root that is missing, unlistable, or empty while it previously held documents
334
+ keeps its mirrors and reports `search-root-unavailable`; see
335
+ `docs/minsync-setup.md`.
336
+
312
337
  ## Probe and configure datasource skills (setup wizard)
313
338
 
314
339
  Use `autorag setup` to probe the local runtime, model profile, and known
@@ -1,2 +0,0 @@
1
- export { loadManifest, loadManifests } from "./loader.js";
2
- export type { StoreManifest } from "./types.js";
@@ -1,3 +0,0 @@
1
- import type { StoreManifest } from "./types.js";
2
- export declare function loadManifest(filePath: string): StoreManifest;
3
- export declare function loadManifests(dirPath: string): StoreManifest[];
@@ -1,8 +0,0 @@
1
- export interface StoreManifest {
2
- name: string;
3
- description: string;
4
- type: "vector" | "bm25" | "hybrid" | "visual";
5
- dataDescription: string;
6
- contentTypes: string[];
7
- config: Record<string, unknown>;
8
- }