omnish 1.2.4 → 1.3.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 +60 -0
- package/README.md +12 -2
- package/config.example.json +9 -4
- package/dist/index.js +246 -196
- package/package.json +24 -12
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,66 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.3.0] - 2026-05-18
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Platform attached mode**: `omnish run` with `platform_url` + `platform_token`; inbound policy from `GET /v1/me` (allowlists, `gatewayMode`).
|
|
15
|
+
- **`omnish platform` CLI**: `status`, `allow`, `login`, `probe`, `link-whatsapp`, `unlink-whatsapp`, `import-whatsapp`.
|
|
16
|
+
- **`omnish config` CLI**: `add`, `show`, `edit`, `delete` for `config.json` including platform credentials (env still overrides).
|
|
17
|
+
- **Platform relay**: WhatsApp/Telegram connectors, `PUT /v1/me/allowlists`, dashboard pairing UI, connector restore on boot, Telegram `/id` before allowlist.
|
|
18
|
+
- **Platform device WebSocket fallback**: CLI tries `/platform/device` then `/control/device`; relay serves both on the control port.
|
|
19
|
+
- **`omnish platform probe`**: diagnoses WebSocket routing for attached `omnish run`.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- **Platform WhatsApp QR pairing**: Baileys 515 `pairing_restart` reconnect loop; close-handler bug that blocked reconnect after `stop()`.
|
|
24
|
+
- **Attached CLI allowlist**: `buildAllowSet` normalizes platform digits-only entries so `+E164` inbound checks match dashboard allowlists.
|
|
25
|
+
- **WhatsApp LID routing** on platform to attached devices; live allowlist reload on platform inbound.
|
|
26
|
+
- **Attached `omnish run` behind misconfigured proxies**: relay serves device WebSocket paths on control port and HTTP edge.
|
|
27
|
+
- **CI / release**: GitHub Actions use Node 22 (pnpm 11); tunnel integration tests install local `contrib/tunnel-relay` deps before `pnpm test`.
|
|
28
|
+
- **Chat LLM fallback**: ignore `EPIPE` when a piped subprocess exits before stdin is closed (fixes flaky CI `workDir` test).
|
|
29
|
+
|
|
30
|
+
### Documentation
|
|
31
|
+
|
|
32
|
+
- [Platform reference](docs/guides/platform-reference.md) hub; attached-mode guides; Easypanel redeploy notes for relay + `COMM_LAYER_DATA_DIR`.
|
|
33
|
+
|
|
34
|
+
[1.3.0]: https://github.com/eligapris/omnish/compare/v1.2.4...v1.3.0
|
|
35
|
+
|
|
36
|
+
## [1.2.5] - 2026-05-16
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
|
|
40
|
+
- **`omnish config` CLI**: `add`, `show`, `edit`, `delete` for `config.json` including `platform_url`, `platform_token`, and `platform_device_id` (env still overrides).
|
|
41
|
+
- **`omnish platform probe`**: diagnoses WebSocket routing for attached `omnish run`.
|
|
42
|
+
- **Platform device WebSocket fallback**: CLI tries `/platform/device` then `/control/device`; relay serves both on the control port.
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
|
|
46
|
+
- **Attached `omnish run` behind misconfigured proxies**: relay serves `/platform/device` and `/control/device` on both the control port (8788) and the HTTP edge (8787). Smoke test covers device paths via `SMOKE_BASE_URL`.
|
|
47
|
+
|
|
48
|
+
### Documentation
|
|
49
|
+
|
|
50
|
+
- EasyPanel routing for apex vs wildcard and control paths: [contrib/tunnel-relay/docs/dns.md](contrib/tunnel-relay/docs/dns.md).
|
|
51
|
+
|
|
52
|
+
### Added
|
|
53
|
+
|
|
54
|
+
- **`/bg --notify` / `-N`**: background jobs can now send a completion notification (exit code, duration, command) to your chat when the process finishes. Combine with names: `/bg -N -n deploy git pull && docker compose up -d`.
|
|
55
|
+
- **Cowork conditional notifications (`notifyWhen`)**: `/cowork set <name> when always|failure|state-change` controls when a task sends its notification. `failure` only notifies on non-zero exit; `state-change` tracks the last-known result in SQLite and only notifies when it flips (e.g. ok→fail or fail→ok).
|
|
56
|
+
- **Cowork heartbeat (dead-man's-switch)**: new schedule kind `heartbeat` that expects periodic check-ins instead of running a command. Create with `/cowork add backup heartbeat 1h 10m`, check in with `/cowork checkin backup`. If no check-in arrives within interval + grace, an alert is sent; a recovery notification follows when check-ins resume.
|
|
57
|
+
- **Webhook receiver**: lightweight HTTP endpoint (`POST /webhook`) for CI/CD webhooks. Accepts JSON payloads with Bearer token auth, formats GitHub Actions and GitLab CI events into concise chat messages, and delivers via `sendToPeer`. Config keys: `webhookEnabled`, `webhookPort`, `webhookHost`, `webhookToken`. See [docs/features/webhook-receiver.md](docs/features/webhook-receiver.md).
|
|
58
|
+
- **Multi-step recipe runbooks**: `/run add deploy --steps git pull; npm ci; npm run build; pm2 restart all` creates a recipe with sequential steps. Steps stop on first failure by default; prefix a step with `+` to continue on fail. Results are sent as a formatted per-step summary when all steps complete. See `/run show <name>` for step listing.
|
|
59
|
+
|
|
60
|
+
### Documentation
|
|
61
|
+
|
|
62
|
+
- New feature doc: [Webhook receiver](docs/features/webhook-receiver.md).
|
|
63
|
+
- Updated [background-jobs.md](docs/features/background-jobs.md) for `--notify` / `-N`.
|
|
64
|
+
- Updated [cowork.md](docs/features/cowork.md) for `notifyWhen` conditional notifications, heartbeat schedule, and `/cowork checkin`.
|
|
65
|
+
- Updated [user-guide.md](docs/guides/user-guide.md) for all new features.
|
|
66
|
+
- Updated [configuration.md](docs/guides/configuration.md) with webhook receiver config section.
|
|
67
|
+
- Updated [README.md](README.md) command summaries.
|
|
68
|
+
- Updated [research pain points](docs/research/unsolved-developer-pain-points.md) with implementation status.
|
|
69
|
+
|
|
10
70
|
## [1.2.4] - 2026-05-11
|
|
11
71
|
|
|
12
72
|
### Added
|
package/README.md
CHANGED
|
@@ -27,14 +27,22 @@
|
|
|
27
27
|
|
|
28
28
|
**WARNING: Remote shell access.** This tool links **WhatsApp** and/or **Telegram** (and is built to add more surfaces later) to your machine and runs shell commands from **allowlisted senders only**. Anyone who can message from an allowed identity can run arbitrary commands as your user. Treat those identities as credentials. Do not use `*` wildcards on the allowlist.
|
|
29
29
|
|
|
30
|
+
### Glossary: gateway, communication layer, modes
|
|
31
|
+
|
|
32
|
+
- **Gateway / CLI** — `omnish run` on **your** machine: enforces allowlist and runs shell / PTY **locally** (security boundary for execution).
|
|
33
|
+
- **Standalone mode** — messengers connect on the same host (`omnish link`, `omnish allow`, `omnish run`). No hosted layer required.
|
|
34
|
+
- **Platform attached mode** — link WhatsApp/Telegram **once** on the hosted relay; each machine runs `omnish run` with `OMNISH_PLATFORM_URL` + `OMNISH_TOKEN` (or `omnish config add platform_url … platform_token …`). Chat is **routed** to the right device; shell still runs only on that box. Docs: [platform attached mode](docs/guides/platform-attached-mode.md) · [**platform reference** (full API/CLI/dashboard)](docs/guides/platform-reference.md) · [communication layer model](docs/architecture/communication-layer-model.md).
|
|
35
|
+
- **`/service` “platform”** — **operating system** (Linux, macOS, Windows), not the communication layer.
|
|
36
|
+
|
|
30
37
|
## What it does
|
|
31
38
|
|
|
32
39
|
- `omnish link` — QR login (WhatsApp → Linked devices), or **`omnish link --tg <bot_token>`** to save a Telegram bot token and set `gatewayMode` (`telegram`, or `both` if WhatsApp is already linked). See `omnish link --help`.
|
|
33
40
|
- `omnish run` — Listen for DMs; execute commands; reply with output.
|
|
34
41
|
- **`omnish i`** — Interactive terminal with the same commands as chat (local full trust; the inbox allowlist is **not** applied). Run from any directory; session cwd starts at the current directory. Use **`/sendto <destination> <selectors> [-- caption]`** (for example `wa`, `tg`, `*`, `+E164,+E164`) to push files through a running gateway (see `omnish i --help`). Background jobs from `/bg` in the REPL are **only** that process (not the gateway’s job list).
|
|
35
42
|
- **Sync:** send `!ls` or `! ls` (prefix configurable; default `!`). Each chat has its **own working directory**; use `!cd /path` or `! cd /path` to change it (saved under the data dir, e.g. `~/.omnish/sessions.json`).
|
|
36
|
-
- **Background:** **`/bg`** runs a long command in that chat’s cwd; optional **`-n myname`** / **`--name`** labels the job
|
|
37
|
-
- **Cowork:** `/cowork` / `/cw` — scheduled or on-demand saved shell tasks, logs under `~/Cowork/…` by default. See [docs/features/cowork.md](docs/features/cowork.md).
|
|
43
|
+
- **Background:** **`/bg`** runs a long command in that chat’s cwd; optional **`-n myname`** / **`--name`** labels the job; **`--notify`** / **`-N`** sends a completion notification with exit code and duration. Then `/jobs`, `/log`, `/tail`, `/kill` as usual.
|
|
44
|
+
- **Cowork:** `/cowork` / `/cw` — scheduled or on-demand saved shell tasks with conditional notifications (`always` / `failure` / `state-change`), heartbeat dead-man's-switch monitoring (`/cowork checkin`), and logs under `~/Cowork/…` by default. See [docs/features/cowork.md](docs/features/cowork.md).
|
|
45
|
+
- **Webhook receiver:** built-in HTTP endpoint for CI/CD notifications (GitHub Actions, GitLab CI). Enable with `webhookEnabled: true`. See [docs/features/webhook-receiver.md](docs/features/webhook-receiver.md).
|
|
38
46
|
- **Interactive PTY:** drive TUIs and REPLs (`cursor-agent`, `claude`, `bash`, etc.) from DMs. See [Interactive sessions](#interactive-sessions) below.
|
|
39
47
|
- **User shortcuts:** save per-chat commands under a short name (`/shortcut add myproj !cd ~/code/myproj`), then run **`!myproj`** or **`/myproj`** (bare token only) to expand once—see [User shortcuts](#user-shortcuts).
|
|
40
48
|
|
|
@@ -235,12 +243,14 @@ Index and curated paths: **[docs/README.md](docs/README.md)**.
|
|
|
235
243
|
| Topic | Doc |
|
|
236
244
|
|-------|-----|
|
|
237
245
|
| Vision — local first, product direction | [docs/vision.md](docs/vision.md) |
|
|
246
|
+
| Docker gateway (reference compose) | [docs/guides/docker-gateway-golden-path.md](docs/guides/docker-gateway-golden-path.md) |
|
|
238
247
|
| Interactive terminal (`omnish i`, `/sendto` multi-target) | [docs/guides/interactive-cli.md](docs/guides/interactive-cli.md) |
|
|
239
248
|
| Configuration (`config.json`) | [docs/guides/configuration.md](docs/guides/configuration.md) |
|
|
240
249
|
| Browser setup UI (`omnish ui`) | [docs/guides/ui.md](docs/guides/ui.md) |
|
|
241
250
|
| Cluster roster + `/config` from chat | [docs/features/cluster-and-chat-config.md](docs/features/cluster-and-chat-config.md) |
|
|
242
251
|
| Interactive sessions (`/apps`) | [docs/features/sessions.md](docs/features/sessions.md) |
|
|
243
252
|
| Background jobs | [docs/features/background-jobs.md](docs/features/background-jobs.md) |
|
|
253
|
+
| Webhook receiver (CI/CD notifications) | [docs/features/webhook-receiver.md](docs/features/webhook-receiver.md) |
|
|
244
254
|
| Message routing | [docs/architecture/routing.md](docs/architecture/routing.md) |
|
|
245
255
|
| Security | [docs/architecture/security.md](docs/architecture/security.md) |
|
|
246
256
|
| User guide | [docs/guides/user-guide.md](docs/guides/user-guide.md) |
|
package/config.example.json
CHANGED
|
@@ -21,13 +21,13 @@
|
|
|
21
21
|
"appsClearInput": true,
|
|
22
22
|
"appsClearInputDelayMs": 20,
|
|
23
23
|
"appsClearInputSequence": "^A,^K",
|
|
24
|
-
"fileSendMaxBytes":
|
|
25
|
-
"fileReceiveMaxBytes":
|
|
24
|
+
"fileSendMaxBytes": 52428800,
|
|
25
|
+
"fileReceiveMaxBytes": 52428800,
|
|
26
26
|
"fileReceiveRootMode": "downloads",
|
|
27
27
|
"fileReceiveRootPath": "",
|
|
28
28
|
"fileInboxSubdir": "inbox",
|
|
29
29
|
"recipesAllowDangerousBuiltins": false,
|
|
30
|
-
"recipesMaxTaskChars":
|
|
30
|
+
"recipesMaxTaskChars": 100000,
|
|
31
31
|
"recipesMacroDefaultCommand": "claude -p \"$OMNISH_TASK\"",
|
|
32
32
|
"clusterEnabled": false,
|
|
33
33
|
"clusterLabel": "",
|
|
@@ -44,5 +44,10 @@
|
|
|
44
44
|
"chatLlmMaxInputChars": 16000,
|
|
45
45
|
"chatLlmMaxOutputChars": 24000,
|
|
46
46
|
"chatLlmNeedsTty": false,
|
|
47
|
-
"chatLlmWorkDir": ""
|
|
47
|
+
"chatLlmWorkDir": "",
|
|
48
|
+
"tunnelEnabled": false,
|
|
49
|
+
"tunnelRelayUrl": "https://tunnel.omnish.dev",
|
|
50
|
+
"platformToken": "",
|
|
51
|
+
"platformDeviceId": "",
|
|
52
|
+
"tunnelMaxActive": 5
|
|
48
53
|
}
|