dsh-telegram-connector 0.13.1 → 0.14.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 CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.14.1
4
+
5
+ - **Component actions no longer restart the runtime.** The setup's
6
+ `components enable/disable` starts or stops the stack only; the Penpot tools
7
+ load (or disappear) on the next `dsh.service` start. The `/components` card
8
+ and its help now say so.
9
+
10
+ ## 0.14.0
11
+
12
+ - **`/menu` is the front door.** `/menu` (and `/start` in the bot chat) posts a
13
+ control card with Status, Workspaces, Web link, Help, Update setup, Restart,
14
+ Plugins and Components. The buttons run the same handlers as the typed
15
+ commands; deployment buttons stay admin-only.
16
+ - **One command per action.** `/plugin` is now `/plugins` with subcommands
17
+ (`/plugins add`, `info`, `remove`, `enable`, `disable`, `confirm`, `cancel`,
18
+ `approve`); `/system components` is now `/components`; `/status` in the bot
19
+ chat is `/system status`. The alias table (`/start`/`/?`/`/man`,
20
+ `/plugin list|install|rm|del`, `/list`, `/workspace rm`) is gone.
21
+ - **`/man` removed.** `/help` and `<command> --help` remain; `/help <command>`
22
+ shows the same detail.
23
+ - **`/dashboard` keeps its topic role** (claim an empty topic); the control card
24
+ is `/menu`.
25
+ - The help registry, README, COMMANDS.md and the tests follow the new surface.
26
+
3
27
  ## 0.13.1
4
28
 
5
29
  - **`/system status` probes the advertised address.** The setup binds the LAN
package/COMPATIBILITY.md CHANGED
@@ -6,6 +6,8 @@ every release.
6
6
 
7
7
  | Connector | DSH | Status | Notes |
8
8
  |---|---|---|---|
9
+ | 0.14.1 | `0.2.1-rc.5` | needs UAT | component actions no longer restart the runtime; the tools load on the next start |
10
+ | 0.14.0 | `0.2.1-rc.5` | needs UAT | one command surface: `/menu` card, `/plugins` subcommands, `/components`; aliases and `/man` removed |
9
11
  | 0.13.1 | `0.2.1-rc.5` | needs UAT | `/system status` probes the advertised web address, so a LAN-only bind no longer reports loopback as unreachable |
10
12
  | 0.13.0 | `0.2.1-rc.5` | needs UAT | independent semver; `/system update connector` resolves and installs the newest compatible connector tag; `/system update penpot` and `/system update plugin <name>` update bundles through the plugin manager; standalone mode documented |
11
13
  | 0.2.1-rc.5-0.12.11 | `0.2.1-rc.5` | tested | maintenance: setup keeps the Penpot token in both env files |
