tapline-host 1.4.0 → 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.
Files changed (122) hide show
  1. package/dist/accounts.d.ts +72 -0
  2. package/dist/accounts.js +208 -0
  3. package/dist/accounts.js.map +1 -0
  4. package/dist/actionlog.d.ts +20 -0
  5. package/dist/actionlog.js.map +1 -1
  6. package/dist/animations.d.ts +39 -0
  7. package/dist/animations.js +124 -0
  8. package/dist/animations.js.map +1 -0
  9. package/dist/api.d.ts +43 -0
  10. package/dist/api.js +154 -0
  11. package/dist/api.js.map +1 -0
  12. package/dist/audit.d.ts +3 -0
  13. package/dist/audit.js +1 -1
  14. package/dist/audit.js.map +1 -1
  15. package/dist/bin.d.ts +2 -0
  16. package/dist/bin.js +19 -0
  17. package/dist/bin.js.map +1 -0
  18. package/dist/brief.d.ts +41 -0
  19. package/dist/brief.js +78 -0
  20. package/dist/brief.js.map +1 -0
  21. package/dist/cli.d.ts +41 -1
  22. package/dist/cli.js +100 -53
  23. package/dist/cli.js.map +1 -1
  24. package/dist/conditions.d.ts +36 -0
  25. package/dist/conditions.js +67 -0
  26. package/dist/conditions.js.map +1 -0
  27. package/dist/confirm.d.ts +21 -2
  28. package/dist/confirm.js +39 -6
  29. package/dist/confirm.js.map +1 -1
  30. package/dist/dispatch.d.ts +27 -0
  31. package/dist/dispatch.js +114 -0
  32. package/dist/dispatch.js.map +1 -0
  33. package/dist/doctor.d.ts +5 -0
  34. package/dist/doctor.js +20 -0
  35. package/dist/doctor.js.map +1 -1
  36. package/dist/drive.d.ts +184 -0
  37. package/dist/drive.js +908 -0
  38. package/dist/drive.js.map +1 -0
  39. package/dist/elicit.d.ts +90 -0
  40. package/dist/elicit.js +179 -0
  41. package/dist/elicit.js.map +1 -0
  42. package/dist/format.d.ts +16 -0
  43. package/dist/format.js +81 -24
  44. package/dist/format.js.map +1 -1
  45. package/dist/images.d.ts +35 -0
  46. package/dist/images.js +76 -6
  47. package/dist/images.js.map +1 -1
  48. package/dist/inspect.d.ts +1 -0
  49. package/dist/journey.d.ts +276 -0
  50. package/dist/journey.js +368 -0
  51. package/dist/journey.js.map +1 -0
  52. package/dist/journeyexport.d.ts +58 -0
  53. package/dist/journeyexport.js +318 -0
  54. package/dist/journeyexport.js.map +1 -0
  55. package/dist/journeygif.d.ts +62 -0
  56. package/dist/journeygif.js +192 -0
  57. package/dist/journeygif.js.map +1 -0
  58. package/dist/journeyreport.d.ts +202 -0
  59. package/dist/journeyreport.js +666 -0
  60. package/dist/journeyreport.js.map +1 -0
  61. package/dist/mapcmd.d.ts +200 -0
  62. package/dist/mapcmd.js +412 -0
  63. package/dist/mapcmd.js.map +1 -0
  64. package/dist/mapfile.d.ts +155 -0
  65. package/dist/mapfile.js +575 -0
  66. package/dist/mapfile.js.map +1 -0
  67. package/dist/mcp.d.ts +14 -11
  68. package/dist/mcp.js +50 -318
  69. package/dist/mcp.js.map +1 -1
  70. package/dist/media.d.ts +88 -0
  71. package/dist/media.js +263 -0
  72. package/dist/media.js.map +1 -0
  73. package/dist/nochange.d.ts +77 -0
  74. package/dist/nochange.js +77 -0
  75. package/dist/nochange.js.map +1 -0
  76. package/dist/places.d.ts +239 -0
  77. package/dist/places.js +823 -0
  78. package/dist/places.js.map +1 -0
  79. package/dist/policy.d.ts +18 -0
  80. package/dist/policy.js +52 -0
  81. package/dist/policy.js.map +1 -1
  82. package/dist/protocol.d.ts +27 -1
  83. package/dist/protocol.js +25 -0
  84. package/dist/protocol.js.map +1 -1
  85. package/dist/reflexes.d.ts +59 -0
  86. package/dist/reflexes.js +133 -0
  87. package/dist/reflexes.js.map +1 -0
  88. package/dist/report.d.ts +32 -2
  89. package/dist/report.js +154 -9
  90. package/dist/report.js.map +1 -1
  91. package/dist/routes.d.ts +115 -0
  92. package/dist/routes.js +287 -0
  93. package/dist/routes.js.map +1 -0
  94. package/dist/run.d.ts +28 -1
  95. package/dist/run.js +32 -3
  96. package/dist/run.js.map +1 -1
  97. package/dist/runtime.d.ts +60 -0
  98. package/dist/runtime.js +255 -0
  99. package/dist/runtime.js.map +1 -0
  100. package/dist/script.d.ts +114 -10
  101. package/dist/script.js +30 -2
  102. package/dist/script.js.map +1 -1
  103. package/dist/server.d.ts +48 -2
  104. package/dist/server.js +88 -13
  105. package/dist/server.js.map +1 -1
  106. package/dist/thincall.d.ts +13 -0
  107. package/dist/thincall.js +335 -0
  108. package/dist/thincall.js.map +1 -0
  109. package/dist/tool-text-data.d.ts +10 -5
  110. package/dist/tool-text-data.js +11 -6
  111. package/dist/tool-text-data.js.map +1 -1
  112. package/dist/tool-text.d.ts +1 -1
  113. package/dist/tools.d.ts +585 -5
  114. package/dist/tools.js +2926 -185
  115. package/dist/tools.js.map +1 -1
  116. package/dist/uxcheck.d.ts +103 -0
  117. package/dist/uxcheck.js +128 -0
  118. package/dist/uxcheck.js.map +1 -0
  119. package/package.json +3 -2
  120. package/skills/tapline/SKILL.md +57 -11
  121. package/skills/tapline/references/personas.md +45 -0
  122. package/skills/tapline/references/setup.md +6 -1
