dsh-perm-gate 4.0.0 → 4.1.0-beta.2

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 CHANGED
@@ -5,21 +5,6 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [3.0.0] - 2026-09-14
9
-
10
- ### Changed
11
-
12
- - **This branch is the DSH 0.1.5 line: version series `3.x`, `engines.dsh`
13
- `>=0.1.5-rc.1 <0.2.0-0`, npm dist-tag `dsh-0.1.5`.** It is a **packaging delta only** —
14
- the code is `main`'s, aligned to `main@42dabae`; the major bump is the fence, so a `^2.x`
15
- install never resolves `3.x` and vice versa.
16
- - `dsh.plugin.json` now carries the same version and range as `package.json` (it still said
17
- `2.6.0` / `>=0.1.2-alpha.1`), and the README version reference follows.
18
- - **`3.x` is not on npm yet.** No `3.x` version and no `dsh-0.1.5` dist-tag have been
19
- published, so `dsh-perm-gate@dsh-0.1.5` does not resolve; until the release is cut, a
20
- `0.1.5-rc.x` host installs this branch directly
21
- (`github:drscrewdriver/dsh-perm-gate#sync/0.1.5-from-main`) or takes `@latest`.
22
-
23
8
  ## [2.6.0] - 2026-09-17
24
9
 
25
10
  ### Added
package/INSTALL.ja.md CHANGED
@@ -12,31 +12,30 @@
12
12
  - [日本語 changelog](./CHANGELOG.ja.md)
13
13
  - [한국어 changelog](./CHANGELOG.ko.md)
14
14
 
15
- `dsh-perm-gate` バージョン **3.0.0**。判定チェーン、ルールファイル形式、自动审查
15
+ `dsh-perm-gate` バージョン **2.4.1**。判定チェーン、ルールファイル形式、自动审查
16
16
  ティアについては [日本語 README](./README.ja.md) を参照してください。
17
17
 
18
18
  ## 必要条件
19
19
 
20
20
  - [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) がインストール済みであること。
21
- - Node.js **>= 24**(`package.json` の `engines` を参照)。
21
+ - Node.js **>= 20**(`package.json` の `engines` を参照)。
22
22
  - `dsh` CLI が `PATH` に存在すること。
23
23
  - インストール先の profile。ブラウザ側は `web` profile 向けにのみビルドされます
24
24
  (`package.json` の `dsh.client.platform = "web"`)。
25
25
 
26
- ## DSH のバージョンに合うラインを選ぶ
26
+ ## DSH のバージョンに合う tag を選ぶ
27
27
 
28
- 2 つの長期ブランチが 2 つの DSH ラインを担当します:`main`(2.x)と
29
- `sync/0.1.5-from-main`(3.x、DSH 0.1.5 のパッケージング変体 —— `compat/0.1.5` は
30
- 同じコードツリーを指します)。
28
+ 単一ビルドが DSH 両ラインをカバーするため、どちらの tag を選んでも動作するコードが
29
+ インストールされます —— tag を残しておくのは、あなたがピン留めするバージョンが
30
+ 各ラインで意味を持つようにするためです。
31
31
 
32
32
  | DSH のバージョン | インストール方法 |
33
33
  |-----------------|-----------------|
34
- | `0.1.2-alpha.1` – `0.1.5-rc.0` | `dsh plugin --profile web add dsh-perm-gate`(tag `latest`、2.x ライン) |
35
- | `0.1.5-rc.1` 以上 | `dsh plugin --profile web add github:drscrewdriver/dsh-perm-gate#sync/0.1.5-from-main`(3.x ライン;npm の dist-tag は未公開 —— `@latest` は同じコードの 2.x パッケージングをインストールします) |
34
+ | `0.1.2-alpha.1` 以上(`0.1.5-rc.2` を含む) | `dsh plugin --profile web add dsh-perm-gate`(tag `latest`) |
36
35
  | `0.1.1-rc.2` まで | `dsh plugin --profile web add dsh-perm-gate@legacy` |
37
36
 
38
- DSH は `engines.dsh` を強制しないため、tag と ref は選択メカニズムであり、互換性
39
- ゲートそのものではありません。ラインと tag の公開レイアウトについては
37
+ DSH は `engines.dsh` を強制しないため、tag が選択メカニズムであり、互換性ゲート
38
+ そのものではありません。単一ビルドが両ラインをカバーする理由と tag の公開方法については、
40
39
  [RELEASING.md](./RELEASING.md) を参照してください。
