@oneentry/mcp-platform-server 0.1.1 → 0.1.4
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/LICENSE +21 -0
- package/README.md +62 -61
- package/dist/api/audit.d.ts +0 -11
- package/dist/api/audit.js +0 -10
- package/dist/api/auth.d.ts +0 -18
- package/dist/api/auth.js +0 -20
- package/dist/api/build-catalog.d.ts +1 -14
- package/dist/api/build-catalog.js +16 -77
- package/dist/api/catalog.d.ts +5 -27
- package/dist/api/catalog.d.ts.map +1 -1
- package/dist/api/catalog.js +31 -43
- package/dist/api/catalog.js.map +1 -1
- package/dist/api/client.d.ts +0 -24
- package/dist/api/client.js +6 -28
- package/dist/api/normalize-schema.d.ts +0 -11
- package/dist/api/normalize-schema.js +0 -18
- package/dist/api/policy.d.ts +0 -23
- package/dist/api/policy.js +0 -0
- package/dist/api/shape.d.ts +0 -13
- package/dist/api/shape.js +0 -21
- package/dist/api/swagger-source.d.ts +13 -12
- package/dist/api/swagger-source.js +93 -50
- package/dist/api/types.d.ts +0 -34
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js +0 -1
- package/dist/bin/cli.d.ts +0 -1
- package/dist/bin/cli.js +1 -5
- package/dist/bin/cli.js.map +1 -1
- package/dist/config/config.d.ts +0 -54
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +0 -60
- package/dist/config/config.js.map +1 -1
- package/dist/index.d.ts +2 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -6
- package/dist/index.js.map +1 -1
- package/dist/knowledge/chunk.d.ts +0 -15
- package/dist/knowledge/chunk.js +0 -16
- package/dist/knowledge/github.d.ts +0 -25
- package/dist/knowledge/github.js +0 -40
- package/dist/knowledge/loader.d.ts +0 -28
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +0 -26
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/knowledge/search.d.ts +0 -22
- package/dist/knowledge/search.d.ts.map +1 -1
- package/dist/knowledge/search.js +0 -34
- package/dist/knowledge/search.js.map +1 -1
- package/dist/knowledge/tar.d.ts +0 -15
- package/dist/knowledge/tar.js +0 -33
- package/dist/knowledge/types.d.ts +0 -35
- package/dist/knowledge/types.d.ts.map +1 -1
- package/dist/knowledge/types.js +0 -1
- package/dist/server.d.ts +0 -12
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +29 -15
- package/dist/server.js.map +1 -1
- package/dist/session.d.ts +0 -23
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +0 -18
- package/dist/session.js.map +1 -1
- package/dist/tools/api-call.d.ts +0 -2
- package/dist/tools/api-call.js +0 -23
- package/dist/tools/api-discovery.d.ts +0 -2
- package/dist/tools/api-discovery.js +2 -5
- package/dist/tools/docs.d.ts +0 -2
- package/dist/tools/docs.js +1 -5
- package/dist/tools/guide.d.ts +0 -7
- package/dist/tools/guide.d.ts.map +1 -1
- package/dist/tools/guide.js +2 -9
- package/dist/tools/guide.js.map +1 -1
- package/dist/tools/result.d.ts +0 -8
- package/dist/tools/result.js +0 -7
- package/dist/tools/whoami.d.ts +0 -2
- package/dist/tools/whoami.d.ts.map +1 -1
- package/dist/tools/whoami.js +1 -3
- package/dist/tools/whoami.js.map +1 -1
- package/dist/transports/http.d.ts +0 -6
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +1 -27
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/stdio.d.ts +0 -6
- package/dist/transports/stdio.js +0 -6
- package/dist/transports/stdio.js.map +1 -1
- package/knowledge/operating-rules.md +70 -125
- package/package.json +18 -5
- package/dist/api/build-catalog.d.ts.map +0 -1
- package/dist/api/build-catalog.js.map +0 -1
- package/dist/api/normalize-schema.d.ts.map +0 -1
- package/dist/api/normalize-schema.js.map +0 -1
- package/dist/api/swagger-source.d.ts.map +0 -1
- package/dist/api/swagger-source.js.map +0 -1
- package/dist/knowledge/github.d.ts.map +0 -1
- package/dist/knowledge/github.js.map +0 -1
- package/dist/knowledge/tar.d.ts.map +0 -1
- package/dist/knowledge/tar.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Публичный API пакета: всё, что нужно, чтобы встроить сервер в свой процесс
|
|
3
|
-
* или собрать его иначе, чем это делает CLI.
|
|
4
|
-
*/
|
|
5
1
|
export { loadConfig, parseFlags, normalizeBaseUrl, ConfigSchema } from './config/config.js';
|
|
6
2
|
export { createServer, createSharedDeps } from './server.js';
|
|
7
3
|
export { Session } from './session.js';
|
|
@@ -16,7 +12,6 @@ export { packFromFiles, resolveKnowledge, seedPack } from './knowledge/loader.js
|
|
|
16
12
|
export { fetchKnowledgeTree, readLocalTree } from './knowledge/github.js';
|
|
17
13
|
export { readTar, readTarGz } from './knowledge/tar.js';
|
|
18
14
|
export { buildCatalog } from './api/build-catalog.js';
|
|
19
|
-
export { fetchSwagger } from './api/swagger-source.js';
|
|
15
|
+
export { fetchSwagger, nestSwaggerUrl, nodeSwaggerUrl, swaggerAttempts } from './api/swagger-source.js';
|
|
20
16
|
export { runStdio } from './transports/stdio.js';
|
|
21
17
|
export { runHttp } from './transports/http.js';
|
|
22
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE5F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE5F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,27 +1,13 @@
|
|
|
1
1
|
import type { KnowledgeChunk, KnowledgeDoc } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Слаг заголовка в стиле GitHub: нижний регистр, пробелы в дефисы,
|
|
4
|
-
* пунктуация выброшена. Кириллица сохраняется — документация в проекте русскоязычная.
|
|
5
|
-
*/
|
|
6
2
|
export declare const slugify: (heading: string) => string;
|
|
7
3
|
interface Section {
|
|
8
4
|
title: string;
|
|
9
5
|
lines: string[];
|
|
10
6
|
}
|
|
11
|
-
/**
|
|
12
|
-
* Режет markdown по заголовкам `##` и `###`.
|
|
13
|
-
* Преамбула до первого `##` становится разделом с пустым anchor — в ней обычно
|
|
14
|
-
* лежит самое важное описание модуля, терять его нельзя.
|
|
15
|
-
*/
|
|
16
7
|
export declare const splitSections: (markdown: string) => {
|
|
17
8
|
docTitle: string;
|
|
18
9
|
sections: Section[];
|
|
19
10
|
};
|
|
20
|
-
/**
|
|
21
|
-
* Превращает один markdown-файл в документ + его разделы.
|
|
22
|
-
* Anchor'ы дедуплицируются суффиксом, иначе два одинаковых `## Схема`
|
|
23
|
-
* в одном файле стали бы неразличимы для cms_docs_read.
|
|
24
|
-
*/
|
|
25
11
|
export declare const chunkDocument: (params: {
|
|
26
12
|
docId: string;
|
|
27
13
|
repo: KnowledgeChunk["repo"];
|
|
@@ -32,4 +18,3 @@ export declare const chunkDocument: (params: {
|
|
|
32
18
|
chunks: KnowledgeChunk[];
|
|
33
19
|
};
|
|
34
20
|
export {};
|
|
35
|
-
//# sourceMappingURL=chunk.d.ts.map
|
package/dist/knowledge/chunk.js
CHANGED
|
@@ -1,20 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Слаг заголовка в стиле GitHub: нижний регистр, пробелы в дефисы,
|
|
3
|
-
* пунктуация выброшена. Кириллица сохраняется — документация в проекте русскоязычная.
|
|
4
|
-
*/
|
|
5
1
|
export const slugify = (heading) => heading
|
|
6
2
|
.toLowerCase()
|
|
7
3
|
.replace(/`|\*|_|\[|\]|\(|\)|:|,|\.|\/|\\|«|»|"|'|\?|!|;/g, '')
|
|
8
4
|
.trim()
|
|
9
5
|
.replace(/\s+/g, '-')
|
|
10
6
|
.slice(0, 80);
|
|
11
|
-
/** Строки внутри огороженных блоков кода не считаются заголовками. */
|
|
12
7
|
const isFence = (line) => line.startsWith('```') || line.startsWith('~~~');
|
|
13
|
-
/**
|
|
14
|
-
* Режет markdown по заголовкам `##` и `###`.
|
|
15
|
-
* Преамбула до первого `##` становится разделом с пустым anchor — в ней обычно
|
|
16
|
-
* лежит самое важное описание модуля, терять его нельзя.
|
|
17
|
-
*/
|
|
18
8
|
export const splitSections = (markdown) => {
|
|
19
9
|
const lines = markdown.split('\n');
|
|
20
10
|
let docTitle = '';
|
|
@@ -43,11 +33,6 @@ export const splitSections = (markdown) => {
|
|
|
43
33
|
sections: sections.filter((s) => s.title !== '' || s.lines.join('').trim() !== ''),
|
|
44
34
|
};
|
|
45
35
|
};
|
|
46
|
-
/**
|
|
47
|
-
* Превращает один markdown-файл в документ + его разделы.
|
|
48
|
-
* Anchor'ы дедуплицируются суффиксом, иначе два одинаковых `## Схема`
|
|
49
|
-
* в одном файле стали бы неразличимы для cms_docs_read.
|
|
50
|
-
*/
|
|
51
36
|
export const chunkDocument = (params) => {
|
|
52
37
|
const { docTitle, sections } = splitSections(params.markdown);
|
|
53
38
|
const seen = new Map();
|
|
@@ -84,4 +69,3 @@ export const chunkDocument = (params) => {
|
|
|
84
69
|
chunks,
|
|
85
70
|
};
|
|
86
71
|
};
|
|
87
|
-
//# sourceMappingURL=chunk.js.map
|
|
@@ -1,46 +1,21 @@
|
|
|
1
|
-
/** Откуда и как забирать репозиторий знаний. */
|
|
2
1
|
export interface KnowledgeSource {
|
|
3
|
-
/** `owner/name` публичного репозитория GitHub. */
|
|
4
2
|
repo: string;
|
|
5
|
-
/** Ветка, тег или sha. */
|
|
6
3
|
ref: string;
|
|
7
4
|
cacheDir: string;
|
|
8
|
-
/** Как долго считать закэшированный sha свежим, не спрашивая GitHub. */
|
|
9
5
|
refreshTtlMs: number;
|
|
10
|
-
/** Не ходить в сеть вовсе: только кэш. */
|
|
11
6
|
offline: boolean;
|
|
12
|
-
/** Токен GitHub — только чтобы поднять лимит API; репозиторий публичный. */
|
|
13
7
|
token?: string;
|
|
14
8
|
timeoutMs: number;
|
|
15
9
|
}
|
|
16
|
-
/** Файл документации, вынутый из репозитория. */
|
|
17
10
|
export interface KnowledgeFile {
|
|
18
|
-
/** Путь относительно каталога `knowledge/`, например `back/docs/menus-module.md`. */
|
|
19
11
|
path: string;
|
|
20
12
|
content: string;
|
|
21
13
|
}
|
|
22
|
-
/** Результат получения дерева знаний. */
|
|
23
14
|
export interface KnowledgeTree {
|
|
24
15
|
files: KnowledgeFile[];
|
|
25
16
|
sha: string;
|
|
26
|
-
/** `github` — только что скачано, `cache` — взято с диска. */
|
|
27
17
|
source: 'github' | 'cache';
|
|
28
18
|
}
|
|
29
|
-
/** Рекурсивно собирает `*.md` каталога. Используется и кэшем, и локальным клоном. */
|
|
30
19
|
export declare const walkMarkdown: (root: string) => string[];
|
|
31
|
-
/**
|
|
32
|
-
* Отдаёт дерево знаний, предпочитая кэш.
|
|
33
|
-
* Порядок такой: свежий кэш -> сверка sha -> скачивание. Пока запись кэша моложе
|
|
34
|
-
* `refreshTtlMs`, сеть не трогается вообще — иначе цикл перезапусков сервера
|
|
35
|
-
* упирался бы в лимит анонимного API GitHub.
|
|
36
|
-
* Бросает исключение, если знания взять неоткуда; решение о запасном варианте
|
|
37
|
-
* принимает вызывающий.
|
|
38
|
-
*/
|
|
39
20
|
export declare const fetchKnowledgeTree: (source: KnowledgeSource) => Promise<KnowledgeTree>;
|
|
40
|
-
/**
|
|
41
|
-
* Читает знания из локального клона репозитория.
|
|
42
|
-
* Принимает и корень клона, и сам каталог `knowledge/` — путать их слишком легко,
|
|
43
|
-
* а разница видна по наличию подкаталога.
|
|
44
|
-
*/
|
|
45
21
|
export declare const readLocalTree: (path: string) => KnowledgeFile[];
|
|
46
|
-
//# sourceMappingURL=github.d.ts.map
|
package/dist/knowledge/github.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
3
3
|
import { readTarGz } from './tar.js';
|
|
4
|
-
/** Каталог внутри репозитория, в котором лежит документация. */
|
|
5
4
|
const ROOT = 'knowledge';
|
|
6
5
|
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
7
|
-
/** Каталог кэша одного репозитория. Слэш в имени заменён, чтобы это был один уровень. */
|
|
8
6
|
const repoCacheDir = (source) => resolve(source.cacheDir, source.repo.replace('/', '--'));
|
|
9
7
|
const stateFile = (source) => join(repoCacheDir(source), 'current.json');
|
|
10
8
|
const readState = (source) => {
|
|
@@ -26,7 +24,6 @@ const writeState = (source, state) => {
|
|
|
26
24
|
mkdirSync(repoCacheDir(source), { recursive: true });
|
|
27
25
|
writeFileSync(stateFile(source), `${JSON.stringify(state)}\n`);
|
|
28
26
|
};
|
|
29
|
-
/** Рекурсивно собирает `*.md` каталога. Используется и кэшем, и локальным клоном. */
|
|
30
27
|
export const walkMarkdown = (root) => {
|
|
31
28
|
const out = [];
|
|
32
29
|
const visit = (dir) => {
|
|
@@ -52,7 +49,6 @@ const exists = (path) => {
|
|
|
52
49
|
return false;
|
|
53
50
|
}
|
|
54
51
|
};
|
|
55
|
-
/** Читает распакованное дерево из кэша. */
|
|
56
52
|
const readCached = (source, sha) => {
|
|
57
53
|
const dir = join(repoCacheDir(source), sha, ROOT);
|
|
58
54
|
if (!exists(dir)) {
|
|
@@ -63,11 +59,6 @@ const readCached = (source, sha) => {
|
|
|
63
59
|
content: readFileSync(file, 'utf8'),
|
|
64
60
|
}));
|
|
65
61
|
};
|
|
66
|
-
/**
|
|
67
|
-
* Записывает дерево в кэш и удаляет каталоги остальных sha.
|
|
68
|
-
* Кэш адресуется коммитом, поэтому старые версии не нужны никогда:
|
|
69
|
-
* запись неизменяема, и «протухнуть» она не может.
|
|
70
|
-
*/
|
|
71
62
|
const writeCache = (source, sha, files) => {
|
|
72
63
|
const base = repoCacheDir(source);
|
|
73
64
|
const target = join(base, sha, ROOT);
|
|
@@ -87,11 +78,6 @@ const headers = (source, accept) => ({
|
|
|
87
78
|
'user-agent': 'oneentry-mcp-platform',
|
|
88
79
|
...(source.token ? { authorization: `Bearer ${source.token}` } : {}),
|
|
89
80
|
});
|
|
90
|
-
/**
|
|
91
|
-
* Расшифровывает код ответа GitHub в причину, по которой ref не превратился в коммит.
|
|
92
|
-
* Голый статус здесь бесполезен: 404 и 409 — это разные ошибки настройки, и обе
|
|
93
|
-
* встречаются при первом подключении к новому репозиторию знаний.
|
|
94
|
-
*/
|
|
95
81
|
const shaFailureHint = (status) => {
|
|
96
82
|
switch (status) {
|
|
97
83
|
case 403: {
|
|
@@ -108,10 +94,6 @@ const shaFailureHint = (status) => {
|
|
|
108
94
|
}
|
|
109
95
|
}
|
|
110
96
|
};
|
|
111
|
-
/**
|
|
112
|
-
* Превращает ref в конкретный коммит. Ответ — голый sha, поэтому запрос дешёвый:
|
|
113
|
-
* его можно делать при каждом запуске, не скачивая архив.
|
|
114
|
-
*/
|
|
115
97
|
const resolveSha = async (source) => {
|
|
116
98
|
const url = `https://api.github.com/repos/${source.repo}/commits/${encodeURIComponent(source.ref)}`;
|
|
117
99
|
const response = await fetch(url, {
|
|
@@ -128,11 +110,6 @@ const resolveSha = async (source) => {
|
|
|
128
110
|
}
|
|
129
111
|
return sha;
|
|
130
112
|
};
|
|
131
|
-
/**
|
|
132
|
-
* Отбирает из архива только документацию.
|
|
133
|
-
* Всё, что вне `knowledge/`, и любой путь с `..` отбрасываются: архив приходит
|
|
134
|
-
* из сети, и он не должен решать, куда мы пишем.
|
|
135
|
-
*/
|
|
136
113
|
const selectDocs = (entries) => {
|
|
137
114
|
const prefix = `${ROOT}/`;
|
|
138
115
|
return entries
|
|
@@ -141,7 +118,6 @@ const selectDocs = (entries) => {
|
|
|
141
118
|
!entry.path.split('/').includes('..'))
|
|
142
119
|
.map((entry) => ({ path: entry.path.slice(prefix.length), content: entry.content }));
|
|
143
120
|
};
|
|
144
|
-
/** Скачивает архив репозитория на конкретном коммите. Один запрос, лимитов API нет. */
|
|
145
121
|
const download = async (source, sha) => {
|
|
146
122
|
const url = `https://codeload.github.com/${source.repo}/tar.gz/${sha}`;
|
|
147
123
|
const response = await fetch(url, {
|
|
@@ -157,18 +133,9 @@ const download = async (source, sha) => {
|
|
|
157
133
|
}
|
|
158
134
|
return files;
|
|
159
135
|
};
|
|
160
|
-
/**
|
|
161
|
-
* Отдаёт дерево знаний, предпочитая кэш.
|
|
162
|
-
* Порядок такой: свежий кэш -> сверка sha -> скачивание. Пока запись кэша моложе
|
|
163
|
-
* `refreshTtlMs`, сеть не трогается вообще — иначе цикл перезапусков сервера
|
|
164
|
-
* упирался бы в лимит анонимного API GitHub.
|
|
165
|
-
* Бросает исключение, если знания взять неоткуда; решение о запасном варианте
|
|
166
|
-
* принимает вызывающий.
|
|
167
|
-
*/
|
|
168
136
|
export const fetchKnowledgeTree = async (source) => {
|
|
169
137
|
const state = readState(source);
|
|
170
138
|
const files = state && state.ref === source.ref ? readCached(source, state.sha) : undefined;
|
|
171
|
-
/** Кэш годен только целиком: и запись о коммите, и распакованное дерево. */
|
|
172
139
|
const cache = state && files ? { state, files } : undefined;
|
|
173
140
|
if (cache && (source.offline || Date.now() - cache.state.checkedAt < source.refreshTtlMs)) {
|
|
174
141
|
return { files: cache.files, sha: cache.state.sha, source: 'cache' };
|
|
@@ -182,7 +149,6 @@ export const fetchKnowledgeTree = async (source) => {
|
|
|
182
149
|
}
|
|
183
150
|
catch (error) {
|
|
184
151
|
if (cache) {
|
|
185
|
-
/** Сеть недоступна, но кэш есть — работаем на нём, это не отказ. */
|
|
186
152
|
return { files: cache.files, sha: cache.state.sha, source: 'cache' };
|
|
187
153
|
}
|
|
188
154
|
throw error;
|
|
@@ -196,11 +162,6 @@ export const fetchKnowledgeTree = async (source) => {
|
|
|
196
162
|
writeState(source, { ref: source.ref, sha, checkedAt: Date.now() });
|
|
197
163
|
return { files: downloaded, sha, source: 'github' };
|
|
198
164
|
};
|
|
199
|
-
/**
|
|
200
|
-
* Читает знания из локального клона репозитория.
|
|
201
|
-
* Принимает и корень клона, и сам каталог `knowledge/` — путать их слишком легко,
|
|
202
|
-
* а разница видна по наличию подкаталога.
|
|
203
|
-
*/
|
|
204
165
|
export const readLocalTree = (path) => {
|
|
205
166
|
const root = exists(join(path, ROOT)) ? join(path, ROOT) : path;
|
|
206
167
|
if (!exists(root)) {
|
|
@@ -211,4 +172,3 @@ export const readLocalTree = (path) => {
|
|
|
211
172
|
content: readFileSync(file, 'utf8'),
|
|
212
173
|
}));
|
|
213
174
|
};
|
|
214
|
-
//# sourceMappingURL=github.js.map
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { type KnowledgeFile } from './github.js';
|
|
2
2
|
import type { KnowledgeOrigin, KnowledgePack } from './types.js';
|
|
3
|
-
/** Настройки источника знаний, как их отдаёт конфигурация. */
|
|
4
3
|
export interface KnowledgeConfig {
|
|
5
4
|
repo: string;
|
|
6
5
|
ref: string;
|
|
7
|
-
/** Локальный клон репозитория знаний: приоритетнее сети. */
|
|
8
6
|
path?: string;
|
|
9
7
|
cacheDir: string;
|
|
10
8
|
refreshTtlMs: number;
|
|
@@ -12,22 +10,9 @@ export interface KnowledgeConfig {
|
|
|
12
10
|
token?: string;
|
|
13
11
|
timeoutMs: number;
|
|
14
12
|
}
|
|
15
|
-
/** Каталог с вшитым минимумом знаний (`operating-rules.md`). */
|
|
16
13
|
export declare const seedDir: () => string;
|
|
17
|
-
/** Каталог со сгенерированными данными пакета (`permissions.json`). */
|
|
18
14
|
export declare const dataDir: () => string;
|
|
19
|
-
/**
|
|
20
|
-
* docId из пути внутри `knowledge/`.
|
|
21
|
-
* `<имя>/index.md` даёт docId `<имя>`: это позволяет разрезать большой документ
|
|
22
|
-
* на каталог из мелких файлов, не меняя идентификатор, на который уже ссылаются
|
|
23
|
-
* `docLinks` каталога операций и золотые запросы тестов.
|
|
24
|
-
*/
|
|
25
15
|
export declare const docIdFromPath: (path: string) => string;
|
|
26
|
-
/**
|
|
27
|
-
* Собирает пакет знаний из плоского списка файлов.
|
|
28
|
-
* Один вход для всех трёх источников — сети, кэша и локального клона, — поэтому
|
|
29
|
-
* поведение поиска не может разойтись между ними.
|
|
30
|
-
*/
|
|
31
16
|
export declare const packFromFiles: (params: {
|
|
32
17
|
files: readonly KnowledgeFile[];
|
|
33
18
|
source: KnowledgeOrigin;
|
|
@@ -37,18 +22,5 @@ export declare const packFromFiles: (params: {
|
|
|
37
22
|
sha?: string;
|
|
38
23
|
warning?: string;
|
|
39
24
|
}) => KnowledgePack;
|
|
40
|
-
/**
|
|
41
|
-
* Вшитый минимум: собственные правила эксплуатации пакета.
|
|
42
|
-
* Существует только затем, чтобы сервер без сети всё равно мог ответить на вопрос
|
|
43
|
-
* «как безопасно писать в эту CMS». Всё остальное живёт в репозитории знаний.
|
|
44
|
-
*/
|
|
45
25
|
export declare const seedPack: (warning?: string) => KnowledgePack;
|
|
46
|
-
/**
|
|
47
|
-
* Выбирает источник знаний: локальный клон -> GitHub (через кэш) -> вшитый минимум.
|
|
48
|
-
* Недоступный GitHub не мешает серверу подняться: пакет беднеет до вшитого минимума,
|
|
49
|
-
* а причина уезжает в `warning`, потому что сеть — не ошибка конфигурации.
|
|
50
|
-
* Единственное исключение бросается на нечитаемый локальный путь: его оператор указал
|
|
51
|
-
* явно, и молчаливое падение до вшитых правил выглядело бы как пустой корпус.
|
|
52
|
-
*/
|
|
53
26
|
export declare const resolveKnowledge: (config: KnowledgeConfig) => Promise<KnowledgePack>;
|
|
54
|
-
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/knowledge/loader.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/knowledge/loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgC,aAAa,EAAE,MAAM,YAAY,CAAC;AAsF9E,2EAA2E;AAC3E,eAAO,MAAM,eAAe,QAAO,MACuC,CAAC;AAE3E,2EAA2E;AAC3E,eAAO,MAAM,OAAO,QAAO,MAC0C,CAAC;AAEtE;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,QAAQ;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB,KAAG,aA0BH,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,YAAY,QAAO,aAO/B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,aAUH,CAAC"}
|
package/dist/knowledge/loader.js
CHANGED
|
@@ -4,22 +4,9 @@ import { fileURLToPath } from 'node:url';
|
|
|
4
4
|
import { chunkDocument } from './chunk.js';
|
|
5
5
|
import { fetchKnowledgeTree, readLocalTree } from './github.js';
|
|
6
6
|
const messageOf = (error) => error instanceof Error ? error.message : String(error);
|
|
7
|
-
/** Каталог с вшитым минимумом знаний (`operating-rules.md`). */
|
|
8
7
|
export const seedDir = () => resolve(fileURLToPath(new URL('.', import.meta.url)), '../../knowledge');
|
|
9
|
-
/** Каталог со сгенерированными данными пакета (`permissions.json`). */
|
|
10
8
|
export const dataDir = () => resolve(fileURLToPath(new URL('.', import.meta.url)), '../../data');
|
|
11
|
-
/**
|
|
12
|
-
* docId из пути внутри `knowledge/`.
|
|
13
|
-
* `<имя>/index.md` даёт docId `<имя>`: это позволяет разрезать большой документ
|
|
14
|
-
* на каталог из мелких файлов, не меняя идентификатор, на который уже ссылаются
|
|
15
|
-
* `docLinks` каталога операций и золотые запросы тестов.
|
|
16
|
-
*/
|
|
17
9
|
export const docIdFromPath = (path) => path.replace(/\.md$/, '').replace(/\/index$/, '');
|
|
18
|
-
/**
|
|
19
|
-
* Собирает пакет знаний из плоского списка файлов.
|
|
20
|
-
* Один вход для всех трёх источников — сети, кэша и локального клона, — поэтому
|
|
21
|
-
* поведение поиска не может разойтись между ними.
|
|
22
|
-
*/
|
|
23
10
|
export const packFromFiles = (params) => {
|
|
24
11
|
const docs = [];
|
|
25
12
|
const chunks = [];
|
|
@@ -46,11 +33,6 @@ export const packFromFiles = (params) => {
|
|
|
46
33
|
chunks,
|
|
47
34
|
};
|
|
48
35
|
};
|
|
49
|
-
/**
|
|
50
|
-
* Вшитый минимум: собственные правила эксплуатации пакета.
|
|
51
|
-
* Существует только затем, чтобы сервер без сети всё равно мог ответить на вопрос
|
|
52
|
-
* «как безопасно писать в эту CMS». Всё остальное живёт в репозитории знаний.
|
|
53
|
-
*/
|
|
54
36
|
export const seedPack = (warning) => packFromFiles({
|
|
55
37
|
files: [
|
|
56
38
|
{
|
|
@@ -62,13 +44,6 @@ export const seedPack = (warning) => packFromFiles({
|
|
|
62
44
|
builtAt: new Date().toISOString(),
|
|
63
45
|
...(warning ? { warning } : {}),
|
|
64
46
|
});
|
|
65
|
-
/**
|
|
66
|
-
* Выбирает источник знаний: локальный клон -> GitHub (через кэш) -> вшитый минимум.
|
|
67
|
-
* Недоступный GitHub не мешает серверу подняться: пакет беднеет до вшитого минимума,
|
|
68
|
-
* а причина уезжает в `warning`, потому что сеть — не ошибка конфигурации.
|
|
69
|
-
* Единственное исключение бросается на нечитаемый локальный путь: его оператор указал
|
|
70
|
-
* явно, и молчаливое падение до вшитых правил выглядело бы как пустой корпус.
|
|
71
|
-
*/
|
|
72
47
|
export const resolveKnowledge = async (config) => {
|
|
73
48
|
const builtAt = new Date().toISOString();
|
|
74
49
|
if (config.path) {
|
|
@@ -109,4 +84,3 @@ export const resolveKnowledge = async (config) => {
|
|
|
109
84
|
'Only the bundled operating rules are available — module reference docs will not be found.');
|
|
110
85
|
}
|
|
111
86
|
};
|
|
112
|
-
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/knowledge/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/knowledge/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { KnowledgeChunk, KnowledgeDoc, KnowledgePack } from './types.js';
|
|
2
|
-
/** Найденный раздел с оценкой и вырезкой вокруг совпадения. */
|
|
3
2
|
export interface KnowledgeHit {
|
|
4
3
|
id: string;
|
|
5
4
|
docId: string;
|
|
@@ -10,36 +9,15 @@ export interface KnowledgeHit {
|
|
|
10
9
|
score: number;
|
|
11
10
|
snippet: string;
|
|
12
11
|
}
|
|
13
|
-
/**
|
|
14
|
-
* Выбрасывает из запроса слова короче трёх букв.
|
|
15
|
-
* Заголовок весит вчетверо больше текста, поэтому раздел «Не входит в scope»
|
|
16
|
-
* выигрывал у описания модуля на вопросе «почему атрибут не попал в индекс»:
|
|
17
|
-
* два служебных слова совпадали с заголовком, а значащие — с телом. Предлоги и
|
|
18
|
-
* частицы (`не`, `в`, `на`, `of`, `to`) не несут смысла ни в русском запросе,
|
|
19
|
-
* ни в английском, и участвовать в ранжировании не должны.
|
|
20
|
-
* Если после отбора не осталось ничего, запрос возвращается как есть —
|
|
21
|
-
* поиск по одному короткому слову лучше поиска ни по чему.
|
|
22
|
-
*/
|
|
23
12
|
export declare const meaningfulQuery: (query: string) => string;
|
|
24
|
-
/**
|
|
25
|
-
* Поисковый индекс по разделам документации.
|
|
26
|
-
* Хранит только идентификаторы в индексе, а тексты — в отдельной карте:
|
|
27
|
-
* так `cms_docs_search` отдаёт вырезки, не поднимая в память дубли корпуса.
|
|
28
|
-
*/
|
|
29
13
|
export declare class KnowledgeIndex {
|
|
30
14
|
private readonly mini;
|
|
31
15
|
private readonly byId;
|
|
32
16
|
private readonly byDocId;
|
|
33
17
|
readonly pack: KnowledgePack;
|
|
34
18
|
constructor(pack: KnowledgePack);
|
|
35
|
-
/** Разделы документа в порядке следования — для листания в cms_docs_read. */
|
|
36
19
|
doc(docId: string): KnowledgeDoc | undefined;
|
|
37
20
|
chunk(id: string): KnowledgeChunk | undefined;
|
|
38
21
|
docs(): readonly KnowledgeDoc[];
|
|
39
|
-
/**
|
|
40
|
-
* Ищет разделы по запросу. Оценка minisearch домножается на веса источника и вида
|
|
41
|
-
* документа, поэтому правила эксплуатации всегда всплывают выше истории фиксов.
|
|
42
|
-
*/
|
|
43
22
|
search(query: string, limit?: number): KnowledgeHit[];
|
|
44
23
|
}
|
|
45
|
-
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/knowledge/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9E,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAiCD
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/knowledge/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9E,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAiCD;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;gBAEjB,IAAI,EAAE,aAAa;IAkB/B,6EAA6E;IAC7E,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5C,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C,IAAI,IAAI,SAAS,YAAY,EAAE;IAI/B;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE;CAwBjD"}
|
package/dist/knowledge/search.js
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
import MiniSearch from 'minisearch';
|
|
2
|
-
/**
|
|
3
|
-
* Веса источников. `mcp` — собственные правила эксплуатации, они всегда должны
|
|
4
|
-
* побеждать первичную документацию; `fixes` — история багов, полезна, но шумна,
|
|
5
|
-
* поэтому опускается вниз, чтобы не вытеснять описание модуля.
|
|
6
|
-
*/
|
|
7
2
|
const REPO_WEIGHT = { mcp: 1.6, back: 1, front: 0.9 };
|
|
8
3
|
const KIND_WEIGHT = {
|
|
9
4
|
docs: 1.15,
|
|
@@ -12,13 +7,6 @@ const KIND_WEIGHT = {
|
|
|
12
7
|
fixes: 0.6,
|
|
13
8
|
specs: 0.6,
|
|
14
9
|
};
|
|
15
|
-
/**
|
|
16
|
-
* Вид документа. Обычно это второй сегмент docId (`back/docs/…` -> `docs`),
|
|
17
|
-
* но каталог `specs` третьим сегментом разбирается отдельно: это датированные
|
|
18
|
-
* описания задач и merge request'ов. По форме документация, по сути — та же история изменений,
|
|
19
|
-
* что и `fixes`: длинная прозаическая, богатая случайными совпадениями и
|
|
20
|
-
* вытесняющая описание модуля. Вес у них поэтому такой же.
|
|
21
|
-
*/
|
|
22
10
|
const kindOf = (docId) => {
|
|
23
11
|
const parts = docId.split('/');
|
|
24
12
|
if (parts[2] === 'specs') {
|
|
@@ -27,21 +15,10 @@ const kindOf = (docId) => {
|
|
|
27
15
|
return parts[1] ?? 'docs';
|
|
28
16
|
};
|
|
29
17
|
const SNIPPET_RADIUS = 180;
|
|
30
|
-
/**
|
|
31
|
-
* Выбрасывает из запроса слова короче трёх букв.
|
|
32
|
-
* Заголовок весит вчетверо больше текста, поэтому раздел «Не входит в scope»
|
|
33
|
-
* выигрывал у описания модуля на вопросе «почему атрибут не попал в индекс»:
|
|
34
|
-
* два служебных слова совпадали с заголовком, а значащие — с телом. Предлоги и
|
|
35
|
-
* частицы (`не`, `в`, `на`, `of`, `to`) не несут смысла ни в русском запросе,
|
|
36
|
-
* ни в английском, и участвовать в ранжировании не должны.
|
|
37
|
-
* Если после отбора не осталось ничего, запрос возвращается как есть —
|
|
38
|
-
* поиск по одному короткому слову лучше поиска ни по чему.
|
|
39
|
-
*/
|
|
40
18
|
export const meaningfulQuery = (query) => {
|
|
41
19
|
const kept = query.split(/\s+/).filter((word) => word.replace(/[^\p{L}\p{N}]/gu, '').length > 2);
|
|
42
20
|
return kept.length > 0 ? kept.join(' ') : query;
|
|
43
21
|
};
|
|
44
|
-
/** Вырезка вокруг первого совпавшего терма; при отсутствии — начало раздела. */
|
|
45
22
|
const makeSnippet = (text, terms) => {
|
|
46
23
|
const flat = text.replace(/\s+/g, ' ').trim();
|
|
47
24
|
const lower = flat.toLowerCase();
|
|
@@ -59,11 +36,6 @@ const makeSnippet = (text, terms) => {
|
|
|
59
36
|
const end = Math.min(flat.length, at + SNIPPET_RADIUS);
|
|
60
37
|
return `${start > 0 ? '…' : ''}${flat.slice(start, end)}${end < flat.length ? '…' : ''}`;
|
|
61
38
|
};
|
|
62
|
-
/**
|
|
63
|
-
* Поисковый индекс по разделам документации.
|
|
64
|
-
* Хранит только идентификаторы в индексе, а тексты — в отдельной карте:
|
|
65
|
-
* так `cms_docs_search` отдаёт вырезки, не поднимая в память дубли корпуса.
|
|
66
|
-
*/
|
|
67
39
|
export class KnowledgeIndex {
|
|
68
40
|
mini;
|
|
69
41
|
byId;
|
|
@@ -86,7 +58,6 @@ export class KnowledgeIndex {
|
|
|
86
58
|
});
|
|
87
59
|
this.mini.addAll(pack.chunks);
|
|
88
60
|
}
|
|
89
|
-
/** Разделы документа в порядке следования — для листания в cms_docs_read. */
|
|
90
61
|
doc(docId) {
|
|
91
62
|
return this.byDocId.get(docId);
|
|
92
63
|
}
|
|
@@ -96,10 +67,6 @@ export class KnowledgeIndex {
|
|
|
96
67
|
docs() {
|
|
97
68
|
return this.pack.docs;
|
|
98
69
|
}
|
|
99
|
-
/**
|
|
100
|
-
* Ищет разделы по запросу. Оценка minisearch домножается на веса источника и вида
|
|
101
|
-
* документа, поэтому правила эксплуатации всегда всплывают выше истории фиксов.
|
|
102
|
-
*/
|
|
103
70
|
search(query, limit = 8) {
|
|
104
71
|
const terms = query.split(/\s+/).filter((t) => t.length > 1);
|
|
105
72
|
const raw = this.mini.search(meaningfulQuery(query));
|
|
@@ -125,4 +92,3 @@ export class KnowledgeIndex {
|
|
|
125
92
|
return hits.slice(0, limit);
|
|
126
93
|
}
|
|
127
94
|
}
|
|
128
|
-
//# sourceMappingURL=search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/knowledge/search.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAepC;;;;GAIG;AACH,MAAM,WAAW,GAA2B,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC9E,MAAM,WAAW,GAA2B
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/knowledge/search.ts"],"names":[],"mappings":"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"}
|
package/dist/knowledge/tar.d.ts
CHANGED
|
@@ -1,22 +1,7 @@
|
|
|
1
|
-
/** Один распакованный файл архива. */
|
|
2
1
|
export interface TarEntry {
|
|
3
|
-
/** Путь внутри архива, уже без корневого каталога. */
|
|
4
2
|
path: string;
|
|
5
3
|
content: string;
|
|
6
4
|
}
|
|
7
|
-
/**
|
|
8
|
-
* Разбирает несжатый tar и возвращает только обычные файлы.
|
|
9
|
-
* Своя реализация вместо зависимости: пакету нужен один сценарий чтения,
|
|
10
|
-
* а каждая зависимость опубликованного npm-пакета — это ещё одна поверхность атаки.
|
|
11
|
-
* Поддержаны оба способа записать длинный путь: расширенный заголовок pax
|
|
12
|
-
* (`git archive`, а значит и GitHub) и GNU longname.
|
|
13
|
-
*/
|
|
14
5
|
export declare const readTar: (buffer: Buffer) => TarEntry[];
|
|
15
|
-
/**
|
|
16
|
-
* Убирает общий первый сегмент пути. GitHub кладёт весь архив в каталог
|
|
17
|
-
* `<repo>-<sha>/`, и без этого docId у каждого документа начинался бы с хэша коммита.
|
|
18
|
-
*/
|
|
19
6
|
export declare const stripRoot: (entries: readonly TarEntry[]) => TarEntry[];
|
|
20
|
-
/** Распаковывает `.tar.gz` целиком: gzip снимается встроенным zlib. */
|
|
21
7
|
export declare const readTarGz: (buffer: Buffer) => TarEntry[];
|
|
22
|
-
//# sourceMappingURL=tar.d.ts.map
|