@@ -0,0 +1,255 @@
1
+ import { spawn } from "node:child_process";
2
+ import { randomBytes } from "node:crypto";
3
+ import { join } from "node:path";
4
+ import { configDir, hostUrl, markPaired, pairedBefore, reachableHost, resolveConfig, screenshotMode, viewerMode, } from "./config.js";
5
+ import { loadAccounts } from "./accounts.js";
6
+ import { Confirmations } from "./confirm.js";
7
+ import { ControlQueue } from "./control.js";
8
+ import { isToolName, callTool } from "./dispatch.js";
9
+ import { realRunner } from "./journeyexport.js";
10
+ import { MapRegistry } from "./places.js";
11
+ import { DEFAULT_POLICY, NO_POLICY, loadPolicy } from "./policy.js";
12
+ import { TaplineHost } from "./server.js";
13
+ import { restoreAnimations } from "./animations.js";
14
+ import { TaplineTools } from "./tools.js";
15
+ import { NO_UX_RULES, loadUxRules } from "./uxcheck.js";
16
+ import { VIEWER_ACCEPTS, ViewerHub, viewerStatusForHost } from "./viewer.js";
17
+ import { VIEWER_HTML } from "./viewer-page.js";
18
+ /** How long a client of the thin call may stay silent before its tools (its report, its journey) are dropped. */
19
+ export const CLIENT_IDLE_MS = 30 * 60 * 1000;
20
+ /** What a queued call answers when its client left before it started (nobody reads it). */
21
+ const CANCELLED = { content: [{ type: "text", text: "Error cancelled: the client left before this call started, so it never ran." }], isError: true };
22
+ /** The client id of a thin call that names none. */
23
+ export const ANONYMOUS_CLIENT = "anonymous";
24
+ function stderrLog(message) {
25
+ process.stderr.write(`[tapline] ${message}\n`);
26
+ }
27
+ /** Opens a link in the default browser of this computer; false when that couldn't start. */
28
+ function openInBrowser(link) {
29
+ try {
30
+ const [command, args] = process.platform === "win32"
31
+ ? ["cmd", ["/c", "start", "", link.replace(/&/g, "^&")]]
32
+ : process.platform === "darwin"
33
+ ? ["open", [link]]
34
+ : ["xdg-open", [link]];
35
+ const child = spawn(command, args, { detached: true, stdio: "ignore", windowsHide: true });
36
+ child.on("error", () => undefined);
37
+ child.unref();
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ /**
45
+ * The wiring an MCP server and a standalone host share: the host, the person's confirmations, the live viewer on the
46
+ * host's port, the policy, the log folders and the 3 s control queue. Rejects with a plain message when an option is
47
+ * wrong or no port is free (the message's lines are for the log).
48
+ */
49
+ export async function createRuntime(options = {}) {
50
+ const log = options.log ?? stderrLog;
51
+ const clock = options.clock ?? Date.now;
52
+ let screenshots;
53
+ let viewer;
54
+ let policy;
55
+ let uxRules = NO_UX_RULES;
56
+ // The safety policy (AGENT-TOOLS 1.8 §11): built in, from --policy FILE, or none with --no-policy. The user's UX
57
+ // house rules (1.12 §17.3): --ux-rules FILE; a bad file stops the host with a plain message.
58
+ screenshots = screenshotMode(options.screenshots, options.env);
59
+ viewer = viewerMode(options.viewer, options.env);
60
+ policy = options.noPolicy === true ? NO_POLICY : options.policy !== undefined ? loadPolicy(options.policy) : DEFAULT_POLICY;
61
+ if (options.uxRules !== undefined)
62
+ uxRules = loadUxRules(options.uxRules);
63
+ // The test accounts (AGENT-TOOLS 1.13 §18.6). A refused file still starts the server, with no accounts and the reason.
64
+ const accounts = options.accounts !== undefined ? await loadAccounts(options.accounts, options.gitProbe) : undefined;
65
+ if (accounts !== undefined && accounts.store === null)
66
+ log(accounts.blocked);
67
+ const config = await resolveConfig(options);
68
+ const clients = new Map();
69
+ const host = new TaplineHost({
70
+ ...(accounts?.store != null ? { redact: accounts.store.redact } : {}),
71
+ token: config.token,
72
+ port: config.port,
73
+ portFallback: config.portFallback,
74
+ hosts: config.hosts,
75
+ ...(options.api === true
76
+ ? {
77
+ api: async (tool, args, clientId, signal) => isToolName(tool) ? thinCall(tool, args, clientId, signal) : undefined,
78
+ }
79
+ : {}),
80
+ });
81
+ host.on("connect", () => markPaired(options.env));
82
+ host.on("connect", (s) => log(`app connected: ${s.app.name} (${s.id}) on ${s.device.name ?? s.device.platform}`));
83
+ host.on("disconnect", (s, reason) => log(`app disconnected: ${s.app.name} (${s.id}): ${reason}`));
84
+ host.on("warning", (message) => log(message));
85
+ for (const note of config.notes)
86
+ log(note);
87
+ let advertised = config.advertisedHost;
88
+ let listening;
89
+ try {
90
+ listening = await host.listen();
91
+ for (const { host: h, port } of listening.listening)
92
+ log(`listening on ws://${h}:${port}/`);
93
+ for (const { host: h, error } of listening.failed)
94
+ log(`could not listen on ${h}: ${error}`);
95
+ advertised = reachableHost(config, listening.listening);
96
+ }
97
+ catch (error) {
98
+ throw new Error(`failed to start: ${error instanceof Error ? error.message : String(error)}\n` +
99
+ "Every port tried is taken (other Tapline hosts?). Pick a free one with --port or TAPLINE_PORT.");
100
+ }
101
+ const port = host.boundPort() ?? config.port;
102
+ const url = hostUrl({ advertisedHost: advertised }, port);
103
+ log(`apps connect to ${url}; use the pair tool to connect a phone`);
104
+ // The live viewer rides on this host's port: local by default, the tailnet with --viewer remote.
105
+ const viewerToken = randomBytes(24).toString("base64url");
106
+ const remoteViewer = viewer === "remote" && config.tailscaleIp !== null;
107
+ const viewerHosts = [`127.0.0.1:${port}`, `localhost:${port}`, `[::1]:${port}`, ...(remoteViewer ? [`${config.tailscaleIp}:${port}`] : [])];
108
+ const viewerLinks = [
109
+ `http://127.0.0.1:${port}/viewer?token=${viewerToken}`,
110
+ ...(remoteViewer ? [`http://${config.tailscaleIp}:${port}/viewer?token=${viewerToken} (from your own devices on Tailscale)`] : []),
111
+ ];
112
+ const control = new ControlQueue();
113
+ const confirmations = new Confirmations();
114
+ let hub;
115
+ const openBrowser = options.openBrowser ?? openInBrowser;
116
+ // One map per app for every client of this host: places, roads and links grow as agents drive (§18.9).
117
+ const maps = new MapRegistry({ mapsDir: options.maps ?? join(configDir(options.env), "maps") });
118
+ const toolsOptions = {
119
+ maps,
120
+ ...(options.brief === true ? { brief: true } : {}),
121
+ policy,
122
+ uxRules,
123
+ ...(accounts !== undefined ? { accounts } : {}),
124
+ confirmations,
125
+ canConfirm: viewer !== "off",
126
+ connect: { url, name: config.name },
127
+ pairedBefore: () => pairedBefore(options.env),
128
+ pairImagePath: join(configDir(options.env), `pair-${port}.png`),
129
+ offerDir: join(configDir(options.env), "offers"),
130
+ screenshots,
131
+ screenshotDir: join(configDir(options.env), "shots"),
132
+ scriptsDir: join(configDir(options.env), "scripts"),
133
+ baselinesDir: join(configDir(options.env), "baselines"),
134
+ // Journey reports (AGENT-TOOLS 1.12 §17.5) and the user's own gh and git for `export`
135
+ journeysDir: join(configDir(options.env), "journeys"),
136
+ exportRunner: realRunner,
137
+ // The action log (AGENT-TOOLS 1.8 §12), unless --no-log
138
+ ...(options.noLog === true ? {} : { logDir: join(configDir(options.env), "log") }),
139
+ ...(viewer === "off"
140
+ ? {}
141
+ : {
142
+ control,
143
+ onAction: (action) => hub?.pushAction(action),
144
+ viewerLinks: () => viewerLinks,
145
+ openViewer: (link) => openBrowser(link),
146
+ viewerLinkToAgent: options.viewerLink === true || process.env["TAPLINE_VIEWER_LINK"] === "1",
147
+ viewerFeed: () => hub?.feed() ?? { on: false, quality: "balanced" },
148
+ }),
149
+ };
150
+ // The connection's own tools: what an MCP server uses, and what the live viewer's person input goes through.
151
+ const primary = new TaplineTools(host, toolsOptions);
152
+ /** Every call through `/api` is a thin call: the log says so, and the report flags a run of them (§16.1). */
153
+ function thinCall(tool, args, clientId, signal) {
154
+ // A thin call never uses the MCP server's tools: those hold its dialog and the OKs given for its calls.
155
+ const tools = toolsFor(clientId ?? ANONYMOUS_CLIENT);
156
+ // Calls that share a tools object run one after another: they share its per-call state (a run's account).
157
+ const before = lanes.get(tools) ?? Promise.resolve();
158
+ // A call whose client left while it waited in the line is dropped before it starts; a running one is told to stop waiting.
159
+ const answer = before.then(() => (signal.aborted ? CANCELLED : tools.withCall(signal, () => tools.asThinCall(() => callTool(tools, tool, args)))));
160
+ lanes.set(tools, answer.then(() => undefined, () => undefined));
161
+ return answer;
162
+ }
163
+ const lanes = new WeakMap();
164
+ function toolsFor(clientId) {
165
+ if (clientId === undefined)
166
+ return primary;
167
+ const now = clock();
168
+ for (const [id, entry] of clients) {
169
+ if (now - entry.lastUsed <= CLIENT_IDLE_MS)
170
+ continue;
171
+ entry.tools.dispose();
172
+ clients.delete(id);
173
+ }
174
+ const known = clients.get(clientId);
175
+ if (known !== undefined) {
176
+ known.lastUsed = now;
177
+ return known.tools;
178
+ }
179
+ // The call log names the agent by this id.
180
+ const tools = new TaplineTools(host, { ...toolsOptions, clientId: () => clientId, confirmScope: "api" });
181
+ clients.set(clientId, { tools, lastUsed: now });
182
+ return tools;
183
+ }
184
+ if (viewer !== "off") {
185
+ const live = new ViewerHub({
186
+ token: viewerToken,
187
+ html: VIEWER_HTML,
188
+ allowedHosts: () => viewerHosts,
189
+ allowRemote: remoteViewer,
190
+ accepts: [...VIEWER_ACCEPTS],
191
+ control,
192
+ setFeed: (on, quality) => {
193
+ void primary.setFeed(on, quality).then((outcome) => {
194
+ // Without an app, or in the background, the status already says so (appStatus below).
195
+ if (!outcome.ok && on && host.current() !== undefined && outcome.code !== "in_background") {
196
+ live.setStatus({ detail: `The app can't stream its screen: ${outcome.message ?? ""}` });
197
+ }
198
+ });
199
+ },
200
+ readOverlay: () => primary.readOverlay(),
201
+ runInput: async (input) => {
202
+ const outcome = await primary.personInput(input);
203
+ // The request reached the app: every client's refs from before it are stale.
204
+ if (outcome.action !== undefined)
205
+ for (const entry of clients.values())
206
+ entry.tools.noteViewerInput();
207
+ return outcome;
208
+ },
209
+ confirmations,
210
+ });
211
+ hub = live;
212
+ host.setHttpExtension(live);
213
+ host.on("frame", (session, frame) => {
214
+ if (host.current()?.id === session.id)
215
+ live.pushFrame(frame);
216
+ });
217
+ const appStatus = () => live.setStatus(viewerStatusForHost(host));
218
+ host.on("connect", appStatus);
219
+ host.on("disconnect", appStatus);
220
+ host.on("appState", appStatus);
221
+ host.on("notAnswering", appStatus);
222
+ host.on("answering", appStatus);
223
+ appStatus();
224
+ log(`live viewer: ${remoteViewer ? "this computer and your Tailscale devices" : "this computer only"} (the viewer tool opens it in a browser here)`);
225
+ // The link for the user's own devices: here in the log, never in an answer to the agent.
226
+ if (remoteViewer)
227
+ for (const link of viewerLinks.slice(1))
228
+ log(`live viewer for your devices: ${link}`);
229
+ }
230
+ if (screenshots === "file")
231
+ log(`screenshots are saved in ${join(configDir(options.env), "shots")} (newest 50 kept)`);
232
+ return {
233
+ host,
234
+ confirmations,
235
+ config,
236
+ listening,
237
+ url,
238
+ port,
239
+ viewerLinks,
240
+ remoteViewer,
241
+ toolsFor,
242
+ // The maps are written at most once a second while driving, and in full here.
243
+ close: async () => {
244
+ await maps.flushAll().catch(() => undefined);
245
+ // The phone is never left fast-forwarded with nobody watching (PLAN-1.6 F4, E8).
246
+ await restoreAnimations(host).catch(() => undefined);
247
+ for (const entry of clients.values())
248
+ entry.tools.dispose();
249
+ clients.clear();
250
+ primary.dispose();
251
+ await host.close();
252
+ },
253
+ };
254
+ }
255
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
package/dist/script.d.ts CHANGED
@@ -1,14 +1,8 @@
1
1
  import { z } from "zod";
2
2
  import { type Step } from "./run.js";
3
- /**
4
- * AGENT-TOOLS 1.8 §9.4: the shared script file, a saved batch both tools write and replay.
5
- * {"format": "agent-tools-script", "version": 1, "name", "app", "fresh", "steps": [ {tool, …, expect?} ]}
6
- * Tapline records the app's methods as they run (press, type, …); this turns them into tool steps, and
7
- * still reads Tapline's own scripts from before 1.1.
8
- */
9
- export declare const sharedScriptSchema: z.ZodObject<{
10
- format: z.ZodLiteral<"agent-tools-script">;
3
+ export declare const sharedScriptV1Schema: z.ZodObject<{
11
4
  version: z.ZodLiteral<1>;
5
+ format: z.ZodLiteral<"agent-tools-script">;
12
6
  name: z.ZodString;
13
7
  app: z.ZodOptional<z.ZodString>;
14
8
  fresh: z.ZodOptional<z.ZodBoolean>;
@@ -26,9 +20,113 @@ export declare const sharedScriptSchema: z.ZodObject<{
26
20
  timeout: z.ZodOptional<z.ZodNumber>;
27
21
  under: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
28
22
  }, z.core.$strip>>;
23
+ if: z.ZodOptional<z.ZodObject<{
24
+ text: z.ZodOptional<z.ZodString>;
25
+ id: z.ZodOptional<z.ZodString>;
26
+ label: z.ZodOptional<z.ZodString>;
27
+ gone: z.ZodOptional<z.ZodBoolean>;
28
+ }, z.core.$strict>>;
29
+ optional: z.ZodOptional<z.ZodBoolean>;
29
30
  }, z.core.$loose>>;
30
31
  }, z.core.$strip>;
31
- export type SharedScript = z.infer<typeof sharedScriptSchema>;
32
+ /** A route's variable: a name, or `account` (the test account a route types, §18.6). Never a value. */
33
+ export declare const variableNameSchema: z.ZodString;
34
+ /** AGENT-TOOLS 1.13 §18.5: version 2 adds where a route starts and ends, and the variables its steps use. */
35
+ export declare const sharedScriptV2Schema: z.ZodObject<{
36
+ version: z.ZodLiteral<2>;
37
+ start: z.ZodOptional<z.ZodString>;
38
+ end: z.ZodOptional<z.ZodString>;
39
+ variables: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
+ format: z.ZodLiteral<"agent-tools-script">;
41
+ name: z.ZodString;
42
+ app: z.ZodOptional<z.ZodString>;
43
+ fresh: z.ZodOptional<z.ZodBoolean>;
44
+ steps: z.ZodArray<z.ZodObject<{
45
+ tool: z.ZodString;
46
+ expect: z.ZodOptional<z.ZodObject<{
47
+ text: z.ZodOptional<z.ZodString>;
48
+ id: z.ZodOptional<z.ZodString>;
49
+ label: z.ZodOptional<z.ZodString>;
50
+ gone: z.ZodOptional<z.ZodBoolean>;
51
+ value: z.ZodOptional<z.ZodString>;
52
+ matches: z.ZodOptional<z.ZodString>;
53
+ threshold: z.ZodOptional<z.ZodNumber>;
54
+ ignore: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
55
+ timeout: z.ZodOptional<z.ZodNumber>;
56
+ under: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
57
+ }, z.core.$strip>>;
58
+ if: z.ZodOptional<z.ZodObject<{
59
+ text: z.ZodOptional<z.ZodString>;
60
+ id: z.ZodOptional<z.ZodString>;
61
+ label: z.ZodOptional<z.ZodString>;
62
+ gone: z.ZodOptional<z.ZodBoolean>;
63
+ }, z.core.$strict>>;
64
+ optional: z.ZodOptional<z.ZodBoolean>;
65
+ }, z.core.$loose>>;
66
+ }, z.core.$strip>;
67
+ export declare const sharedScriptSchema: z.ZodUnion<readonly [z.ZodObject<{
68
+ version: z.ZodLiteral<1>;
69
+ format: z.ZodLiteral<"agent-tools-script">;
70
+ name: z.ZodString;
71
+ app: z.ZodOptional<z.ZodString>;
72
+ fresh: z.ZodOptional<z.ZodBoolean>;
73
+ steps: z.ZodArray<z.ZodObject<{
74
+ tool: z.ZodString;
75
+ expect: z.ZodOptional<z.ZodObject<{
76
+ text: z.ZodOptional<z.ZodString>;
77
+ id: z.ZodOptional<z.ZodString>;
78
+ label: z.ZodOptional<z.ZodString>;
79
+ gone: z.ZodOptional<z.ZodBoolean>;
80
+ value: z.ZodOptional<z.ZodString>;
81
+ matches: z.ZodOptional<z.ZodString>;
82
+ threshold: z.ZodOptional<z.ZodNumber>;
83
+ ignore: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
84
+ timeout: z.ZodOptional<z.ZodNumber>;
85
+ under: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
86
+ }, z.core.$strip>>;
87
+ if: z.ZodOptional<z.ZodObject<{
88
+ text: z.ZodOptional<z.ZodString>;
89
+ id: z.ZodOptional<z.ZodString>;
90
+ label: z.ZodOptional<z.ZodString>;
91
+ gone: z.ZodOptional<z.ZodBoolean>;
92
+ }, z.core.$strict>>;
93
+ optional: z.ZodOptional<z.ZodBoolean>;
94
+ }, z.core.$loose>>;
95
+ }, z.core.$strip>, z.ZodObject<{
96
+ version: z.ZodLiteral<2>;
97
+ start: z.ZodOptional<z.ZodString>;
98
+ end: z.ZodOptional<z.ZodString>;
99
+ variables: z.ZodOptional<z.ZodArray<z.ZodString>>;
100
+ format: z.ZodLiteral<"agent-tools-script">;
101
+ name: z.ZodString;
102
+ app: z.ZodOptional<z.ZodString>;
103
+ fresh: z.ZodOptional<z.ZodBoolean>;
104
+ steps: z.ZodArray<z.ZodObject<{
105
+ tool: z.ZodString;
106
+ expect: z.ZodOptional<z.ZodObject<{
107
+ text: z.ZodOptional<z.ZodString>;
108
+ id: z.ZodOptional<z.ZodString>;
109
+ label: z.ZodOptional<z.ZodString>;
110
+ gone: z.ZodOptional<z.ZodBoolean>;
111
+ value: z.ZodOptional<z.ZodString>;
112
+ matches: z.ZodOptional<z.ZodString>;
113
+ threshold: z.ZodOptional<z.ZodNumber>;
114
+ ignore: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
115
+ timeout: z.ZodOptional<z.ZodNumber>;
116
+ under: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
117
+ }, z.core.$strip>>;
118
+ if: z.ZodOptional<z.ZodObject<{
119
+ text: z.ZodOptional<z.ZodString>;
120
+ id: z.ZodOptional<z.ZodString>;
121
+ label: z.ZodOptional<z.ZodString>;
122
+ gone: z.ZodOptional<z.ZodBoolean>;
123
+ }, z.core.$strict>>;
124
+ optional: z.ZodOptional<z.ZodBoolean>;
125
+ }, z.core.$loose>>;
126
+ }, z.core.$strip>]>;
127
+ export type SharedScriptV1 = z.infer<typeof sharedScriptV1Schema>;
128
+ export type SharedScriptV2 = z.infer<typeof sharedScriptV2Schema>;
129
+ export type SharedScript = SharedScriptV1 | SharedScriptV2;
32
130
  /** Tapline's script before 1.1: the app's methods and their parameters. */
33
131
  export declare const legacyScriptSchema: z.ZodObject<{
34
132
  version: z.ZodLiteral<1>;
@@ -52,6 +150,12 @@ export interface MethodStep {
52
150
  /** Tapline: the screen's route when the step was recorded, checked on replay (a step field, not a parameter). */
53
151
  route?: string[];
54
152
  }
153
+ /**
154
+ * The existing name that differs from `name` only in case, else null (AGENT-TOOLS 1.13.1 item 5). `home` and `HOME` are
155
+ * one file on Windows and macOS, so the second is refused before anything is written. It compares names, never the
156
+ * file system, so it means the same on every OS.
157
+ */
158
+ export declare function caseTwin(name: string, existing: Iterable<string>): string | null;
55
159
  /** One recorded app call as a script step; null for calls a script doesn't keep. */
56
160
  export declare function toToolStep(step: MethodStep): Step | null;
57
161
  /**
@@ -59,7 +163,7 @@ export declare function toToolStep(step: MethodStep): Step | null;
59
163
  * label, with gone and timeout), so the script reads as "do this, then this must show".
60
164
  */
61
165
  export declare function scriptSteps(calls: MethodStep[]): Step[];
62
- export declare function fromLegacy(script: LegacyScript): SharedScript;
166
+ export declare function fromLegacy(script: LegacyScript): SharedScriptV1;
63
167
  /** A script from a file's text, either format; null when it is neither. */
64
168
  export declare function readScript(text: string): SharedScript | null;
65
169
  /** A step a script can't keep: a ref (it doesn't survive a session). */
package/dist/script.js CHANGED
@@ -6,14 +6,25 @@ import { stepSchema } from "./run.js";
6
6
  * Tapline records the app's methods as they run (press, type, …); this turns them into tool steps, and
7
7
  * still reads Tapline's own scripts from before 1.1.
8
8
  */
9
- export const sharedScriptSchema = z.object({
9
+ const scriptBase = {
10
10
  format: z.literal("agent-tools-script"),
11
- version: z.literal(1),
12
11
  name: z.string(),
13
12
  app: z.string().optional(),
14
13
  fresh: z.boolean().optional(),
15
14
  steps: z.array(stepSchema),
15
+ };
16
+ export const sharedScriptV1Schema = z.object({ ...scriptBase, version: z.literal(1) });
17
+ /** A route's variable: a name, or `account` (the test account a route types, §18.6). Never a value. */
18
+ export const variableNameSchema = z.string().regex(/^[A-Za-z_]\w*$/, "a variable's name is letters, digits and '_'");
19
+ /** AGENT-TOOLS 1.13 §18.5: version 2 adds where a route starts and ends, and the variables its steps use. */
20
+ export const sharedScriptV2Schema = z.object({
21
+ ...scriptBase,
22
+ version: z.literal(2),
23
+ start: z.string().min(1).optional(),
24
+ end: z.string().min(1).optional(),
25
+ variables: z.array(variableNameSchema).optional(),
16
26
  });
27
+ export const sharedScriptSchema = z.union([sharedScriptV1Schema, sharedScriptV2Schema]);
17
28
  /** Tapline's script before 1.1: the app's methods and their parameters. */
18
29
  export const legacyScriptSchema = z.object({
19
30
  version: z.literal(1),
@@ -42,6 +53,23 @@ const TOOL_OF = {
42
53
  sleep: "wait",
43
54
  performance: "performance",
44
55
  };
56
+ /** ASCII letters folded to lower case, and nothing else: names are ASCII, and `K` (Kelvin) is not a `k`. */
57
+ function asciiLower(name) {
58
+ return name.replace(/[A-Z]/g, (letter) => String.fromCharCode(letter.charCodeAt(0) + 32));
59
+ }
60
+ /**
61
+ * The existing name that differs from `name` only in case, else null (AGENT-TOOLS 1.13.1 item 5). `home` and `HOME` are
62
+ * one file on Windows and macOS, so the second is refused before anything is written. It compares names, never the
63
+ * file system, so it means the same on every OS.
64
+ */
65
+ export function caseTwin(name, existing) {
66
+ const others = [...existing];
67
+ // The exact name exists: it is the one meant, even when a twin from another OS sits next to it.
68
+ if (others.includes(name))
69
+ return null;
70
+ const folded = asciiLower(name);
71
+ return others.find((other) => asciiLower(other) === folded) ?? null;
72
+ }
45
73
  /** The app's target (`testID`) as a tool target (`id`). */
46
74
  function toolTarget(target) {
47
75
  if (typeof target !== "object" || target === null)
@@ -1 +1 @@
1
- {"version":3,"file":"script.js","sourceRoot":"","sources":["../src/script.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"script.js","sourceRoot":"","sources":["../src/script.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { EventEmitter } from "node:events";
2
2
  import { type IncomingMessage, type ServerResponse } from "node:http";
3
3
  import type { Duplex } from "node:stream";
4
- import { type AppInfo, type DeviceInfo, type LogEntry } from "./protocol.js";
4
+ import { type ApiHandler } from "./api.js";
5
+ import { type AppInfo, type DeviceInfo, type LogEntry, type PlaceState } from "./protocol.js";
5
6
  export declare const CLOSE_REPLACED = 4010;
6
7
  export declare const CLOSE_SILENT = 4011;
7
8
  export interface SessionInfo {
@@ -16,6 +17,13 @@ export interface SessionInfo {
16
17
  state: string;
17
18
  at: number;
18
19
  };
20
+ /**
21
+ * The app's latest `place` event (AGENT-TOOLS 1.13 §18.11): route patterns, tab and layer, never params. `seenAt` is
22
+ * this host's clock when it arrived, the same computer's time as the tool that asks.
23
+ */
24
+ place?: PlaceState & {
25
+ seenAt: number;
26
+ };
19
27
  /** How the app reaches this host, from the address it connected from. */
20
28
  via?: "tailscale" | "wifi";
21
29
  }
@@ -105,11 +113,24 @@ export interface TaplineHostOptions {
105
113
  * (the report crosses the network, and the app passes on at most one touch per 500 ms). Default 1500 ms.
106
114
  */
107
115
  agentTouchSlackMs?: number;
116
+ /** Serves `POST /api/<tool>` (the thin call, AGENT-TOOLS 1.13 §18.10). Only a standalone `tapline host` sets it. */
117
+ api?: ApiHandler;
118
+ /**
119
+ * Scrubs the text of everything the app sends back (answers, errors, log lines, crashes) before anything else reads
120
+ * it: how test accounts' values stay out of every answer (AGENT-TOOLS 1.13 §18.6).
121
+ */
122
+ redact?: (text: string) => string;
108
123
  }
109
124
  /** The longest touch another tool may announce (`POST /agent-touch`), in milliseconds. */
110
125
  export declare const MAX_AGENT_TOUCH_MS = 10000;
111
126
  /** Whether a socket's peer is this computer. */
112
127
  export declare function isLoopback(address: string | undefined): boolean;
128
+ /** The checks and the answer of `GET /place`, apart from the socket so a test can use a peer that isn't this computer. */
129
+ export declare function handlePlaceRequest(req: IncomingMessage, res: ServerResponse, context: {
130
+ token: string;
131
+ loopback: boolean;
132
+ sessions: () => SessionInfo[];
133
+ }): boolean;
113
134
  /**
114
135
  * Whether a peer is on this computer's own local network (or is this computer): private IPv4, link-local, IPv6
115
136
  * unique-local. Not Tailscale (100.64.0.0/10) and not the internet: the development offer stays on the Wi-Fi.
@@ -136,6 +157,11 @@ export interface DevOffer {
136
157
  export interface RequestOptions {
137
158
  sessionId?: string;
138
159
  timeoutMs?: number;
160
+ /**
161
+ * The answer comes back with account values still in it, for the host's own safety checks (the policy, the guard).
162
+ * It never goes outward: show it only through `redactOut`.
163
+ */
164
+ internal?: boolean;
139
165
  }
140
166
  export interface ListenResult {
141
167
  listening: Array<{
@@ -147,7 +173,7 @@ export interface ListenResult {
147
173
  error: string;
148
174
  }>;
149
175
  }
150
- export type TaplineErrorCode = "not_connected" | "timeout" | "reconnecting" | "not_answering" | "send_failed" | (string & {});
176
+ export type TaplineErrorCode = "not_connected" | "timeout" | "reconnecting" | "not_answering" | "send_failed" | "off_route" | (string & {});
151
177
  /** An error from the host itself or relayed from the app (`code` is then the app's code). */
152
178
  export declare class TaplineError extends Error {
153
179
  readonly code: TaplineErrorCode;
@@ -161,6 +187,8 @@ interface HostEvents {
161
187
  frame: [session: SessionInfo, frame: AppFrame];
162
188
  /** The app went to the background or came back ("background", "active", "inactive"). */
163
189
  appState: [session: SessionInfo, state: string];
190
+ /** The app's photo picker handed over the armed test pictures (`media` with `picker`). */
191
+ pickerSkipped: [session: SessionInfo, count: number];
164
192
  /** A person touched the app's screen (the app saw a real touch; at most about two a second). */
165
193
  touch: [session: SessionInfo];
166
194
  /** A request to a connected app ended with `not_answering`. */
@@ -200,12 +228,16 @@ export declare class TaplineHost extends EventEmitter<HostEvents> {
200
228
  private readonly crashMap;
201
229
  private readonly crashLog;
202
230
  private crashSeq;
231
+ /** Requests that may have acted on the app (not reads, not dry runs), once past the checks that refuse before sending. */
232
+ private actingSent;
203
233
  private httpExtension;
234
+ private readonly api;
204
235
  /** Open after `pair`: development builds on the local network may fetch this code (one use, 10 minutes). */
205
236
  private devOffer;
206
237
  private sweeper;
207
238
  private listenCalled;
208
239
  private closed;
240
+ private readonly redact;
209
241
  constructor(options: TaplineHostOptions);
210
242
  /**
211
243
  * Another tool on this computer (Tapwright) is about to touch the phone for an agent, for about
@@ -217,6 +249,11 @@ export declare class TaplineHost extends EventEmitter<HostEvents> {
217
249
  * this computer, answered 204. Returns false for any other path.
218
250
  */
219
251
  private handleAgentTouch;
252
+ /**
253
+ * `GET /place?app=<app id>` with `Authorization: Bearer <the host token>` (AGENT-TOOLS 1.13 §18.11): only from this
254
+ * computer, answered from memory with no request to the phone. Returns false for any other path.
255
+ */
256
+ private handlePlace;
220
257
  /**
221
258
  * Starts listening on every configured address. When the port is taken and `portFallback`
222
259
  * allows it, moves on to the following ports. Rejects only if no address could bind.
@@ -269,6 +306,11 @@ export declare class TaplineHost extends EventEmitter<HostEvents> {
269
306
  } | undefined;
270
307
  /** The agent is about to end the app's connection on purpose (a reload): that is no crash. */
271
308
  expectEnd(sessionId: string, expected?: boolean): void;
309
+ /**
310
+ * How many requests that may have acted on an app were sent so far. A call whose mark didn't move did nothing, so
311
+ * it is safe to run it again (AGENT-TOOLS 1.13 §11.5).
312
+ */
313
+ actingMark(): number;
272
314
  /** The number of crash events so far; pass it to `crashEventsAfter` later. */
273
315
  crashMark(): number;
274
316
  /** Crash events after `seq`, oldest first; only those of the app `of` when it is given. */
@@ -284,6 +326,10 @@ export declare class TaplineHost extends EventEmitter<HostEvents> {
284
326
  private pushCrashEvent;
285
327
  private describeIds;
286
328
  private currentSession;
329
+ /** Whether account values are scrubbed from what the apps send (a test accounts file is loaded). */
330
+ get redacting(): boolean;
331
+ /** Scrubs a value (text and property names) the way every answer from an app is; for what an `internal` request gave. */
332
+ redactOut<T>(value: T): T;
287
333
  /** Sends a request to an app and resolves with its `result` (or rejects with a TaplineError). */
288
334
  request(method: string, params?: unknown, options?: RequestOptions): Promise<unknown>;
289
335
  private onConnection;