dsh-locator 0.1.0 → 0.2.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.
- package/CHANGELOG.md +14 -1
- package/README-zh.md +13 -3
- package/README.md +13 -3
- package/bin/darwin-arm64/indexd +0 -0
- package/bin/darwin-x64/indexd +0 -0
- package/bin/linux-arm64/indexd +0 -0
- package/bin/linux-x64/indexd +0 -0
- package/bin/win32-arm64/indexd.exe +0 -0
- package/bin/win32-x64/indexd.exe +0 -0
- package/lib/export.d.ts +13 -0
- package/lib/export.d.ts.map +1 -0
- package/lib/export.js +141 -0
- package/lib/export.js.map +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/runtime.d.ts +17 -0
- package/lib/runtime.d.ts.map +1 -1
- package/lib/runtime.js +15 -0
- package/lib/runtime.js.map +1 -1
- package/package.json +1 -1
- package/src/export.ts +140 -0
- package/src/index.ts +2 -0
- package/src/runtime.ts +32 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.1 — 2026-11-09
|
|
4
|
+
|
|
5
|
+
* Rebuild `lib/` before packing: 0.2.0's npm tarball was built from a stale
|
|
6
|
+
`lib/` and did not contain `lib/export.js`. No source change.
|
|
7
|
+
|
|
8
|
+
## 0.2.0 — 2026-11-09
|
|
9
|
+
|
|
10
|
+
* `locator_export`: stream the index page by page and write a read-only SQLite mirror (`entries(path, name, dir, size, mtime_ms, ext)`) through Node's built-in `node:sqlite`. The compact snapshot remains the primary store.
|
|
11
|
+
* Engine `dump` RPC with a record-id cursor, so exports do not hold the index lock between pages.
|
|
12
|
+
* CI runs the engine build before the Node tests, exercising the new RPC and the clean-install path together.
|
|
13
|
+
* Windows USN path validated end to end on a Windows CI runner (1.34 M records, `C:\Windows` indexed in 7.8 s); macOS kqueue watcher covered by a macOS CI test.
|
|
14
|
+
* Experimental cgo FSEvents backend was attempted and removed after an arm64 `FSEventStreamCreate` crash; kqueue remains the shipped macOS backend.
|
|
15
|
+
|
|
3
16
|
## 0.1.0 — 2026-11-09
|
|
4
17
|
|
|
5
18
|
First working release.
|
|
@@ -10,7 +23,7 @@ First working release.
|
|
|
10
23
|
* Linux inotify watcher (recursive) and Windows `ReadDirectoryChangesW` watcher (recursive, no admin).
|
|
11
24
|
* macOS gets a kqueue vnode watcher (directory-level creates/deletes/renames, capped at 4,096 watched directories) plus the periodic rebuild fallback; FSEvents is next.
|
|
12
25
|
* USN change feed: after MFT enumeration the engine polls the journal every two seconds and applies creates, deletes and renames through a tested pure applier (`usn.ApplyChanges`), updating the FRN path map in place.
|
|
13
|
-
* USN decoder and opt-in fast path (`internal/usn`): USN_RECORD_V2 parsing, FRN parent-map path reconstruction, journal read, `windowsUsn` / `--usn` MFT enumeration with automatic portable-walk fallback, page-level metadata fill for names-only records, and an `indexd usn-probe` elevated acceptance command. Off by default
|
|
26
|
+
* USN decoder and opt-in fast path (`internal/usn`): USN_RECORD_V2 parsing, FRN parent-map path reconstruction, journal read, `windowsUsn` / `--usn` MFT enumeration with automatic portable-walk fallback, page-level metadata fill for names-only records, and an `indexd usn-probe` elevated acceptance command. Off by default; the ioctl path, path reconstruction, journal read and the full `scan --usn` route are validated on a Windows CI runner.
|
|
14
27
|
* Everything-style query language: bare terms, `!` negation, quotes, `*`/`?`, `ext:`, `path:`, `size:`, `dm:`, `folder:`, `file:`, `case:`, `wholeword:`.
|
|
15
28
|
* DSH plugin with `locator_search`, `locator_status`, `locator_rebuild`, a path-search result card and configurable roots/excludes/state.
|
|
16
29
|
* Global Web GUI search panel (`Ctrl+Shift+F`, sidebar magnifier): debounced live search, sortable columns, kind filters, keyboard selection, path copy, status footer. Served through same-origin host routes with the Web connection's own trust check; headless profiles simply omit it.
|
package/README-zh.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# dsh-locator
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/dsh-locator)
|
|
4
|
+
[](https://github.com/PerryLink/dsh-locator/actions/workflows/ci.yml)
|
|
5
|
+
|
|
3
6
|
中文 | [English](README.md)
|
|
4
7
|
|
|
5
8
|
给 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 用的全盘毫秒级文件搜索,**自建索引**:不装 Everything、不用 `es.exe`、不需要 Everything 服务。
|
|
@@ -15,7 +18,7 @@
|
|
|
15
18
|
## 安装
|
|
16
19
|
|
|
17
20
|
```sh
|
|
18
|
-
# npm
|
|
21
|
+
# npm
|
|
19
22
|
dsh plugin --profile web add dsh-locator
|
|
20
23
|
|
|
21
24
|
# 从源码
|
|
@@ -62,6 +65,7 @@ npm 包内置 `linux-x64`、`linux-arm64`、`win32-x64`、`win32-arm64`、`darwi
|
|
|
62
65
|
| `locator_search` | 查询索引,返回路径、大小、修改时间、扩展名、类型,并给出 total/truncated,截断页面不会被当成完整结果。 |
|
|
63
66
|
| `locator_status` | 根目录、条目数、监听状态、状态目录与引擎路径。用来解释覆盖范围或排查结果过期。 |
|
|
64
67
|
| `locator_rebuild` | 后台重建索引;新索引就绪前,搜索继续用旧索引。 |
|
|
68
|
+
| `locator_export` | 把索引导出成只读 SQLite(`entries` 表),供外部 SQL 工具查询;逐页流式导出,二进制快照仍是主存储。 |
|
|
65
69
|
|
|
66
70
|
### 查询语法
|
|
67
71
|
|
|
@@ -116,7 +120,13 @@ npm 包内置 `linux-x64`、`linux-arm64`、`win32-x64`、`win32-arm64`、`darwi
|
|
|
116
120
|
|
|
117
121
|
### Windows 与 USN 日志
|
|
118
122
|
|
|
119
|
-
引擎里已经有 USN 解码器、可选的快路径和探针。快路径**默认关闭**(`windowsUsn: false`):卷 ioctl
|
|
123
|
+
引擎里已经有 USN 解码器、可选的快路径和探针。快路径**默认关闭**(`windowsUsn: false`):卷 ioctl 需要管理员权限;它已经在 GitHub Actions 的 Windows runner(管理员、真实 NTFS 卷)上端到端验证:
|
|
124
|
+
- 读取 1,345,546 条 MFT 记录,解析出 1,345,539 条路径
|
|
125
|
+
- `C:\Windows` 下 164,209 条(122,915 文件、41,294 目录)
|
|
126
|
+
- `scan --usn --root C:\Windows` 建索引 164,216 条用 7.8 秒;查询 9.6 ms
|
|
127
|
+
- 变更日志可读(某次运行读到 8,233 条);`D:` 卷日志未启用时带警告回退目录遍历
|
|
128
|
+
|
|
129
|
+
你也可以自己跑同一个探针:
|
|
120
130
|
|
|
121
131
|
```powershell
|
|
122
132
|
# 管理员 PowerShell(或:Start-Process -Verb RunAs <路径> ...)
|
|
@@ -125,7 +135,7 @@ npm 包内置 `linux-x64`、`linux-arm64`、`win32-x64`、`win32-arm64`、`darwi
|
|
|
125
135
|
|
|
126
136
|
它会打印日志 id/USN、枚举 MFT(每秒记录数、根目录下文件/目录数、样例路径),并解码最近几条变更日志。非管理员运行会明确报 `Access is denied`;解析与路径重建在 Linux 上有单元测试覆盖。
|
|
127
137
|
|
|
128
|
-
打开 `windowsUsn: true`(或 `indexd scan --usn`)后,引擎用 MFT 枚举代替目录遍历,再按 FRN 父表重建路径。引擎保留卷句柄,每 2 秒轮询变更日志,按同一张 FRN 表就地应用新建、删除、重命名(`usn.ApplyChanges`)。USN 记录**没有大小和修改时间**:名字/路径是准的,`locator_status` 会把这种索引标成 `USN`,守护进程会对返回页现场 stat,所以面板/模型看到的行仍有真实大小和日期;但全库的 `size:`/`dm:` 过滤在元数据补齐前是近似的。任何失败(没提权、卷不支持、记录过多)都会带警告回退到目录遍历,绝不会让搜索不可用。运行中日志轮询失败会报警并停止该监视器,可移植的 `ReadDirectoryChangesW` 监听和 `locator_rebuild`
|
|
138
|
+
打开 `windowsUsn: true`(或 `indexd scan --usn`)后,引擎用 MFT 枚举代替目录遍历,再按 FRN 父表重建路径。引擎保留卷句柄,每 2 秒轮询变更日志,按同一张 FRN 表就地应用新建、删除、重命名(`usn.ApplyChanges`)。USN 记录**没有大小和修改时间**:名字/路径是准的,`locator_status` 会把这种索引标成 `USN`,守护进程会对返回页现场 stat,所以面板/模型看到的行仍有真实大小和日期;但全库的 `size:`/`dm:` 过滤在元数据补齐前是近似的。任何失败(没提权、卷不支持、记录过多)都会带警告回退到目录遍历,绝不会让搜索不可用。运行中日志轮询失败会报警并停止该监视器,可移植的 `ReadDirectoryChangesW` 监听和 `locator_rebuild` 仍然可用。变更应用逻辑有合成记录测试,ioctl 路径由 Windows CI job 验证。
|
|
129
139
|
|
|
130
140
|
Everything 之所以首次索引近乎瞬时,是因为它通过 USN 日志直接读 NTFS 主文件表。`dsh-locator` v0.1 刻意先做可移植的目录遍历 + 变更通知:不需要服务、不需要 UAC、任何文件系统都能用。USN/MFT 枚举会作为可选快路径加入路线图(需要进程对卷持有 `GENERIC_READ`,通常意味着管理员权限),可移植路径始终保留为回退。
|
|
131
141
|
|
package/README.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# dsh-locator
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/dsh-locator)
|
|
4
|
+
[](https://github.com/PerryLink/dsh-locator/actions/workflows/ci.yml)
|
|
5
|
+
|
|
3
6
|
[中文](README-zh.md) | English
|
|
4
7
|
|
|
5
8
|
A whole-disk, millisecond file search for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) that builds its **own** index. No Everything installation, no `es.exe`, no Everything service.
|
|
@@ -15,7 +18,7 @@ Everything inspired the *ideas*: a persistent index of file names, a query langu
|
|
|
15
18
|
## Install
|
|
16
19
|
|
|
17
20
|
```sh
|
|
18
|
-
# from npm
|
|
21
|
+
# from npm
|
|
19
22
|
dsh plugin --profile web add dsh-locator
|
|
20
23
|
|
|
21
24
|
# from a checkout
|
|
@@ -62,6 +65,7 @@ Press `Ctrl+Shift+F` anywhere in the Web GUI, or click the magnifier at the side
|
|
|
62
65
|
| `locator_search` | Query the index. Returns path, size, modification time, extension and kind, plus total/truncated so a capped page is never presented as complete. |
|
|
63
66
|
| `locator_status` | Roots, entry counts, watcher state, state directory and engine path. Use it to explain coverage or diagnose a stale result. |
|
|
64
67
|
| `locator_rebuild` | Replace the index with a fresh background scan. Searches keep using the old index until the new one is ready. |
|
|
68
|
+
| `locator_export` | Write a read-only SQLite mirror of the index (`entries` table) for external SQL tools. Streams page by page; the binary snapshot stays primary. |
|
|
65
69
|
|
|
66
70
|
### Query language
|
|
67
71
|
|
|
@@ -116,7 +120,13 @@ The engine is pure Go with no cgo, cross-compiled from one machine. It never nee
|
|
|
116
120
|
|
|
117
121
|
### Windows and the USN journal
|
|
118
122
|
|
|
119
|
-
The engine carries a USN decoder, an opt-in fast path and a probe. The path is **off by default** (`windowsUsn: false`) because the volume ioctl needs administrator rights
|
|
123
|
+
The engine carries a USN decoder, an opt-in fast path and a probe. The path is **off by default** (`windowsUsn: false`) because the volume ioctl needs administrator rights; it has been validated end to end on a GitHub Actions Windows runner (administrator, real NTFS volume):
|
|
124
|
+
- 1,345,546 MFT records read, 1,345,539 paths resolved
|
|
125
|
+
- 164,209 entries under `C:\Windows` (122,915 files, 41,294 dirs)
|
|
126
|
+
- `scan --usn --root C:\Windows` indexed 164,216 entries in 7.8 s; a query returned in 9.6 ms
|
|
127
|
+
- the change journal was read (8,233 records on one run) and an inactive journal on `D:` fell back to the walk with a warning
|
|
128
|
+
|
|
129
|
+
You can still run the same probe yourself:
|
|
120
130
|
|
|
121
131
|
```powershell
|
|
122
132
|
# Elevated PowerShell (or: Start-Process -Verb RunAs <path> ...)
|
|
@@ -125,7 +135,7 @@ The engine carries a USN decoder, an opt-in fast path and a probe. The path is *
|
|
|
125
135
|
|
|
126
136
|
It prints the journal id/USNs, enumerates the MFT (records per second, files/dirs below the root, sample paths) and decodes the last few change-journal records. A non-elevated run fails with `Access is denied` — the parser and path reconstruction are covered by unit tests on every platform.
|
|
127
137
|
|
|
128
|
-
With `windowsUsn: true` (or `indexd scan --usn`) the engine enumerates the MFT instead of walking directories, then builds paths from the FRN parent map. It keeps the volume handle and polls the change journal every two seconds, applying creates, deletes and renames through `usn.ApplyChanges` (the same FRN map, updated in place). USN records carry **no size or modification time**: results are correct for names and paths, `locator_status` marks such an index with `USN`, and the daemon stats the returned page so the rows the panel/model sees still show real sizes and dates. `size:`/`dm:` filters over the whole index stay approximate until a metadata pass runs. Any failure (no elevation, unsupported volume, too many records) falls back to the portable walk with a warning; it never disables search. If journal polling fails mid-session, the watcher reports it and stops; the portable `ReadDirectoryChangesW` watcher and `locator_rebuild` are still there. The journal applier is covered by synthetic-record tests
|
|
138
|
+
With `windowsUsn: true` (or `indexd scan --usn`) the engine enumerates the MFT instead of walking directories, then builds paths from the FRN parent map. It keeps the volume handle and polls the change journal every two seconds, applying creates, deletes and renames through `usn.ApplyChanges` (the same FRN map, updated in place). USN records carry **no size or modification time**: results are correct for names and paths, `locator_status` marks such an index with `USN`, and the daemon stats the returned page so the rows the panel/model sees still show real sizes and dates. `size:`/`dm:` filters over the whole index stay approximate until a metadata pass runs. Any failure (no elevation, unsupported volume, too many records) falls back to the portable walk with a warning; it never disables search. If journal polling fails mid-session, the watcher reports it and stops; the portable `ReadDirectoryChangesW` watcher and `locator_rebuild` are still there. The journal applier is covered by synthetic-record tests and the ioctl path by the Windows CI job.
|
|
129
139
|
|
|
130
140
|
Everything reads the NTFS Master File Table through the USN journal, which is why its first index is nearly instant. `dsh-locator` v0.1 deliberately starts with a portable directory walk plus change notifications: it works without a service, without UAC and on every filesystem. USN/MFT enumeration is on the roadmap as an opt-in fast path for volumes where the process holds `GENERIC_READ` (admin) — the portable path stays the fallback.
|
|
131
141
|
|
package/bin/darwin-arm64/indexd
CHANGED
|
Binary file
|
package/bin/darwin-x64/indexd
CHANGED
|
Binary file
|
package/bin/linux-arm64/indexd
CHANGED
|
Binary file
|
package/bin/linux-x64/indexd
CHANGED
|
Binary file
|
|
Binary file
|
package/bin/win32-x64/indexd.exe
CHANGED
|
Binary file
|
package/lib/export.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `locator_export` — write a read-only SQLite mirror of the index.
|
|
3
|
+
*
|
|
4
|
+
* The engine keeps its compact snapshot; this tool streams the index page by
|
|
5
|
+
* page and writes a normal SQLite database so external tools can query it.
|
|
6
|
+
* `node:sqlite` is loaded lazily: hosts below Node 22.5 get a clear error
|
|
7
|
+
* instead of a plugin that fails to load.
|
|
8
|
+
* @module dsh-locator/export
|
|
9
|
+
*/
|
|
10
|
+
import type { LocatorRuntime } from './runtime.ts';
|
|
11
|
+
/** Build the locator_export tool. */
|
|
12
|
+
export declare function makeExportTool(rt: LocatorRuntime): import("@deepseek-ai/dsh-tools").ToolDefinition;
|
|
13
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAelD,qCAAqC;AACrC,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,mDA8FhD"}
|
package/lib/export.js
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `locator_export` — write a read-only SQLite mirror of the index.
|
|
3
|
+
*
|
|
4
|
+
* The engine keeps its compact snapshot; this tool streams the index page by
|
|
5
|
+
* page and writes a normal SQLite database so external tools can query it.
|
|
6
|
+
* `node:sqlite` is loaded lazily: hosts below Node 22.5 get a clear error
|
|
7
|
+
* instead of a plugin that fails to load.
|
|
8
|
+
* @module dsh-locator/export
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, mkdirSync, rmSync, statSync } from 'node:fs';
|
|
11
|
+
import { dirname, isAbsolute, resolve } from 'node:path';
|
|
12
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
13
|
+
const OUTPUT_SCHEMA = {
|
|
14
|
+
type: 'object',
|
|
15
|
+
additionalProperties: false,
|
|
16
|
+
properties: {
|
|
17
|
+
ok: { type: 'boolean', required: true },
|
|
18
|
+
path: { type: 'string' },
|
|
19
|
+
rows: { type: 'integer' },
|
|
20
|
+
bytes: { type: 'integer' },
|
|
21
|
+
tookMs: { type: 'number' },
|
|
22
|
+
error: { type: 'string' },
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
/** Build the locator_export tool. */
|
|
26
|
+
export function makeExportTool(rt) {
|
|
27
|
+
return defineTool({
|
|
28
|
+
name: 'locator_export',
|
|
29
|
+
description: [
|
|
30
|
+
'Export the local file index as a read-only SQLite database (dsh-locator).',
|
|
31
|
+
'',
|
|
32
|
+
'The database has one table, `entries(path TEXT PRIMARY KEY, name TEXT, dir INTEGER, size INTEGER, mtime_ms INTEGER, ext TEXT)`. It is a snapshot: run the tool again to refresh it. The index itself stays in its compact binary form; this is for external SQL tools, dashboards or scripts.',
|
|
33
|
+
'',
|
|
34
|
+
'Use it when the user asks for a queryable copy of their file index, wants to run SQL against it, or needs the data in another program. It is expensive on a million-entry index (tens of seconds and a large file), so do not call it routinely.',
|
|
35
|
+
].join('\n'),
|
|
36
|
+
parameters: {
|
|
37
|
+
path: { type: 'string', required: true, description: 'Absolute path of the .sqlite/.db file to create.' },
|
|
38
|
+
overwrite: { type: 'boolean', description: 'Replace an existing file (default false).' },
|
|
39
|
+
pageSize: { type: 'integer', description: 'Rows per engine request (default 5000, max 10000).' },
|
|
40
|
+
},
|
|
41
|
+
timeoutMs: 180_000,
|
|
42
|
+
output: {
|
|
43
|
+
schema: OUTPUT_SCHEMA,
|
|
44
|
+
render: (_args, value) => {
|
|
45
|
+
const v = value;
|
|
46
|
+
if (!v.ok)
|
|
47
|
+
return [{ type: 'text', text: `locator_export failed: ${v.error ?? 'unknown error'}` }];
|
|
48
|
+
return [{
|
|
49
|
+
type: 'text',
|
|
50
|
+
text: `locator_export: ${String(v.rows ?? 0)} rows -> ${v.path ?? ''} (${formatSize(v.bytes ?? 0)}, ${((v.tookMs ?? 0) / 1000).toFixed(1)} s)`,
|
|
51
|
+
}];
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
async execute(args) {
|
|
55
|
+
const started = Date.now();
|
|
56
|
+
const target = resolve(args.path);
|
|
57
|
+
if (!isAbsolute(args.path))
|
|
58
|
+
return { ok: false, error: 'path must be absolute' };
|
|
59
|
+
if (existsSync(target) && args.overwrite !== true) {
|
|
60
|
+
return { ok: false, error: `refusing to overwrite ${target}; pass overwrite: true` };
|
|
61
|
+
}
|
|
62
|
+
const pageSize = Math.min(10_000, Math.max(100, args.pageSize ?? 5000));
|
|
63
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
64
|
+
let sqlite;
|
|
65
|
+
try {
|
|
66
|
+
sqlite = await import('node:sqlite');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return { ok: false, error: 'node:sqlite is unavailable; Node 22.5 or newer is required' };
|
|
70
|
+
}
|
|
71
|
+
if (existsSync(target))
|
|
72
|
+
rmSync(target);
|
|
73
|
+
rt.start();
|
|
74
|
+
const db = new sqlite.DatabaseSync(target);
|
|
75
|
+
let rows = 0;
|
|
76
|
+
try {
|
|
77
|
+
db.exec('PRAGMA journal_mode = MEMORY');
|
|
78
|
+
db.exec('PRAGMA synchronous = OFF');
|
|
79
|
+
db.exec(`CREATE TABLE entries (
|
|
80
|
+
path TEXT PRIMARY KEY,
|
|
81
|
+
name TEXT NOT NULL,
|
|
82
|
+
dir INTEGER NOT NULL,
|
|
83
|
+
size INTEGER NOT NULL,
|
|
84
|
+
mtime_ms INTEGER NOT NULL,
|
|
85
|
+
ext TEXT NOT NULL
|
|
86
|
+
) WITHOUT ROWID`);
|
|
87
|
+
db.exec('CREATE INDEX entries_mtime ON entries(mtime_ms)');
|
|
88
|
+
const insert = db.prepare('INSERT OR REPLACE INTO entries (path, name, dir, size, mtime_ms, ext) VALUES (?, ?, ?, ?, ?, ?)');
|
|
89
|
+
db.exec('BEGIN');
|
|
90
|
+
let after = 0;
|
|
91
|
+
for (;;) {
|
|
92
|
+
const page = await rt.dump(after, pageSize);
|
|
93
|
+
for (const entry of page.entries) {
|
|
94
|
+
insert.run(entry.path, entry.name, entry.dir ? 1 : 0, entry.size, entry.mtime, entry.ext);
|
|
95
|
+
rows++;
|
|
96
|
+
}
|
|
97
|
+
after = page.next;
|
|
98
|
+
if (page.done || page.entries.length === 0)
|
|
99
|
+
break;
|
|
100
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
101
|
+
}
|
|
102
|
+
db.exec('COMMIT');
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
try {
|
|
106
|
+
db.exec('ROLLBACK');
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// The transaction may already be closed; the file is removed below.
|
|
110
|
+
}
|
|
111
|
+
db.close();
|
|
112
|
+
rmSync(target, { force: true });
|
|
113
|
+
return { ok: false, error: messageOf(error) };
|
|
114
|
+
}
|
|
115
|
+
db.close();
|
|
116
|
+
return {
|
|
117
|
+
ok: true,
|
|
118
|
+
path: target,
|
|
119
|
+
rows,
|
|
120
|
+
bytes: statSync(target).size,
|
|
121
|
+
tookMs: Date.now() - started,
|
|
122
|
+
};
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
function messageOf(error) {
|
|
127
|
+
return error instanceof Error ? error.message : String(error);
|
|
128
|
+
}
|
|
129
|
+
function formatSize(bytes) {
|
|
130
|
+
if (bytes < 1024)
|
|
131
|
+
return `${String(bytes)} B`;
|
|
132
|
+
const units = ['KB', 'MB', 'GB'];
|
|
133
|
+
let value = bytes / 1024;
|
|
134
|
+
let unit = 0;
|
|
135
|
+
while (value >= 1024 && unit < units.length - 1) {
|
|
136
|
+
value /= 1024;
|
|
137
|
+
unit++;
|
|
138
|
+
}
|
|
139
|
+
return `${value.toFixed(1)} ${units[unit] ?? 'GB'}`;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGnD,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,QAAQ;IACd,oBAAoB,EAAE,KAAK;IAC3B,UAAU,EAAE;QACV,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;QACvC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACzB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC1B;CACO,CAAA;AAEV,qCAAqC;AACrC,MAAM,UAAU,cAAc,CAAC,EAAkB;IAC/C,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE;YACX,2EAA2E;YAC3E,EAAE;YACF,+RAA+R;YAC/R,EAAE;YACF,kPAAkP;SACnP,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kDAAkD,EAAE;YACzG,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,2CAA2C,EAAE;YACxF,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,oDAAoD,EAAE;SACjG;QACD,SAAS,EAAE,OAAO;QAClB,MAAM,EAAE;YACN,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACvB,MAAM,CAAC,GAAG,KAAuG,CAAA;gBACjH,IAAI,CAAC,CAAC,CAAC,EAAE;oBAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC,KAAK,IAAI,eAAe,EAAE,EAAE,CAAC,CAAA;gBAClG,OAAO,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,mBAAmB,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;qBAC/I,CAAC,CAAA;YACJ,CAAC;SACF;QACD,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAA;YACzF,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBAClD,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,KAAK,EAAE,yBAAyB,MAAM,wBAAwB,EAAE,CAAA;YAC/F,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAA;YACvE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAE/C,IAAI,MAAoC,CAAA;YACxC,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,KAAK,EAAE,4DAA4D,EAAE,CAAA;YACpG,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,CAAC;gBAAE,MAAM,CAAC,MAAM,CAAC,CAAA;YACtC,EAAE,CAAC,KAAK,EAAE,CAAA;YACV,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YAC1C,IAAI,IAAI,GAAG,CAAC,CAAA;YACZ,IAAI,CAAC;gBACH,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;gBACvC,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;gBACnC,EAAE,CAAC,IAAI,CAAC;;;;;;;wBAOQ,CAAC,CAAA;gBACjB,EAAE,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;gBAC1D,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,iGAAiG,CAAC,CAAA;gBAC5H,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAChB,IAAI,KAAK,GAAG,CAAC,CAAA;gBACb,SAAS,CAAC;oBACR,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;oBAC3C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBACjC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;wBACzF,IAAI,EAAE,CAAA;oBACR,CAAC;oBACD,KAAK,GAAG,IAAI,CAAC,IAAI,CAAA;oBACjB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;wBAAE,MAAK;oBACjD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;gBACrD,CAAC;gBACD,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBACrB,CAAC;gBAAC,MAAM,CAAC;oBACP,oEAAoE;gBACtE,CAAC;gBACD,EAAE,CAAC,KAAK,EAAE,CAAA;gBACV,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC/B,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAA;YACxD,CAAC;YACD,EAAE,CAAC,KAAK,EAAE,CAAA;YACV,OAAO;gBACL,EAAE,EAAE,IAAa;gBACjB,IAAI,EAAE,MAAM;gBACZ,IAAI;gBACJ,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI;gBAC5B,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;aAC7B,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC/D,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAA;IAC7C,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAChC,IAAI,KAAK,GAAG,KAAK,GAAG,IAAI,CAAA;IACxB,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,OAAO,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,KAAK,IAAI,IAAI,CAAA;QACb,IAAI,EAAE,CAAA;IACR,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;AACrD,CAAC"}
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAOzC,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,CAAA;AAEjC,0BAA0B;AAC1B,eAAO,MAAM,IAAI,gBAAgB,CAAA;AAEjC,2DAA2D;AAC3D,eAAO,MAAM,MAAM,UAAY,CAAA;AAE/B;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA6BxD"}
|
package/lib/index.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* @module dsh-locator
|
|
5
5
|
*/
|
|
6
6
|
import { Config as ConfigSchema } from "./config.js";
|
|
7
|
+
import { makeExportTool } from "./export.js";
|
|
7
8
|
import { registerHttp } from "./http.js";
|
|
8
9
|
import { resolveBinary, resolveRoots, resolveStateDir } from "./paths.js";
|
|
9
10
|
import { LocatorRuntime } from "./runtime.js";
|
|
@@ -41,6 +42,7 @@ export function apply(ctx, config) {
|
|
|
41
42
|
ctx.tools.register(makeSearchTool(rt));
|
|
42
43
|
ctx.tools.register(makeStatusTool(rt));
|
|
43
44
|
ctx.tools.register(makeRebuildTool(rt));
|
|
45
|
+
ctx.tools.register(makeExportTool(rt));
|
|
44
46
|
// The Web GUI panel is optional: profiles without a Web server keep the
|
|
45
47
|
// three tools and never mount an HTTP route.
|
|
46
48
|
registerHttp(ctx, rt);
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE5E,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,CAAA;AAEjC,0BAA0B;AAC1B,MAAM,CAAC,MAAM,IAAI,GAAG,aAAa,CAAA;AAEjC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,CAAA;AAE/B;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAc;IAChD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAM;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACxC,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;IAEnE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACd,2EAA2E;QAC3E,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,EAAE,CAAC,KAAK,EAAE,CAAA;YACV,MAAM,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,QAAQ,GAAG,CAAC,CAAA;QACrE,CAAC,EAAE,IAAI,CAAC,CAAA;QACR,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAA;QAChB,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE5E,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,CAAA;AAEjC,0BAA0B;AAC1B,MAAM,CAAC,MAAM,IAAI,GAAG,aAAa,CAAA;AAEjC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,CAAA;AAE/B;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAc;IAChD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAM;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACxC,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;IAEnE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACd,2EAA2E;QAC3E,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,EAAE,CAAC,KAAK,EAAE,CAAA;YACV,MAAM,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,QAAQ,GAAG,CAAC,CAAA;QACrE,CAAC,EAAE,IAAI,CAAC,CAAA;QACR,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAA;QAChB,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAA;IACvC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAA;IAEtC,wEAAwE;IACxE,6CAA6C;IAC7C,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AACvB,CAAC"}
|
package/lib/runtime.d.ts
CHANGED
|
@@ -36,6 +36,21 @@ export interface SearchArgs {
|
|
|
36
36
|
filesOnly: boolean;
|
|
37
37
|
dirsOnly: boolean;
|
|
38
38
|
}
|
|
39
|
+
/** One row of a paginated index dump. */
|
|
40
|
+
export interface DumpEntry {
|
|
41
|
+
path: string;
|
|
42
|
+
name: string;
|
|
43
|
+
size: number;
|
|
44
|
+
mtime: number;
|
|
45
|
+
ext: string;
|
|
46
|
+
dir: boolean;
|
|
47
|
+
}
|
|
48
|
+
/** One page of an index dump. */
|
|
49
|
+
export interface DumpPage {
|
|
50
|
+
entries: DumpEntry[];
|
|
51
|
+
next: number;
|
|
52
|
+
done: boolean;
|
|
53
|
+
}
|
|
39
54
|
/** Engine status as reported by the `status` method and events. */
|
|
40
55
|
export interface EngineStatus {
|
|
41
56
|
version: string;
|
|
@@ -103,6 +118,8 @@ export declare class LocatorRuntime {
|
|
|
103
118
|
request<T>(method: string, params?: Record<string, unknown>): Promise<T>;
|
|
104
119
|
/** Run a search. */
|
|
105
120
|
search(args: SearchArgs): Promise<SearchResult>;
|
|
121
|
+
/** Read one page of the index for an export. */
|
|
122
|
+
dump(after: number, limit: number): Promise<DumpPage>;
|
|
106
123
|
/** Read live status from the engine, refreshing the cached event copy. */
|
|
107
124
|
engineStatus(): Promise<EngineStatus | undefined>;
|
|
108
125
|
/** Ask the engine to rebuild the whole index in the background. */
|
package/lib/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/lib/runtime.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* @module dsh-locator/runtime
|
|
5
5
|
*/
|
|
6
6
|
import { spawn } from 'node:child_process';
|
|
7
|
+
import { chmodSync } from 'node:fs';
|
|
7
8
|
import { createInterface } from 'node:readline';
|
|
8
9
|
/**
|
|
9
10
|
* Owns the engine process. Tools await {@link LocatorRuntime.waitReady} before
|
|
@@ -52,6 +53,16 @@ export class LocatorRuntime {
|
|
|
52
53
|
this.spawn();
|
|
53
54
|
}
|
|
54
55
|
spawn() {
|
|
56
|
+
// npm and git checkouts can lose the executable bit on the bundled engine.
|
|
57
|
+
// Restore it (best effort) before spawning; Windows does not use it.
|
|
58
|
+
if (process.platform !== 'win32') {
|
|
59
|
+
try {
|
|
60
|
+
chmodSync(this.binary, 0o755);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// A read-only install cannot be fixed here; spawn reports the real error.
|
|
64
|
+
}
|
|
65
|
+
}
|
|
55
66
|
const args = ['serve', '--state', this.stateDir];
|
|
56
67
|
for (const root of this.roots)
|
|
57
68
|
args.push('--root', root);
|
|
@@ -257,6 +268,10 @@ export class LocatorRuntime {
|
|
|
257
268
|
hits: Array.isArray(result.hits) ? result.hits : [],
|
|
258
269
|
};
|
|
259
270
|
}
|
|
271
|
+
/** Read one page of the index for an export. */
|
|
272
|
+
async dump(after, limit) {
|
|
273
|
+
return await this.request('dump', { after, limit });
|
|
274
|
+
}
|
|
260
275
|
/** Read live status from the engine, refreshing the cached event copy. */
|
|
261
276
|
async engineStatus() {
|
|
262
277
|
try {
|
package/lib/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-locator",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Whole-disk, millisecond file search for DeepSeek Harness without Everything: a self-built cross-platform index, an Everything-style query language, agent tools and a Web search panel (Ctrl+Shift+F). Windows, macOS and Linux.",
|
|
5
5
|
"author": "PerryLink contributors",
|
|
6
6
|
"repository": {
|
package/src/export.ts
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `locator_export` — write a read-only SQLite mirror of the index.
|
|
3
|
+
*
|
|
4
|
+
* The engine keeps its compact snapshot; this tool streams the index page by
|
|
5
|
+
* page and writes a normal SQLite database so external tools can query it.
|
|
6
|
+
* `node:sqlite` is loaded lazily: hosts below Node 22.5 get a clear error
|
|
7
|
+
* instead of a plugin that fails to load.
|
|
8
|
+
* @module dsh-locator/export
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { existsSync, mkdirSync, rmSync, statSync } from 'node:fs'
|
|
12
|
+
import { dirname, isAbsolute, resolve } from 'node:path'
|
|
13
|
+
import { defineTool } from '@deepseek-ai/dsh-tools'
|
|
14
|
+
import type { LocatorRuntime } from './runtime.ts'
|
|
15
|
+
|
|
16
|
+
const OUTPUT_SCHEMA = {
|
|
17
|
+
type: 'object',
|
|
18
|
+
additionalProperties: false,
|
|
19
|
+
properties: {
|
|
20
|
+
ok: { type: 'boolean', required: true },
|
|
21
|
+
path: { type: 'string' },
|
|
22
|
+
rows: { type: 'integer' },
|
|
23
|
+
bytes: { type: 'integer' },
|
|
24
|
+
tookMs: { type: 'number' },
|
|
25
|
+
error: { type: 'string' },
|
|
26
|
+
},
|
|
27
|
+
} as const
|
|
28
|
+
|
|
29
|
+
/** Build the locator_export tool. */
|
|
30
|
+
export function makeExportTool(rt: LocatorRuntime) {
|
|
31
|
+
return defineTool({
|
|
32
|
+
name: 'locator_export',
|
|
33
|
+
description: [
|
|
34
|
+
'Export the local file index as a read-only SQLite database (dsh-locator).',
|
|
35
|
+
'',
|
|
36
|
+
'The database has one table, `entries(path TEXT PRIMARY KEY, name TEXT, dir INTEGER, size INTEGER, mtime_ms INTEGER, ext TEXT)`. It is a snapshot: run the tool again to refresh it. The index itself stays in its compact binary form; this is for external SQL tools, dashboards or scripts.',
|
|
37
|
+
'',
|
|
38
|
+
'Use it when the user asks for a queryable copy of their file index, wants to run SQL against it, or needs the data in another program. It is expensive on a million-entry index (tens of seconds and a large file), so do not call it routinely.',
|
|
39
|
+
].join('\n'),
|
|
40
|
+
parameters: {
|
|
41
|
+
path: { type: 'string', required: true, description: 'Absolute path of the .sqlite/.db file to create.' },
|
|
42
|
+
overwrite: { type: 'boolean', description: 'Replace an existing file (default false).' },
|
|
43
|
+
pageSize: { type: 'integer', description: 'Rows per engine request (default 5000, max 10000).' },
|
|
44
|
+
},
|
|
45
|
+
timeoutMs: 180_000,
|
|
46
|
+
output: {
|
|
47
|
+
schema: OUTPUT_SCHEMA,
|
|
48
|
+
render: (_args, value) => {
|
|
49
|
+
const v = value as { ok: boolean; path?: string; rows?: number; bytes?: number; tookMs?: number; error?: string }
|
|
50
|
+
if (!v.ok) return [{ type: 'text', text: `locator_export failed: ${v.error ?? 'unknown error'}` }]
|
|
51
|
+
return [{
|
|
52
|
+
type: 'text',
|
|
53
|
+
text: `locator_export: ${String(v.rows ?? 0)} rows -> ${v.path ?? ''} (${formatSize(v.bytes ?? 0)}, ${((v.tookMs ?? 0) / 1000).toFixed(1)} s)`,
|
|
54
|
+
}]
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
async execute(args) {
|
|
58
|
+
const started = Date.now()
|
|
59
|
+
const target = resolve(args.path)
|
|
60
|
+
if (!isAbsolute(args.path)) return { ok: false as const, error: 'path must be absolute' }
|
|
61
|
+
if (existsSync(target) && args.overwrite !== true) {
|
|
62
|
+
return { ok: false as const, error: `refusing to overwrite ${target}; pass overwrite: true` }
|
|
63
|
+
}
|
|
64
|
+
const pageSize = Math.min(10_000, Math.max(100, args.pageSize ?? 5000))
|
|
65
|
+
mkdirSync(dirname(target), { recursive: true })
|
|
66
|
+
|
|
67
|
+
let sqlite: typeof import('node:sqlite')
|
|
68
|
+
try {
|
|
69
|
+
sqlite = await import('node:sqlite')
|
|
70
|
+
} catch {
|
|
71
|
+
return { ok: false as const, error: 'node:sqlite is unavailable; Node 22.5 or newer is required' }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (existsSync(target)) rmSync(target)
|
|
75
|
+
rt.start()
|
|
76
|
+
const db = new sqlite.DatabaseSync(target)
|
|
77
|
+
let rows = 0
|
|
78
|
+
try {
|
|
79
|
+
db.exec('PRAGMA journal_mode = MEMORY')
|
|
80
|
+
db.exec('PRAGMA synchronous = OFF')
|
|
81
|
+
db.exec(`CREATE TABLE entries (
|
|
82
|
+
path TEXT PRIMARY KEY,
|
|
83
|
+
name TEXT NOT NULL,
|
|
84
|
+
dir INTEGER NOT NULL,
|
|
85
|
+
size INTEGER NOT NULL,
|
|
86
|
+
mtime_ms INTEGER NOT NULL,
|
|
87
|
+
ext TEXT NOT NULL
|
|
88
|
+
) WITHOUT ROWID`)
|
|
89
|
+
db.exec('CREATE INDEX entries_mtime ON entries(mtime_ms)')
|
|
90
|
+
const insert = db.prepare('INSERT OR REPLACE INTO entries (path, name, dir, size, mtime_ms, ext) VALUES (?, ?, ?, ?, ?, ?)')
|
|
91
|
+
db.exec('BEGIN')
|
|
92
|
+
let after = 0
|
|
93
|
+
for (;;) {
|
|
94
|
+
const page = await rt.dump(after, pageSize)
|
|
95
|
+
for (const entry of page.entries) {
|
|
96
|
+
insert.run(entry.path, entry.name, entry.dir ? 1 : 0, entry.size, entry.mtime, entry.ext)
|
|
97
|
+
rows++
|
|
98
|
+
}
|
|
99
|
+
after = page.next
|
|
100
|
+
if (page.done || page.entries.length === 0) break
|
|
101
|
+
await new Promise(resolve => setImmediate(resolve))
|
|
102
|
+
}
|
|
103
|
+
db.exec('COMMIT')
|
|
104
|
+
} catch (error) {
|
|
105
|
+
try {
|
|
106
|
+
db.exec('ROLLBACK')
|
|
107
|
+
} catch {
|
|
108
|
+
// The transaction may already be closed; the file is removed below.
|
|
109
|
+
}
|
|
110
|
+
db.close()
|
|
111
|
+
rmSync(target, { force: true })
|
|
112
|
+
return { ok: false as const, error: messageOf(error) }
|
|
113
|
+
}
|
|
114
|
+
db.close()
|
|
115
|
+
return {
|
|
116
|
+
ok: true as const,
|
|
117
|
+
path: target,
|
|
118
|
+
rows,
|
|
119
|
+
bytes: statSync(target).size,
|
|
120
|
+
tookMs: Date.now() - started,
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
})
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function messageOf(error: unknown): string {
|
|
127
|
+
return error instanceof Error ? error.message : String(error)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function formatSize(bytes: number): string {
|
|
131
|
+
if (bytes < 1024) return `${String(bytes)} B`
|
|
132
|
+
const units = ['KB', 'MB', 'GB']
|
|
133
|
+
let value = bytes / 1024
|
|
134
|
+
let unit = 0
|
|
135
|
+
while (value >= 1024 && unit < units.length - 1) {
|
|
136
|
+
value /= 1024
|
|
137
|
+
unit++
|
|
138
|
+
}
|
|
139
|
+
return `${value.toFixed(1)} ${units[unit] ?? 'GB'}`
|
|
140
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import type { Context } from '@deepseek-ai/cordis'
|
|
8
8
|
import { Config as ConfigSchema } from './config.ts'
|
|
9
9
|
import type { Config } from './config.ts'
|
|
10
|
+
import { makeExportTool } from './export.ts'
|
|
10
11
|
import { registerHttp } from './http.ts'
|
|
11
12
|
import { resolveBinary, resolveRoots, resolveStateDir } from './paths.ts'
|
|
12
13
|
import { LocatorRuntime } from './runtime.ts'
|
|
@@ -49,6 +50,7 @@ export function apply(ctx: Context, config: Config): void {
|
|
|
49
50
|
ctx.tools.register(makeSearchTool(rt))
|
|
50
51
|
ctx.tools.register(makeStatusTool(rt))
|
|
51
52
|
ctx.tools.register(makeRebuildTool(rt))
|
|
53
|
+
ctx.tools.register(makeExportTool(rt))
|
|
52
54
|
|
|
53
55
|
// The Web GUI panel is optional: profiles without a Web server keep the
|
|
54
56
|
// three tools and never mount an HTTP route.
|
package/src/runtime.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'
|
|
8
|
+
import { chmodSync } from 'node:fs'
|
|
8
9
|
import { createInterface } from 'node:readline'
|
|
9
10
|
import type { Config } from './config.ts'
|
|
10
11
|
|
|
@@ -43,6 +44,23 @@ export interface SearchArgs {
|
|
|
43
44
|
dirsOnly: boolean
|
|
44
45
|
}
|
|
45
46
|
|
|
47
|
+
/** One row of a paginated index dump. */
|
|
48
|
+
export interface DumpEntry {
|
|
49
|
+
path: string
|
|
50
|
+
name: string
|
|
51
|
+
size: number
|
|
52
|
+
mtime: number
|
|
53
|
+
ext: string
|
|
54
|
+
dir: boolean
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** One page of an index dump. */
|
|
58
|
+
export interface DumpPage {
|
|
59
|
+
entries: DumpEntry[]
|
|
60
|
+
next: number
|
|
61
|
+
done: boolean
|
|
62
|
+
}
|
|
63
|
+
|
|
46
64
|
/** Engine status as reported by the `status` method and events. */
|
|
47
65
|
export interface EngineStatus {
|
|
48
66
|
version: string
|
|
@@ -124,6 +142,15 @@ export class LocatorRuntime {
|
|
|
124
142
|
}
|
|
125
143
|
|
|
126
144
|
private spawn(): void {
|
|
145
|
+
// npm and git checkouts can lose the executable bit on the bundled engine.
|
|
146
|
+
// Restore it (best effort) before spawning; Windows does not use it.
|
|
147
|
+
if (process.platform !== 'win32') {
|
|
148
|
+
try {
|
|
149
|
+
chmodSync(this.binary, 0o755)
|
|
150
|
+
} catch {
|
|
151
|
+
// A read-only install cannot be fixed here; spawn reports the real error.
|
|
152
|
+
}
|
|
153
|
+
}
|
|
127
154
|
const args = ['serve', '--state', this.stateDir]
|
|
128
155
|
for (const root of this.roots) args.push('--root', root)
|
|
129
156
|
for (const exclude of this.config.excludes) args.push('--exclude', exclude)
|
|
@@ -323,6 +350,11 @@ export class LocatorRuntime {
|
|
|
323
350
|
}
|
|
324
351
|
}
|
|
325
352
|
|
|
353
|
+
/** Read one page of the index for an export. */
|
|
354
|
+
async dump(after: number, limit: number): Promise<DumpPage> {
|
|
355
|
+
return await this.request<DumpPage>('dump', { after, limit })
|
|
356
|
+
}
|
|
357
|
+
|
|
326
358
|
/** Read live status from the engine, refreshing the cached event copy. */
|
|
327
359
|
async engineStatus(): Promise<EngineStatus | undefined> {
|
|
328
360
|
try {
|