@putdotio/rokit 1.7.0 → 2.0.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/AGENTS.md ADDED
@@ -0,0 +1,90 @@
1
+ # Agent Guide
2
+
3
+ `rokit` is a small Node CLI that wraps generic Roku device harness primitives.
4
+ Keep it platform-focused, typed, and useful for both humans and agents.
5
+
6
+ ## Generic Tool Boundary
7
+
8
+ - Keep `rokit` free of put.io product behavior. Do not add put.io app IDs,
9
+ deep links, content IDs, account data, credentials, journeys, UI node names,
10
+ or product assertions.
11
+ - `@putdotio/rokit`, `putdotio/rokit`, release-bot wiring, copyright, and
12
+ security contacts are ownership/publishing metadata only; do not treat them
13
+ as permission to add product-specific fixtures.
14
+ - Use neutral examples such as `dev`, `Example Channel`, `videoPlayerScreen`,
15
+ and synthetic SceneGraph/XML data when docs or tests need sample app data.
16
+ - Consumer app repos own product scenario scripts, app-specific selectors,
17
+ playback/content assertions, and review artifacts.
18
+
19
+ ## Patterns
20
+
21
+ - Use Effect at the runtime boundary and for reusable effectful operations. Keep
22
+ errors schema-backed and render them without stack traces in CLI output.
23
+ - Keep CLI wiring thin: parse/dispatch commands, then call named Roku helpers.
24
+ - Keep human output stable; `--json` / `--output json` should wrap every
25
+ command result and error in a deterministic object for agents.
26
+ - Keep `src/index.ts` as the public library surface for app-specific scenario
27
+ scripts. Export generic Roku/SceneGraph primitives only.
28
+ - Treat `process.cwd()` as the consumer app root.
29
+ - Keep `.rokit/` consumer-local; it can hold env, generated artifacts, and
30
+ transient device state.
31
+ - Keep `examples/live-probe-channel` generic. It exists only to prove package,
32
+ install, launch, input, SceneGraph, screenshot, and proof mechanics.
33
+ - Wrap `roku-deploy` for package publish, screenshots, and device metadata when
34
+ it already owns the platform mechanics.
35
+ - Use Roku ECP for launch, keypresses, active-app queries, and raw runtime
36
+ state.
37
+ - Media-player helpers can parse and wait on Roku `/query/media-player` state,
38
+ but app repos own expectations about specific content, playback URLs, and
39
+ containers.
40
+ - Keep SceneGraph helpers generic: node state, text, attributes, focus/state
41
+ waits, and raw tree output are okay; product-specific screen contracts stay in
42
+ app repos.
43
+ - Keep app journeys, content IDs, account data, and product assertions out of
44
+ the generic harness.
45
+
46
+ ## Sharp Edges
47
+
48
+ - Missing config/env and child-command failures should not print stack traces.
49
+ - `ROKIT_PASSWORD` is required only for developer-installer operations such as
50
+ install and screenshot.
51
+ - `ROKU_DEV_TARGET` and `ROKU_DEV_PASSWORD` are compatibility fallbacks, not the
52
+ primary public contract.
53
+ - Avoid sleeps in generic commands. App repos can add meaningful wait/assert
54
+ loops around `rokit` primitives.
55
+ - Release details live in `docs/DISTRIBUTION.md`; readiness details live in
56
+ `docs/READINESS.md`.
57
+
58
+ ## When Contracts Change
59
+
60
+ - Command, env, or output changes: update `README.md` and CLI tests.
61
+ - CI/release/publishing changes: update workflow docs or release config in the
62
+ same change.
63
+ - Keep `CLAUDE.md` as a symlink to this file if Claude-compatible discovery is
64
+ added.
65
+
66
+ ## Checks
67
+
68
+ ```bash
69
+ vp install
70
+ vp run verify
71
+ ```
72
+
73
+ Fast loops:
74
+
75
+ ```bash
76
+ vp run check
77
+ vp run typecheck
78
+ vp run smoke
79
+ vp run test
80
+ ```
81
+
82
+ Live Roku checks when a developer-enabled device exists:
83
+
84
+ ```bash
85
+ ROKIT_TARGET=<roku-ip> vp run live:smoke
86
+ ROKIT_TARGET=<roku-ip> ROKIT_PASSWORD=<password> vp run live:probe
87
+ ROKIT_TARGET=<roku-ip> vp exec rokit check
88
+ ROKIT_TARGET=<roku-ip> vp exec rokit launch dev
89
+ ROKIT_TARGET=<roku-ip> vp exec rokit press Info Back
90
+ ```
@@ -0,0 +1,52 @@
1
+ # Contributing
2
+
3
+ ## Setup
4
+
5
+ ```bash
6
+ vp install
7
+ ```
8
+
9
+ ## Run Locally
10
+
11
+ Use the built CLI through the package scripts while developing:
12
+
13
+ ```bash
14
+ vp run smoke
15
+ ```
16
+
17
+ For live Roku checks, set local environment variables in your shell or
18
+ `.rokit/.env`.
19
+
20
+ ## Validation
21
+
22
+ ```bash
23
+ vp run verify
24
+ ```
25
+
26
+ `verify` runs static checks, TypeScript, packaging, tests, and an npm pack dry
27
+ run.
28
+
29
+ ## Live Checks
30
+
31
+ Live checks require a developer-enabled Roku on the same network:
32
+
33
+ ```bash
34
+ ROKIT_TARGET=<roku-ip> vp run live:smoke
35
+ ROKIT_TARGET=<roku-ip> vp exec rokit press Info Back
36
+ ```
37
+
38
+ Screenshots and installs require `ROKIT_PASSWORD`.
39
+
40
+ Keep local device details in `.rokit/.env` or your shell. Do not commit device
41
+ IPs, passwords, signing keys, tokens, or account-specific app data.
42
+
43
+ ## Pull Requests
44
+
45
+ - Keep changes focused.
46
+ - Add or update tests when command behavior, parsing, output, or public exports change.
47
+ - Include the most useful verification evidence for the change.
48
+ - Keep app-specific journeys out of `rokit`; add those to the consuming app repo instead.
49
+
50
+ ## Distribution
51
+
52
+ Release and publishing details live in [Distribution](./docs/DISTRIBUTION.md).
package/README.md CHANGED
@@ -1,7 +1,12 @@
1
1
  <div align="center">
