tapline-host 1.0.0 → 1.1.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 (50) hide show
  1. package/dist/actionlog.d.ts +43 -0
  2. package/dist/actionlog.js +62 -0
  3. package/dist/actionlog.js.map +1 -0
  4. package/dist/audit.d.ts +44 -0
  5. package/dist/audit.js +60 -0
  6. package/dist/audit.js.map +1 -0
  7. package/dist/cli.js +79 -17
  8. package/dist/cli.js.map +1 -1
  9. package/dist/confirm.d.ts +69 -0
  10. package/dist/confirm.js +120 -0
  11. package/dist/confirm.js.map +1 -0
  12. package/dist/format.d.ts +8 -1
  13. package/dist/format.js +53 -11
  14. package/dist/format.js.map +1 -1
  15. package/dist/init.d.ts +59 -0
  16. package/dist/init.js +475 -0
  17. package/dist/init.js.map +1 -0
  18. package/dist/inspect.d.ts +75 -0
  19. package/dist/inspect.js +127 -0
  20. package/dist/inspect.js.map +1 -0
  21. package/dist/mcp.d.ts +4 -1
  22. package/dist/mcp.js +56 -2
  23. package/dist/mcp.js.map +1 -1
  24. package/dist/policy.d.ts +42 -0
  25. package/dist/policy.js +74 -0
  26. package/dist/policy.js.map +1 -0
  27. package/dist/run.d.ts +47 -0
  28. package/dist/run.js +88 -0
  29. package/dist/run.js.map +1 -0
  30. package/dist/script.d.ts +68 -0
  31. package/dist/script.js +142 -0
  32. package/dist/script.js.map +1 -0
  33. package/dist/server.d.ts +39 -0
  34. package/dist/server.js +120 -0
  35. package/dist/server.js.map +1 -1
  36. package/dist/tool-text-data.d.ts +24 -7
  37. package/dist/tool-text-data.js +24 -7
  38. package/dist/tool-text-data.js.map +1 -1
  39. package/dist/tool-text.d.ts +1 -1
  40. package/dist/tools.d.ts +152 -6
  41. package/dist/tools.js +905 -118
  42. package/dist/tools.js.map +1 -1
  43. package/dist/viewer-page.js +1 -1
  44. package/dist/viewer-page.js.map +1 -1
  45. package/dist/viewer.d.ts +3 -0
  46. package/dist/viewer.js +21 -4
  47. package/dist/viewer.js.map +1 -1
  48. package/package.json +2 -2
  49. package/skills/tapline/SKILL.md +41 -11
  50. package/skills/tapline/references/setup.md +24 -2
