dsh-telegram-connector 0.13.0 → 0.14.0
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 +25 -0
- package/COMPATIBILITY.md +2 -0
- package/README.md +25 -25
- package/docs/COMMANDS.md +32 -29
- package/docs/DESIGN.md +15 -15
- package/docs/STANDALONE.md +2 -2
- package/lib/help.d.ts +3 -3
- package/lib/help.js +50 -57
- package/lib/help.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +80 -58
- package/lib/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.14.0
|
|
4
|
+
|
|
5
|
+
- **`/menu` is the front door.** `/menu` (and `/start` in the bot chat) posts a
|
|
6
|
+
control card with Status, Workspaces, Web link, Help, Update setup, Restart,
|
|
7
|
+
Plugins and Components. The buttons run the same handlers as the typed
|
|
8
|
+
commands; deployment buttons stay admin-only.
|
|
9
|
+
- **One command per action.** `/plugin` is now `/plugins` with subcommands
|
|
10
|
+
(`/plugins add`, `info`, `remove`, `enable`, `disable`, `confirm`, `cancel`,
|
|
11
|
+
`approve`); `/system components` is now `/components`; `/status` in the bot
|
|
12
|
+
chat is `/system status`. The alias table (`/start`/`/?`/`/man`,
|
|
13
|
+
`/plugin list|install|rm|del`, `/list`, `/workspace rm`) is gone.
|
|
14
|
+
- **`/man` removed.** `/help` and `<command> --help` remain; `/help <command>`
|
|
15
|
+
shows the same detail.
|
|
16
|
+
- **`/dashboard` keeps its topic role** (claim an empty topic); the control card
|
|
17
|
+
is `/menu`.
|
|
18
|
+
- The help registry, README, COMMANDS.md and the tests follow the new surface.
|
|
19
|
+
|
|
20
|
+
## 0.13.1
|
|
21
|
+
|
|
22
|
+
- **`/system status` probes the advertised address.** The setup binds the LAN
|
|
23
|
+
address (for example `192.168.2.98`), so the old hardcoded
|
|
24
|
+
`127.0.0.1:4310` check reported `answered unreachable` while the Web UI was
|
|
25
|
+
serving. The probe now tries the URL the web app advertises and falls back to
|
|
26
|
+
loopback only when there is no advertised URL.
|
|
27
|
+
|
|
3
28
|
## 0.13.0
|
|
4
29
|
|
|
5
30
|
- **npm distribution.** The package is published as
|
package/COMPATIBILITY.md
CHANGED
|
@@ -6,6 +6,8 @@ every release.
|
|
|
6
6
|
|
|
7
7
|
| Connector | DSH | Status | Notes |
|
|
8
8
|
|---|---|---|---|
|
|
9
|
+
| 0.14.0 | `0.2.1-rc.5` | needs UAT | one command surface: `/menu` card, `/plugins` subcommands, `/components`; aliases and `/man` removed |
|
|
10
|
+
| 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 |
|
|
9
11
|
| 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 |
|
|
10
12
|
| 0.2.1-rc.5-0.12.11 | `0.2.1-rc.5` | tested | maintenance: setup keeps the Penpot token in both env files |
|
|
11
13
|
| 0.2.1-rc.5-0.12.10 | `0.2.1-rc.5` | previous | maintenance: setup pins API-only penpot plugin 0.2.0 |
|
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
|
-
`/
|
|
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, `/
|
|
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
|
-
- **
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
|
@@ -154,7 +154,7 @@ install without the setup.
|
|
|
154
154
|
The connector is published to npm as an exact version:
|
|
155
155
|
|
|
156
156
|
```sh
|
|
157
|
-
dsh plugin --profile web add dsh-telegram-connector@0.13.
|
|
157
|
+
dsh plugin --profile web add dsh-telegram-connector@0.13.1
|
|
158
158
|
export DSH_TELEGRAM_BOT_TOKEN='123456:ABC…'
|
|
159
159
|
```
|
|
160
160
|
|
|
@@ -170,7 +170,7 @@ cat >> "$DSH_HOME/profiles/web/pnpm-workspace.yaml" <<'YAML'
|
|
|
170
170
|
allowBuilds:
|
|
171
171
|
dsh-telegram-connector@https://github.com/vladtsvirko/dsh-telegram-connector.git: true
|
|
172
172
|
YAML
|
|
173
|
-
dsh plugin --profile web add github:vladtsvirko/dsh-telegram-connector#v0.13.
|
|
173
|
+
dsh plugin --profile web add github:vladtsvirko/dsh-telegram-connector#v0.13.1
|
|
174
174
|
```
|
|
175
175
|
|
|
176
176
|
That path runs the package's `prepare` build; pnpm ≥ 10 refuses it until 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
|
-
|
|
251
|
-
(including subcommands: `/
|
|
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
|
-
| `/
|
|
265
|
-
| `/
|
|
266
|
-
| `/
|
|
267
|
-
| `/
|
|
268
|
-
| `/
|
|
269
|
-
| `/
|
|
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
|
-
| `/
|
|
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
|
-
| `/
|
|
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`
|
|
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
|
-
| `/
|
|
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.** `/
|
|
508
|
-
after **Confirm** (or `/
|
|
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
|
|
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
|
|
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>`
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
`/
|
|
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
|
-
`/
|
|
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,
|
|
29
|
-
deployment buttons on the
|
|
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
|
-
| `/
|
|
60
|
-
| `/
|
|
61
|
-
| `/
|
|
62
|
-
| `/
|
|
63
|
-
| `/
|
|
64
|
-
| `/
|
|
65
|
-
| `/
|
|
66
|
-
| `/
|
|
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. `/
|
|
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
|
-
| `/
|
|
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 (`/
|
|
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 `/
|
|
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`, `/
|
|
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
|
-
/
|
|
297
|
-
/
|
|
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 `/
|
|
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
|
-
`/
|
|
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`, `/
|
|
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
|
-
| `/
|
|
139
|
-
| `/
|
|
140
|
-
| **Confirm** button or `/
|
|
141
|
-
| `/
|
|
142
|
-
| `/
|
|
143
|
-
| `/
|
|
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 `/
|
|
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. `/
|
|
324
|
-
installs only after an explicit confirmation (the card's **Confirm** or `/
|
|
325
|
-
named and only `/
|
|
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** / `/
|
|
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 / /
|
|
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
|
```
|
package/docs/STANDALONE.md
CHANGED
|
@@ -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`, `/
|
|
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`, `/
|
|
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
|
|
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. `/
|
|
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
|
-
/**
|
|
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;
|