2
+ <p>
3
+ <img src="https://static.put.io/images/putio-boncuk.png" width="72" alt="put.io Boncuk logo">
4
+ </p>
5
+
2
6
  <h1>rokit</h1>
3
7
 
4
- <p>A tiny CLI companion for Roku device harness work.</p>
8
+ <p>Roku device harness primitives for package, launch, input, state, and proof loops.</p>
9
+ <p>Generic by design: app journeys, credentials, content IDs, and product assertions stay in consumer repos.</p>
5
10
 
6
11
  <p>
7
12
  <a href="https://github.com/putdotio/rokit/actions/workflows/ci.yml?query=branch%3Amain" style="text-decoration:none;"><img src="https://img.shields.io/github/actions/workflow/status/putdotio/rokit/ci.yml?branch=main&style=flat&label=ci&colorA=000000&colorB=000000" alt="CI"></a>
@@ -16,48 +21,94 @@
16
21
  pnpm add -D @putdotio/rokit
17
22
  ```
18
23
 
19
- `rokit` wraps Roku platform primitives for live-device proof loops. It does not
20
- own app-specific journeys, content IDs, credentials, or product assertions.
24
+ Node `>=24.14 <25`
21
25
 
22
- ## Usage
26
+ ## Quick Start
23
27
 
24
- Create `.rokit/.env` or export environment variables in the app repo:
28
+ Set the target Roku in the app repo that consumes `rokit`:
25
29
 
26
30
  ```bash
27
- ROKIT_TARGET=<roku-ip>
28
- ROKIT_PASSWORD=<developer-mode-password>
31
+ export ROKIT_TARGET=<roku-ip>
32
+ export ROKIT_PASSWORD=<developer-mode-password>
29
33
  ```
30
34
 
31
- Then run:
35
+ Then run the generic device checks and actions you need:
32
36
 
33
37
  ```bash
34
38
  pnpm exec rokit check
39
+ pnpm exec rokit package --out artifacts/live/channel.zip
40
+ pnpm exec rokit install artifacts/live/channel.zip
35
41
  pnpm exec rokit launch dev
36
42
  pnpm exec rokit press Down Select
