@deepseek-ai/dsh-experimental-webworker-runtime 0.2.1-alpha.2 → 0.2.1-alpha.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.
- package/README.i18n.yaml +4 -4
- package/README.md +2 -1
- package/README.zh.md +2 -1
- package/lib/index.js +3 -2
- package/lib/worker.js +6 -6
- package/package.json +25 -25
package/README.i18n.yaml
CHANGED
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
en: 4e53164159b5ce41
|
|
16
16
|
zh: 89582dc0294d0776
|
|
17
17
|
/deepseek-ai-dsh-experimental-webworker-runtime/use-this-package:
|
|
18
|
-
en:
|
|
19
|
-
zh:
|
|
18
|
+
en: aed3c07b75b29e34
|
|
19
|
+
zh: b609ae0f5796aa34
|
|
20
20
|
/deepseek-ai-dsh-experimental-webworker-runtime/model-experience:
|
|
21
21
|
en: 61fce9b4c7dc96e6
|
|
22
22
|
zh: dc2d931063a38327
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
en: ca75c51c89c2c9b0
|
|
25
25
|
zh: 64715dc7e6d02f71
|
|
26
26
|
/deepseek-ai-dsh-experimental-webworker-runtime/known-limitations-and-deferred-work:
|
|
27
|
-
en:
|
|
28
|
-
zh:
|
|
27
|
+
en: 7a473e73cc9449f9
|
|
28
|
+
zh: 2752c65ef3a33463
|
|
29
29
|
/deepseek-ai-dsh-experimental-webworker-runtime/known-limitations-and-deferred-work/dev-note:
|
|
30
30
|
en: e67f633dc6fe7773
|
|
31
31
|
zh: e88aeb617ffb74ea
|
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ Three build artifacts and one source-owned process layer:
|
|
|
32
32
|
- **`src/shell/` (the worker's own process layer)** — a browser worker cannot fork, so `node:child_process` is not a stub but an implementation: `spawn` starts the command in its own Web Worker — this same bundle, told by its first frame to be a shell process — and reports it through the `ChildProcess` surface the subprocess service consumes. The command runs off the host's thread, `SIGKILL` terminates it whatever it is doing, and it reaches the VFS only by message (the host serves those frames). Worker platform executables preserve native-package protocols such as Landlock without replacing their JavaScript packages or coupling their implementations to `node:child_process`; `xdg-open` sends one VFS text file to the page's read-only viewer, so desktop-opener actions such as **Open configuration file** show the file in the page; ordinary commands use the package's evaluator and coreutils command table. The grammar is `@yarnpkg/parsers`' `parseShell`, while `execSync`/`fork` still refuse because they need a real process.
|
|
33
33
|
- **`lib/client.js` (page half)** — startup has two independent stages. `chooseWorkerHostSource({ image?, fixtureManifest? })` optionally owns the boot barrier and fixture manifest: without `preview-fixture` it waits at the source chooser, while a valid query selects directly; either path returns ordered overlays. `connectWorkerHost(worker, { image?, overlays? })` remains the public base-runtime connector; callers that skip the chooser get an empty overlay list. `apps/web` invokes both and supplies its statically bundled Worker. The opening `init` frame carries the base and ordered overlay URLs, the boot payload delivers the structured index-injection table, and `applyIndexInjections` executes it before the shell entry runs. Script preload rows are advisory and skipped because `/plugins` resources resolve only through the tunnel; `loadBundle` fetches each combo on first demand, embeds its tunnel-only source map as a Base64 data URL, and executes the script as a Blob. The worker's unsolicited `view-text` frame opens the page's modal text viewer. The tunnel also exposes fetch-shaped transport, the independent file-upload carrier, and the API client. Request frames preserve Blob bodies through structured clone and transfer `ReadableStream<Uint8Array>` ownership. The Host Worker streams both forms into the route, so neither browser thread creates a complete byte array for a generic-file upload. A Remote stream's uplink crosses as `stream-uplink-item` / `stream-uplink-end` frames into an unbounded `TunnelUplink` that drops items arriving after `end`: the page and its worker are one trusted same-origin boundary, so the Host inbox cap does not apply.
|
|
34
34
|
|
|
35
|
-
Acceptance lives in `apps/web/tests/preview-boot.e2e.ts`, which serves the real built pages and drives the pre-boot chooser plus Worker activation in headless Chromium. The empty selection exercises first-run startup. The `vfs-example` overlay supplies ordinary workspace files and plaintext persistence artifacts for cold Workspace/Session discovery, tool presentation, subagent navigation, and history paging without a model request. The [packer](../webworker-packer/README.md) prepares current-generation successors from committed historical logs in Node; those source logs remain byte-identical in the overlay. The fixture generator owns the acceptance test's current projection cache. The chooser reserves WebFS as a separate user-authorized source; that provider does not read the built-in fixture.
|
|
35
|
+
Acceptance lives in `apps/web/tests/preview-boot.e2e.ts`, which serves the real built pages and drives the pre-boot chooser plus Worker activation in headless Chromium. The empty selection exercises first-run startup. The `vfs-example` overlay supplies ordinary workspace files and plaintext persistence artifacts for cold Workspace/Session discovery, tool presentation, subagent navigation, and history paging without a model request. The showcase mixes empty, whitespace-only, and non-empty reasoning with a long multiline command and a parent-path file link; these are authored fixtures, not live model output. The [packer](../webworker-packer/README.md) prepares current-generation successors from committed historical logs in Node; those source logs remain byte-identical in the overlay. The fixture generator owns the acceptance test's current projection cache. The chooser reserves WebFS as a separate user-authorized source; that provider does not read the built-in fixture.
|
|
36
36
|
|
|
37
37
|
The [built-bundle import sweep](tests/compile/transform-corpus-check.ts) checks bare Node imports after the library build. Its Dockkit exception accepts Node’s unknown-`.css`-extension refusal for any stylesheet rather than one pinned path; another extension, error code, or message, and an unexpectedly successful exempt import, remain errors.
|
|
38
38
|
|
|
@@ -57,6 +57,7 @@ None; this package neither assembles nor sends a provider request.
|
|
|
57
57
|
- **Native TLS listeners require a Node Host**: the worker's `node:https.createServer` rejects activation rather than substituting plaintext. The preview's internal HTTP tunnel does not bind sockets; browser-facing HTTPS belongs to its deployment server.
|
|
58
58
|
- **Desktop product telemetry is unavailable**: `got.post` reports an explicit worker-host refusal. Got and its Node HTTP dependencies are excluded from the browser image; Desktop reporting remains disabled in the preview composition.
|
|
59
59
|
- **Host package commands are unavailable**: `execa` reports an explicit worker-host refusal; the preview cannot run pnpm, install plugins, or install native dependencies.
|
|
60
|
+
- **pi-ai model requests are unavailable**: the replacement exposes a fixed subset of installed provider identifiers with no models, allowing the adapter to register configuration metadata. Its identifiers must stay valid when pi-ai is upgraded; inference entry points report an explicit worker-host refusal.
|
|
60
61
|
- **PTC Node programs are unavailable**: the process shim exposes `/dsh/bin/node` as its executable identity so the provider can activate, but the Worker has neither a Node executable nor `stripTypeScriptTypes`. Program execution fails before launching a child.
|
|
61
62
|
- **Office conversion requires a Node Host**: the LibreOffice kit replacement rejects converter creation with `unavailable`. The browser image excludes the kit and its engine dependencies; the Office preview reports that conversion is unavailable.
|
|
62
63
|
- **Filesystem watchers observe only the mounted VFS**: image seeding is silent and the VFS has no symlinks or external writers. `persistent`, `ref()`, and `unref()` preserve the Node API but cannot control a dedicated Worker's lifetime because browsers expose no ref-counted event loop.
|
package/README.zh.md
CHANGED
|
@@ -32,7 +32,7 @@ kind: "package-library"
|
|
|
32
32
|
- **`src/shell/`(worker 自己的进程层)**——浏览器 worker 无法 fork,所以 `node:child_process` 不是 stub 而是实现:`spawn` 把命令放进它自己的 Web Worker——就是这同一个束,由首帧告诉它「你是 shell 进程」——并以 subprocess 服务消费的 `ChildProcess` 面报告结果。命令不占宿主线程,`SIGKILL` 不管它在干什么都能终止它,而它只能靠消息触达 VFS(由宿主应答这些帧)。Worker 平台 executable 在不替换 JavaScript 包、也不把具体实现耦合进 `node:child_process` 的情况下保持 Landlock 等 native 包协议;`xdg-open` 把一个 VFS 文本文件交给页面的只读查看器,因此 **打开配置文件** 等桌面打开操作会在页面内显示该文件;普通命令使用本包的求值器与 coreutils 命令表。语法来自 `@yarnpkg/parsers` 的 `parseShell`,而 `execSync`/`fork` 依然拒绝,因为它们需要真进程。
|
|
33
33
|
- **`lib/client.js`(页面半)**——启动分为相互独立的两段。`chooseWorkerHostSource({ image?, fixtureManifest? })` 可选地拥有 boot barrier 与 fixture manifest:没有 `preview-fixture` 时停在来源选择面板,合法 query 则直接选择;两条路径都返回按序排列的 overlays。`connectWorkerHost(worker, { image?, overlays? })` 仍是公开的基础运行态连接器;调用方跳过选择器时 overlay 列表为空。`apps/web` 调用这两段并提供静态打包的 Worker。开局 `init` 帧携带基础镜像与按序排列的 overlay URL,boot 载荷送达结构化 index 注入表,`applyIndexInjections` 在壳入口运行前逐行执行。脚本 preload 行只是提示,因此会被跳过:`/plugins` 资源只能经 tunnel 解析,`loadBundle` 会在首次需要时获取 combo、把仅 tunnel 可达的 sourcemap 内嵌为 Base64 data URL,再以 Blob 执行脚本。worker 主动发出的 `view-text` 帧会打开页面的模态文本查看器。Tunnel 还暴露 fetch 形式的传输、独立文件上传载体和 API 客户端。请求帧通过结构化克隆保留 Blob 请求体,并转移 `ReadableStream<Uint8Array>` 的所有权。Host Worker 将两种请求体都逐块送入路由,因此通用文件上传不会在任何浏览器线程创建完整字节数组。Remote 流的上行以 `stream-uplink-item` / `stream-uplink-end` 帧进入没有上限的 `TunnelUplink`,`end` 之后到达的项被丢弃:页面与其 worker 是同一个可信的同源边界,Host 的 inbox 上限在此不适用。
|
|
34
34
|
|
|
35
|
-
验收在 `apps/web/tests/preview-boot.e2e.ts`:静态服务真实构建页面,在 headless Chromium 里驱动 pre-boot 选择面板与 Worker 激活。空白选择验证首次启动;`vfs-example` overlay 提供普通 workspace 文件与明文 persistence 产物,无需模型请求即可验证 Workspace/Session 冷发现、工具呈现、subagent 导航和历史分页。[打包器](../webworker-packer/README.zh.md)在 Node 中根据已提交的历史日志准备当前代后继文件;这些源日志在 overlay 中逐字节保持不变。fixture 生成器负责验收测试的当前投影缓存。选择面板为 WebFS 保留独立的用户授权来源;该 provider 不读取内置 fixture。
|
|
35
|
+
验收在 `apps/web/tests/preview-boot.e2e.ts`:静态服务真实构建页面,在 headless Chromium 里驱动 pre-boot 选择面板与 Worker 激活。空白选择验证首次启动;`vfs-example` overlay 提供普通 workspace 文件与明文 persistence 产物,无需模型请求即可验证 Workspace/Session 冷发现、工具呈现、subagent 导航和历史分页。showcase 混排空字符串、纯空白与非空推理块,并包含多行长命令和父路径文件链接;这些是人工构造的 fixture,不是真实模型输出。[打包器](../webworker-packer/README.zh.md)在 Node 中根据已提交的历史日志准备当前代后继文件;这些源日志在 overlay 中逐字节保持不变。fixture 生成器负责验收测试的当前投影缓存。选择面板为 WebFS 保留独立的用户授权来源;该 provider 不读取内置 fixture。
|
|
36
36
|
|
|
37
37
|
[已构建 bundle 导入检查](tests/compile/transform-corpus-check.ts)在库构建后检查裸 Node 导入。Dockkit 例外接受 Node 针对任意样式表报告的未知 `.css` 扩展名错误,而不限定某一固定路径;其他扩展名、错误码或消息,以及意外成功的豁免导入,仍然报错。
|
|
38
38
|
|
|
@@ -57,6 +57,7 @@ kind: "package-library"
|
|
|
57
57
|
- **原生 TLS 监听器需要 Node Host**:worker 的 `node:https.createServer` 会拒绝激活,不会替换成明文。预览内部的 HTTP 隧道不绑定套接字;面向浏览器的 HTTPS 由部署服务器提供。
|
|
58
58
|
- **桌面产品埋点不可用**:`got.post` 明确报告 worker host 不支持该调用。浏览器镜像不包含 Got 及其 Node HTTP 依赖;预览组合不启用桌面上报。
|
|
59
59
|
- **宿主包管理命令不可用**:`execa` 明确报告 worker host 不支持该调用;预览无法运行 pnpm、安装插件或安装原生依赖。
|
|
60
|
+
- **pi-ai 模型请求不可用**:替代实现暴露已安装提供方标识的固定子集,不包含模型,使适配器能够注册配置元数据。升级 pi-ai 时必须保持这些标识有效;推理入口明确报告 worker host 不支持该调用。
|
|
60
61
|
- **PTC Node 程序不可用**:process shim 用 `/dsh/bin/node` 表示可执行文件身份,使 provider 能够激活,但 Worker 既没有 Node 可执行文件,也没有 `stripTypeScriptTypes`。程序执行会在启动子进程前失败。
|
|
61
62
|
- **Office 转换需要 Node Host**:LibreOffice kit 的替代模块以 `unavailable` 拒绝创建转换器。浏览器镜像排除 kit 及其引擎依赖;Office 预览提示转换不可用。
|
|
62
63
|
- **文件 watcher 只能观察已挂载的 VFS**:镜像 seed 不产生事件,VFS 也没有符号链接或外部写入方。`persistent`、`ref()` 和 `unref()` 保留 Node API,但浏览器没有引用计数事件循环,因此这些接口不能控制 dedicated Worker 的生存期。
|
package/lib/index.js
CHANGED
|
@@ -3429,10 +3429,11 @@ function createWorkerHost(options) {
|
|
|
3429
3429
|
const handler = connection.createSharedFetchHandler("/api");
|
|
3430
3430
|
const usage = loader.usage();
|
|
3431
3431
|
console.info(`webworker host: tree active (modules=${String(usage.modules)}, data overlays=${String(overlays.length)}, direct lane=connection.createSharedFetchHandler, als causality=${options.alsCausality === void 0 ? "inert" : "snapshot/restore"}, image lowering=${LOWERING_VERSION})`);
|
|
3432
|
+
const peer = connection.browserPeer;
|
|
3432
3433
|
tunnel.serve({
|
|
3433
|
-
directFetch: (request) => handler.fetch(request),
|
|
3434
|
+
directFetch: (request) => handler.fetch(request, peer),
|
|
3434
3435
|
bootPayload: () => readBootPayload(ctx),
|
|
3435
|
-
openStream: (endpoint, payload, uplink, signal) => typertGateway.wireStream.open(endpoint, payload, uplink,
|
|
3436
|
+
openStream: (endpoint, payload, uplink, signal) => typertGateway.wireStream.open(endpoint, payload, uplink, peer, signal),
|
|
3436
3437
|
streamFailure: typertGateway.wireStream.failure
|
|
3437
3438
|
});
|
|
3438
3439
|
started.resolve();
|
package/lib/worker.js
CHANGED
|
@@ -2709,10 +2709,11 @@ function createWorkerHost(options) {
|
|
|
2709
2709
|
const handler = connection.createSharedFetchHandler("/api");
|
|
2710
2710
|
const usage = loader.usage();
|
|
2711
2711
|
console.info(`webworker host: tree active (modules=${String(usage.modules)}, data overlays=${String(overlays.length)}, direct lane=connection.createSharedFetchHandler, als causality=${options.alsCausality === void 0 ? "inert" : "snapshot/restore"}, image lowering=${LOWERING_VERSION})`);
|
|
2712
|
+
const peer = connection.browserPeer;
|
|
2712
2713
|
tunnel.serve({
|
|
2713
|
-
directFetch: (request) => handler.fetch(request),
|
|
2714
|
+
directFetch: (request) => handler.fetch(request, peer),
|
|
2714
2715
|
bootPayload: () => readBootPayload(ctx),
|
|
2715
|
-
openStream: (endpoint, payload, uplink, signal) => typertGateway.wireStream.open(endpoint, payload, uplink,
|
|
2716
|
+
openStream: (endpoint, payload, uplink, signal) => typertGateway.wireStream.open(endpoint, payload, uplink, peer, signal),
|
|
2716
2717
|
streamFailure: typertGateway.wireStream.failure
|
|
2717
2718
|
});
|
|
2718
2719
|
started.resolve();
|
|
@@ -21748,15 +21749,14 @@ const isContextOverflow = notImplementedFail(MODULE$1, "isContextOverflow");
|
|
|
21748
21749
|
/** Collection of every builtin provider (unavailable). */
|
|
21749
21750
|
const builtinModels = notImplementedFail(MODULE$1, "builtinModels");
|
|
21750
21751
|
/**
|
|
21751
|
-
*
|
|
21752
|
-
*
|
|
21753
|
-
* added since.
|
|
21752
|
+
* Preview provider ids, in catalog order. This fixed subset must use valid
|
|
21753
|
+
* installed pi-ai identifiers so the adapter can attach authentication metadata.
|
|
21754
21754
|
*/
|
|
21755
21755
|
const BUILTIN_PROVIDER_IDS = [
|
|
21756
21756
|
"amazon-bedrock",
|
|
21757
21757
|
"ant-ling",
|
|
21758
21758
|
"anthropic",
|
|
21759
|
-
"azure
|
|
21759
|
+
"azure",
|
|
21760
21760
|
"baseten",
|
|
21761
21761
|
"cerebras",
|
|
21762
21762
|
"cloudflare-ai-gateway",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-experimental-webworker-runtime",
|
|
3
3
|
"description": "Browser-only harness runtime: in-memory VFS, module transform and loader, postMessage tunnel, and the dedicated Web Worker assembly, with the Node-compatibility layer that lets the host tree run unchanged",
|
|
4
|
-
"version": "0.2.1-alpha.
|
|
4
|
+
"version": "0.2.1-alpha.3",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -28,43 +28,43 @@
|
|
|
28
28
|
},
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@deepseek-ai/dsh-util-crypto": "0.2.1-alpha.
|
|
31
|
+
"@deepseek-ai/dsh-util-crypto": "0.2.1-alpha.3",
|
|
32
32
|
"@noble/hashes": "^2.4.0",
|
|
33
33
|
"@yarnpkg/parsers": "^3.1.0",
|
|
34
34
|
"acorn": "^8.18.0",
|
|
35
35
|
"buffer": "^6.0.3",
|
|
36
36
|
"picomatch": "^4.0.7",
|
|
37
37
|
"readable-stream": "^4.7.0",
|
|
38
|
-
"@deepseek-ai/dsh-client-web": "0.2.1-alpha.
|
|
38
|
+
"@deepseek-ai/dsh-client-web": "0.2.1-alpha.3"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
|
-
"@deepseek-ai/cordis": "~4.0.5-alpha.
|
|
42
|
-
"@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.
|
|
43
|
-
"@deepseek-ai/dsh-client-connection": "0.2.1-alpha.
|
|
44
|
-
"@deepseek-ai/dsh-client-modules": "0.2.1-alpha.
|
|
45
|
-
"@deepseek-ai/dsh-host-webserver": "0.2.1-alpha.
|
|
41
|
+
"@deepseek-ai/cordis": "~4.0.5-alpha.2",
|
|
42
|
+
"@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.2",
|
|
43
|
+
"@deepseek-ai/dsh-client-connection": "0.2.1-alpha.3",
|
|
44
|
+
"@deepseek-ai/dsh-client-modules": "0.2.1-alpha.3",
|
|
45
|
+
"@deepseek-ai/dsh-host-webserver": "0.2.1-alpha.3"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@deepseek-ai/cordis": "~4.0.5-alpha.
|
|
49
|
-
"@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.
|
|
50
|
-
"@deepseek-ai/dsh-api-gateway": "0.2.1-alpha.
|
|
51
|
-
"@deepseek-ai/dsh-app-boot": "0.2.1-alpha.
|
|
52
|
-
"@deepseek-ai/dsh-bash-sandbox": "0.2.1-alpha.
|
|
53
|
-
"@deepseek-ai/dsh-client-connection": "0.2.1-alpha.
|
|
54
|
-
"@deepseek-ai/dsh-client-file-upload": "0.2.1-alpha.
|
|
55
|
-
"@deepseek-ai/dsh-client-modules": "0.2.1-alpha.
|
|
56
|
-
"@deepseek-ai/dsh-host-webserver": "0.2.1-alpha.
|
|
57
|
-
"@deepseek-ai/dsh-sandbox-local": "0.2.1-alpha.
|
|
58
|
-
"@deepseek-ai/dsh-sandbox-policy": "0.2.1-alpha.
|
|
59
|
-
"@deepseek-ai/dsh-session": "0.2.1-alpha.
|
|
60
|
-
"@deepseek-ai/dsh-session-projection": "0.2.1-alpha.
|
|
61
|
-
"@deepseek-ai/dsh-session-persistence-jsonl": "0.2.1-alpha.
|
|
62
|
-
"@deepseek-ai/dsh-subagent": "0.2.1-alpha.
|
|
63
|
-
"@deepseek-ai/dsh-subprocess-local": "0.2.1-alpha.
|
|
48
|
+
"@deepseek-ai/cordis": "~4.0.5-alpha.2",
|
|
49
|
+
"@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.2",
|
|
50
|
+
"@deepseek-ai/dsh-api-gateway": "0.2.1-alpha.3",
|
|
51
|
+
"@deepseek-ai/dsh-app-boot": "0.2.1-alpha.3",
|
|
52
|
+
"@deepseek-ai/dsh-bash-sandbox": "0.2.1-alpha.3",
|
|
53
|
+
"@deepseek-ai/dsh-client-connection": "0.2.1-alpha.3",
|
|
54
|
+
"@deepseek-ai/dsh-client-file-upload": "0.2.1-alpha.3",
|
|
55
|
+
"@deepseek-ai/dsh-client-modules": "0.2.1-alpha.3",
|
|
56
|
+
"@deepseek-ai/dsh-host-webserver": "0.2.1-alpha.3",
|
|
57
|
+
"@deepseek-ai/dsh-sandbox-local": "0.2.1-alpha.3",
|
|
58
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.2.1-alpha.3",
|
|
59
|
+
"@deepseek-ai/dsh-session": "0.2.1-alpha.3",
|
|
60
|
+
"@deepseek-ai/dsh-session-projection": "0.2.1-alpha.3",
|
|
61
|
+
"@deepseek-ai/dsh-session-persistence-jsonl": "0.2.1-alpha.3",
|
|
62
|
+
"@deepseek-ai/dsh-subagent": "0.2.1-alpha.3",
|
|
63
|
+
"@deepseek-ai/dsh-subprocess-local": "0.2.1-alpha.3",
|
|
64
64
|
"@deepseek-ai/node-addon-system": "~0.1.2",
|
|
65
65
|
"@types/picomatch": "^4.0.3",
|
|
66
66
|
"@types/readable-stream": "^4.0.24",
|
|
67
|
-
"chokidar": "
|
|
67
|
+
"chokidar": "5.0.0"
|
|
68
68
|
},
|
|
69
69
|
"files": [
|
|
70
70
|
"lib/index.js",
|