package/README.md CHANGED
@@ -19,7 +19,7 @@ group "landing-page" another workspace
19
19
  ```
20
20
 
21
21
  The full command reference is [`docs/COMMANDS.md`](docs/COMMANDS.md) — the bot's
22
- `/man` prints the same text, and every command accepts `--help`. The reasoning
22
+ `/help <command>` prints the same text, and every command accepts `--help`. The reasoning
23
23
  behind the mapping is in [`docs/DESIGN.md`](docs/DESIGN.md); supported DSH
24
24
  versions are in [`COMPATIBILITY.md`](COMPATIBILITY.md).
25
25
 
@@ -73,17 +73,17 @@ versions are in [`COMPATIBILITY.md`](COMPATIBILITY.md).
73
73
  code block or a bullet list on the way out (see above).
74
74
  - **Commands live in one place.** A dashboard topic holds `/new`, `/sync`,
75
75
  `/close`, `/rename`, `/model` and friends; session topics accept plain text.
76
- - **Plugins from the chat.** `/plugins` lists the profile's bundles, `/plugin add`
76
+ - **Plugins from the chat.** `/plugins` lists the profile's bundles, `/plugins add`
77
77
  inspects a spec before anything runs and asks for a confirmation, and
78
78
  `enable`/`disable`/`remove` work without opening a terminal.
79
79
  - **Channel-aware prompts.** A Telegram prompt reaches the agent with a
80
80
  `[via Telegram]` marker, so the answer can use chat steps instead of host
81
81
  commands. Web UI prompts are unmarked; the marker is in the session, not in
82
82
  the Telegram message.
83
- - **Dashboard card.** `/dashboard` posts the common actions as inline buttons:
84
- new session, sync, status and sessions in a group; status, web link, update,
85
- restart, plugins and components in the bot chat. Deployment buttons are
86
- admin-only, exactly like the typed commands.
83
+ - **Menu card.** `/menu` (and `/start` in the bot chat) posts the common actions
84
+ as inline buttons: status, workspaces, web link, help, update, restart, plugins
85
+ and components. Deployment buttons are admin-only, exactly like the typed
86
+ commands. `/dashboard` in a group still claims an empty topic as the dashboard.
87
87
  - **Host-free after install.** The runtime runs under a
88
88
  supervisor: every plugin confirmation opens a rollback window (live under HMR,
89
89
  or around a restart), and `/system update connector` resolves and installs the
@@ -246,9 +246,9 @@ allowlisted user; `provider`/`model` → the profile default; `workspaceRoot`
246
246
 
247
247
  ## Commands
248
248
 
249
- The bot is self-documenting: `/help` lists the commands for the current chat,
250
- `/man` prints the full manual, and `<command> --help` explains one command
251
- (including subcommands: `/plugin add --help`). The same text is in
249
+ The bot is self-documenting: `/help` lists the commands for the current chat
250
+ and `<command> --help` explains one command
251
+ (including subcommands: `/plugins add --help`). The same text is in
252
252
  [`docs/COMMANDS.md`](docs/COMMANDS.md). A `<session>` argument accepts a full
253
253
  session id, an id prefix, or the topic title.
254
254
 
@@ -261,12 +261,12 @@ session id, an id prefix, or the topic title.
261
261
  | `/workspace link <name>` | print the group link again |
262
262
  | `/workspace remove <name>` | preview the topics, confirm, then unregister from DSH and delete the group's session topics (files and sessions are untouched) |
263
263
  | `/plugins` | list the profile's bundles: enabled, disabled, available |
264
- | `/plugin info <name>` | version, source, rows, overrides and any error |
265
- | `/plugin add <spec>` | inspect a package, then install it after **Confirm** (or `/plugin confirm`) |
266
- | `/plugin enable <name>` · `/plugin disable <name>` | select or deselect a bundle (confirmed like the rest) |
267
- | `/plugin remove <name>` | uninstall a bundle (asks for confirmation) |
268
- | `/plugin confirm` · `/plugin cancel` | finish or drop a pending install/removal (the card has the same buttons) |
269
- | `/plugin approve` | allow the install scripts pnpm blocked, and retry |
264
+ | `/plugins info <name>` | version, source, rows, overrides and any error |
265
+ | `/plugins add <spec>` | inspect a package, then install it after **Confirm** (or `/plugins confirm`) |
266
+ | `/plugins enable <name>` · `/plugins disable <name>` | select or deselect a bundle (confirmed like the rest) |
267
+ | `/plugins remove <name>` | uninstall a bundle (asks for confirmation) |
268
+ | `/plugins confirm` · `/plugins cancel` | finish or drop a pending install/removal (the card has the same buttons) |
269
+ | `/plugins approve` | allow the install scripts pnpm blocked, and retry |
270
270
  | `/system restart` | restart into a trial: the new state is live, with a rollback window |
271
271
  | `/system restart now` | restart without a trial; the current state becomes the rollback point |
272
272
  | `/system update connector [to <version>] [now]` | move the connector to its newest compatible version, in a trial |
@@ -276,16 +276,16 @@ session id, an id prefix, or the topic title.
276
276
  | `/system confirm` | commit the running trial (or press **Commit**) |
277
277
  | `/system rollback` | restore the last committed state and restart |
278
278
  | `/system cancel` | abandon a pending update and unblock the bot; after acceptance it stops the updater job |
279
- | `/system components` | optional components (e.g. the design stack): a card with Enable/Disable/Port buttons |
279
+ | `/components` | optional components (e.g. the design stack): a card with Enable/Disable/Port buttons |
280
280
  | `/system status` | versions, supervisor, open trial, web/key/registry probes |
281
281
  | `/system takechat` | make this chat the control chat (notices and update reports follow it) |
282
282
  | `/firewall` | native only: whether ufw lets the web UI through, and the `/firewall allow <port>` fix |
283
283
  | `/web` | a signed link into the web UI for the same sessions |
284
284
  | `/timezone [zone]` | IANA zone used to read times you type (default `$DSH_TIMEZONE` or UTC) |
285
285
  | `/reactions …` | read/streaming/staged reactions: show, set, `on`/`off`, `reset`, `allowed` |
286
- | `/status` | model route, counts, poller, timezone, supervisor and probe lines |
287
286
  | `/system status` | connector, runtime and updater state |
288
- | `/help` · `/man` | index, or the full manual |
287
+ | `/menu` · `/start` | the control card with buttons for the common actions |
288
+ | `/help [command]` | the command index, or one command |
289
289
 
290
290
  Plugin commands run in the private chat because they change the whole profile,
291
291
  not one workspace. `/schedules` is still a stub.
@@ -317,7 +317,7 @@ not one workspace. `/schedules` is still a stub.
317
317
  | `/run <command> [args]` | run a host command even when a connector name wins |
318
318
  | `/skill <name> [args]` | load a skill even when a host command owns the name |
319
319
  | `//text` | send a prompt that literally starts with `/` |