37
- pnpm exec rokit press --delay-ms 250 Right Select
38
- pnpm exec rokit query /query/active-app
39
- pnpm exec rokit wait-node videoPlayerScreen visible
40
- pnpm exec rokit screenshot artifacts/live/player.png
43
+ pnpm exec rokit proof artifacts/live/proof --screenshot
44
+ ```
45
+
46
+ `ROKIT_PASSWORD` is required for developer-installer operations such as
47
+ `install` and `screenshot`. `ROKU_DEV_TARGET` and `ROKU_DEV_PASSWORD` are
48
+ accepted as compatibility fallbacks for app repos that already use Roku dev
49
+ naming.
50
+
51
+ ## Automation
52
+
53
+ Prefer JSON when `rokit` feeds another tool:
54
+
55
+ ```bash
56
+ pnpm exec rokit describe
41
57
  pnpm exec rokit --json active-app
58
+ pnpm exec rokit --dry-run launch dev
59
+ pnpm exec rokit --fields status,data.state media-player
60
+ pnpm exec rokit --input-json '{"command":"press","keys":["Down","Select"]}'
42
61
  ```
43
62
 
44
- App-specific scenario scripts can also import the generic helpers:
63
+ `describe` prints the machine-readable command surface, including command
64
+ names, parameters, JSON payload fields, global options, and automation feature
65
+ flags. When stdout is not a TTY, command output defaults to JSON unless
66
+ `--output text` is explicit.
67
+
68
+ ## Command Surface
69
+
70
+ Common commands:
71
+
72
+ | Command | Purpose |
73
+ | -------------------------------------------------- | -------------------------------------------------- |
74
+ | `describe` | Print the machine-readable command surface |
75
+ | `check` | Confirm ECP and developer-installer reachability |
76
+ | `discover` | Find Roku ECP devices with SSDP |
77
+ | `device-info` | Read Roku device metadata |
78
+ | `active-app` | Read the foreground app |
79
+ | `media-player` | Read parsed `/query/media-player` state |
80
+ | `snapshot` | Read a compact state snapshot |
81
+ | `proof <output-dir>` | Write reviewable local proof artifacts |
82
+ | `package --out <zip-path>` | Create a sideload ZIP from the current app root |
83
+ | `install <zip-path>` | Publish an existing ZIP to the Roku developer slot |
84
+ | `launch <app-id>` | Launch an app by id with optional params |
85
+ | `press <key...>` | Send Roku remote keys |
86
+ | `query <ecp-path>` | Print a raw ECP response |
87
+ | `sgnodes` | Print the raw SceneGraph tree |
88
+ | `assert-node` / `wait-node` | Check generic SceneGraph node state |
89
+ | `wait-active` / `wait-media-player` / `wait-ready` | Poll generic runtime readiness |
90
+ | `screenshot <output-path>` | Save a developer screenshot |
91
+
92
+ Mutating commands support `--dry-run` where the platform can validate without
93
+ changing device or filesystem state. ECP paths reject query strings, fragments,
94
+ traversal, backslashes, control characters, and percent-encoded path segments.
95
+ Generated output paths must stay within the current working directory.
96
+
97
+ ## Library Use
98
+
99
+ App-specific scenario scripts can import the generic helpers:
45
100
 
46
101
  ```ts
47
102
  import {
48
- assertNamedNodeState,
49
- assertNamedNodeTranslation,
50
103
  assertMediaPlayerContainer,
51
104
  assertSceneGraphNode,
52
105
  pressKey,
53
106
  querySceneGraph,
54
- sceneGraphContainsText,
55
107
  waitForSceneGraphAssertion,
56
108
  type RokuContext,
57
109
  } from "@putdotio/rokit";
58
110
 
59
111
  const target = process.env.ROKIT_TARGET;
60
-
61
112
  if (!target) {
62
113
  throw new Error("ROKIT_TARGET is not set");
63
114
  }
@@ -69,111 +120,28 @@ const context: RokuContext = {
69
120
  };
70
121
 
71
122
  await pressKey(context, "Info");
72
- const xml = await querySceneGraph(context, { attempts: 3, requireComplete: true });
123
+ await querySceneGraph(context, { attempts: 3, requireComplete: true });
73
124
  await assertSceneGraphNode(context, "videoPlayerScreen", { state: "visible" });
74
- assertNamedNodeTranslation(xml, "videoPlayerScreen", 0, 0);
75
125
  await assertMediaPlayerContainer(context, "mp4");