41
40
 
42
41
  ## 公式 CLI でインストール
@@ -73,11 +72,6 @@ profile の `cordis.yml` にプラグインを追加します:
73
72
  defaultAction: ask # allow | ask | deny
74
73
  ```
75
74
 
76
- ルール本体は `dsh-perm-gate-rules` settings 名前空間に保存され、変更のたびにゲートが
77
- その場で再コンパイルされます。上記の YAML ファイルは任意です。名前空間が未設定の間
78
- だけ読み込まれ、プラグインが最初にルールを書き込む際(許可リストの承認、または設定
79
- UI での編集)にファイルのルールが自動的に取り込まれます。
80
-
81
75
  まずは [examples/permissions.example.yaml](./examples/permissions.example.yaml)
82
76
  から始め、profile を再読込してください。
83
77
 
package/INSTALL.ko.md CHANGED
@@ -12,32 +12,31 @@
12
12
  - [日本語 changelog](./CHANGELOG.ja.md)
13
13
  - [한국어 changelog](./CHANGELOG.ko.md)
14
14
 
15
- `dsh-perm-gate` 버전 **3.0.0**. 결정 체인, 규칙 파일 형식, 自动审查 티어는
15
+ `dsh-perm-gate` 버전 **2.4.1**. 결정 체인, 규칙 파일 형식, 自动审查 티어는
16
16
  [한국어 README](./README.ko.md)를 참고하세요.
17
17
 
18
18
  ## 요구 사항
19
19
 
20
20
  - [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)가 설치되어 있어야 합니다.
21
- - Node.js **>= 24** (`package.json`의 `engines` 참고).
21
+ - Node.js **>= 20** (`package.json`의 `engines` 참고).
22
22
  - `dsh` CLI가 `PATH`에 있어야 합니다.
23
23
  - 설치할 profile. 브라우저 절반은 `web` profile용으로만 빌드됩니다
24
24
  (`package.json`의 `dsh.client.platform = "web"`).
25
25
 
26
- ## DSH 버전에 맞는 라인 선택
26
+ ## DSH 버전에 맞는 tag 선택
27
27
 
28
- 두 개의 장기 브랜치가 두 DSH 라인을 담당합니다: `main`(2.x)과
29
- `sync/0.1.5-from-main`(3.x, DSH 0.1.5 패키징 변형 —— `compat/0.1.5`는 같은 코드
30
- 트리를 가리킵니다).
28
+ 단일 빌드는 두 DSH 라인을 모두 커버하므로, 어느 tag를 골라도 작동하는 코드가
29
+ 설치됩니다 —— tag를 유지하는 이유는 당신이 고정하는 버전이 각 라인에서 의미 있게
30
+ 유지되도록 하기 위함입니다.
31
31
 
32
32
  | DSH 버전 | 설치 방법 |
33
33
  |----------|-----------|
34
- | `0.1.2-alpha.1` – `0.1.5-rc.0` | `dsh plugin --profile web add dsh-perm-gate` (tag `latest`, 2.x 라인) |
35
- | `0.1.5-rc.1` 이상 | `dsh plugin --profile web add github:drscrewdriver/dsh-perm-gate#sync/0.1.5-from-main` (3.x 라인; npm dist-tag 미게시 —— `@latest`는 동일 코드의 2.x 패키징을 설치) |
34
+ | `0.1.2-alpha.1` 이상 (`0.1.5-rc.2` 포함) | `dsh plugin --profile web add dsh-perm-gate` (tag `latest`) |
36
35
  | `0.1.1-rc.2` 이하 | `dsh plugin --profile web add dsh-perm-gate@legacy` |
37
36
 
38
- DSH는 `engines.dsh`를 강제하지 않으므로, tag과 ref은 선택 메커니즘이지 호환성
39
- 게이트가 아닙니다. 라인과 tag 게시 레이아웃은 [RELEASING.md](./RELEASING.md)를
40
- 참고하세요.
37
+ DSH는 `engines.dsh`를 강제하지 않으므로, tag는 선택 메커니즘이지 호환성 게이트가
38
+ 아닙니다. 단일 아티팩트가 두 라인을 커버하는 이유와 tag가 게시되는 방식에 대해서는
39
+ [RELEASING.md](./RELEASING.md)를 참고하세요.
41
40
 
42
41
  ## 공식 CLI로 설치
43
42
 
@@ -74,11 +73,6 @@ profile의 `cordis.yml`에 플러그인을 추가합니다:
74
73
  defaultAction: ask # allow | ask | deny