320
- | `/help` · `/man` | the session command manual |
320
+ | `/help` | the session command manual |
321
321
 
322
322
  Management lives in the dashboard: `/new`, `/sessions`, `/status`, `/dashboard`,
323
323
  `/sync`, `/archived`, `/unarchive`, `/rename`, `/model`, `/close`,
@@ -490,7 +490,7 @@ session it has open.
490
490
  | nothing happens after adding the plugin | token is empty — the connector logs a warning and stays idle |
491
491
  | group title never follows a rename | bot lacks *Change Info* in that group |
492
492
  | `this runtime exposes no plugin manager` | the profile is not base-backed, or `@deepseek-ai/dsh-plugin-manager` is not mounted |
493
- | `/plugin add` says *already installed* | updates are a removal plus an install; use the host CLI, or remove first |
493
+ | `/plugins add` says *already installed* | updates are a removal plus an install; use the host CLI, or remove first |
494
494
  | a plugin change says *restart required* | this runtime has no HMR — `/system restart`, then `/system confirm` if it works |
495
495
  | `/system restart` says *not running under the supervisor* | the runtime was started directly (no container), so restart it from the host |
496
496
 
@@ -504,8 +504,8 @@ session it has open.
504
504
  - The bot token comes from the environment; `cordis.patch.yml` never carries it.
505
505
  - The bot is an admin of its groups and can delete topics. `/dangerous cleanup`
506
506
  requires an explicit `confirm`; `/forget` never deletes anything.
507
- - **Plugins execute host code.** `/plugin add` inspects first and installs only
508
- after **Confirm** (or `/plugin confirm`); blocked install scripts need `/plugin approve`, which
507
+ - **Plugins execute host code.** `/plugins add` inspects first and installs only
508
+ after **Confirm** (or `/plugins confirm`); blocked install scripts need `/plugins approve`, which
509
509
  names exactly the packages allowed. The connector refuses to remove or disable
510
510
  itself, since that would cut the line mid-command.
511
511
  - `bindings.json` contains chat ids and session ids, not message contents.
@@ -520,7 +520,7 @@ npm run typecheck
520
520
  ```
521
521
 
522
522
  `src/index.ts` is the plugin (routing, commands, streaming); `help.ts` is the
523
- command registry behind `/help`, `/man` and the Telegram command menu;
523
+ command registry behind `/help` and the Telegram command menu;
524
524
  `telegram.ts` is the typed Bot API client; `render.ts` normalises rich Markdown
525
525
  and splits; `outbox.ts` owns the per-group queue and publishers; `bindings.ts`
526
526
  persists the mapping; `sessions.ts` owns the topic key model; `bridge.ts` is the
package/docs/COMMANDS.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Commands
2
2
 
3
3
  The bot has three surfaces. Each has its own command set, and each answers
4
- `/help`, `/man` and `<command> --help` from the same registry the bot uses.
4
+ `/help` and `<command> --help` from the same registry the bot uses.
5
5
 
6
6
  ```
7
7
  private chat with the bot control plane workspaces, plugins, restarts, updates
@@ -13,20 +13,18 @@ group "web-app" workspace
13
13
  Conventions:
14
14
 
15
15
  - `<required>`, `[optional]`, `<a|b>` means choose one.