76
- await waitForSceneGraphAssertion(context, "expected player", (xml) => {
77
- assertNamedNodeState(xml, "videoPlayerScreen", "visible");
78
- if (!sceneGraphContainsText(xml, "Ready")) {
79
- throw new Error("expected ready text");
126
+ await waitForSceneGraphAssertion(context, "player ready", (xml) => {
127
+ if (!xml.includes("videoPlayerScreen")) {
128
+ throw new Error("expected player screen");
80
129
  }
81
130
  });
82
131
  ```
83
132
 
84
- ## Commands
85
-
86
- ```bash
87
- rokit check
88
- rokit device-info
89
- rokit active-app
90
- rokit media-player
91
- rokit wait-active <app-id> [--timeout-ms <ms>]
92
- rokit wait-media-player <state> [--timeout-ms <ms>]
93
- rokit launch <app-id> [--param key=value]
94
- rokit press [--delay-ms <ms>] <key> [key...]
95
- rokit query <ecp-path>
96
- rokit sgnodes
97
- rokit assert-node <node-name> <visible|hidden|absent|text|attr> [value]
98
- rokit wait-node <node-name> <visible|hidden|absent|text|attr> [value] [--timeout-ms <ms>]
99
- rokit screenshot <output-path>
100
- rokit install <zip-path>
101
- rokit --version
102
- ```
103
-
104
- Global options:
105
-
106
- ```bash
107
- rokit --json <command>
108
- rokit --output json <command>
109
- ```
110
-
111
- JSON mode wraps command output as `{ "status": "ok", "command": "...", ... }`
112
- and reports failures as `{ "status": "failed", "error": { "message": "..." } }`.
113
-
114
- - `check` confirms the Roku ECP endpoint responds and the developer installer
115
- is reachable.
116
- - `device-info` prints enhanced Roku device metadata as JSON.
117
- - `active-app` prints the foreground app.
118
- - `media-player` prints parsed `/query/media-player` playback state, including
119
- state, container, position, duration, and format metadata.
120
- - `wait-active` waits until the requested app is foregrounded and tolerates
121
- transient ECP read failures while polling.
122
- - `wait-media-player` waits until `/query/media-player` reports a target state
123
- such as `play`, `pause`, or `buffer`.
124
- - `launch` opens an app and waits until it is active. Use repeated `--param`
125
- values for deeplink parameters. Roku launch responses can race app startup, so
126
- launch accepts transient timeout/fetch failures and then verifies foreground
127
- state.
128
- - `press` sends Roku remote keys through ECP. Use `--delay-ms` for navigation
129
- sequences that need a stable gap between keys.
130
- - `query` prints a raw ECP response such as `/query/sgnodes/all`.
131
- - `sgnodes` prints the raw SceneGraph tree from `/query/sgnodes/all`. Library
132
- callers can pass retry options to `querySceneGraph`; use
133
- `requireComplete: true` when a scenario needs to reject partial SceneGraph
134
- dumps that include `<All_Nodes>` but no root `<App>` node yet.
135
- - `assert-node` checks a named SceneGraph node once.
136
- - `wait-node` polls SceneGraph until a named node condition matches.
137
- - `screenshot` saves a developer screenshot. It requires `ROKIT_PASSWORD`.
138
- - `install` publishes an existing ZIP through `roku-deploy`. It requires
139
- `ROKIT_PASSWORD`.
140
-
141
- ## Environment
142
-
143
- ```bash
144
- ROKIT_TARGET=<roku-ip>
145
- ROKIT_PASSWORD=<developer-mode-password>
146
- ROKIT_USERNAME=rokudev
147
- ROKIT_TIMEOUT_MS=10000
148
- ```
149
-
150
- `ROKU_DEV_TARGET` and `ROKU_DEV_PASSWORD` are accepted as fallbacks for app
151
- repos that already use Roku dev naming.
152
-
153
- Keep `.rokit/` local. Device IPs, Developer Mode passwords, signing keys, user
154
- tokens, and app-specific media identifiers do not belong in git.
155
-
156
133
  ## Boundaries
157
134
 
158
- `rokit` is the generic Roku harness layer:
135
+ `rokit` owns generic Roku mechanics:
159
136
 
160
- - device info
161
- - install/publish
162
- - launch and deeplink parameters
163
- - remote keypresses
164
- - raw ECP queries
165
- - parsed media-player state from `/query/media-player`
166
- - media-player active-state and container assertions
137
+ - package, install, launch, deeplink params, and remote keypresses
138
+ - raw ECP queries and parsed media-player state
167
139
  - SceneGraph state queries and named-node assertions
168
- - SceneGraph attribute, numeric geometry, bounds, and translation readers
169
- - SceneGraph completeness and escaped-text helpers
170
- - SceneGraph geometry assertions, status/failure readers, and custom assertion
171
- wait loops
172
- - screenshots
173
-
174
- App repositories should keep their own scenario commands for product behavior,
175
- such as opening a specific route, asserting playback state, generating review
176
- HTML, or checking app-specific UI nodes.
140
+ - screenshots, snapshots, and proof artifacts
141
+
142
+ Consumer app repos own product behavior: opening specific routes, asserting
143
+ playback for real content, checking app-specific UI nodes, and generating review
144
+ artifacts.
177
145
 
178
146
  ## Docs
179
147
 
package/SECURITY.md ADDED
@@ -0,0 +1,38 @@
1
+ # Security
2
+
3
+ If you believe you have found a security or privacy issue in this project,
4
+ please report it privately.
5
+
6
+ ## Contact
7
+
8
+ - email: devs@put.io
9
+
10
+ Private reports are preferred for security and privacy issues.
11
+
12
+ If you are unsure whether something is sensitive, email first instead of opening
13
+ a public issue.
14
+
15
+ ## Scope
16
+
17
+ Useful reports usually include issues involving:
18
+
19
+ - token, secret, or credential exposure
20
+ - unsafe handling of device passwords or signing keys
21
+ - command injection through CLI arguments, env values, or device responses
22
+ - publishing, release, or package integrity problems
23
+ - private device, account, or media identifier exposure
24
+
25
+ ## Guidelines
26
+
27
+ - test only against devices, accounts, environments, and data you control
28
+ - keep testing non-destructive, low-volume, and service-safe
29
+ - do not include device passwords, signing keys, account tokens, private content IDs, or local device identifiers in public issues, pull requests, examples, or logs
30
+
31
+ ## Supported Versions
32
+
33
+ Only the latest published version receives routine fixes.
34
+
35
+ ## Disclosure
36
+
37
+ Please allow a reasonable amount of time to investigate and fix the issue before
38
+ sharing details publicly.
package/dist/index.d.mts CHANGED
@@ -60,6 +60,12 @@ type DeviceSummary = {
60
60
  readonly model: string;
61
61
  readonly name: string;
62
62
  };
63
+ type DiscoveredRokuDevice = {
64
+ readonly location: string;
65
+ readonly server?: string;
66
+ readonly target?: string;
67
+ readonly usn?: string;
68
+ };
63
69
  type MediaPlayerState = "buffer" | "close" | "error" | "none" | "open" | "pause" | "play" | "stop" | string;
64
70
  type MediaPlayerInfo = {
65
71
  readonly audio?: string;
@@ -88,9 +94,13 @@ type WaitForSceneGraphAssertionOptions = {
88
94
  readonly pollIntervalMs?: number;
89
95
  readonly timeoutMs?: number;
90
96
  };
97
+ type PackageResult = {
98
+ readonly path: string;
99
+ };
91
100
  declare const checkDevice: (context: RokuContext) => Promise<DeviceSummary>;
92
101
  declare const getDeviceInfo: (context: RokuContext) => Promise<rokuDeploy.DeviceInfo>;
93
102
  declare const queryActiveApp: (context: RokuContext) => Promise<ActiveApp>;
103
+ declare const discoverRokuDevices: (timeoutMs?: number) => Promise<DiscoveredRokuDevice[]>;
94
104
  declare const waitForActiveApp: (context: RokuContext, appId: string, timeoutMs?: number) => Promise<ActiveApp>;
95
105
  declare const launchApp: (context: RokuContext, appId: string, params?: ReadonlyMap<string, string>) => Promise<ActiveApp>;
96
106
  declare const pressKey: (context: RokuContext, key: string) => Promise<void>;
@@ -116,6 +126,8 @@ declare const installPackage: (context: RokuContext & {
116
126
  declare const takeScreenshot: (context: RokuContext & {
117
127
  readonly password: string;
118
128
  }, outputPath: string) => Promise<string>;
129
+ declare const packageChannel: (outputPath: string, rootDir?: string) => Promise<PackageResult>;
130
+ declare const validateEcpPath: (path: string) => string;
119
131
  declare const validateRemoteKey: (key: string) => void;
120
132
  //#endregion
121
- export { type ActiveApp, type DeviceSummary, type MediaPlayerInfo, type MediaPlayerState, type NodeExpectation, type NodeState, type RemoteKey, type RetryOptions, type RokuContext, type SceneGraphAssertion, type SceneGraphBounds, type SceneGraphPoint, type SceneGraphStatus, type WaitForSceneGraphAssertionOptions, assertMediaPlayerContainer, assertNamedNode, assertNamedNodeSize, assertNamedNodeState, assertNamedNodeText, assertNamedNodeTranslation, assertSceneGraphNode, assertSceneGraphNumberNear, checkDevice, escapeXmlAttribute, getDeviceInfo, installPackage, isActiveMediaPlayerState, isCompleteSceneGraph, isNamedNodeVisible, launchApp, parseSceneGraphNumberList, pressKey, queryActiveApp, queryEcp, queryMediaPlayer, queryMediaPlayerSafe, queryMediaPlayerXml, queryMediaPlayerXmlSafe, querySceneGraph, readActiveApp, readMediaPlayerContainer, readMediaPlayerInfo, readMediaPlayerPositionMs, readMediaPlayerState, readNamedNodeAttribute, readNamedNodeAttributes, readNamedNodeBounds, readNamedNodeNumber, readNamedNodeTranslation, readSceneGraphFailure, readSceneGraphStatus, readXmlAttribute, readXmlTag, sceneGraphContainsText, takeScreenshot, validateRemoteKey, waitForActiveApp, waitForMediaPlayerState, waitForSceneGraphAssertion, waitForSceneGraphNode };
133
+ export { type ActiveApp, type DeviceSummary, type DiscoveredRokuDevice, type MediaPlayerInfo, type MediaPlayerState, type NodeExpectation, type NodeState, type PackageResult, type RemoteKey, type RetryOptions, type RokuContext, type SceneGraphAssertion, type SceneGraphBounds, type SceneGraphPoint, type SceneGraphStatus, type WaitForSceneGraphAssertionOptions, assertMediaPlayerContainer, assertNamedNode, assertNamedNodeSize, assertNamedNodeState, assertNamedNodeText, assertNamedNodeTranslation, assertSceneGraphNode, assertSceneGraphNumberNear, checkDevice, discoverRokuDevices, escapeXmlAttribute, getDeviceInfo, installPackage, isActiveMediaPlayerState, isCompleteSceneGraph, isNamedNodeVisible, launchApp, packageChannel, parseSceneGraphNumberList, pressKey, queryActiveApp, queryEcp, queryMediaPlayer, queryMediaPlayerSafe, queryMediaPlayerXml, queryMediaPlayerXmlSafe, querySceneGraph, readActiveApp, readMediaPlayerContainer, readMediaPlayerInfo, readMediaPlayerPositionMs, readMediaPlayerState, readNamedNodeAttribute, readNamedNodeAttributes, readNamedNodeBounds, readNamedNodeNumber, readNamedNodeTranslation, readSceneGraphFailure, readSceneGraphStatus, readXmlAttribute, readXmlTag, sceneGraphContainsText, takeScreenshot, validateEcpPath, validateRemoteKey, waitForActiveApp, waitForMediaPlayerState, waitForSceneGraphAssertion, waitForSceneGraphNode };
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { A as assertNamedNodeTranslation, B as readNamedNodeTranslation, C as waitForMediaPlayerState, D as assertNamedNodeSize, E as assertNamedNode, F as parseSceneGraphNumberList, G as readXmlAttribute, H as readSceneGraphStatus, I as readNamedNodeAttribute, K as readXmlTag, L as readNamedNodeAttributes, M as escapeXmlAttribute, N as isCompleteSceneGraph, O as assertNamedNodeState, P as isNamedNodeVisible, R as readNamedNodeBounds, S as waitForActiveApp, T as waitForSceneGraphNode, U as sceneGraphContainsText, V as readSceneGraphFailure, W as readActiveApp, _ as readMediaPlayerInfo, a as installPackage, b as takeScreenshot, c as pressKey, d as queryMediaPlayer, f as queryMediaPlayerSafe, g as readMediaPlayerContainer, h as querySceneGraph, i as getDeviceInfo, j as assertSceneGraphNumberNear, k as assertNamedNodeText, l as queryActiveApp, m as queryMediaPlayerXmlSafe, n as assertSceneGraphNode, o as isActiveMediaPlayerState, p as queryMediaPlayerXml, r as checkDevice, s as launchApp, t as assertMediaPlayerContainer, u as queryEcp, v as readMediaPlayerPositionMs, w as waitForSceneGraphAssertion, x as validateRemoteKey, y as readMediaPlayerState, z as readNamedNodeNumber } from "./roku-B61mpmWt.mjs";
2
- export { assertMediaPlayerContainer, assertNamedNode, assertNamedNodeSize, assertNamedNodeState, assertNamedNodeText, assertNamedNodeTranslation, assertSceneGraphNode, assertSceneGraphNumberNear, checkDevice, escapeXmlAttribute, getDeviceInfo, installPackage, isActiveMediaPlayerState, isCompleteSceneGraph, isNamedNodeVisible, launchApp, parseSceneGraphNumberList, pressKey, queryActiveApp, queryEcp, queryMediaPlayer, queryMediaPlayerSafe, queryMediaPlayerXml, queryMediaPlayerXmlSafe, querySceneGraph, readActiveApp, readMediaPlayerContainer, readMediaPlayerInfo, readMediaPlayerPositionMs, readMediaPlayerState, readNamedNodeAttribute, readNamedNodeAttributes, readNamedNodeBounds, readNamedNodeNumber, readNamedNodeTranslation, readSceneGraphFailure, readSceneGraphStatus, readXmlAttribute, readXmlTag, sceneGraphContainsText, takeScreenshot, validateRemoteKey, waitForActiveApp, waitForMediaPlayerState, waitForSceneGraphAssertion, waitForSceneGraphNode };
1
+ import { A as assertNamedNode, B as readNamedNodeAttribute, C as takeScreenshot, D as waitForMediaPlayerState, E as waitForActiveApp, F as assertSceneGraphNumberNear, G as readSceneGraphFailure, H as readNamedNodeBounds, I as escapeXmlAttribute, J as readActiveApp, K as readSceneGraphStatus, L as isCompleteSceneGraph, M as assertNamedNodeState, N as assertNamedNodeText, O as waitForSceneGraphAssertion, P as assertNamedNodeTranslation, R as isNamedNodeVisible, T as validateRemoteKey, U as readNamedNodeNumber, V as readNamedNodeAttributes, W as readNamedNodeTranslation, X as readXmlTag, Y as readXmlAttribute, _ as querySceneGraph, a as getDeviceInfo, b as readMediaPlayerPositionMs, c as launchApp, d as queryActiveApp, f as queryEcp, g as queryMediaPlayerXmlSafe, h as queryMediaPlayerXml, i as discoverRokuDevices, j as assertNamedNodeSize, k as waitForSceneGraphNode, l as packageChannel, m as queryMediaPlayerSafe, n as assertSceneGraphNode, o as installPackage, p as queryMediaPlayer, q as sceneGraphContainsText, r as checkDevice, s as isActiveMediaPlayerState, t as assertMediaPlayerContainer, u as pressKey, v as readMediaPlayerContainer, w as validateEcpPath, x as readMediaPlayerState, y as readMediaPlayerInfo, z as parseSceneGraphNumberList } from "./roku-BxnS6Axs.mjs";
2
+ export { assertMediaPlayerContainer, assertNamedNode, assertNamedNodeSize, assertNamedNodeState, assertNamedNodeText, assertNamedNodeTranslation, assertSceneGraphNode, assertSceneGraphNumberNear, checkDevice, discoverRokuDevices, escapeXmlAttribute, getDeviceInfo, installPackage, isActiveMediaPlayerState, isCompleteSceneGraph, isNamedNodeVisible, launchApp, packageChannel, parseSceneGraphNumberList, pressKey, queryActiveApp, queryEcp, queryMediaPlayer, queryMediaPlayerSafe, queryMediaPlayerXml, queryMediaPlayerXmlSafe, querySceneGraph, readActiveApp, readMediaPlayerContainer, readMediaPlayerInfo, readMediaPlayerPositionMs, readMediaPlayerState, readNamedNodeAttribute, readNamedNodeAttributes, readNamedNodeBounds, readNamedNodeNumber, readNamedNodeTranslation, readSceneGraphFailure, readSceneGraphStatus, readXmlAttribute, readXmlTag, sceneGraphContainsText, takeScreenshot, validateEcpPath, validateRemoteKey, waitForActiveApp, waitForMediaPlayerState, waitForSceneGraphAssertion, waitForSceneGraphNode };