75
74
  ```
76
75
 
77
- 규칙 본체는 `dsh-perm-gate-rules` settings 네임스페이스에 저장되며, 변경 시마다
78
- 게이트가 그 자리에서 다시 컴파일됩니다. 위의 YAML 파일은 선택 사항입니다.
79
- 네임스페이스가 설정되지 않은 동안에만 읽히며, 플러그인이 처음으로 규칙을 쓸 때(허용
80
- 목록 승인 또는 설정 UI에서의 편집) 파일의 규칙이 자동으로 흡수됩니다.
81
-
82
76
  [examples/permissions.example.yaml](./examples/permissions.example.yaml)에서 시작한 뒤
83
77
  profile을 다시 불러오세요.
84
78
 
package/INSTALL.md CHANGED
@@ -12,32 +12,30 @@
12
12
  - [日本語 changelog](./CHANGELOG.ja.md)
13
13
  - [한국어 changelog](./CHANGELOG.ko.md)
14
14
 
15
- `dsh-perm-gate` version **3.0.0**. Continue with the [README](./README.md) for the
15
+ `dsh-perm-gate` version **2.4.1**. Continue with the [README](./README.md) for the
16
16
  decision chain, the rules file format and the 自动审查 tier.
17
17
 
18
18
  ## Requirements
19
19
 
20
20
  - An existing [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) installation.
21
- - Node.js **>= 24** (see `engines` in `package.json`).
21
+ - Node.js **>= 20** (see `engines` in `package.json`).
22
22
  - The `dsh` CLI on your `PATH`.
23
23
  - A profile to install into — the browser half only ships for the `web` profile
24
24
  (`dsh.client.platform = "web"` in `package.json`).
25
25
 
26
- ## Pick the line for your DSH version
26
+ ## Pick the tag for your DSH version
27
27
 
28
- Two long-lived branches serve two DSH lines: `main` (2.x) and
29
- `sync/0.1.5-from-main` (3.x, the DSH 0.1.5 packaging variant — `compat/0.1.5`
30
- points at the same tree).
28
+ One build serves both DSH lines, so either tag installs working code — the tag
29
+ exists so a version you pin stays meaningful per line.
31
30
 
32
31
  | Your DSH | Install |
33
32
  |----------|---------|
34
- | `0.1.2-alpha.1` – `0.1.5-rc.0` | `dsh plugin --profile web add dsh-perm-gate` (tag `latest`, the 2.x line) |
35
- | `0.1.5-rc.1` or newer | `dsh plugin --profile web add github:drscrewdriver/dsh-perm-gate#sync/0.1.5-from-main` (the 3.x line; no npm dist-tag yet — `@latest` installs the same code with 2.x packaging) |
33
+ | `0.1.2-alpha.1` or newer (incl. `0.1.5-rc.2`) | `dsh plugin --profile web add dsh-perm-gate` (tag `latest`) |
36
34
  | up to `0.1.1-rc.2` | `dsh plugin --profile web add dsh-perm-gate@legacy` |
37
35
 
38
- DSH does not enforce `engines.dsh`, so tags and refs are the selection mechanism
39
- rather than a compatibility gate. See [RELEASING.md](./RELEASING.md) for how the
40
- lines and tags are laid out.
36
+ DSH does not enforce `engines.dsh`, so the tags are the selection mechanism rather
37
+ than a compatibility gate. See [RELEASING.md](./RELEASING.md) for why one artifact
38
+ covers both lines and how the tags are published.
41
39
 
42
40
  ## Install with the official CLI
43
41
 
@@ -75,12 +73,6 @@ Add the plugin to your profile's `cordis.yml`:
75
73
  gatePresets: [permissive] # tiers where the gate is active at all (default)
