tapflow 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,6 +8,14 @@
8
8
  Your builds, streams, and recordings stay on infrastructure you control.
9
9
  </p>
10
10
 
11
+ <p>
12
+ <strong>No WebDriverAgent</strong>
13
+ &nbsp;·&nbsp;
14
+ <strong>2-line setup</strong>
15
+ &nbsp;·&nbsp;
16
+ <strong>Self-hosted · Free · MIT</strong>
17
+ </p>
18
+
11
19
  <p>
12
20
  <a href="https://github.com/jo-duchan/tapflow/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="MIT License" /></a>
13
21
  <a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen" alt="Node.js ≥ 20" /></a>
@@ -35,6 +43,10 @@
35
43
  <p><em>Click to play</em></p>
36
44
  </div>
37
45
 
46
+ <p align="center"><em>Streams over H.264 with a zero-buffer decoder (no MSE) — <a href="https://github.com/jo-duchan/tapflow/blob/main/contributing/streaming-latency-log.md">latency measurements ↗</a></em></p>
47
+
48
+ > **v0.x, actively developed** — backward-compatible by default; breaking changes are rare and always noted in the [changelog](https://github.com/jo-duchan/tapflow/blob/main/CHANGELOG.md). [Roadmap →](https://github.com/jo-duchan/tapflow/blob/main/ROADMAP.md)
49
+
38
50
  ---
39
51
 
40
52
  ## Why tapflow?
@@ -60,31 +72,22 @@ We hit this exact problem, so we built tapflow.
60
72
  | Xcode / Android Studio | Each teammate needs a Mac and a full mobile toolchain |
61
73
  | **tapflow** | Reuse your own Macs — data stays on infrastructure you control, and the whole team does QA from a browser |
62
74
 
63
- ## What tapflow does
75
+ ## How it works
64
76
 
65
77
  tapflow connects three parts:
66
78
 
67
- 1. A **self-hosted relay** server (Linux or Mac)
68
- 2. A **macOS agent** that drives iOS simulators and Android emulators
69
- 3. A **browser dashboard** for the rest of the team
79
+ 1. A **self-hosted relay** (Linux or Mac) — also serves the dashboard on the same port, so there's no separate web server.
80
+ 2. A **macOS agent** that drives the iOS Simulator and Android emulator — it connects _outbound_ to the relay (no inbound firewall rules) and injects iOS touch directly, without WebDriverAgent.
81
+ 3. A **browser dashboard** for the rest of the team — pick an available device and interact with it in real time while the simulators keep running on your Macs.
70
82
 
71
- The agent connects outbound to the relay. Teammates open the dashboard, pick an available device, and interact with it remotely — while the simulators and emulators keep running on your own Macs.
72
-
73
- ## What tapflow is not
74
-
75
- tapflow doesn't replace native mobile development tools. Mobile developers still use Xcode, Android Studio, and their build tooling. tapflow makes the *running* simulators and emulators accessible to the rest of the team through a browser — it isn't an automation framework or a device farm.
76
-
77
- ## How it works
78
-
79
- ```
83
+ ```text
80
84
  Browser (your team) ←─ WebSocket ─→ Relay Server ←─ WebSocket (outbound) ─→ Mac Agent
81
85
  (Linux / Mac) (iOS · Android)
82
86
  ```
83
87
 
84
- 1. The **Mac Agent** connects _outbound_ to the relay — no inbound firewall rules needed.
85
- 2. Anyone on the team opens the **dashboard** in any browser and sees all available devices.
86
- 3. Touch events are forwarded in real time; the screen streams back to the browser.
87
- 4. The **relay** also serves the dashboard SPA on the same port — no separate web server needed.
88
+ ## What tapflow is not
89
+
90
+ tapflow doesn't replace native mobile development tools. Mobile developers still use Xcode, Android Studio, and their build tooling. tapflow makes the *running* simulators and emulators accessible to the rest of the team through a browser, and it is not a device farm. It does have an automated QA axis — a deterministic flow runner and an MCP server for LLM agents — but wiring in external automation frameworks like WebDriverAgent or Appium is out of scope; tapflow ships its own minimal runner instead.
88
91
 
89
92
  ## Quick Start
90
93
 
@@ -141,7 +144,7 @@ Navigate to `http://localhost:4000` and sign in with the account you just create
141
144
  ## Features
142
145
 
143
146
  - **No mobile toolchain for QA users** — teammates test from a browser without installing Xcode, Android Studio, or local simulator tooling.
144
- - **Self-hosted by default** — app builds, device streams, recordings, and account data stay on infrastructure you control.
147
+ - **Self-hosted by default** — no third-party cloud and no external accounts; everything runs on hardware you already own.
145
148
  - **Use your existing Mac setup** — run agents on Macs that already have the iOS Simulator or Android emulator available.
146
149
  - **API-first** — REST endpoints and Personal Access Tokens support CI/CD and AI-agent workflows.
147
150
 
@@ -157,10 +160,10 @@ What's included:
157
160
  - **Screenshot REST endpoint** — `GET /api/v1/sessions/:sessionId/screenshot` for CI and AI agents.
158
161
  - **Mac resource monitoring** — CPU & RAM per agent, to spot overloaded hosts before assigning sessions.
159
162
  - **Team management** — invite links, roles (Admin / Developer / QA / Viewer), and Personal Access Tokens.
160
- - **MCP Server** *(experimental)* — `@tapflowio/mcp-server` lets Claude Code and other LLM agents control simulators as native tools.
163
+ - **MCP Server** — `@tapflowio/mcp-server` lets Claude Code and other LLM agents control simulators as native tools.
161
164
 
162
165
  <a name="latency-note"></a>
163
- > <sup>1</sup> On localhost, decode-to-present is in the single-to-low-double-digit milliseconds (WebCodecs ~2.5 ms, WASM ~9–14 ms); end-to-end "glass-to-glass" latency also depends on your network. See the [streaming latency log](https://github.com/jo-duchan/tapflow/blob/main/contributing/streaming-latency-log.md) for the full pipeline analysis and measurements.
166
+ > <sup>1</sup> On a real LAN, decode-to-present measures in the low tens of milliseconds (p50 ~11–17 ms with the WASM software decoder; faster with WebCodecs on HTTPS); end-to-end "glass-to-glass" latency adds your network's round trip on top. See the [streaming latency log](https://github.com/jo-duchan/tapflow/blob/main/contributing/streaming-latency-log.md) for the full measurements, conditions, and known limitations.
164
167
 
165
168
  ## Security & Privacy
166
169
 
@@ -182,17 +185,7 @@ Found a vulnerability? See [SECURITY.md](https://github.com/jo-duchan/tapflow/bl
182
185
 
183
186
  ## Self-Hosting
184
187
 
185
- ### Local (single Mac)
186
-
187
- Relay and agent on the same machine — ideal for a single developer or small team.
188
-
189
- ```sh
190
- tapflow start
191
- ```
192
-
193
- ### Team (separate relay server)
194
-
195
- Run the relay on a Linux server or dedicated Mac. Each Mac with simulators runs the agent.
188
+ A single Mac needs nothing beyond `tapflow start` (see [Quick Start](#quick-start)). For a team, run the relay on a separate Linux server or dedicated Mac, and point each Mac agent at it.
196
189
 
197
190
  **Relay server:**
198
191
 
@@ -234,33 +227,11 @@ Full reference → [CLI docs](https://www.tapflow.dev/reference/cli)
234
227
 
235
228
  ## Documentation
236
229
 
237
- **[www.tapflow.dev](https://www.tapflow.dev)**
238
-
239
- **Getting Started**
240
- - [Introduction](https://www.tapflow.dev/guide/introduction)
241
- - [Quick Start](https://www.tapflow.dev/guide/getting-started)
242
- - [Requirements](https://www.tapflow.dev/guide/requirements)
243
-
244
- **Setup**
245
- - [Self-Hosting the Relay](https://www.tapflow.dev/guide/self-hosting)
246
- - [Security & Privacy](https://www.tapflow.dev/guide/security)
247
- - [Agent Setup](https://www.tapflow.dev/guide/agent)
248
- - [Uploading Builds (CI/CD)](https://www.tapflow.dev/guide/upload-builds)
249
- - [Scaling Mac Resources](https://www.tapflow.dev/guide/scaling)
250
-
251
- **Dashboard**
252
- - [First-time Setup](https://www.tapflow.dev/dashboard/setup)
253
- - [Dashboard Overview](https://www.tapflow.dev/dashboard/overview)
254
-
255
- **AI Agent**
256
- - [MCP Server](https://www.tapflow.dev/guide/mcp-server) *(experimental)*
257
-
258
- **Reference**
259
- - [CLI Reference](https://www.tapflow.dev/reference/cli)
260
- - [Configuration](https://www.tapflow.dev/reference/configuration)
261
- - [REST API](https://www.tapflow.dev/reference/api)
230
+ Full docs: **[www.tapflow.dev](https://www.tapflow.dev)**
262
231
 
263
- **[Troubleshooting](https://www.tapflow.dev/guide/troubleshooting)**
232
+ - **Guides** — [Quick Start](https://www.tapflow.dev/guide/getting-started) · [Environment Setup](https://www.tapflow.dev/guide/environment-setup) · [Self-Hosting](https://www.tapflow.dev/guide/self-hosting) · [Security & Privacy](https://www.tapflow.dev/guide/security) · [Uploading Builds (CI/CD)](https://www.tapflow.dev/guide/upload-builds) · [Troubleshooting](https://www.tapflow.dev/guide/troubleshooting)
233
+ - **Reference** — [CLI](https://www.tapflow.dev/reference/cli) · [Configuration](https://www.tapflow.dev/reference/configuration) · [REST API](https://www.tapflow.dev/reference/api)
234
+ - **AI Agent** — [MCP Server](https://www.tapflow.dev/guide/mcp-server)
264
235
 
265
236
  ## Contributing
266
237
 
@@ -0,0 +1,13 @@
1
+ export interface FlowRunOptions {
2
+ relay?: string;
3
+ token?: string;
4
+ session?: string;
5
+ device?: string;
6
+ build?: number;
7
+ install?: boolean;
8
+ junit?: string;
9
+ artifacts?: string;
10
+ timeout?: number;
11
+ }
12
+ export declare function cmdFlowRun(files: string[], opts: FlowRunOptions): Promise<void>;
13
+ //# sourceMappingURL=flow-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-run.d.ts","sourceRoot":"","sources":["../../src/commands/flow-run.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AA+CD,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA0FrF"}
@@ -0,0 +1,141 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { parseFlow, runFlow, toJUnitXml, RelayClient, RelayDriver, } from '@tapflowio/flow-runner';
4
+ // Exit codes are part of the CI contract: 0 = all flows passed,
5
+ // 1 = at least one flow failed, 2 = environment/config error.
6
+ const EXIT_FLOW_FAILED = 1;
7
+ const EXIT_ENV_ERROR = 2;
8
+ function envFail(message) {
9
+ console.error(`✗ ${message}`);
10
+ process.exit(EXIT_ENV_ERROR);
11
+ }
12
+ async function resolveSession(client, opts) {
13
+ const sessions = await client.listDevices();
14
+ const devices = sessions.flatMap((s) => s.devices);
15
+ if (devices.length === 0)
16
+ envFail('no devices registered on the relay — is an agent running?');
17
+ let candidates = devices;
18
+ if (opts.session) {
19
+ candidates = devices.filter((d) => d.sessionId === opts.session);
20
+ if (candidates.length === 0)
21
+ envFail(`session ${opts.session} not found`);
22
+ if (candidates.length > 1)
23
+ envFail(`session ${opts.session} matches multiple devices — narrow with --device <name>`);
24
+ }
25
+ else if (opts.device) {
26
+ candidates = devices.filter((d) => d.name === opts.device);
27
+ if (candidates.length === 0) {
28
+ envFail(`device "${opts.device}" not found (available: ${devices.map((d) => d.name).join(', ')})`);
29
+ }
30
+ // The same device name can exist on two agents (two Macs) — never pick one silently.
31
+ if (candidates.length > 1)
32
+ envFail(`multiple devices named "${opts.device}" — narrow with --session <id> (tapflow status)`);
33
+ }
34
+ else {
35
+ const booted = devices.filter((d) => d.status === 'booted');
36
+ if (booted.length === 1) {
37
+ candidates = booted;
38
+ }
39
+ else {
40
+ envFail(booted.length === 0
41
+ ? 'no booted device — pass --device <name> to boot one, or boot it in the dashboard'
42
+ : `multiple booted devices — pick one with --device <name> or --session <id> (booted: ${booted.map((d) => d.name).join(', ')})`);
43
+ }
44
+ }
45
+ const device = candidates[0];
46
+ if (device.busy)
47
+ envFail(`device "${device.name}" is busy (another session is active)`);
48
+ return { sessionId: device.sessionId, device };
49
+ }
50
+ export async function cmdFlowRun(files, opts) {
51
+ if (files.length === 0)
52
+ envFail('no flow files given — usage: tapflow flow run .tapflow/flows/*.yaml');
53
+ // NaN would disable every deadline check in the engine (Date.now() >= NaN is
54
+ // always false) and hang the run — reject bad numeric flags up front.
55
+ if (opts.build !== undefined && !Number.isInteger(opts.build))
56
+ envFail('--build must be an integer build id (see list_builds / the dashboard)');
57
+ if (opts.timeout !== undefined && !(Number.isFinite(opts.timeout) && opts.timeout > 0))
58
+ envFail('--timeout must be a positive number of seconds');
59
+ // Parse everything up front: a schema error is a config problem (exit 2),
60
+ // not a test failure, and it should surface before touching any device.
61
+ const flows = [];
62
+ for (const file of files) {
63
+ let text;
64
+ try {
65
+ text = fs.readFileSync(file, 'utf-8');
66
+ }
67
+ catch (e) {
68
+ envFail(`cannot read ${file}: ${e.message}`);
69
+ }
70
+ try {
71
+ flows.push(parseFlow(text, file));
72
+ }
73
+ catch (e) {
74
+ envFail(e.message);
75
+ }
76
+ }
77
+ const relayUrl = opts.relay ?? 'ws://localhost:4000';
78
+ const token = opts.token ?? process.env.TAPFLOW_TOKEN ?? '';
79
+ const client = new RelayClient(relayUrl, token);
80
+ try {
81
+ await client.connect();
82
+ }
83
+ catch (e) {
84
+ envFail(`cannot connect to relay at ${relayUrl}: ${e.message}`);
85
+ }
86
+ let exitCode = 0;
87
+ try {
88
+ const { sessionId, device } = await resolveSession(client, opts);
89
+ await client.joinSession(sessionId);
90
+ // Always send device:boot — it is idempotent on a booted device and it is
91
+ // what initializes the agent's touch/stream state for this session (the
92
+ // dashboard does the same on join).
93
+ console.log(`preparing ${device.name}...`);
94
+ await client.bootDevice(sessionId, device.id);
95
+ if (opts.build !== undefined && opts.install !== false) {
96
+ console.log(`installing build ${opts.build}...`);
97
+ await client.installApp(sessionId, opts.build);
98
+ }
99
+ const driver = new RelayDriver(client, sessionId, opts.build);
100
+ const engineOpts = opts.timeout !== undefined ? { defaultTimeoutMs: opts.timeout * 1000 } : {};
101
+ const results = [];
102
+ for (const [flowIndex, flow] of flows.entries()) {
103
+ process.stdout.write(`▶ ${flow.name} `);
104
+ const result = await runFlow(flow, driver, engineOpts);
105
+ results.push(result);
106
+ console.log(result.status === 'passed' ? `✓ (${(result.durationMs / 1000).toFixed(1)}s)` : '✗');
107
+ if (result.status === 'failed') {
108
+ console.error(` ${result.failureMessage}`);
109
+ if (result.failureScreenshot) {
110
+ // Runtime data belongs in the gitignored .tapflow-data/, and the
111
+ // index prefix keeps same-named flows from different directories
112
+ // from overwriting each other's evidence.
113
+ const dir = opts.artifacts ?? path.join('.tapflow-data', 'artifacts');
114
+ fs.mkdirSync(dir, { recursive: true });
115
+ const shot = path.join(dir, `${String(flowIndex + 1).padStart(2, '0')}-${flow.name.replace(/[^\w.-]+/g, '_')}-failure.png`);
116
+ fs.writeFileSync(shot, result.failureScreenshot);
117
+ console.error(` screenshot: ${shot}`);
118
+ }
119
+ }
120
+ }
121
+ if (opts.junit) {
122
+ fs.mkdirSync(path.dirname(path.resolve(opts.junit)), { recursive: true });
123
+ fs.writeFileSync(opts.junit, toJUnitXml(results));
124
+ console.log(`JUnit report: ${opts.junit}`);
125
+ }
126
+ const failed = results.filter((r) => r.status === 'failed').length;
127
+ console.log(`\n${results.length - failed}/${results.length} flows passed`);
128
+ if (failed > 0)
129
+ exitCode = EXIT_FLOW_FAILED;
130
+ client.leaveSession(sessionId);
131
+ }
132
+ catch (e) {
133
+ console.error(`✗ ${e.message}`);
134
+ exitCode = EXIT_ENV_ERROR;
135
+ }
136
+ finally {
137
+ client.disconnect();
138
+ }
139
+ process.exit(exitCode);
140
+ }
141
+ //# sourceMappingURL=flow-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-run.js","sourceRoot":"","sources":["../../src/commands/flow-run.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -16,6 +16,7 @@ import { cmdAgentStart } from './commands/agent-start.js';
16
16
  import { cmdReset } from './commands/reset.js';
17
17
  import { cmdStatus } from './commands/status.js';
18
18
  import { cmdLogs } from './commands/logs.js';
19
+ import { cmdFlowRun } from './commands/flow-run.js';
19
20
  process.on('unhandledRejection', (err) => {
20
21
  console.error(err instanceof Error ? err.message : String(err));
21
22
  process.exit(1);
@@ -87,6 +88,28 @@ cli
87
88
  .option('--relay <url>', 'Relay URL (default: http://localhost:4000)')
88
89
  .option('--lines <n>', 'Number of lines to show (default: 100)', { default: 100 })
89
90
  .action((opts) => cmdLogs(opts));
91
+ cli
92
+ .command('flow <subcommand> [...files]', 'Deterministic flow commands (subcommand: run)')
93
+ .option('--relay <url>', 'Relay URL (default: ws://localhost:4000)')
94
+ .option('--token <token>', 'PAT for a remote relay (or TAPFLOW_TOKEN env)')
95
+ .option('--session <id>', 'Target session id (from tapflow status)')
96
+ .option('--device <name>', 'Target device by name (boots it when shut down)')
97
+ .option('--build <id>', 'Build under test — installed before the run, launched by the launchApp step')
98
+ .option('--no-install', 'Skip installing --build before the run')
99
+ .option('--junit <path>', 'Write a JUnit XML report')
100
+ .option('--artifacts <dir>', 'Failure screenshot directory (default: .tapflow/artifacts)')
101
+ .option('--timeout <seconds>', 'Default per-selector wait (default: 10)')
102
+ .action((subcommand, files, opts) => {
103
+ if (subcommand !== 'run') {
104
+ console.error(`unknown flow subcommand: ${subcommand} (expected: run)`);
105
+ process.exit(2);
106
+ }
107
+ return cmdFlowRun(files, {
108
+ ...opts,
109
+ build: opts.build !== undefined ? Number(opts.build) : undefined,
110
+ timeout: opts.timeout !== undefined ? Number(opts.timeout) : undefined,
111
+ });
112
+ });
90
113
  cli.help();
91
114
  cli.version(version);
92
115
  cli.parse();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAwB,CAAA;AACnH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE;IACvC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEF,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAA;AAE1B,GAAG;KACA,OAAO,CAAC,MAAM,EAAE,4CAA4C,CAAC;KAC7D,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,SAAS,EAAE,wCAAwC,CAAC;KAC3D,MAAM,CAAC,CAAC,IAA0C,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;AAE9E,GAAG;KACA,OAAO,CAAC,oBAAoB,EAAE,2CAA2C,CAAC;KAC1E,MAAM,CAAC,eAAe,EAAE,4CAA4C,CAAC;KACrE,MAAM,CAAC,CAAC,UAAkB,EAAE,IAAwB,EAAE,EAAE;IACvD,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAA;IACpD,OAAO,CAAC,KAAK,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAA;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEJ,GAAG;KACA,OAAO,CAAC,mBAAmB,EAAE,0DAA0D,CAAC;KACxF,MAAM,CAAC,QAAQ,EAAE,8BAA8B,CAAC;KAChD,MAAM,CAAC,CAAC,QAA4B,EAAE,IAAwB,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AAEvG,GAAG;KACA,OAAO,CAAC,kBAAkB,EAAE,6DAA6D,CAAC;KAC1F,MAAM,CAAC,CAAC,QAAiB,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;AAEpD,GAAG;KACA,OAAO,CAAC,SAAS,EAAE,gDAAgD,CAAC;KACpE,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAA;AAE7B,GAAG;KACA,OAAO,CAAC,aAAa,EAAE,kCAAkC,CAAC;KAC1D,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;AAE1C,GAAG;KACA,OAAO,CAAC,OAAO,EAAE,+DAA+D,CAAC;KACjF,MAAM,CAAC,uBAAuB,EAAE,iEAAiE,CAAC;KAClG,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;KAC9D,MAAM,CAAC,CAAC,IAA4C,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;AAE3E,GAAG;KACA,OAAO,CAAC,oBAAoB,EAAE,2CAA2C,CAAC;KAC1E,MAAM,CAAC,YAAY,EAAE,mCAAmC,CAAC;KACzD,MAAM,CAAC,qBAAqB,EAAE,sFAAsF,CAAC;KACrH,MAAM,CAAC,CAAC,UAAkB,EAAE,IAAwC,EAAE,EAAE;IACvE,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,aAAa,CAAC,IAAI,CAAC,CAAA;IACtD,OAAO,CAAC,KAAK,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAA;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEJ,GAAG;KACA,OAAO,CAAC,oBAAoB,EAAE,oCAAoC,CAAC;KACnE,MAAM,CAAC,eAAe,EAAE,oDAAoD,CAAC;KAC7E,MAAM,CAAC,uBAAuB,EAAE,iEAAiE,CAAC;KAClG,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,mEAAmE,CAAC;KAC5F,MAAM,CAAC,CAAC,UAAkB,EAAE,IAA4E,EAAE,EAAE;IAC3G,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,aAAa,CAAC,IAAI,CAAC,CAAA;IACtD,OAAO,CAAC,KAAK,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAA;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEJ,GAAG;KACA,OAAO,CAAC,OAAO,EAAE,0BAA0B,CAAC;KAC5C,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;AAE3B,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,qDAAqD,CAAC;KACxE,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;KACnE,MAAM,CAAC,CAAC,IAAwB,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AAExD,GAAG;KACA,OAAO,CAAC,MAAM,EAAE,+BAA+B,CAAC;KAChD,MAAM,CAAC,eAAe,EAAE,4CAA4C,CAAC;KACrE,MAAM,CAAC,aAAa,EAAE,wCAAwC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;KACjF,MAAM,CAAC,CAAC,IAAwC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;AAEtE,GAAG,CAAC,IAAI,EAAE,CAAA;AACV,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AACpB,GAAG,CAAC,KAAK,EAAE,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tapflow",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "Self-hosted iOS/Android simulator streaming for the whole team",
5
5
  "keywords": [
6
6
  "ios",
@@ -47,10 +47,11 @@
47
47
  "cac": "^6.7.14",
48
48
  "ws": "^8.21.0",
49
49
  "zod": "^4.4.3",
50
- "@tapflowio/agent-core": "0.13.0",
51
- "@tapflowio/ios-agent": "0.13.0",
52
- "@tapflowio/relay": "0.13.0",
53
- "@tapflowio/android-agent": "0.13.0"
50
+ "@tapflowio/agent-core": "0.14.0",
51
+ "@tapflowio/android-agent": "0.14.0",
52
+ "@tapflowio/flow-runner": "0.14.0",
53
+ "@tapflowio/ios-agent": "0.14.0",
54
+ "@tapflowio/relay": "0.14.0"
54
55
  },
55
56
  "devDependencies": {
56
57
  "@types/node": "^20.19.43",