16
- - Every command accepts `--help`; `/help <command>` and `/man [command]` show the
17
- same text. The one exception is `/commands`, which lists the live host catalog
18
- instead of its own help.
19
- - Aliases: `/start` = `/help`, `/?` = `/help`, `/plugin list` = `/plugins`,
20
- `/plugin install` = `/plugin add`, `/plugin rm` = `/plugin del` =
21
- `/plugin remove`, `/workspace rm` = `/workspace remove`. `/plugin` with no
22
- subcommand lists the bundles, like `/plugins`.
16
+ - Every command accepts `--help`; `/help <command>` shows the same text. The one
17
+ exception is `/commands`, which lists the live host catalog instead of its own
18
+ help.
19
+ - `/start` and `/menu` post the control card in the bot chat. In a group,
20
+ `/start` is the `startgroup` deep link that binds the workspace.
23
21
  - Admin-only (the `adminUserId` account, or the control-chat owner when unset):
24
22
  `/workspace new|link|remove`, every `/system` subcommand except `status`,
25
- `/plugin add|remove|enable|disable|confirm|cancel|approve`, `/bind`,
26
- `/system takechat`, `/firewall allow`, `/unbind`, `/dashboard`,
23
+ `/components`, `/plugins add|remove|enable|disable|confirm|cancel|approve`,
24
+ `/bind`, `/system takechat`, `/firewall allow`, `/unbind`, `/dashboard`,
27
25
  `/dangerous cleanup`. The inline buttons that do the same things — trial
28
- Commit/Roll back, the component card, the update card's **Cancel**, Take over, the
29
- deployment buttons on the dashboard card — are admin-only too.
26
+ Commit/Roll back, the component card, the update card's **Cancel**, Take over,
27
+ the deployment buttons on the menu card — are admin-only too.
30
28
  - A `<session>` argument accepts the full session id, an id prefix, or the topic title.
31
29
  - You can only use a command on the surface it belongs to; elsewhere the bot
32
30
  tells you where it lives.
@@ -56,17 +54,17 @@ dashboard.
56
54
  | Command | What it does |
57
55
  |---|---|
58
56
  | `/plugins` | bundles of this profile: enabled, disabled, available |
59
- | `/plugin info <name>` | version, source, rows, overrides, errors |
60
- | `/plugin add <spec>` | inspect a package, then install it after confirmation |
61
- | `/plugin remove <name>` | uninstall a bundle after confirmation |
62
- | `/plugin enable <name>` | select a bundle after confirmation |
63
- | `/plugin disable <name>` | deselect a bundle, keeping the package installed |
64
- | `/plugin confirm` | run the pending action |
65
- | `/plugin cancel` | drop the pending action |
66
- | `/plugin approve` | allow the install scripts pnpm blocked, then retry |
57
+ | `/plugins info <name>` | version, source, rows, overrides, errors |
58
+ | `/plugins add <spec>` | inspect a package, then install it after confirmation |
59
+ | `/plugins remove <name>` | uninstall a bundle after confirmation |
60
+ | `/plugins enable <name>` | select a bundle after confirmation |
61
+ | `/plugins disable <name>` | deselect a bundle, keeping the package installed |
62
+ | `/plugins confirm` | run the pending action |
63
+ | `/plugins cancel` | drop the pending action |
64
+ | `/plugins approve` | allow the install scripts pnpm blocked, then retry |
67
65
 
68
66
  A spec is a registry name (`pkg`, `pkg@1.2`), `github:owner/repo`, an absolute
69
- path, or a tarball URL. `/plugin add` never mutates before you press **Confirm** (or send `/plugin confirm`);
67
+ path, or a tarball URL. `/plugins add` never mutates before you press **Confirm** (or send `/plugins confirm`);
70
68
  the pending action expires after ten minutes and is bound to its author.
71
69
 
72
70
  Every confirmed plugin action opens a **trial** first: under HMR the change is
@@ -75,6 +73,13 @@ Commit with `/system confirm`, revert with `/system rollback`, or let the window
75
73
  failed install/removal closes the trial without touching the profile. The
76
74
  connector refuses to disable or remove itself.
77
75
 
76
+ ### Menu
77
+
78
+ | Command | What it does |
79
+ |---|---|
80
+ | `/menu` | post the control card: Status · Workspaces · Web link · Help · Update setup · Restart · Plugins · Components |
81
+ | `/start` | the welcome card in the bot chat; the `startgroup` deep link in a group |
82
+
78
83
  ### System
79
84
 
80
85
  | Command | What it does |