76
74
  ```
77
75
 
78
- Rules are stored in the `dsh-perm-gate-rules` settings namespace, and every
79
- change recompiles the gate in place. The YAML file above is optional: it is only
80
- read while the namespace is untouched, and the first rules write from the plugin
81
- (an allowlist approval, or an edit in the settings UI) absorbs the file's rules
82
- automatically.
83
-
84
76
  Start from [examples/permissions.example.yaml](./examples/permissions.example.yaml),
85
77
  then reload the profile.
86
78
 
package/INSTALL.zh.md CHANGED
@@ -12,30 +12,29 @@
12
12
  - [日本語 changelog](./CHANGELOG.ja.md)
13
13
  - [한국어 changelog](./CHANGELOG.ko.md)
14
14
 
15
- `dsh-perm-gate` 版本 **3.0.0**。裁决链、规则文件格式与自动审查档位请见
15
+ `dsh-perm-gate` 版本 **2.4.1**。裁决链、规则文件格式与自动审查档位请见
16
16
  [中文 README](./README.zh.md)。
17
17
 
18
18
  ## 前置条件
19
19
 
20
20
  - 已安装 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)。
21
- - Node.js **>= 24**(见 `package.json` 的 `engines`)。
21
+ - Node.js **>= 20**(见 `package.json` 的 `engines`)。
22
22
  - `dsh` CLI 已在 `PATH` 中。
23
23
  - 需要一个目标 profile —— 浏览器端只为 `web` profile 构建(`package.json`
24
24
  里 `dsh.client.platform = "web"`)。
25
25
 
26
- ## 按你的 DSH 版本选择安装线
26
+ ## 按你的 DSH 版本选择 tag
27
27
 
28
- 两条长期分支分别服务两条 DSH 线:`main`(2.x)与 `sync/0.1.5-from-main`
29
- (3.x,DSH 0.1.5 打包变体 —— `compat/0.1.5` 指向同一棵代码树)。
28
+ 单一构建同时覆盖两条 DSH 线,所以任一 tag 安装的代码都能工作 —— 保留 tag
29
+ 是为了让你锁定的版本在每条线上都有意义。
30
30
 
31
31
  | 你的 DSH | 安装方式 |
32
32
  |----------|----------|
33
- | `0.1.2-alpha.1` – `0.1.5-rc.0` | `dsh plugin --profile web add dsh-perm-gate`(tag `latest`,2.x 线) |
34
- | `0.1.5-rc.1` 或更高 | `dsh plugin --profile web add github:drscrewdriver/dsh-perm-gate#sync/0.1.5-from-main`(3.x 线;npm 尚无对应 dist-tag —— `@latest` 安装的是相同代码的 2.x 打包) |
33
+ | `0.1.2-alpha.1` 或更高(含 `0.1.5-rc.2`) | `dsh plugin --profile web add dsh-perm-gate`(tag `latest`) |
35
34
  | 不高于 `0.1.1-rc.2` | `dsh plugin --profile web add dsh-perm-gate@legacy` |
36
35
 
37
- DSH 不强制 `engines.dsh`,因此 tag 与 ref 是选择机制而非兼容性关卡。
38
- 各线与 tag 的发布布局详见 [RELEASING.md](./RELEASING.md)。
36
+ DSH 不强制 `engines.dsh`,因此 tag 是选择机制而非兼容性关卡。
37
+ 详见 [RELEASING.md](./RELEASING.md) 了解为何单一制品覆盖两条线以及 tag 的发布方式。
39
38
 
40
39
  ## 用官方 CLI 安装
41
40
 
@@ -71,10 +70,6 @@ dsh plugin --profile web add .
71
70
  defaultAction: ask # allow | ask | deny