@@ -0,0 +1,127 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { dirname, join, relative, sep } from "node:path";
3
+ import { z } from "zod";
4
+ import { formatElement } from "./format.js";
5
+ import { elementSchema } from "./protocol.js";
6
+ /**
7
+ * `inspect` (Tapline 1.1): from the screen to the code. The app finds the components and the source line
8
+ * (React's `_debugStack`, mapped by Metro); the host turns the path into one relative to the app's project
9
+ * and, when the file is on this computer, shows the line itself.
10
+ */
11
+ export const inspectResultSchema = z.object({
12
+ element: elementSchema,
13
+ source: z.object({
14
+ components: z.array(z.string()),
15
+ location: z
16
+ .object({ file: z.string(), line: z.number(), column: z.number(), component: z.string().nullish(), direct: z.boolean().optional() })
17
+ .nullable(),
18
+ usedAt: z
19
+ .union([
20
+ z.array(z.object({ file: z.string(), line: z.number(), column: z.number(), component: z.string().nullish() })),
21
+ z.object({ file: z.string(), line: z.number(), column: z.number(), component: z.string().nullish() }).transform((one) => [one]),
22
+ ])
23
+ .optional(),
24
+ props: z.record(z.string(), z.string()),
25
+ }),
26
+ });
27
+ const realFiles = { exists: existsSync, read: (p) => readFileSync(p, "utf8") };
28
+ /** The app's project folder for a source file: the nearest folder above it with a package.json. */
29
+ export function projectRoot(file, files = realFiles) {
30
+ let dir = dirname(file);
31
+ for (let i = 0; i < 40; i++) {
32
+ if (!dir.split(/[\\/]/).includes("node_modules") && files.exists(join(dir, "package.json")))
33
+ return dir;
34
+ const up = dirname(dir);
35
+ if (up === dir)
36
+ return null;
37
+ dir = up;
38
+ }
39
+ return null;
40
+ }
41
+ /** A path for people and agents: relative to the app's project, with forward slashes; never absolute. */
42
+ export function shownPath(file, files = realFiles) {
43
+ const root = projectRoot(file, files);
44
+ const rel = root !== null ? relative(root, file) : file.split(/[\\/]/).slice(-3).join(sep);
45
+ return rel.split(sep).join("/").replace(/\\/g, "/");
46
+ }
47
+ /** The source line, trimmed and cut to 120 characters; null when the file isn't on this computer. */
48
+ export function sourceLine(file, line, files = realFiles) {
49
+ try {
50
+ if (!files.exists(file))
51
+ return null;
52
+ const text = files.read(file).split(/\r?\n/)[line - 1];
53
+ if (text === undefined)
54
+ return null;
55
+ const trimmed = text.trim();
56
+ return trimmed.length > 120 ? `${trimmed.slice(0, 119)}…` : trimmed;
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ /** The first line of a file that writes this id as a string literal ("id", 'id' or `id`); null when none. */
63
+ export function literalLine(file, id, files = realFiles) {
64
+ try {
65
+ if (!files.exists(file))
66
+ return null;
67
+ const lines = files.read(file).split(/\r?\n/);
68
+ const quoted = [`"${id}"`, `'${id}'`, `\`${id}\``];
69
+ const at = lines.findIndex((line) => quoted.some((q) => line.includes(q)));
70
+ return at >= 0 ? at + 1 : null;
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ }
76
+ export function formatInspect(result, files = realFiles) {
77
+ const lines = [formatElement(result.element)];
78
+ const { components, location, props } = result.source;
79
+ if (components.length > 0)
80
+ lines.push(`Components: ${components.join(" › ")}`);
81
+ if (location !== null) {
82
+ const where = `${shownPath(location.file, files)}:${location.line}`;
83
+ const inComponent = location.component ? ` (in ${location.component})` : "";
84
+ lines.push(location.direct === false
85
+ ? `Drawn by a library, inside: ${where}${inComponent}`
86
+ : `Written at: ${where}${inComponent}`);
87
+ const code = sourceLine(location.file, location.line, files);
88
+ if (code !== null)
89
+ lines.push(` ${location.line} | ${code}`);
90
+ // Inside the app's own shared component: where the screen uses it. Of the call sites up the chain, the
91
+ // first whose line names the element (its label, text or id, or the id's last part), else the nearest.
92
+ const sites = result.source.usedAt ?? [];
93
+ const el = result.element;
94
+ const elementId = el.testID ?? "";
95
+ const words = [el.label, el.text, elementId, elementId.split(/[-_.:]/).pop()].filter((w) => typeof w === "string" && w.length >= 2);
96
+ const names = (site) => {
97
+ const code = sourceLine(site.file, site.line, files) ?? "";
98
+ return words.some((w) => code.includes(`"${w}"`) || code.includes(`'${w}'`) || code.includes(`>${w}<`));
99
+ };
100
+ const used = sites.find(names) ?? sites[0];
101
+ if (used !== undefined) {
102
+ lines.push(`Used at: ${shownPath(used.file, files)}:${used.line}${used.component ? ` (in ${used.component})` : ""}`);
103
+ const usedCode = sourceLine(used.file, used.line, files);
104
+ if (usedCode !== null)
105
+ lines.push(` ${used.line} | ${usedCode}`);
106
+ }
107
+ // A library drew it: the app still wrote the element's id somewhere in that file (a tab's options).
108
+ const id = result.element.testID;
109
+ if (location.direct === false && typeof id === "string" && id !== "") {
110
+ const at = literalLine(location.file, id, files);
111
+ if (at !== null) {
112
+ lines.push(`Its id is set at: ${shownPath(location.file, files)}:${at}`);
113
+ const set = sourceLine(location.file, at, files);
114
+ if (set !== null)
115
+ lines.push(` ${at} | ${set}`);
116
+ }
117
+ }
118
+ }
119
+ else {
120
+ lines.push("Written at: unknown (Metro didn't map it; the app may be a release build or loaded without Metro).");
121
+ }
122
+ const shown = Object.entries(props).map(([k, v]) => `${k}=${v}`);
123
+ if (shown.length > 0)
124
+ lines.push(`Props: ${shown.join(", ")}`);
125
+ return lines.join("\n");
126
+ }
127
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts CHANGED
@@ -3,8 +3,11 @@ import { type ResolveOptions } from "./config.js";
3
3
  import { TaplineTools } from "./tools.js";
4
4
  /** Registers every Tapline tool on an MCP server. */
5
5
  export declare function createMcpServer(tools: TaplineTools): McpServer;
6
- /** Runs the host and serves MCP over stdio. stdout is reserved for the protocol; everything else goes to stderr. */
7
6
  export declare function runMcp(options?: ResolveOptions & {
8
7
  screenshots?: string;
9
8
  viewer?: string;
9
+ noLog?: boolean;
10
+ policy?: string;
11
+ noPolicy?: boolean;
12
+ viewerLink?: boolean;
10
13
  }): Promise<boolean>;
package/dist/mcp.js CHANGED
@@ -2,8 +2,11 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
3
  import { join } from "node:path";
4
4
  import { configDir, hostUrl, reachableHost, resolveConfig, screenshotMode, viewerMode, } from "./config.js";
5
+ import { spawn } from "node:child_process";
5
6
  import { randomBytes } from "node:crypto";
6
7
  import { ControlQueue } from "./control.js";
8
+ import { Confirmations } from "./confirm.js";
9
+ import { DEFAULT_POLICY, NO_POLICY, loadPolicy } from "./policy.js";
7
10
  import { VIEWER_ACCEPTS, ViewerHub, viewerStatusForHost } from "./viewer.js";
8
11
  import { VIEWER_HTML } from "./viewer-page.js";
9
12
  import { TaplineHost } from "./server.js";
@@ -11,7 +14,7 @@ import { INSTRUCTIONS, toolDescription } from "./tool-text.js";
11
14
  import { TaplineTools, toolShapes } from "./tools.js";
12
15
  /** Registers every Tapline tool on an MCP server. */
13
16
  export function createMcpServer(tools) {
14
- const server = new McpServer({ name: "tapline", version: "1.0.0" }, { instructions: INSTRUCTIONS });
17
+ const server = new McpServer({ name: "tapline", version: "1.1.0" }, { instructions: INSTRUCTIONS });
15
18
  server.registerTool("apps", {
16
19
  title: "Connected apps",
17
20
  description: toolDescription("apps"),
@@ -40,6 +43,23 @@ export function createMcpServer(tools) {
40
43
  inputSchema: toolShapes.check_layout,
41
44
  annotations: { readOnlyHint: true },
42
45
  }, (args) => tools.checkLayout(args));
46
+ server.registerTool("run", {
47
+ title: "Run several steps",
48
+ description: toolDescription("run"),
49
+ inputSchema: toolShapes.run,
50
+ }, (args) => tools.run(args));
51
+ server.registerTool("audit", {
52
+ title: "Audit the screen's accessibility",
53
+ description: toolDescription("audit"),
54
+ inputSchema: toolShapes.audit,
55
+ annotations: { readOnlyHint: true },
56
+ }, (args) => tools.audit(args));
57
+ server.registerTool("inspect", {
58
+ title: "Find the code behind an element",
59
+ description: toolDescription("inspect"),
60
+ inputSchema: toolShapes.inspect,
61
+ annotations: { readOnlyHint: true },
62
+ }, (args) => tools.inspect(args));
43
63
  server.registerTool("tap", {
44
64
  title: "Tap",
45
65
  description: toolDescription("tap"),
@@ -141,12 +161,32 @@ function log(message) {
141
161
  process.stderr.write(`[tapline] ${message}\n`);
142
162
  }
143
163
  /** Runs the host and serves MCP over stdio. stdout is reserved for the protocol; everything else goes to stderr. */
164
+ /** Opens a link in the default browser of this computer; false when that couldn't start. */
165
+ function openInBrowser(link) {
166
+ try {
167
+ const [command, args] = process.platform === "win32"
168
+ ? ["cmd", ["/c", "start", "", link.replace(/&/g, "^&")]]
169
+ : process.platform === "darwin"
170
+ ? ["open", [link]]
171
+ : ["xdg-open", [link]];
172
+ const child = spawn(command, args, { detached: true, stdio: "ignore", windowsHide: true });
173
+ child.on("error", () => undefined);
174
+ child.unref();
175
+ return true;
176
+ }
177
+ catch {
178
+ return false;
179
+ }
180
+ }
144
181
  export async function runMcp(options = {}) {
145
182
  let screenshots;
146
183
  let viewer;
184
+ let policy;
147
185
  try {
148
186
  screenshots = screenshotMode(options.screenshots, options.env);
149
187
  viewer = viewerMode(options.viewer, options.env);
188
+ // The safety policy (AGENT-TOOLS 1.8 §11): built in, from --policy FILE, or none with --no-policy.
189
+ policy = options.noPolicy === true ? NO_POLICY : options.policy !== undefined ? loadPolicy(options.policy) : DEFAULT_POLICY;
150
190
  }
151
191
  catch (error) {
152
192
  log(error instanceof Error ? error.message : String(error));
@@ -190,20 +230,29 @@ export async function runMcp(options = {}) {
190
230
  ...(remoteViewer ? [`http://${config.tailscaleIp}:${port}/viewer?token=${viewerToken} (from your own devices on Tailscale)`] : []),
191
231
  ];
192
232
  const control = new ControlQueue();
233
+ const confirmations = new Confirmations();
193
234
  let hub;
194
235
  const tools = new TaplineTools(host, {
236
+ policy,
237
+ confirmations,
238
+ canConfirm: viewer !== "off",
195
239
  connect: { url, name: config.name },
196
240
  pairImagePath: join(configDir(), `pair-${port}.png`),
241
+ offerDir: join(configDir(), "offers"),
197
242
  screenshots,
198
243
  screenshotDir: join(configDir(), "shots"),
199
244
  scriptsDir: join(configDir(), "scripts"),
200
245
  baselinesDir: join(configDir(), "baselines"),
246
+ // The action log (AGENT-TOOLS 1.8 §12), unless --no-log
247
+ ...(options.noLog === true ? {} : { logDir: join(configDir(), "log") }),
201
248
  ...(viewer === "off"
202
249
  ? {}
203
250
  : {
204
251
  control,
205
252
  onAction: (action) => hub?.pushAction(action),
206
253
  viewerLinks: () => viewerLinks,
254
+ openViewer: (link) => openInBrowser(link),
255
+ viewerLinkToAgent: options.viewerLink === true || process.env["TAPLINE_VIEWER_LINK"] === "1",
207
256
  viewerFeed: () => hub?.feed() ?? { on: false, quality: "balanced" },
208
257
  }),
209
258
  });
@@ -225,6 +274,7 @@ export async function runMcp(options = {}) {
225
274
  },
226
275
  readOverlay: () => tools.readOverlay(),
227
276
  runInput: (input) => tools.personInput(input),
277
+ confirmations,
228
278
  });
229
279
  hub = live;
230
280
  host.setHttpExtension(live);
@@ -239,7 +289,11 @@ export async function runMcp(options = {}) {
239
289
  host.on("notAnswering", appStatus);
240
290
  host.on("answering", appStatus);
241
291
  appStatus();
242
- log(`live viewer: ${remoteViewer ? "this computer and your Tailscale devices" : "this computer only"} (the viewer tool gives the link)`);
292
+ log(`live viewer: ${remoteViewer ? "this computer and your Tailscale devices" : "this computer only"} (the viewer tool opens it in a browser here)`);
293
+ // The link for the user's own devices: here in the log, never in an answer to the agent.
294
+ if (remoteViewer)
295
+ for (const link of viewerLinks.slice(1))
296
+ log(`live viewer for your devices: ${link}`);
243
297
  }
244
298
  if (screenshots === "file")
245
299
  log(`screenshots are saved in ${join(configDir(), "shots")} (newest 50 kept)`);
package/dist/mcp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * AGENT-TOOLS 1.8 §11: the safety policy. Words that need a person's OK before a touch, words that are
4
+ * blocked outright, per app. A word matches the touched element's own label or text, whole words,
5
+ * ignoring case ("Delete trip" matches "Delete"; "Deleted" doesn't). testIDs are never matched.
6
+ */
7
+ export declare const DEFAULT_CONFIRM: string[];
8
+ export declare const policySchema: z.ZodObject<{
9
+ version: z.ZodLiteral<1>;
10
+ confirm: z.ZodOptional<z.ZodArray<z.ZodString>>;
11
+ block: z.ZodOptional<z.ZodArray<z.ZodString>>;
12
+ apps: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
13
+ confirm: z.ZodOptional<z.ZodArray<z.ZodString>>;
14
+ block: z.ZodOptional<z.ZodArray<z.ZodString>>;
15
+ }, z.core.$strip>>>;
16
+ }, z.core.$strip>;
17
+ export type PolicyFile = z.infer<typeof policySchema>;
18
+ export interface Lists {
19
+ confirm: string[];
20
+ block: string[];
21
+ }
22
+ export declare const DEFAULT_POLICY: PolicyFile;
23
+ export declare const NO_POLICY: PolicyFile;
24
+ /** Reads `--policy FILE`; throws with a plain message when it isn't one. */
25
+ export declare function loadPolicy(path: string): PolicyFile;
26
+ /** The lists for one app: its own lists replace the global ones where it has them. */
27
+ export declare function listsFor(policy: PolicyFile, app: {
28
+ id?: string;
29
+ name: string;
30
+ } | undefined): Lists;
31
+ /** The first word of the list that the element's own label or text names, whole words, ignoring case. */
32
+ export declare function matchWord(words: string[], element: {
33
+ label?: string | null;
34
+ text?: string | null;
35
+ }): string | null;
36
+ /** What a person's OK is tied to: the same tool on the same element (its id, else its role, label and text). */
37
+ export declare function elementKey(element: {
38
+ testID?: string | null;
39
+ role?: string | null;
40
+ label?: string | null;
41
+ text?: string | null;
42
+ }): string;
package/dist/policy.js ADDED
@@ -0,0 +1,74 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { z } from "zod";
3
+ /**
4
+ * AGENT-TOOLS 1.8 §11: the safety policy. Words that need a person's OK before a touch, words that are
5
+ * blocked outright, per app. A word matches the touched element's own label or text, whole words,
6
+ * ignoring case ("Delete trip" matches "Delete"; "Deleted" doesn't). testIDs are never matched.
7
+ */
8
+ export const DEFAULT_CONFIRM = [
9
+ "Buy",
10
+ "Purchase",
11
+ "Subscribe",
12
+ "Pay",
13
+ "Delete",
14
+ "Remove",
15
+ "Send",
16
+ "Post",
17
+ "Publish",
18
+ "Sign out",
19
+ "Log out",
20
+ "Erase",
21
+ ];
22
+ const listsSchema = z.object({ confirm: z.array(z.string()).optional(), block: z.array(z.string()).optional() });
23
+ export const policySchema = z.object({
24
+ version: z.literal(1),
25
+ confirm: z.array(z.string()).optional(),
26
+ block: z.array(z.string()).optional(),
27
+ apps: z.record(z.string(), listsSchema).optional(),
28
+ });
29
+ export const DEFAULT_POLICY = { version: 1, confirm: DEFAULT_CONFIRM, block: [] };
30
+ export const NO_POLICY = { version: 1, confirm: [], block: [] };
31
+ /** Reads `--policy FILE`; throws with a plain message when it isn't one. */
32
+ export function loadPolicy(path) {
33
+ let json;
34
+ try {
35
+ json = JSON.parse(readFileSync(path, "utf8"));
36
+ }
37
+ catch (error) {
38
+ throw new Error(`couldn't read the policy ${path}: ${error instanceof Error ? error.message : String(error)}`);
39
+ }
40
+ const parsed = policySchema.safeParse(json);
41
+ if (!parsed.success)
42
+ throw new Error(`${path} isn't a policy (version 1, with confirm, block and apps lists)`);
43
+ // A file that names only words to block keeps the built-in words to confirm; `"confirm": []` turns them off.
44
+ return { ...parsed.data, confirm: parsed.data.confirm ?? DEFAULT_CONFIRM };
45
+ }
46
+ /** The lists for one app: its own lists replace the global ones where it has them. */
47
+ export function listsFor(policy, app) {
48
+ const own = app === undefined ? undefined : (policy.apps?.[app.id ?? ""] ?? policy.apps?.[app.name]);
49
+ return {
50
+ confirm: own?.confirm ?? policy.confirm ?? [],
51
+ block: own?.block ?? policy.block ?? [],
52
+ };
53
+ }
54
+ function escape(word) {
55
+ return word.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
56
+ }
57
+ /** The first word of the list that the element's own label or text names, whole words, ignoring case. */
58
+ export function matchWord(words, element) {
59
+ const said = [element.label ?? "", element.text ?? ""].filter((s) => s !== "");
60
+ for (const word of words) {
61
+ const w = word.trim();
62
+ if (w === "")
63
+ continue;
64
+ const re = new RegExp(`(^|[^\\p{L}\\p{N}])${escape(w)}($|[^\\p{L}\\p{N}])`, "iu");
65
+ if (said.some((s) => re.test(s)))
66
+ return w;
67
+ }
68
+ return null;
69
+ }
70
+ /** What a person's OK is tied to: the same tool on the same element (its id, else its role, label and text). */
71
+ export function elementKey(element) {
72
+ return element.testID ? `id:${element.testID}` : `el:${element.role ?? ""}|${element.label ?? ""}|${element.text ?? ""}`;
73
+ }
74
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
package/dist/run.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * AGENT-TOOLS 1.8 §9: `run`, a batch of ordinary tool calls that is also a script. Runs the steps in order,
4
+ * stops at the first failed call or expectation, and answers once. Tapline's executor is the host: each step
5
+ * goes to the app as it would alone (no screen list in between), and the one change block at the end covers
6
+ * the whole batch.
7
+ */
8
+ export declare const RUN_TOOLS: readonly ["tap", "long_press", "type_text", "scroll", "toggle", "back", "swipe", "open_url", "wait", "wait_for", "app_command"];
9
+ export type RunTool = (typeof RUN_TOOLS)[number];
10
+ /** Tools a step may not be (they read or manage, rather than act): `bad_params`. */
11
+ export declare const NOT_IN_RUN: string[];
12
+ export declare const expectSchema: z.ZodObject<{
13
+ text: z.ZodOptional<z.ZodString>;
14
+ id: z.ZodOptional<z.ZodString>;
15
+ label: z.ZodOptional<z.ZodString>;
16
+ gone: z.ZodOptional<z.ZodBoolean>;
17
+ value: z.ZodOptional<z.ZodString>;
18
+ timeout: z.ZodOptional<z.ZodNumber>;
19
+ }, z.core.$strip>;
20
+ export type Expect = z.infer<typeof expectSchema>;
21
+ export declare const stepSchema: z.ZodObject<{
22
+ tool: z.ZodString;
23
+ expect: 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
+ value: z.ZodOptional<z.ZodString>;
29
+ timeout: z.ZodOptional<z.ZodNumber>;
30
+ }, z.core.$strip>>;
31
+ }, z.core.$loose>;
32
+ export type Step = z.infer<typeof stepSchema>;
33
+ export declare const MAX_STEPS = 50;
34
+ export declare const RUN_TIMEOUT_MS = 120000;
35
+ export declare const EXPECT_TIMEOUT_S = 2;
36
+ /** How the answer names a step: its tool and its target as the agent wrote it (`tap "Save"`, `tap id=save`). */
37
+ export declare function describeRunStep(step: Step): string;
38
+ /** How a failed expectation reads: `text "Saved" didn't appear within 2 s`. */
39
+ export declare function expectFailure(e: Expect, seconds: number, actual?: string): string;
40
+ /** `Note:` lines from a step's own answer, labelled with the step (`Note (step 2): closed the keyboard first.`). */
41
+ export declare function stepNotes(answer: string, step: number): string[];
42
+ /** The error line of a failed step's answer, split into its code and message. */
43
+ export declare function parseError(answer: string): {
44
+ code: string;
45
+ message: string;
46
+ rest: string[];
47
+ };
package/dist/run.js ADDED
@@ -0,0 +1,88 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * AGENT-TOOLS 1.8 §9: `run`, a batch of ordinary tool calls that is also a script. Runs the steps in order,
4
+ * stops at the first failed call or expectation, and answers once. Tapline's executor is the host: each step
5
+ * goes to the app as it would alone (no screen list in between), and the one change block at the end covers
6
+ * the whole batch.
7
+ */
8
+ export const RUN_TOOLS = ["tap", "long_press", "type_text", "scroll", "toggle", "back", "swipe", "open_url", "wait", "wait_for", "app_command"];
9
+ /** Tools a step may not be (they read or manage, rather than act): `bad_params`. */
10
+ export const NOT_IN_RUN = ["look", "run", "audit", "apps", "viewer", "record", "replay", "inspect", "check_layout", "pair", "open_app", "logs", "reload", "compare_screen", "filmstrip"];
11
+ export const expectSchema = z
12
+ .object({
13
+ text: z.string().optional(),
14
+ id: z.string().optional(),
15
+ label: z.string().optional(),
16
+ gone: z.boolean().optional(),
17
+ value: z.string().optional(),
18
+ timeout: z.number().min(0.5).max(30).optional(),
19
+ })
20
+ .refine((e) => [e.text, e.id, e.label].filter((v) => v !== undefined).length === 1, {
21
+ message: "expect needs exactly one of text, id or label",
22
+ })
23
+ .refine((e) => e.value === undefined || e.text === undefined, { message: "expect.value goes with id or label" });
24
+ export const stepSchema = z
25
+ .object({ tool: z.string(), expect: expectSchema.optional() })
26
+ .passthrough();
27
+ export const MAX_STEPS = 50;
28
+ export const RUN_TIMEOUT_MS = 120_000;
29
+ export const EXPECT_TIMEOUT_S = 2;
30
+ /** How the answer names a step: its tool and its target as the agent wrote it (`tap "Save"`, `tap id=save`). */
31
+ export function describeRunStep(step) {
32
+ const p = step;
33
+ const target = p["target"];
34
+ let where = "";
35
+ if (typeof target === "object" && target !== null) {
36
+ const t = target;
37
+ if (typeof t["id"] === "string")
38
+ where = `id=${t["id"]}`;
39
+ else if (typeof t["text"] === "string")
40
+ where = JSON.stringify(t["text"]);
41
+ else if (typeof t["label"] === "string")
42
+ where = JSON.stringify(t["label"]);
43
+ else if (typeof t["ref"] === "string")
44
+ where = String(t["ref"]);
45
+ else if (typeof t["x"] === "number")
46
+ where = `${String(t["x"])},${String(t["y"])}`;
47
+ }
48
+ switch (step.tool) {
49
+ case "scroll":
50
+ return `scroll ${typeof p["to"] === "string" ? `to ${p["to"]}` : typeof p["direction"] === "string" ? p["direction"] : "down"}${where ? ` ${where}` : ""}`;
51
+ case "wait":
52
+ return `wait ${Number(p["seconds"] ?? 0).toFixed(1)}`;
53
+ case "wait_for": {
54
+ const what = typeof p["text"] === "string" ? JSON.stringify(p["text"]) : typeof p["id"] === "string" ? `id=${p["id"]}` : typeof p["label"] === "string" ? JSON.stringify(p["label"]) : "";
55
+ return `wait_for ${what}${p["gone"] === true ? " gone" : ""}`.trim();
56
+ }
57
+ case "open_url":
58
+ return "open_url";
59
+ case "app_command":
60
+ return `app_command ${String(p["name"] ?? "")}`.trim();
61
+ case "back":
62
+ return "back";
63
+ default:
64
+ return where ? `${step.tool} ${where}` : step.tool;
65
+ }
66
+ }
67
+ /** How a failed expectation reads: `text "Saved" didn't appear within 2 s`. */
68
+ export function expectFailure(e, seconds, actual) {
69
+ const what = e.text !== undefined ? `text ${JSON.stringify(e.text)}` : e.id !== undefined ? `id ${JSON.stringify(e.id)}` : `label ${JSON.stringify(e.label)}`;
70
+ if (e.value !== undefined) {
71
+ return `${what} didn't have the value ${JSON.stringify(e.value)} within ${seconds} s${actual !== undefined ? ` (it has ${JSON.stringify(actual)})` : ""}`;
72
+ }
73
+ return e.gone === true ? `${what} didn't go away within ${seconds} s` : `${what} didn't appear within ${seconds} s`;
74
+ }
75
+ /** `Note:` lines from a step's own answer, labelled with the step (`Note (step 2): closed the keyboard first.`). */
76
+ export function stepNotes(answer, step) {
77
+ return answer
78
+ .split("\n")
79
+ .filter((line) => line.startsWith("Note: ") && !line.startsWith("Note: changes are since your last list"))
80
+ .map((line) => `Note (step ${step}): ${line.slice("Note: ".length)}`);
81
+ }
82
+ /** The error line of a failed step's answer, split into its code and message. */
83
+ export function parseError(answer) {
84
+ const [first = "", ...rest] = answer.split("\n");
85
+ const m = /^Error (\w+): (.*)$/.exec(first);
86
+ return m ? { code: m[1], message: m[2], rest } : { code: "internal", message: first, rest };
87
+ }
88
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}