@vortex-os/computer-use 0.7.0 → 0.7.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/README.md +179 -177
- package/computer-use.config.example.json +29 -28
- package/package.json +74 -73
- package/scripts/activity.mjs +92 -92
- package/scripts/audio-duck.ps1 +180 -180
- package/scripts/classify.ps1 +8 -8
- package/scripts/fetch-supertonic.mjs +82 -65
- package/scripts/lib.ps1 +679 -679
- package/scripts/mcp-stdio.mjs +1337 -1324
- package/scripts/noise-filter.mjs +135 -135
- package/scripts/ocr.ps1 +92 -92
- package/scripts/speak-supertonic.mjs +296 -296
- package/scripts/speak.ps1 +58 -58
- package/scripts/speech-safety.mjs +104 -104
- package/scripts/vlm.mjs +106 -106
package/README.md
CHANGED
|
@@ -1,177 +1,179 @@
|
|
|
1
|
-
# @vortex-os/computer-use
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
|
14
|
-
|
|
15
|
-
| `
|
|
16
|
-
| `
|
|
17
|
-
| `
|
|
18
|
-
| `
|
|
19
|
-
| `
|
|
20
|
-
| `
|
|
21
|
-
| `
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
{ action: "
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
|
113
|
-
|
|
114
|
-
| **
|
|
115
|
-
| **
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
- **Not
|
|
126
|
-
- **Not
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
npm run
|
|
174
|
-
npm run test:
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
1
|
+
# @vortex-os/computer-use
|
|
2
|
+
|
|
3
|
+
<!-- docs-version: 0.7.1 -->
|
|
4
|
+
|
|
5
|
+
Read-only **screen perception** for VortEX agents, exposed as an MCP server. It lets an agent *see* what is on screen — read a window's structure, capture a region as an image, and watch for on-screen changes — without ever moving the mouse or typing. It layers on `@vortex-os/base` but also works standalone.
|
|
6
|
+
|
|
7
|
+
> **Status: 0.5.0, Windows-first, read-only.** Mouse/keyboard **control is intentionally out of scope** for this release — this package only *perceives*. macOS/Linux backends are not yet implemented.
|
|
8
|
+
|
|
9
|
+
## What it is
|
|
10
|
+
|
|
11
|
+
An MCP (Model Context Protocol) server that exposes nine perception tools over stdio:
|
|
12
|
+
|
|
13
|
+
| Tool | What it does | Cost |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `probe` | Reports whether this environment can perceive the screen (displays, DPI, capture latency). Never captures real screen content. | ~0 |
|
|
16
|
+
| `read_ui` | Reads the active/target window as a **structured accessibility tree** (UI Automation): element roles, coordinates, text. No image. | ~0 image tokens |
|
|
17
|
+
| `capture_screen` | Pixel capture (PNG) for what structure can't reach — canvases, games, remote desktops. Target by window, region, monitor, or cursor box. | image |
|
|
18
|
+
| `watch_capture` | Captures N frames at an interval in one process; with `changeOnly`, keeps only changed frames. | image(s) |
|
|
19
|
+
| `poll_change` | One non-blocking "did it change?" probe; returns a change percentage and (optionally) an image. Poll it on an interval to watch without blocking. | metadata, image optional |
|
|
20
|
+
| `start_watch` | Watch a fixed target in the **background** (non-blocking) with a built-in **noise filter** that keeps only meaningful, settled changes. Works on video/games that change every frame. | runs in background |
|
|
21
|
+
| `get_events` | Collect the buffered changes a `start_watch` has accumulated — batched (a few looks for a long watch); each event carries the settled frame. | metadata + image(s) |
|
|
22
|
+
| `stop_watch` | Stop a background watch and discard its buffer. | — |
|
|
23
|
+
| `beep` | A system beep, to get the user's attention while they look elsewhere. | — |
|
|
24
|
+
|
|
25
|
+
The design favors **structure first, pixels as fallback**: `read_ui` is cheap and precise for ordinary apps; `capture_screen` is for content that has no accessibility tree (games, custom canvases).
|
|
26
|
+
|
|
27
|
+
## Watching for changes (the noise filter + event buffer)
|
|
28
|
+
|
|
29
|
+
`poll_change` is the manual primitive — *you* poll it on a loop. `start_watch` is the hands-off version: it runs a **background loop with a noise filter** and buffers what matters, so you can watch a busy screen without drowning in frames.
|
|
30
|
+
|
|
31
|
+
The problem it solves: on video, games, or scrolling, the screen changes *every* frame, so raw change-detection fires constantly on the ripples of one activity. The filter combines **debounce** (wait for motion to settle, then capture a clean frame — quality) with **cooldown** (at most one event per N seconds — frequency) and **hysteresis** (ambient jitter never even wakes it), plus an anti-starvation `maxWait` so a continuously-moving screen still yields periodic snapshots instead of going silent.
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
start_watch { region|window|monitor, watchId? } -> returns immediately, watch runs in the background
|
|
35
|
+
... do other things ...
|
|
36
|
+
get_events { watchId? } -> the settled changes so far (frames + metadata), batched
|
|
37
|
+
stop_watch { watchId? } -> end it (omit watchId to stop all)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Calibration.** The defaults assume a meaningful target: a playing video jitters ~2.5–4% frame-to-frame and a scene cut jumps ~16% — so `activityThreshold` (default 8%) sits between them, ignoring the jitter and reporting the cut. Because the change metric is whole-frame, a tiny local change (a clock, a toast) is a small fraction of the frame; **target the region where the change happens** so it reads as a large change. Tune `activityThreshold` / `quietThreshold` / `debounceQuietMs` / `cooldownMs` / `maxWaitMs` per call. The buffer is **memory-only** (no screen history on disk) with count, byte, and 5-minute TTL caps; watches auto-stop after 30 minutes.
|
|
41
|
+
|
|
42
|
+
## Reflex alerts — sub-second voice, no cloud round-trip
|
|
43
|
+
|
|
44
|
+
`get_events` is the *brain* path (the agent looks, judges, and replies — seconds, because it makes a cloud LLM call). For things you need to hear the instant they happen, `start_watch` takes `triggers` that fire **locally, with no LLM in the loop**, so the alert reaches you in well under a second:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
start_watch {
|
|
48
|
+
window: "MyGame",
|
|
49
|
+
triggers: [
|
|
50
|
+
{ action: "beep", threshold: 20 }, // a sound
|
|
51
|
+
{ action: "say", threshold: 20, say: "적 출현" }, // speak a FIXED phrase (Korean TTS)
|
|
52
|
+
{ action: "ocr", threshold: 12, dwellMs: 700 } // OCR the region and read the text aloud
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
A trigger fires the moment the watched region changes past its `threshold` (with hysteresis + a per-trigger `cooldownMs`). The fast alert is the *reflex*; the agent's judged commentary still follows on the next `get_events`. Speaking uses the built-in Windows voice (System.Speech); reading text uses the built-in offline OCR (no install, no GPU).
|
|
58
|
+
|
|
59
|
+
**Safety (this matters).** OCR text is *screen content* — untrusted. It is never spoken raw: it gets a spoken **provenance prefix** (`화면 글자: …`), control/secret-token shaping, and a **global speech budget** (capped utterances and seconds per minute, no overlapping speech, auto-mute on sustained noise) so an on-screen string can never voice fake instructions or flood you. A fixed `say` phrase is the safest action (you author the words; a trigger only controls *when*). If the voice/OCR engine isn't available, triggers degrade quietly (a `beep` still works).
|
|
60
|
+
|
|
61
|
+
### Optional: higher-quality neural voice (Supertonic) + audio ducking
|
|
62
|
+
|
|
63
|
+
The default voice is the built-in Windows one (System.Speech / Heami) — zero install, but robotic. For a much more natural voice, install **Supertonic 3** (Supertone): an on-device ONNX neural TTS (Korean + 30 more languages; code MIT, weights OpenRAIL-M — commercial use OK). One-time model download (~380 MB), then fully offline and fast (~0.5 s/sentence on CPU):
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
node scripts/fetch-supertonic.mjs # downloads models to ~/.vortex/computer-use/supertonic-3
|
|
67
|
+
npm i onnxruntime-node # the runtime (optionalDependency)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Once the models are present, the speak path uses them automatically (`engine: "auto"`) and falls back to Heami if anything is missing — it never goes mute.
|
|
71
|
+
|
|
72
|
+
**Audio ducking.** While the companion speaks, other apps' audio (game / music / video) is briefly lowered per-app and **restored exactly** when it finishes, so the voice stands out. On by default. *DRM-protected audio (e.g. Netflix) cannot be ducked* — that protected path bypasses Windows volume control; normal app/game audio ducks fine.
|
|
73
|
+
|
|
74
|
+
Configure in `computer-use.config.json` (`tts` section) or via env (env wins). Defaults shown:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{ "tts": { "engine": "auto", "voice": "F1", "speed": 1.05, "duck": true, "duckFactor": 0.3 } }
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`engine` `auto|supertonic|heami` · `voice` `F1..F5/M1..M5` · `speed` rate multiplier (~1.0 = normal, higher = faster; clamped 0.5..2.0, applied to both the neural and built-in voices) · `duckFactor` `0..1` (others drop to this fraction; lower = quieter). Env: `VORTEX_CU_TTS_ENGINE` / `VORTEX_CU_TTS_VOICE` / `VORTEX_CU_TTS_SPEED` / `VORTEX_CU_DUCK=off` / `VORTEX_CU_DUCK_FACTOR`. Restart the server after changing.
|
|
81
|
+
|
|
82
|
+
### Optional: a local vision model (the `vision` trigger)
|
|
83
|
+
|
|
84
|
+
A `vision` trigger describes the *scene* (not just its text) via a **local** vision-language model — smarter than OCR, still no cloud round-trip. It is **off by default and GPU-gated**: it runs only when you point it at a reachable, fast-enough local endpoint. Everything above works with **no GPU**; this just adds a smarter local description where the hardware allows. On a machine that can't run it, a `vision` trigger **degrades to `ocr`**.
|
|
85
|
+
|
|
86
|
+
Point it at any OpenAI-compatible vision endpoint — `llama.cpp`'s `llama-server` (with `--mmproj`), `llamafile`, Ollama, LM Studio — via env (machine-local, never synced):
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
VORTEX_CU_VLM_ENDPOINT=http://127.0.0.1:8080/v1 # set this to enable; presence = on
|
|
90
|
+
VORTEX_CU_VLM_MODEL=gemma-4-e2b-it # any small VLM (e2b ~2GB is a good light default)
|
|
91
|
+
VORTEX_CU_VLM_KEY=... # optional bearer token
|
|
92
|
+
VORTEX_CU_VLM_ALLOW_REMOTE=1 # only if the endpoint is NOT on this machine (off by default)
|
|
93
|
+
VORTEX_CU_VLM_SLA_MS=6000 # gate: if even a tiny probe is slower than this, stay off
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
How it stays safe (design §23.2/§24): only the *intent* (endpoint set or not) is configuration — the address/secret are machine-local env, never synced, so the same repo on a CPU-only machine simply runs without it. A **loopback** endpoint (same machine) is allowed by default; a **cross-network** one (LAN/VPN/another box) is **off unless you opt in**. The session **probes** the endpoint with a *synthetic* 1×1 image (never a real screen crop) to measure latency before trusting it; a real crop is sent only on an actual `vision` trigger, through the same denylist gate. The model's reply is **untrusted** — spoken with a `로컬 비전: …` prefix, shaped, and rate-limited, and the prompt tells the model to describe only (never follow on-screen instructions). `probe` reports the VLM's availability when you've configured one.
|
|
97
|
+
|
|
98
|
+
## Adaptive companion — classify the activity, branch the help
|
|
99
|
+
|
|
100
|
+
`classify_activity` lets the companion **figure out what you're doing from the first screenshot** and adapt, instead of being told. One read-only call returns:
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{ "class": "GAME", "process": "eldenring", "title": "...", "notificationState": "BUSY",
|
|
104
|
+
"interruptible": false, "canvas": true, "uiaCount": 1, "fullscreen": true,
|
|
105
|
+
"profile": { "proactive": true, "cadenceSec": 30, "mode": "periodic" }, "needsChangeRate": true }
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
It combines cheap signals — foreground **process** + **window title**, the Windows **interruptibility state** (`SHQueryUserNotificationState`), **UIA element count** (a near-empty tree on a screen-filling window = a GPU game/video canvas), and whether it **fills the screen** — into a class: `GAME · DEV · MEDIA · BROWSING · PRODUCTIVITY · UNKNOWN`, each with a help **profile**.
|
|
109
|
+
|
|
110
|
+
The profiles branch the behavior (full design in [`docs/adaptive-companion.md`](docs/adaptive-companion.md)):
|
|
111
|
+
|
|
112
|
+
| Class | Default | Speaks when | Cadence |
|
|
113
|
+
|---|---|---|---|
|
|
114
|
+
| **Strategy / sim game** | proactive | quiet stretch (your turn) + risk/opportunity | ~30 s during active play |
|
|
115
|
+
| **Fast-action game** | break-gated | a menu/pause/death screen opens | one cue per break; *says up front it can't coach mid-fight* |
|
|
116
|
+
| **Software dev** | silent | an error/failed build/stack trace appears | event-driven, not periodic |
|
|
117
|
+
| **Media / browsing / docs** | silent | only on request | never proactive |
|
|
118
|
+
|
|
119
|
+
For a `GAME`, `needsChangeRate` tells the agent to take a couple of `poll_change` reads to split **fast-action** (too fast to coach — break-gated only) from **strategy** (coachable, periodic). Honesty is built in: it never pretends to coach a game it can't follow, and it won't talk over media. The **interruptibility state** gates every utterance, on top of the global speech budget. Explicit user requests ("tell me when X happens", "be quieter") layer on as reflex triggers / cadence overrides.
|
|
120
|
+
|
|
121
|
+
Tune it in `computer-use.config.json` (`companion` section): `uiaCanvasMax` (the canvas cutoff) and per-class `profiles` (e.g. `GAME.cadenceSec: 20` for chattier coaching). Env: `VORTEX_CU_UIA_CANVAS_MAX`.
|
|
122
|
+
|
|
123
|
+
## What it is NOT
|
|
124
|
+
|
|
125
|
+
- **Not control.** No clicking, typing, or app automation. Perception only.
|
|
126
|
+
- **Not real-time for *judgment*.** Reflex `triggers` deliver a sub-second beep / fixed phrase / OCR readout, but anything the agent has to *think* about (a judged message) is seconds-scale — it makes a cloud call. Good for alerts, translation, and watching-alongside; not for reflex-speed decisions.
|
|
127
|
+
- **Not comprehensive secret protection.** See *Privacy & redaction* below — the denylist is the real control; field-level masking is best-effort and does not catch plaintext secrets sitting in arbitrary windows.
|
|
128
|
+
- **Not cross-platform yet.** Windows only in 0.3.0.
|
|
129
|
+
|
|
130
|
+
## Install
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
npm i @vortex-os/computer-use
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Peer dependency: `@vortex-os/base` (`>=0.3.0 <1.0.0`). The MCP SDK (`@modelcontextprotocol/sdk`) is an optional dependency, loaded only when the server runs. No native build step.
|
|
137
|
+
|
|
138
|
+
### Register the MCP server
|
|
139
|
+
|
|
140
|
+
The package ships a `vortex-mcp-computer-use` bin that launches the stdio server. Register it with your agent host. For Claude Code, add it to `.mcp.json`:
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"mcpServers": {
|
|
145
|
+
"vortex-computer-use": {
|
|
146
|
+
"command": "npx",
|
|
147
|
+
"args": ["vortex-mcp-computer-use"]
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
> Use a server name other than the reserved `computer-use` (e.g. `vortex-computer-use`) — some hosts reserve `computer-use` and will silently skip a server with that exact name. MCP servers load at session start, so **restart the agent** after adding it.
|
|
154
|
+
|
|
155
|
+
## Privacy & redaction
|
|
156
|
+
|
|
157
|
+
Whatever you point this at is sent to your AI model. Two controls reduce accidental exposure; both run in the backend **before** any pixels or text reach the model:
|
|
158
|
+
|
|
159
|
+
1. **Denylist (the primary control).** List window titles or process names that must never be captured. If a listed window is visible anywhere inside a capture region, the whole capture is refused (`{ "redacted": true }` — no image, no text). This is the reliable defense against accidentally capturing a password manager or banking window during a watch.
|
|
160
|
+
2. **Password-field masking.** In `read_ui`, fields the OS reports as password inputs are dropped (no value, no text, children not traversed).
|
|
161
|
+
|
|
162
|
+
Copy `computer-use.config.example.json` to `computer-use.config.json` (next to the server) to configure the denylist, or set `VORTEX_CU_DENY_TITLES` / `VORTEX_CU_DENY_PROCS` (JSON arrays). **The denylist is read once at startup — restart the server after changing it.**
|
|
163
|
+
|
|
164
|
+
**Honest limits.** This is *not* comprehensive secret-scanning. A plaintext token shown in a text editor or terminal (not a password field, not a denylisted window) will still be captured. Pixel-level password masking is intentionally out of scope for 0.1.0. Capture images are volatile — held only long enough to send, then deleted; they are never written to disk persistently.
|
|
165
|
+
|
|
166
|
+
### Audit
|
|
167
|
+
|
|
168
|
+
Each perception call appends one metadata line (timestamp, tool, output size, a keyed HMAC of the output, and an HMAC of the window title) to a daily JSONL log under your user-local app data (`%LOCALAPPDATA%\vortex-computer-use\audit\`) — outside the synced instance data. **No raw images and no plaintext window titles are stored.** If the audit key can't be set up, perception still works and a warning is printed.
|
|
169
|
+
|
|
170
|
+
## Verify
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
npm run verify # node scripts/verify.mjs — needs a desktop session; captures the real screen
|
|
174
|
+
npm run test:filter # node scripts/test-noise-filter.mjs — pure unit tests, no screen needed
|
|
175
|
+
npm run test:speech # node scripts/test-speech-safety.mjs — pure unit tests (provenance/shaping/budget)
|
|
176
|
+
npm run test:vlm # node scripts/test-vlm.mjs — pure unit tests (config/trust-tier/protocol)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
`verify` exercises every tool plus the redaction/audit gate (denylist blocking across all capture modes, no over-block, no title leak, audit written with no plaintext). The `test:*` scripts check the noise-filter, speech-safety, and VLM-protocol logic deterministically (no screen/audio/network). Three live harnesses drive the real screen: `node scripts/verify-watch.mjs` (background watch: settle → event → frame, denylist blindness, cleanup), `node scripts/verify-reflex.mjs` (reflex triggers → local speech, rendered to WAV so it stays silent), and `node scripts/verify-vlm.mjs` (the `vision` path against a mock local endpoint: synthetic-probe, real-crop only on a trigger, degrade-to-OCR).
|
|
@@ -1,28 +1,29 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_comment": "Copy to computer-use.config.json to enable redaction. Empty by default — nothing is blocked until you add entries. The denylist is the primary control: any listed window/process that appears inside a capture region makes the whole capture fail-closed (no image, no structured text). Matching is case-insensitive substring. This is NOT comprehensive secret-scanning: plaintext secrets visible in non-listed windows (editors, terminals) are still captured. Env overrides: VORTEX_CU_DENY_TITLES / VORTEX_CU_DENY_PROCS (JSON arrays).",
|
|
3
|
-
"_restart": "The denylist is read once at server start; RESTART the MCP server (restart the agent / reload its MCP servers) after changing this file or the env vars for the change to take effect.",
|
|
4
|
-
"redaction": {
|
|
5
|
-
"denyWindowTitles": [],
|
|
6
|
-
"denyProcesses": []
|
|
7
|
-
},
|
|
8
|
-
"_examples": {
|
|
9
|
-
"denyWindowTitles": ["Bitwarden", "1Password", "KeePass", "Online Banking"],
|
|
10
|
-
"denyProcesses": ["Bitwarden", "1Password", "KeePassXC", "keeper"]
|
|
11
|
-
},
|
|
12
|
-
"_tts_comment": "Spoken-voice settings. engine 'auto' uses the higher-quality Supertonic neural voice when its models are present (run `node scripts/fetch-supertonic.mjs` once, ~380MB), else falls back to the built-in Windows voice ('heami'). 'duck' lowers OTHER apps' audio while the companion speaks (per-app, restored after); 'duckFactor' is how far they drop (0.3 = to 30%; lower = quieter). NOTE: DRM-protected audio (e.g. Netflix) can't be ducked — that's the app's protection, not a limitation here. Env overrides win over this file: VORTEX_CU_TTS_ENGINE / VORTEX_CU_TTS_VOICE / VORTEX_CU_DUCK(=off) / VORTEX_CU_DUCK_FACTOR. Restart the server after changing.",
|
|
13
|
-
"tts": {
|
|
14
|
-
"engine": "auto",
|
|
15
|
-
"voice": "F1",
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Copy to computer-use.config.json to enable redaction. Empty by default — nothing is blocked until you add entries. The denylist is the primary control: any listed window/process that appears inside a capture region makes the whole capture fail-closed (no image, no structured text). Matching is case-insensitive substring. This is NOT comprehensive secret-scanning: plaintext secrets visible in non-listed windows (editors, terminals) are still captured. Env overrides: VORTEX_CU_DENY_TITLES / VORTEX_CU_DENY_PROCS (JSON arrays).",
|
|
3
|
+
"_restart": "The denylist is read once at server start; RESTART the MCP server (restart the agent / reload its MCP servers) after changing this file or the env vars for the change to take effect.",
|
|
4
|
+
"redaction": {
|
|
5
|
+
"denyWindowTitles": [],
|
|
6
|
+
"denyProcesses": []
|
|
7
|
+
},
|
|
8
|
+
"_examples": {
|
|
9
|
+
"denyWindowTitles": ["Bitwarden", "1Password", "KeePass", "Online Banking"],
|
|
10
|
+
"denyProcesses": ["Bitwarden", "1Password", "KeePassXC", "keeper"]
|
|
11
|
+
},
|
|
12
|
+
"_tts_comment": "Spoken-voice settings. engine 'auto' uses the higher-quality Supertonic neural voice when its models are present (run `node scripts/fetch-supertonic.mjs` once, ~380MB), else falls back to the built-in Windows voice ('heami'). 'speed' is the speech-rate multiplier (~1.0 = normal, higher = faster; applied to Supertonic directly and mapped onto the Windows voice's rate; clamped to 0.5..2.0). 'duck' lowers OTHER apps' audio while the companion speaks (per-app, restored after); 'duckFactor' is how far they drop (0.3 = to 30%; lower = quieter). NOTE: DRM-protected audio (e.g. Netflix) can't be ducked — that's the app's protection, not a limitation here. Env overrides win over this file: VORTEX_CU_TTS_ENGINE / VORTEX_CU_TTS_VOICE / VORTEX_CU_TTS_SPEED / VORTEX_CU_DUCK(=off) / VORTEX_CU_DUCK_FACTOR. Restart the server after changing.",
|
|
13
|
+
"tts": {
|
|
14
|
+
"engine": "auto",
|
|
15
|
+
"voice": "F1",
|
|
16
|
+
"speed": 1.05,
|
|
17
|
+
"duck": true,
|
|
18
|
+
"duckFactor": 0.3
|
|
19
|
+
},
|
|
20
|
+
"_companion_comment": "Adaptive companion (classify_activity). 'uiaCanvasMax' is the UIA element-count cutoff below which a screen-filling window is treated as a GPU canvas (game/video) — raise it if a game with some on-screen widgets is misread as an app. 'profiles' overrides per-class cadence/proactivity, e.g. make game coaching chattier with GAME.cadenceSec=20. Classes: GAME, DEV, MEDIA, BROWSING, PRODUCTIVITY, UNKNOWN. Env override: VORTEX_CU_UIA_CANVAS_MAX. See docs/adaptive-companion.md. Restart the server after changing.",
|
|
21
|
+
"companion": {
|
|
22
|
+
"uiaCanvasMax": 5,
|
|
23
|
+
"profiles": {
|
|
24
|
+
"GAME": { "cadenceSec": 30, "proactive": true },
|
|
25
|
+
"DEV": { "proactive": false },
|
|
26
|
+
"MEDIA": { "proactive": false }
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|