72
71
  ```
73
72
 
74
- 规则本体存储在 `dsh-perm-gate-rules` settings 命名空间中,每次变更都会就地重编译
75
- 闸门。上面的 YAML 文件是可选的:只有命名空间未被配置时才会读取它,插件发起的首次
76
- 规则写入(白名单批准或设置界面编辑)会自动收编文件中的规则。
77
-
78
73
  可从 [examples/permissions.example.yaml](./examples/permissions.example.yaml) 起步,
79
74
  然后重载 profile。
80
75
 
package/README.md CHANGED
@@ -42,7 +42,7 @@
42
42
  > **private** method of the user-approval service on both, so it is read behind a
43
43
  > `typeof` probe and degrades to “policy unknown” when absent or throwing.
44
44
 
45
- Version **3.0.0** — see the [Changelog](./CHANGELOG.md).
45
+ Version **2.6.0** — see the [Changelog](./CHANGELOG.md).
46
46
 
47
47
  A single, self-sufficient, deterministic-first, fail-closed permission gate for DeepSeek Harness.
48
48
 
package/dsh.plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "dsh-perm-gate",
3
3
  "name": "dsh-perm-gate",
4
- "version": "3.0.0",
4
+ "version": "2.6.0",
5
5
  "description": {
6
6
  "en": "Deterministic-first, fail-closed permission gate for DeepSeek Harness 0.1.2+: a P0 hard-deny -> P1 precise session grant -> P2 static allow/deny rule chain -> P3 optional LLM classifier -> P4 ask pipeline over the tools/pre-execute waterfall, with a standalone CLI dry-run evaluator and an auditable decision log. It only vetoes with deny/ask and always delegates otherwise, and unknown or malformed rules fail loud instead of silently standing the gate down.",
7
7
  "zh": "面向 DeepSeek Harness 0.1.2+ 的确定性优先、失败即拒的权限闸门:在 tools/pre-execute 瀑布上串起 P0 硬拒绝 → P1 精确会话授权 → P2 静态 allow/deny 规则链 → P3 可选 LLM 语义分类 → P4 ask,并附带独立 CLI 干跑评估器与可审计的决策日志。只以 deny/ask 否决、其余一律放行,规则未知或非法时直接报错,绝不静默失效。"
@@ -13,7 +13,7 @@
13
13
  },
14
14
  "license": "MIT",
15
15
  "engines": {
16
- "dsh": ">=0.1.5-rc.1 <0.2.0-0"
16
+ "dsh": ">=0.1.2-alpha.1"
17
17
  },
18
18
  "components": {
19
19
  "host": "lib/index.js",
package/lib/client.js CHANGED
@@ -89,6 +89,8 @@ window.__ModuleLoader__.load({
89
89
  "card.llmPresetHost": "DSH 模型组(选择后自动切换为会话模式)",
90
90
  "card.networkEnabled": "网络拦截(networkEnabled)",
91
91
  "card.networkEnabledHint": "开启后启动本地代理拦截子进程出站连接,按规则放行/阻断。关闭则零行为变更。",
92
+ "card.watch": "规则热重载(watch)",
93
+ "card.watchHint": "开启后自动监听规则文件变更并即时生效,无需手动 reload。",
92
94
  "card.networkRebindNote": "切换后立即生效(自动重绑,无需重载插件)。",
93
95
  "card.networkInjectEnv": "注入代理环境变量(networkInjectEnv)",
94
96
  "card.networkInjectEnvHint": "开启后为子进程写入 HTTP(S)_PROXY / ALL_PROXY(并清空 NO_PROXY)。关闭则只启动监听、不改变任何进程环境。",
@@ -145,20 +147,20 @@ window.__ModuleLoader__.load({
145
147
  "card.dryRunNoRules": "(当前加载了 0 条规则:检查 rulesFile 路径)",
146
148
  "card.dryRunFail": "测试失败:",
147
149
  "card.dryRunStale": "路由不存在(插件未重启?)",
148
- "card.rules": "权限 YAML",
149
- "card.rulesHint": "门禁此刻实际加载的规则文件原文。只读——这里改不了任何东西。要改规则,用下面的白名单,或直接编辑该文件。",
150
+ "card.rules": "Settings 内置规则",
151
+ "card.rulesHint": "门禁此刻实际加载的规则(来自 settings 命名空间 dsh-perm-gate-rules)。只读——这里改不了任何东西。要改规则,用下面的白名单,或在 settings.yaml 中编辑。",
150
152
  "card.rulesRefresh": "刷新",
151
153
  "card.rulesLoading": "读取中…",
152
- "card.rulesPath": "文件",
153
- "card.rulesNone": "未配置规则文件",
154
+ "card.rulesPath": "来源",
155
+ "card.rulesNone": "未配置规则",
154
156
  "card.rulesCounts": "规则",
155
157
  "card.rulesDefault": "defaultAction",
156
158
  "card.rulesStats": "%b 字节 · %l 行",
157
- "card.rulesMissing": "文件不存在。门禁会退到内置默认。",
158
- "card.rulesTruncated": "文件过大,仅显示前 512 KB。",
159
+ "card.rulesMissing": "规则不存在。门禁会退到内置默认。",
160
+ "card.rulesTruncated": "规则过大,仅显示前 512 KB。",
159
161
  "card.rulesError": "加载失败:",
160
162
  "card.rulesStale": "路由不存在(插件未重启?)",
161
- "card.rulesNote": "此处只读:面板无法修改该文件,白名单段是唯一会写入它的地方。"
163
+ "card.rulesNote": "此处只读:面板无法修改规则,白名单段是唯一会写入 settings 的地方。"
162
164
  };
163
165
  /** English dictionary (keys mirror zh). */
164
166
  const en = {
@@ -239,6 +241,8 @@ window.__ModuleLoader__.load({
239
241
  "card.llmPresetHost": "DSH model groups (selecting one switches to the session receiver)",
240
242
  "card.networkEnabled": "Network interception (networkEnabled)",
241
243
  "card.networkEnabledHint": "When on, starts a local proxy that intercepts outbound subprocess connections and applies allow/deny rules. Off = zero behavior change.",
244
+ "card.watch": "Rule hot-reload (watch)",
245
+ "card.watchHint": "When on, automatically watches rule files for changes and applies them instantly without manual reload.",
242
246
  "card.networkRebindNote": "Takes effect immediately — the proxy rebinds automatically, no plugin reload needed.",
243
247
  "card.networkInjectEnv": "Inject proxy environment (networkInjectEnv)",
244
248
  "card.networkInjectEnvHint": "Writes HTTP(S)_PROXY / ALL_PROXY for subprocesses (and clears NO_PROXY). Off = the listener runs but no process environment is changed.",
@@ -295,20 +299,20 @@ window.__ModuleLoader__.load({
295
299
  "card.dryRunNoRules": "(0 rules loaded — check the rulesFile path)",
296
300
  "card.dryRunFail": "Test failed: ",
297
301
  "card.dryRunStale": "route missing (plugin not restarted?)",
298
- "card.rules": "Permissions YAML",
299
- "card.rulesHint": "The rules file the gate is loading right now, verbatim. Read-only — nothing here can change it. To change rules, use the allowlist below or edit the file directly.",
302
+ "card.rules": "Settings Built-in Rules",
303
+ "card.rulesHint": "The rules the gate is loading right now (from the dsh-perm-gate-rules settings namespace). Read-only — nothing here can change them. To change rules, use the allowlist below or edit settings.yaml.",
300
304
  "card.rulesRefresh": "Refresh",
301
305
  "card.rulesLoading": "Reading…",
302
- "card.rulesPath": "File",
303
- "card.rulesNone": "no rules file configured",
306
+ "card.rulesPath": "Source",
307
+ "card.rulesNone": "no rules configured",
304
308
  "card.rulesCounts": "Rules",
305
309
  "card.rulesDefault": "defaultAction",
306
310
  "card.rulesStats": "%b bytes · %l lines",
307
- "card.rulesMissing": "The file does not exist. The gate falls back to its built-in defaults.",
308
- "card.rulesTruncated": "File is large; showing the first 512 KB only.",
311
+ "card.rulesMissing": "Rules not found. The gate falls back to its built-in defaults.",
312
+ "card.rulesTruncated": "Rules are large; showing the first 512 KB only.",
309
313
  "card.rulesError": "Load failed: ",
310
314
  "card.rulesStale": "route missing (plugin not restarted?)",
311
- "card.rulesNote": "Read-only: this panel cannot modify the file. The allowlist section is the only place that writes to it."
315
+ "card.rulesNote": "Read-only: this panel cannot modify the rules. The allowlist section is the only place that writes to settings."
312
316
  };
313
317
  //#endregion
314
318
  //#region src/deny-defaults.ts
@@ -1929,7 +1933,7 @@ window.__ModuleLoader__.load({
1929
1933
  })
1930
1934
  ]
1931
1935
  }),
1932
- value.networkEnabled === true ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
1936
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
1933
1937
  style: sectionStyle,
1934
1938
  children: [
1935
1939
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
@@ -1960,7 +1964,39 @@ window.__ModuleLoader__.load({
1960
1964
  })]
1961
1965
  })
1962
1966
  ]
1963
- }) : null,
1967
+ }),
1968
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
1969
+ style: sectionStyle,
1970
+ children: [
1971
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1972
+ style: labelStyle,
1973
+ children: t("card.watch")
1974
+ }),
1975
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1976
+ style: hintStyle,
1977
+ children: t("card.watchHint")
1978
+ }),
1979
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1980
+ style: {
1981
+ display: "flex",
1982
+ alignItems: "center",
1983
+ gap: "8px",
1984
+ marginTop: "6px"
1985
+ },
1986
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1987
+ type: "checkbox",
1988
+ checked: value.watch !== false,
1989
+ disabled: readonly,
1990
+ onChange: (event) => {
1991
+ scope.set("watch", event.currentTarget.checked);
1992
+ }
1993
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1994
+ style: { fontSize: "13px" },
1995
+ children: value.watch !== false ? "ON" : "OFF"
1996
+ })]
1997
+ })
1998
+ ]
1999
+ }),
1964
2000
  !snapshot.writable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1965
2001
  style: {
1966
2002
  margin: "8px 0 0",