@@ -88,11 +93,9 @@ connector refuses to disable or remove itself.
88
93
  | `/system update setup [--i-know-versions-are-incompatible]` | show a card with the target, DSH change, recent commit subjects and running sessions, then drain and update through the updater service; a cross-line jump gets a second **Cross anyway** confirmation |
89
94
  | `/system confirm` | commit the open trial (also the **Commit** button) |
90
95
  | `/system rollback` | restore the last committed state and restart (also **Roll back**) |
91
- | `/system components [<component> <enable\|disable\|port> [<port>]]` | optional components: a card with Enable/Disable/Port buttons, or the text form. The Port button offers three presets (8090/8091/8092); use the text form for anything else |
96
+ | `/components [<component> <enable\|disable\|port> [<port>]]` | optional components: a card with Enable/Disable/Port buttons, or the text form. The Port button offers three presets (8090/8091/8092); use the text form for anything else |
92
97
  | `/system cancel` | abandon a pending update and unblock the bot (same as the card's **Cancel**); after acceptance it stops the running updater job |
93
98
  | `/system takechat` | make this private chat the control chat; notices, update reports and failure cards move here |
94
- | `/status` | model route, workspace/session counts, poller, timezone, supervisor |
95
- | `/dashboard` | post the control card: status, web link, update, restart, plugins, components |
96
99
  | `/firewall` | whether ufw lets the web UI through, and the exact `/firewall allow <port>` to fix it |
97
100
  | `/firewall allow <port>` | admin only; asks the updater to allow that served port from the LAN |
98
101
  | `/web` | a signed link into the web UI for the same sessions (bot chat only) |
@@ -175,7 +178,7 @@ button runs the same command you could type, so permissions are identical:
175
178
  | Card | Buttons |
176
179
  |---|---|
177
180
  | group dashboard (`/dashboard`) | New session · Sync · Status · Sessions |
178
- | bot chat (`/dashboard`) | Status · Web link · Update setup · Restart · Plugins · Components |
181
+ | bot chat (`/menu`) | Status · Workspaces · Web link · Help · Update setup · Restart · Plugins · Components |
179
182
 
180
183
  The **flow cards** are confirmation prompts: trial Commit/Roll back, the update
181
184
  card's **Cancel** (while draining), component Enable/Disable/Port, and Take over (confirmed; restarts dsh) for a
@@ -186,7 +189,7 @@ remove`, `/unbind`, `/dangerous cleanup`, plugin add/remove/enable/disable and
186
189
  the dashboard **Restart** button. Each press answers with a toast
187
190
  (`deleting…` / `cancelled`), and the card is edited to the result. The typed
188
191
  fallback remains: `/workspace remove <name> confirm`, `/unbind confirm`,
189
- `/dangerous cleanup confirm` and `/plugin confirm`.
192
+ `/dangerous cleanup confirm` and `/plugins confirm`.
190
193
 
191
194
  ## Icons and marks
192
195
 
@@ -262,7 +265,7 @@ topic is always one session, and a topic is never re-assigned.
262
265
  | `/run <command> [args]` | run a host command even when a connector command owns the name |
263
266
  | `/skill <name> [args]` | load a skill even when a host command owns the name |
264
267
  | `//text` | send a prompt that literally starts with `/` |
265
- | `/help`, `/man` | the session command manual |
268
+ | `/help`, `/help` | the session command manual |
266
269
 
267
270
  Host commands (for example `/compact`, `/goal` or a command from a newly
268
271
  installed plugin) run against the session without creating a model message.
@@ -293,8 +296,8 @@ A topic created by hand becomes a session on its first message.
293
296
  # adopt what the web UI already has
294
297
  /sync (General)
295
298
  # install a plugin safely
296
- /plugin add github:owner/repo (bot chat)
297
- /plugin confirm → trial or live window
299
+ /plugins add github:owner/repo (bot chat)
300
+ /plugins confirm → trial or live window
298
301
  /system confirm (or the Commit button)
299
302
  # ship a new connector
300
303
  /system update connector → newest compatible version → trial → /system confirm
package/docs/DESIGN.md CHANGED
@@ -108,17 +108,17 @@ message, never a retry storm.
108
108
 
109
109
  ## 5. Commands
110
110
 
111
- The full reference is [COMMANDS.md](COMMANDS.md) (and `/man` in the bot); the
111
+ The full reference is [COMMANDS.md](COMMANDS.md) (and `/help` in the bot); the
112
112
  shape is what matters here.
113
113
 
114
114
  - **Control chat** — `/workspaces`, `/workspace new|link|rm`, `/plugins`,
115
- `/plugin info|add|enable|disable|remove|confirm|cancel|approve`, `/status`,
115
+ `/plugins info|add|enable|disable|remove|confirm|cancel|approve`, `/status`,
116
116
  `/system status`, `/timezone`, `/reactions`, `/web`, `/firewall`, `/system …`,
117
117
  `/schedules` (stub).
118
118
  - **Dashboard** — `/new`, `/sessions`, `/status`, `/dashboard`, `/sync`,
119
119
  `/archived`, `/unarchive`, `/rename`, `/model`, `/close`, `/reopen`,
120
120
  `/forget`, `/unbind`, `/dangerous cleanup`.
121
- - **Session topic** — plain text is a turn. `/help`, `/man`, `/commands`,
121
+ - **Session topic** — plain text is a turn. `/help`, `/help`, `/commands`,
122
122
  `/skills`, `/<skill>`, `/run`, `/skill` and host commands are accepted;
123
123
  management commands take the session as an argument in the dashboard, so a
124
124
  conversation never has to be command-aware.
@@ -135,12 +135,12 @@ a workspace topic, and it rides on the host's `pluginManager` service:
135
135
  | Step | Host call |
136
136
  |---|---|
137
137
  | `/plugins` | `listBundles()` |
138
- | `/plugin info <name>` | `listBundles()`, matched by name, title or scope-less name |
139
- | `/plugin add <spec>` | `inspect(spec)` — no mutation |
140
- | **Confirm** button or `/plugin confirm` | `installBundle(spec)` |
141
- | `/plugin approve` | `installBundle(spec, { approvedBuilds })` |
142
- | `/plugin enable\|disable <name>` | `setBundleEnabled(name, boolean)` |
143
- | `/plugin remove <name>` | `removeBundle(name)` |
138
+ | `/plugins info <name>` | `listBundles()`, matched by name, title or scope-less name |
139
+ | `/plugins add <spec>` | `inspect(spec)` — no mutation |
140
+ | **Confirm** button or `/plugins confirm` | `installBundle(spec)` |
141
+ | `/plugins approve` | `installBundle(spec, { approvedBuilds })` |
142
+ | `/plugins enable\|disable <name>` | `setBundleEnabled(name, boolean)` |
143
+ | `/plugins remove <name>` | `removeBundle(name)` |
144
144
 
145
145
  The confirmation gate is deliberate: a plugin runs in-process with the
146
146
  runtime's permissions, so the preview lists what the spec names and the
@@ -151,7 +151,7 @@ disabling a bundle goes through the same confirmation for that reason. When the
151
151
  manager reports `restart-required`, the connector does not hand the restart back
152
152
  to the user — it starts the trial itself, and the trial message is the second
153
153
  confirmation.
154
- pnpm's blocked install scripts are named, and only `/plugin approve` allows the
154
+ pnpm's blocked install scripts are named, and only `/plugins approve` allows the
155
155
  exact packages the failed run reported. The connector refuses to disable or
156
156
  remove its own bundle, because the in-flight reply would be cut off. A missing
157
157
  manager is reported, never assumed.
@@ -320,9 +320,9 @@ and directories.
320
320
  - The bot is a group admin and can delete topics: `/dangerous cleanup` requires
321
321
  an explicit `confirm`, and `/forget` never deletes anything.
322
322
  - Plugin mutations are the highest-risk surface: a bundle's code and install
323
- scripts run with the runtime's permissions. `/plugin add` inspects first and
324
- installs only after an explicit confirmation (the card's **Confirm** or `/plugin confirm`); blocked install scripts are
325
- named and only `/plugin approve` allows exactly those names; `/plugin remove`
323
+ scripts run with the runtime's permissions. `/plugins add` inspects first and
324
+ installs only after an explicit confirmation (the card's **Confirm** or `/plugins confirm`); blocked install scripts are
325
+ named and only `/plugins approve` allows exactly those names; `/plugins remove`
326
326
  confirms too. Enable/disable is confirmed like the rest, and reversible. The
327
327
  connector refuses to disable or remove its own bundle.
328
328
 
@@ -371,7 +371,7 @@ a rollback, which is what makes the swap cheap and safe.
371
371
  |---|---|---|
372
372
  | `/system restart` (default) | connector → `POST /restart {trial:true}` | supervisor persists the trial, then restarts `dsh` |
373
373
  | `/system restart now` | connector → `POST /restart {trial:false}` | supervisor snapshots the current profile, then restarts |
374
- | plugin confirmation (**Confirm** / `/plugin confirm`) | connector → `POST /trial/open` | trial opens *before* the change, without restarting |
374
+ | plugin confirmation (**Confirm** / `/plugins confirm`) | connector → `POST /trial/open` | trial opens *before* the change, without restarting |
375
375
  | change applied live | connector | keeps the trial; the message is the confirmation |
376
376
  | change needs a restart | connector → abandon + `/system restart` | the live trial is closed and a restart trial opened |
377
377
  | `/system update connector` | connector → `POST /update {trial:true}` | supervisor stops the runtime, runs `dsh-entrypoint reset-plugin`, starts a trial |
@@ -400,7 +400,7 @@ deserves the same window. The connector therefore opens the trial *before* the
400
400
  manager runs the operation:
401
401
 
402
402
  ```
403
- Confirm / /plugin confirm ─► POST /trial/open ─► mutation ─┬─ applied ─► keep trial, announce
403
+ Confirm / /plugins confirm ─► POST /trial/open ─► mutation ─┬─ applied ─► keep trial, announce
404
404
  ├─ restart-required ─► abandon, restart trial
405
405
  └─ failed ─► abandon
406
406
  ```
@@ -64,10 +64,10 @@ feature silently disappears.
64
64
  | Feature | Setup | Standalone |
65
65
  |---|---|---|
66
66
  | Sessions, topics, workspace dashboard, media, reactions | yes | yes |
67
- | `/plugins`, `/plugin add|remove|enable|disable` | yes, DSH plugin manager | yes, if the profile is base-backed with `pluginManager`; otherwise the commands explain that it is absent |
67
+ | `/plugins`, `/plugins add|remove|enable|disable` | yes, DSH plugin manager | yes, if the profile is base-backed with `pluginManager`; otherwise the commands explain that it is absent |
68
68
  | `/system update penpot`, `/system update plugin <name>` | yes, wrapped in a supervisor trial | yes through the plugin manager; without a supervisor there is no automatic rollback |
69
69
  | `/system update connector` | yes: newest compatible npm version, installed by the supervisor | no: update from the host with the two `dsh plugin` commands below |
70
- | `/system update setup`, `/system components`, `/firewall` | yes, through the updater service | no: the updater is not present, and the commands say so |
70
+ | `/system update setup`, `/components`, `/firewall` | yes, through the updater service | no: the updater is not present, and the commands say so |
71
71
  | `/system restart`, `/system rollback` | supervisor trial | restart the runtime yourself; no trial |
72
72
  | `/system status` | versions, supervisor, registry, data directory | the same lines, with absent components marked |
73
73
 
package/lib/help.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The command manual.
3
3
  *
4
- * One registry drives `/help`, `/man` and `<command> --help` on all three
4
+ * One registry drives `/help` and `<command> --help` on all three
5
5
  * surfaces (the bot chat, the workspace dashboard, a session topic), so the
6
6
  * text cannot drift between the index, the detail view and the README.
7
7
  *
@@ -11,7 +11,7 @@ export type Surface = 'control' | 'dashboard' | 'session';
11
11
  export interface CommandDoc {
12
12
  /** Command path without a slash, e.g. `plugin add`. */
13
13
  path: string;
14
- /** Canonical invocation, e.g. `/plugin add <spec>`. */
14
+ /** Canonical invocation, e.g. `/plugins add <spec>`. */
15
15
  usage: string;
16
16
  summary: string;
17
17
  details?: string;
@@ -25,7 +25,7 @@ export interface CommandDoc {
25
25
  export declare const COMMANDS: CommandDoc[];
26
26
  /** `/help`: commands grouped by area, with one line each. */
27
27
  export declare function indexText(surface: Surface): string;
28
- /** `/man`: the same registry with details and examples. */
28
+ /** The manual: the same registry with details and examples. */
29
29
  export declare function manualText(surface: Surface, only?: string): string;
30
30
  /** `/help <command>` and `<command> --help`. */
31
31
  export declare function lookupText(raw: string, surface: Surface): string | undefined;