roku-mcp 1.5.2 → 1.6.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/README.md +57 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/tools/edit-ui.d.ts +3 -0
- package/dist/tools/edit-ui.d.ts.map +1 -0
- package/dist/tools/edit-ui.js +536 -0
- package/dist/tools/edit-ui.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -197,6 +197,63 @@ Or simply add the two expected variables to your `.env` alongside your existing
|
|
|
197
197
|
| `roku_console_send` | Send a command to the debug console and auto-disconnect |
|
|
198
198
|
| `roku_console_disconnect` | Close the console connection (safety net) |
|
|
199
199
|
|
|
200
|
+
### Runtime UI Editing
|
|
201
|
+
|
|
202
|
+
Edit the SceneGraph UI of a running sideloaded dev channel without redeploying — the same backend the SceneGraph Inspector in the [vscode-brightscript-language](https://github.com/rokucommunity/vscode-brightscript-language) extension uses. These tools speak the [roku-test-automation](https://github.com/triwav/roku-test-automation) (RTA) protocol against the channel's **On-Device Component** on TCP port 9000, so changes apply instantly with no debugger pause.
|
|
203
|
+
|
|
204
|
+
| Tool | Description |
|
|
205
|
+
|---|---|
|
|
206
|
+
| `roku_edit_node` | Set one or more fields on a node by id (visible, translation, text, color, opacity, etc.) |
|
|
207
|
+
| `roku_set_node_visible` | Show or hide a node by id |
|
|
208
|
+
| `roku_move_node` | Move a node to `[x, y]` |
|
|
209
|
+
| `roku_focus_node` | Set focus on a node by id (RTA `focusNode`) |
|
|
210
|
+
| `roku_remove_node` | Detach a node from its parent at runtime (RTA `removeNode`) |
|
|
211
|
+
| `roku_create_node` | Create a new node and append it to a parent by id (RTA `createChild`) |
|
|
212
|
+
| `roku_get_value` | Read a field value (or full `keyPath`) from the running scene (RTA `getValue`) |
|
|
213
|
+
| `roku_observe_field` | Wait for a field to change or match a value (RTA `onFieldChangeOnce`) — great for "wait until X" assertions |
|
|
214
|
+
|
|
215
|
+
**How it works.** Each tool opens a short-lived TCP connection to the RTA On-Device Component (port 9000) in the running channel, sends a length-prefixed JSON request (`setValue` / `getValue` / `focusNode` / ...) and parses the framed JSON response. Mutations apply on the SceneGraph thread without breaking into the debugger.
|
|
216
|
+
|
|
217
|
+
**Node addressing.** `nodeId` accepts either:
|
|
218
|
+
- A `uiElementId` like `RTA_1773` (visible in the `roku_query_sg_nodes` / `roku_query_app_ui` output for every node when RTA is running). This is the most robust target.
|
|
219
|
+
- A real BrightScript `id` attribute defined on the node in the channel source.
|
|
220
|
+
|
|
221
|
+
Anything matching `/^RTA_\d+$/` is sent with RTA `base: "elementId"`; otherwise it's sent with `base: "scene"`.
|
|
222
|
+
|
|
223
|
+
#### Required: install the RTA On-Device Component in your channel
|
|
224
|
+
|
|
225
|
+
These tools only work when the channel under test bundles RTA. You have two options:
|
|
226
|
+
|
|
227
|
+
**Option A — let `roku-debug` inject RTA on every sideload (recommended for VS Code users).**
|
|
228
|
+
|
|
229
|
+
1. In your `launch.json`, enable:
|
|
230
|
+
|
|
231
|
+
```json
|
|
232
|
+
"injectRdbOnDeviceComponent": true
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
2. In `source/main.brs`, add the marker comment immediately after `screen.show()`:
|
|
236
|
+
|
|
237
|
+
```brightscript
|
|
238
|
+
sub main()
|
|
239
|
+
screen = createObject("roSGScreen")
|
|
240
|
+
' ...
|
|
241
|
+
screen.show()
|
|
242
|
+
' vscode_rdb_on_device_component_entry
|
|
243
|
+
' ...
|
|
244
|
+
end sub
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Option B — bundle the RTA component yourself.** Copy the `device/components` folder from [roku-test-automation](https://github.com/triwav/roku-test-automation) into your channel and instantiate `RTA_OnDeviceComponent` once from your scene.
|
|
248
|
+
|
|
249
|
+
Either way, on a successful install you will see this in the device log at channel launch:
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
[RTA][INFO] OnDeviceComponent init
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
If a runtime UI tool returns a connection-refused error, RTA is not present in the running channel — apply one of the two install options above and redeploy.
|
|
256
|
+
|
|
200
257
|
### BrightScript Profiler
|
|
201
258
|
|
|
202
259
|
Analyze `.bsprof` files generated by Roku devices. These tools use [bsprof-cli](https://www.npmjs.com/package/bsprof-cli) to parse the binary profiler format and return structured JSON reports.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC;AAUvB,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,QAAQ,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAelF"}
|
package/dist/index.js
CHANGED
|
@@ -7,10 +7,11 @@ import { registerScreenshotTools } from './tools/screenshot.js';
|
|
|
7
7
|
import { registerConsoleTools } from './tools/console.js';
|
|
8
8
|
import { registerBsprofTools } from './tools/bsprof.js';
|
|
9
9
|
import { registerPerfettoTools } from './tools/perfetto.js';
|
|
10
|
+
import { registerEditUiTools } from './tools/edit-ui.js';
|
|
10
11
|
export default function createServer(_options) {
|
|
11
12
|
const server = new McpServer({
|
|
12
13
|
name: 'roku-mcp',
|
|
13
|
-
version: '1.
|
|
14
|
+
version: '1.6.0',
|
|
14
15
|
});
|
|
15
16
|
registerDeployTools(server);
|
|
16
17
|
registerEcpTools(server);
|
|
@@ -18,6 +19,7 @@ export default function createServer(_options) {
|
|
|
18
19
|
registerConsoleTools(server);
|
|
19
20
|
registerBsprofTools(server);
|
|
20
21
|
registerPerfettoTools(server);
|
|
22
|
+
registerEditUiTools(server);
|
|
21
23
|
return server.server;
|
|
22
24
|
}
|
|
23
25
|
const isDirectRun = typeof process !== 'undefined' &&
|
|
@@ -28,7 +30,7 @@ if (isDirectRun) {
|
|
|
28
30
|
const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
|
|
29
31
|
const server = new McpServer({
|
|
30
32
|
name: 'roku-mcp',
|
|
31
|
-
version: '1.
|
|
33
|
+
version: '1.6.0',
|
|
32
34
|
});
|
|
33
35
|
registerDeployTools(server);
|
|
34
36
|
registerEcpTools(server);
|
|
@@ -36,6 +38,7 @@ if (isDirectRun) {
|
|
|
36
38
|
registerConsoleTools(server);
|
|
37
39
|
registerBsprofTools(server);
|
|
38
40
|
registerPerfettoTools(server);
|
|
41
|
+
registerEditUiTools(server);
|
|
39
42
|
const transport = new StdioServerTransport();
|
|
40
43
|
await server.connect(transport);
|
|
41
44
|
})();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,QAA8C;IACjF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,MAAM,WAAW,GACf,OAAO,OAAO,KAAK,WAAW;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;AAEnF,IAAI,WAAW,EAAE,CAAC;IAChB,CAAC,KAAK,IAAI,EAAE;QACV,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;YAC3B,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC5B,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAChC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC7B,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC5B,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAE5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC,CAAC,EAAE,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-ui.d.ts","sourceRoot":"","sources":["../../src/tools/edit-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+QpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsU3D"}
|
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import net from 'net';
|
|
3
|
+
import { resolveHost, friendlyError } from '../roku-config.js';
|
|
4
|
+
/**
|
|
5
|
+
* Edit a running SceneGraph UI at runtime using the roku-test-automation (RTA)
|
|
6
|
+
* On-Device Component, the same backend the SceneGraph Inspector in the
|
|
7
|
+
* rokucommunity/vscode-brightscript-language extension uses.
|
|
8
|
+
*
|
|
9
|
+
* The RTA OnDeviceComponent listens on TCP port 9000 inside the channel and
|
|
10
|
+
* speaks a simple length-prefixed JSON protocol. Each message looks like:
|
|
11
|
+
*
|
|
12
|
+
* [ int32LE stringLength ][ int32LE binaryLength ][ utf-8 JSON payload ][ optional binary ]
|
|
13
|
+
*
|
|
14
|
+
* Requests are `{ id, type, args, isRecuring }`; responses come framed the same
|
|
15
|
+
* way and we correlate by `id`. See the upstream source at
|
|
16
|
+
* https://github.com/triwav/roku-test-automation/blob/master/client/src/OnDeviceComponent.ts
|
|
17
|
+
*
|
|
18
|
+
* Requirements on the device:
|
|
19
|
+
* - The channel must include the RTA OnDeviceComponent (either bundled by the
|
|
20
|
+
* channel, or injected at sideload time by roku-debug via
|
|
21
|
+
* `"injectRdbOnDeviceComponent": true` in launch.json plus the marker
|
|
22
|
+
* comment `' vscode_rdb_on_device_component_entry` after `screen.show()`).
|
|
23
|
+
* - A successful install logs `[RTA][INFO] OnDeviceComponent init` at launch.
|
|
24
|
+
*
|
|
25
|
+
* Node addressing:
|
|
26
|
+
* - `base: 'elementId'` + `keyPath: <uiElementId>` — most robust, uses the
|
|
27
|
+
* `uiElementId="RTA_*"` shown by `roku_query_sg_nodes`.
|
|
28
|
+
* - `base: 'scene'` + `keyPath: 'someId'` — works when the node has a real
|
|
29
|
+
* `id` field set in the BrightScript code.
|
|
30
|
+
* - `base: 'focusedNode'` — no keyPath, targets whatever is currently focused.
|
|
31
|
+
*
|
|
32
|
+
* The mutating tools below accept `nodeId` and try elementId first, then fall
|
|
33
|
+
* back to scene-keyPath for convenience.
|
|
34
|
+
*/
|
|
35
|
+
const RTA_PORT = 9000;
|
|
36
|
+
const DEFAULT_TIMEOUT_MS = 5000;
|
|
37
|
+
const RTA_SETUP_HINT = '\n\nThis tool talks to the roku-test-automation (RTA) On-Device Component on TCP port 9000. ' +
|
|
38
|
+
'If the connection is refused, the channel does not include RTA. To enable it, either bundle the RTA OnDeviceComponent in your channel ' +
|
|
39
|
+
'OR (when sideloading via roku-debug) set `"injectRdbOnDeviceComponent": true` in launch.json and add the marker comment ' +
|
|
40
|
+
'`\' vscode_rdb_on_device_component_entry` immediately after `screen.show()` inside `main()`. ' +
|
|
41
|
+
'A successful install logs `[RTA][INFO] OnDeviceComponent init` at channel launch.';
|
|
42
|
+
const HEADER_SIZE = 8;
|
|
43
|
+
class RtaClient {
|
|
44
|
+
socket;
|
|
45
|
+
connected = false;
|
|
46
|
+
pending = new Map();
|
|
47
|
+
incoming = null;
|
|
48
|
+
leftover = Buffer.alloc(0);
|
|
49
|
+
constructor(socket) {
|
|
50
|
+
this.socket = socket;
|
|
51
|
+
socket.on('data', (chunk) => this.onData(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
|
|
52
|
+
socket.on('close', () => {
|
|
53
|
+
this.connected = false;
|
|
54
|
+
for (const p of this.pending.values()) {
|
|
55
|
+
clearTimeout(p.timer);
|
|
56
|
+
p.reject(new Error('RTA socket closed before response was received'));
|
|
57
|
+
}
|
|
58
|
+
this.pending.clear();
|
|
59
|
+
});
|
|
60
|
+
socket.on('error', () => { });
|
|
61
|
+
}
|
|
62
|
+
static connect(host, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
const socket = new net.Socket();
|
|
65
|
+
const timer = setTimeout(() => {
|
|
66
|
+
socket.destroy();
|
|
67
|
+
reject(new Error(`Timed out connecting to RTA on ${host}:${RTA_PORT}`));
|
|
68
|
+
}, timeoutMs);
|
|
69
|
+
socket.once('error', (err) => {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
reject(err);
|
|
72
|
+
});
|
|
73
|
+
socket.connect(RTA_PORT, host, async () => {
|
|
74
|
+
clearTimeout(timer);
|
|
75
|
+
const client = new RtaClient(socket);
|
|
76
|
+
client.connected = true;
|
|
77
|
+
try {
|
|
78
|
+
// Handshake: the RTA OnDeviceComponent expects an initial setSettings call.
|
|
79
|
+
await client.send('setSettings', { logLevel: 'info' });
|
|
80
|
+
resolve(client);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
socket.destroy();
|
|
84
|
+
reject(err);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
close() {
|
|
90
|
+
try {
|
|
91
|
+
this.socket.destroy();
|
|
92
|
+
}
|
|
93
|
+
catch { /* ignore */ }
|
|
94
|
+
this.connected = false;
|
|
95
|
+
}
|
|
96
|
+
onData(chunk) {
|
|
97
|
+
let buf = Buffer.concat([this.leftover, chunk]);
|
|
98
|
+
this.leftover = Buffer.alloc(0);
|
|
99
|
+
while (buf.length > 0) {
|
|
100
|
+
if (!this.incoming) {
|
|
101
|
+
if (buf.length < HEADER_SIZE) {
|
|
102
|
+
this.leftover = buf;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.incoming = {
|
|
106
|
+
stringLength: buf.readInt32LE(0),
|
|
107
|
+
binaryLength: buf.readInt32LE(4),
|
|
108
|
+
stringPayload: '',
|
|
109
|
+
binaryReceived: 0,
|
|
110
|
+
};
|
|
111
|
+
buf = buf.slice(HEADER_SIZE);
|
|
112
|
+
}
|
|
113
|
+
const needString = this.incoming.stringLength - Buffer.byteLength(this.incoming.stringPayload, 'utf-8');
|
|
114
|
+
if (needString > 0) {
|
|
115
|
+
const take = Math.min(needString, buf.length);
|
|
116
|
+
this.incoming.stringPayload += buf.slice(0, take).toString('utf-8');
|
|
117
|
+
buf = buf.slice(take);
|
|
118
|
+
if (Buffer.byteLength(this.incoming.stringPayload, 'utf-8') < this.incoming.stringLength) {
|
|
119
|
+
this.leftover = buf;
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const needBinary = this.incoming.binaryLength - this.incoming.binaryReceived;
|
|
124
|
+
if (needBinary > 0) {
|
|
125
|
+
const take = Math.min(needBinary, buf.length);
|
|
126
|
+
this.incoming.binaryReceived += take;
|
|
127
|
+
buf = buf.slice(take);
|
|
128
|
+
if (this.incoming.binaryReceived < this.incoming.binaryLength) {
|
|
129
|
+
this.leftover = buf;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const json = JSON.parse(this.incoming.stringPayload);
|
|
135
|
+
const id = json.id;
|
|
136
|
+
if (id && this.pending.has(id)) {
|
|
137
|
+
const p = this.pending.get(id);
|
|
138
|
+
this.pending.delete(id);
|
|
139
|
+
clearTimeout(p.timer);
|
|
140
|
+
p.resolve(json);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// ignore malformed responses
|
|
145
|
+
}
|
|
146
|
+
this.incoming = null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
send(type, args, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
150
|
+
if (!this.connected)
|
|
151
|
+
return Promise.reject(new Error('RTA client not connected'));
|
|
152
|
+
const id = Math.random().toString(36).slice(2, 14);
|
|
153
|
+
const request = { id, type, args, isRecuring: false };
|
|
154
|
+
const stringPayload = JSON.stringify(request).replace(/[\x00-\x08\x0E-\x1F\x7F-\uFFFF]/g, '');
|
|
155
|
+
const header = Buffer.alloc(HEADER_SIZE);
|
|
156
|
+
header.writeInt32LE(Buffer.byteLength(stringPayload, 'utf-8'), 0);
|
|
157
|
+
header.writeInt32LE(0, 4);
|
|
158
|
+
const body = Buffer.from(stringPayload, 'utf-8');
|
|
159
|
+
return new Promise((resolve, reject) => {
|
|
160
|
+
const timer = setTimeout(() => {
|
|
161
|
+
this.pending.delete(id);
|
|
162
|
+
reject(new Error(`RTA request \`${type}\` timed out after ${timeoutMs}ms`));
|
|
163
|
+
}, timeoutMs);
|
|
164
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
165
|
+
this.socket.write(Buffer.concat([header, body]), (err) => {
|
|
166
|
+
if (err) {
|
|
167
|
+
this.pending.delete(id);
|
|
168
|
+
clearTimeout(timer);
|
|
169
|
+
reject(err);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Determine the best `base`/`keyPath` pair for a given user-supplied node
|
|
177
|
+
* identifier. We try elementId first because it always works against the
|
|
178
|
+
* `uiElementId="RTA_*"` ids RTA assigns to every node, then fall back to
|
|
179
|
+
* scene-relative lookup so callers can pass a real BrightScript `id` too.
|
|
180
|
+
*/
|
|
181
|
+
async function resolveTarget(client, nodeId) {
|
|
182
|
+
if (/^RTA_\d+$/i.test(nodeId)) {
|
|
183
|
+
return { base: 'elementId', keyPath: nodeId };
|
|
184
|
+
}
|
|
185
|
+
return { base: 'scene', keyPath: nodeId };
|
|
186
|
+
}
|
|
187
|
+
async function withClient(host, fn) {
|
|
188
|
+
const client = await RtaClient.connect(host);
|
|
189
|
+
try {
|
|
190
|
+
return await fn(client);
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
client.close();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function summarizeResponse(json) {
|
|
197
|
+
if (!json)
|
|
198
|
+
return '(no response)';
|
|
199
|
+
if (json.error)
|
|
200
|
+
return `RTA error: ${typeof json.error === 'string' ? json.error : JSON.stringify(json.error)}`;
|
|
201
|
+
const { id: _id, timeTaken: _t, ...rest } = json;
|
|
202
|
+
void _id;
|
|
203
|
+
void _t;
|
|
204
|
+
const trimmed = JSON.stringify(rest);
|
|
205
|
+
return trimmed === '{}' ? 'OK' : trimmed;
|
|
206
|
+
}
|
|
207
|
+
function isRtaError(json) {
|
|
208
|
+
return !!(json && json.error);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Build the `setValue` args for a node+field pair, matching how the VS Code
|
|
212
|
+
* SceneGraph Inspector formats requests.
|
|
213
|
+
*
|
|
214
|
+
* - When `base` is `elementId`, the `keyPath` must be the bare elementId and
|
|
215
|
+
* the field name goes in the separate `field` arg. Appending `.field` to
|
|
216
|
+
* the elementId makes the OnDeviceComponent treat the whole string as a
|
|
217
|
+
* non-existent elementId, so the write silently no-ops while still
|
|
218
|
+
* returning a 200-style response. (Verified against firmware behavior.)
|
|
219
|
+
* - When `base` is `scene` (or any other base), the field name is the last
|
|
220
|
+
* segment of the dotted keyPath, e.g. `MainScene.subtitle.text`.
|
|
221
|
+
*/
|
|
222
|
+
function buildSetValueArgs(target, field, value) {
|
|
223
|
+
if (target.base === 'elementId') {
|
|
224
|
+
return {
|
|
225
|
+
base: 'elementId',
|
|
226
|
+
keyPath: target.keyPath ?? '',
|
|
227
|
+
field,
|
|
228
|
+
value,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const keyPath = target.keyPath ? `${target.keyPath}.${field}` : field;
|
|
232
|
+
return {
|
|
233
|
+
base: target.base,
|
|
234
|
+
keyPath,
|
|
235
|
+
field,
|
|
236
|
+
value,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
export function registerEditUiTools(server) {
|
|
240
|
+
server.registerTool('roku_edit_node', {
|
|
241
|
+
description: 'Edit a SceneGraph node on the running dev channel at runtime by setting one or more fields. ' +
|
|
242
|
+
'Uses the roku-test-automation (RTA) On-Device Component on TCP port 9000 — the same backend the SceneGraph Inspector in the vscode-brightscript-language extension uses. ' +
|
|
243
|
+
'Requires RTA to be present in the running channel (see README "Runtime UI Editing"). ' +
|
|
244
|
+
'nodeId can be either a `uiElementId` like "RTA_1773" (as shown by roku_query_sg_nodes) or a BrightScript scene-level `id`. ' +
|
|
245
|
+
'Common fields: visible (boolean), translation ([x,y]), text (string), color (hex like "0xRRGGBBAA"), opacity (number 0..1).',
|
|
246
|
+
inputSchema: {
|
|
247
|
+
host: z.string().optional().describe('IP address or hostname of the Roku device'),
|
|
248
|
+
nodeId: z.string().describe('uiElementId (e.g. "RTA_1773") or BrightScript scene id of the node to edit'),
|
|
249
|
+
fields: z
|
|
250
|
+
.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.array(z.number())]))
|
|
251
|
+
.describe('Map of field name -> new value. Each field becomes one setValue request.'),
|
|
252
|
+
},
|
|
253
|
+
}, async (params) => {
|
|
254
|
+
try {
|
|
255
|
+
const host = await resolveHost(params);
|
|
256
|
+
const entries = Object.entries(params.fields ?? {});
|
|
257
|
+
if (entries.length === 0) {
|
|
258
|
+
return { content: [{ type: 'text', text: 'No fields provided.' }], isError: true };
|
|
259
|
+
}
|
|
260
|
+
const { lines, anyError } = await withClient(host, async (client) => {
|
|
261
|
+
const target = await resolveTarget(client, params.nodeId);
|
|
262
|
+
const out = [];
|
|
263
|
+
let err = false;
|
|
264
|
+
for (const [field, value] of entries) {
|
|
265
|
+
const args = buildSetValueArgs(target, field, value);
|
|
266
|
+
const json = await client.send('setValue', args);
|
|
267
|
+
if (isRtaError(json))
|
|
268
|
+
err = true;
|
|
269
|
+
out.push(`${field} = ${JSON.stringify(value)} -> ${summarizeResponse(json)}`);
|
|
270
|
+
}
|
|
271
|
+
return { lines: out, anyError: err };
|
|
272
|
+
});
|
|
273
|
+
return {
|
|
274
|
+
content: [{ type: 'text', text: `Updated node "${params.nodeId}":\n${lines.join('\n')}` }],
|
|
275
|
+
isError: anyError || undefined,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
return {
|
|
280
|
+
content: [{ type: 'text', text: `Edit node failed: ${friendlyError(error)}${RTA_SETUP_HINT}` }],
|
|
281
|
+
isError: true,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
server.registerTool('roku_set_node_visible', {
|
|
286
|
+
description: 'Show or hide a SceneGraph node by id via RTA setValue on the `visible` field.',
|
|
287
|
+
inputSchema: {
|
|
288
|
+
host: z.string().optional().describe('IP address or hostname of the Roku device'),
|
|
289
|
+
nodeId: z.string().describe('uiElementId (e.g. "RTA_1773") or BrightScript scene id of the node'),
|
|
290
|
+
visible: z.boolean().describe('true to show, false to hide'),
|
|
291
|
+
},
|
|
292
|
+
}, async (params) => {
|
|
293
|
+
try {
|
|
294
|
+
const host = await resolveHost(params);
|
|
295
|
+
const json = await withClient(host, async (client) => {
|
|
296
|
+
const target = await resolveTarget(client, params.nodeId);
|
|
297
|
+
return client.send('setValue', buildSetValueArgs(target, 'visible', params.visible));
|
|
298
|
+
});
|
|
299
|
+
return {
|
|
300
|
+
content: [{ type: 'text', text: `${params.visible ? 'Showed' : 'Hid'} "${params.nodeId}" -> ${summarizeResponse(json)}` }],
|
|
301
|
+
isError: isRtaError(json) || undefined,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
return {
|
|
306
|
+
content: [{ type: 'text', text: `Set visible failed: ${friendlyError(error)}${RTA_SETUP_HINT}` }],
|
|
307
|
+
isError: true,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
server.registerTool('roku_move_node', {
|
|
312
|
+
description: 'Move a SceneGraph node to a new position by setting its `translation` field to [x, y].',
|
|
313
|
+
inputSchema: {
|
|
314
|
+
host: z.string().optional().describe('IP address or hostname of the Roku device'),
|
|
315
|
+
nodeId: z.string().describe('uiElementId or scene id of the node to move'),
|
|
316
|
+
x: z.number().describe('Target x coordinate in pixels'),
|
|
317
|
+
y: z.number().describe('Target y coordinate in pixels'),
|
|
318
|
+
},
|
|
319
|
+
}, async (params) => {
|
|
320
|
+
try {
|
|
321
|
+
const host = await resolveHost(params);
|
|
322
|
+
const json = await withClient(host, async (client) => {
|
|
323
|
+
const target = await resolveTarget(client, params.nodeId);
|
|
324
|
+
return client.send('setValue', buildSetValueArgs(target, 'translation', [params.x, params.y]));
|
|
325
|
+
});
|
|
326
|
+
return {
|
|
327
|
+
content: [{ type: 'text', text: `Moved "${params.nodeId}" to [${params.x}, ${params.y}] -> ${summarizeResponse(json)}` }],
|
|
328
|
+
isError: isRtaError(json) || undefined,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
return {
|
|
333
|
+
content: [{ type: 'text', text: `Move node failed: ${friendlyError(error)}${RTA_SETUP_HINT}` }],
|
|
334
|
+
isError: true,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
server.registerTool('roku_focus_node', {
|
|
339
|
+
description: 'Set focus on a SceneGraph node by id via RTA focusNode.',
|
|
340
|
+
inputSchema: {
|
|
341
|
+
host: z.string().optional().describe('IP address or hostname of the Roku device'),
|
|
342
|
+
nodeId: z.string().describe('uiElementId or scene id of the node to focus'),
|
|
343
|
+
on: z.boolean().optional().describe('true to set focus (default), false to remove'),
|
|
344
|
+
},
|
|
345
|
+
}, async (params) => {
|
|
346
|
+
try {
|
|
347
|
+
const host = await resolveHost(params);
|
|
348
|
+
const json = await withClient(host, async (client) => {
|
|
349
|
+
const target = await resolveTarget(client, params.nodeId);
|
|
350
|
+
return client.send('focusNode', {
|
|
351
|
+
base: target.base,
|
|
352
|
+
keyPath: target.keyPath,
|
|
353
|
+
on: params.on ?? true,
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
return {
|
|
357
|
+
content: [{ type: 'text', text: `Focus(${params.on ?? true}) "${params.nodeId}" -> ${summarizeResponse(json)}` }],
|
|
358
|
+
isError: isRtaError(json) || undefined,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
return {
|
|
363
|
+
content: [{ type: 'text', text: `Focus node failed: ${friendlyError(error)}${RTA_SETUP_HINT}` }],
|
|
364
|
+
isError: true,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
server.registerTool('roku_remove_node', {
|
|
369
|
+
description: 'Remove a SceneGraph node from its parent at runtime via RTA removeNode.',
|
|
370
|
+
inputSchema: {
|
|
371
|
+
host: z.string().optional().describe('IP address or hostname of the Roku device'),
|
|
372
|
+
nodeId: z.string().describe('uiElementId or scene id of the node to remove'),
|
|
373
|
+
},
|
|
374
|
+
}, async (params) => {
|
|
375
|
+
try {
|
|
376
|
+
const host = await resolveHost(params);
|
|
377
|
+
const json = await withClient(host, async (client) => {
|
|
378
|
+
const target = await resolveTarget(client, params.nodeId);
|
|
379
|
+
return client.send('removeNode', {
|
|
380
|
+
base: target.base,
|
|
381
|
+
keyPath: target.keyPath,
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
return {
|
|
385
|
+
content: [{ type: 'text', text: `Removed "${params.nodeId}" -> ${summarizeResponse(json)}` }],
|
|
386
|
+
isError: isRtaError(json) || undefined,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
return {
|
|
391
|
+
content: [{ type: 'text', text: `Remove node failed: ${friendlyError(error)}${RTA_SETUP_HINT}` }],
|
|
392
|
+
isError: true,
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
server.registerTool('roku_create_node', {
|
|
397
|
+
description: 'Create a new SceneGraph node at runtime and append it as a child of an existing node via RTA createChild. ' +
|
|
398
|
+
'Subtype must be a SceneGraph node type registered for the running scene (e.g. Label, Rectangle, Poster, Group).',
|
|
399
|
+
inputSchema: {
|
|
400
|
+
host: z.string().optional().describe('IP address or hostname of the Roku device'),
|
|
401
|
+
parentId: z.string().describe('uiElementId or scene id of the parent node'),
|
|
402
|
+
subtype: z.string().describe('SceneGraph subtype to create (Label, Rectangle, Poster, Group, ...)'),
|
|
403
|
+
id: z.string().optional().describe('Optional id to set on the new node'),
|
|
404
|
+
fields: z
|
|
405
|
+
.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.array(z.number())]))
|
|
406
|
+
.optional()
|
|
407
|
+
.describe('Optional initial fields to set on the new node'),
|
|
408
|
+
},
|
|
409
|
+
}, async (params) => {
|
|
410
|
+
try {
|
|
411
|
+
const host = await resolveHost(params);
|
|
412
|
+
const json = await withClient(host, async (client) => {
|
|
413
|
+
const target = await resolveTarget(client, params.parentId);
|
|
414
|
+
const fields = { ...(params.fields ?? {}) };
|
|
415
|
+
if (params.id)
|
|
416
|
+
fields.id = params.id;
|
|
417
|
+
return client.send('createChild', {
|
|
418
|
+
base: target.base,
|
|
419
|
+
keyPath: target.keyPath,
|
|
420
|
+
subtype: params.subtype,
|
|
421
|
+
fields,
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
return {
|
|
425
|
+
content: [{ type: 'text', text: `Created <${params.subtype}>${params.id ? ` id="${params.id}"` : ''} under "${params.parentId}" -> ${summarizeResponse(json)}` }],
|
|
426
|
+
isError: isRtaError(json) || undefined,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
catch (error) {
|
|
430
|
+
return {
|
|
431
|
+
content: [{ type: 'text', text: `Create node failed: ${friendlyError(error)}${RTA_SETUP_HINT}` }],
|
|
432
|
+
isError: true,
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
server.registerTool('roku_get_value', {
|
|
437
|
+
description: 'Read a field value from a SceneGraph node at runtime via RTA getValue. Returns the value as JSON. ' +
|
|
438
|
+
'Pass either nodeId+field, or a full keyPath like "MainScene.rowList.0.title".',
|
|
439
|
+
inputSchema: {
|
|
440
|
+
host: z.string().optional().describe('IP address or hostname of the Roku device'),
|
|
441
|
+
nodeId: z.string().optional().describe('uiElementId or scene id of the node (combined with `field`)'),
|
|
442
|
+
field: z.string().optional().describe('Field name on the node (used with nodeId)'),
|
|
443
|
+
keyPath: z.string().optional().describe('Full RTA keyPath instead of nodeId+field (e.g. "MainScene.rowList.focusedRow.title.text")'),
|
|
444
|
+
base: z.enum(['global', 'scene', 'elementId', 'focusedNode', 'nodeRef', 'appUI']).optional().describe('RTA base (default inferred from nodeId, or "scene" when using keyPath)'),
|
|
445
|
+
},
|
|
446
|
+
}, async (params) => {
|
|
447
|
+
try {
|
|
448
|
+
const host = await resolveHost(params);
|
|
449
|
+
if (!params.keyPath && !(params.nodeId && params.field)) {
|
|
450
|
+
return { content: [{ type: 'text', text: 'Provide either `keyPath` or both `nodeId` and `field`.' }], isError: true };
|
|
451
|
+
}
|
|
452
|
+
const json = await withClient(host, async (client) => {
|
|
453
|
+
let args;
|
|
454
|
+
if (params.keyPath) {
|
|
455
|
+
args = { base: params.base ?? 'scene', keyPath: params.keyPath };
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
const target = await resolveTarget(client, params.nodeId);
|
|
459
|
+
const base = params.base ?? target.base;
|
|
460
|
+
if (base === 'elementId') {
|
|
461
|
+
args = { base, keyPath: target.keyPath ?? '', field: params.field };
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
args = {
|
|
465
|
+
base,
|
|
466
|
+
keyPath: target.keyPath ? `${target.keyPath}.${params.field}` : params.field,
|
|
467
|
+
field: params.field,
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return client.send('getValue', args);
|
|
472
|
+
});
|
|
473
|
+
return { content: [{ type: 'text', text: JSON.stringify(json, null, 2) }], isError: isRtaError(json) || undefined };
|
|
474
|
+
}
|
|
475
|
+
catch (error) {
|
|
476
|
+
return {
|
|
477
|
+
content: [{ type: 'text', text: `Get value failed: ${friendlyError(error)}${RTA_SETUP_HINT}` }],
|
|
478
|
+
isError: true,
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
server.registerTool('roku_observe_field', {
|
|
483
|
+
description: 'Wait for a SceneGraph field to change (or match a specific value) via RTA onFieldChangeOnce. ' +
|
|
484
|
+
'Returns when the observer fires or the timeout elapses. Great for "wait until video starts playing" style assertions.',
|
|
485
|
+
inputSchema: {
|
|
486
|
+
host: z.string().optional().describe('IP address or hostname of the Roku device'),
|
|
487
|
+
nodeId: z.string().optional().describe('uiElementId or scene id of the node'),
|
|
488
|
+
keyPath: z.string().optional().describe('Full RTA keyPath (alternative to nodeId+field)'),
|
|
489
|
+
field: z.string().optional().describe('Field name to observe (used with nodeId)'),
|
|
490
|
+
match: z
|
|
491
|
+
.union([z.string(), z.number(), z.boolean()])
|
|
492
|
+
.optional()
|
|
493
|
+
.describe('Optional value to wait for. If omitted, fires on any change.'),
|
|
494
|
+
timeoutMs: z.number().optional().default(10_000).describe('How long to wait before giving up (default 10000)'),
|
|
495
|
+
},
|
|
496
|
+
}, async (params) => {
|
|
497
|
+
try {
|
|
498
|
+
const host = await resolveHost(params);
|
|
499
|
+
if (!params.keyPath && !(params.nodeId && params.field)) {
|
|
500
|
+
return { content: [{ type: 'text', text: 'Provide either `keyPath` or both `nodeId` and `field`.' }], isError: true };
|
|
501
|
+
}
|
|
502
|
+
const timeoutMs = params.timeoutMs ?? 10_000;
|
|
503
|
+
const json = await withClient(host, async (client) => {
|
|
504
|
+
let baseArgs;
|
|
505
|
+
if (params.keyPath) {
|
|
506
|
+
baseArgs = { base: 'scene', keyPath: params.keyPath };
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
const target = await resolveTarget(client, params.nodeId);
|
|
510
|
+
if (target.base === 'elementId') {
|
|
511
|
+
baseArgs = { base: 'elementId', keyPath: target.keyPath ?? '', field: params.field };
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
baseArgs = {
|
|
515
|
+
base: target.base,
|
|
516
|
+
keyPath: target.keyPath ? `${target.keyPath}.${params.field}` : params.field,
|
|
517
|
+
field: params.field,
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
const args = { ...baseArgs, observerFireTimeout: timeoutMs };
|
|
522
|
+
if (params.match !== undefined)
|
|
523
|
+
args.match = params.match;
|
|
524
|
+
return client.send('onFieldChangeOnce', args, timeoutMs + 2000);
|
|
525
|
+
});
|
|
526
|
+
return { content: [{ type: 'text', text: JSON.stringify(json, null, 2) }], isError: isRtaError(json) || undefined };
|
|
527
|
+
}
|
|
528
|
+
catch (error) {
|
|
529
|
+
return {
|
|
530
|
+
content: [{ type: 'text', text: `Observe field failed: ${friendlyError(error)}${RTA_SETUP_HINT}` }],
|
|
531
|
+
isError: true,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
//# sourceMappingURL=edit-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-ui.js","sourceRoot":"","sources":["../../src/tools/edit-ui.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED