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.
- package/dist/accounts.d.ts +72 -0
- package/dist/accounts.js +208 -0
- package/dist/accounts.js.map +1 -0
- package/dist/actionlog.d.ts +20 -0
- package/dist/actionlog.js.map +1 -1
- package/dist/animations.d.ts +39 -0
- package/dist/animations.js +124 -0
- package/dist/animations.js.map +1 -0
- package/dist/api.d.ts +43 -0
- package/dist/api.js +154 -0
- package/dist/api.js.map +1 -0
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +1 -1
- package/dist/audit.js.map +1 -1
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +19 -0
- package/dist/bin.js.map +1 -0
- package/dist/brief.d.ts +41 -0
- package/dist/brief.js +78 -0
- package/dist/brief.js.map +1 -0
- package/dist/cli.d.ts +41 -1
- package/dist/cli.js +100 -53
- package/dist/cli.js.map +1 -1
- package/dist/conditions.d.ts +36 -0
- package/dist/conditions.js +67 -0
- package/dist/conditions.js.map +1 -0
- package/dist/confirm.d.ts +21 -2
- package/dist/confirm.js +39 -6
- package/dist/confirm.js.map +1 -1
- package/dist/dispatch.d.ts +27 -0
- package/dist/dispatch.js +114 -0
- package/dist/dispatch.js.map +1 -0
- package/dist/doctor.d.ts +5 -0
- package/dist/doctor.js +20 -0
- package/dist/doctor.js.map +1 -1
- package/dist/drive.d.ts +184 -0
- package/dist/drive.js +908 -0
- package/dist/drive.js.map +1 -0
- package/dist/elicit.d.ts +90 -0
- package/dist/elicit.js +179 -0
- package/dist/elicit.js.map +1 -0
- package/dist/format.d.ts +16 -0
- package/dist/format.js +81 -24
- package/dist/format.js.map +1 -1
- package/dist/images.d.ts +35 -0
- package/dist/images.js +76 -6
- package/dist/images.js.map +1 -1
- package/dist/inspect.d.ts +1 -0
- package/dist/journey.d.ts +276 -0
- package/dist/journey.js +368 -0
- package/dist/journey.js.map +1 -0
- package/dist/journeyexport.d.ts +58 -0
- package/dist/journeyexport.js +318 -0
- package/dist/journeyexport.js.map +1 -0
- package/dist/journeygif.d.ts +62 -0
- package/dist/journeygif.js +192 -0
- package/dist/journeygif.js.map +1 -0
- package/dist/journeyreport.d.ts +202 -0
- package/dist/journeyreport.js +666 -0
- package/dist/journeyreport.js.map +1 -0
- package/dist/mapcmd.d.ts +200 -0
- package/dist/mapcmd.js +412 -0
- package/dist/mapcmd.js.map +1 -0
- package/dist/mapfile.d.ts +155 -0
- package/dist/mapfile.js +575 -0
- package/dist/mapfile.js.map +1 -0
- package/dist/mcp.d.ts +14 -11
- package/dist/mcp.js +50 -318
- package/dist/mcp.js.map +1 -1
- package/dist/media.d.ts +88 -0
- package/dist/media.js +263 -0
- package/dist/media.js.map +1 -0
- package/dist/nochange.d.ts +77 -0
- package/dist/nochange.js +77 -0
- package/dist/nochange.js.map +1 -0
- package/dist/places.d.ts +239 -0
- package/dist/places.js +823 -0
- package/dist/places.js.map +1 -0
- package/dist/policy.d.ts +18 -0
- package/dist/policy.js +52 -0
- package/dist/policy.js.map +1 -1
- package/dist/protocol.d.ts +27 -1
- package/dist/protocol.js +25 -0
- package/dist/protocol.js.map +1 -1
- package/dist/reflexes.d.ts +59 -0
- package/dist/reflexes.js +133 -0
- package/dist/reflexes.js.map +1 -0
- package/dist/report.d.ts +32 -2
- package/dist/report.js +154 -9
- package/dist/report.js.map +1 -1
- package/dist/routes.d.ts +115 -0
- package/dist/routes.js +287 -0
- package/dist/routes.js.map +1 -0
- package/dist/run.d.ts +28 -1
- package/dist/run.js +32 -3
- package/dist/run.js.map +1 -1
- package/dist/runtime.d.ts +60 -0
- package/dist/runtime.js +255 -0
- package/dist/runtime.js.map +1 -0
- package/dist/script.d.ts +114 -10
- package/dist/script.js +30 -2
- package/dist/script.js.map +1 -1
- package/dist/server.d.ts +48 -2
- package/dist/server.js +88 -13
- package/dist/server.js.map +1 -1
- package/dist/thincall.d.ts +13 -0
- package/dist/thincall.js +335 -0
- package/dist/thincall.js.map +1 -0
- package/dist/tool-text-data.d.ts +10 -5
- package/dist/tool-text-data.js +11 -6
- package/dist/tool-text-data.js.map +1 -1
- package/dist/tool-text.d.ts +1 -1
- package/dist/tools.d.ts +585 -5
- package/dist/tools.js +2926 -185
- package/dist/tools.js.map +1 -1
- package/dist/uxcheck.d.ts +103 -0
- package/dist/uxcheck.js +128 -0
- package/dist/uxcheck.js.map +1 -0
- package/package.json +3 -2
- package/skills/tapline/SKILL.md +57 -11
- package/skills/tapline/references/personas.md +45 -0
- package/skills/tapline/references/setup.md +6 -1
package/dist/api.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
2
|
+
/** The most a call's JSON may be. */
|
|
3
|
+
export const MAX_API_BODY = 1024 * 1024;
|
|
4
|
+
export function safeEqual(a, b) {
|
|
5
|
+
const left = Buffer.from(a, "utf8");
|
|
6
|
+
const right = Buffer.from(b, "utf8");
|
|
7
|
+
if (left.length !== right.length)
|
|
8
|
+
return false;
|
|
9
|
+
return timingSafeEqual(left, right);
|
|
10
|
+
}
|
|
11
|
+
/** An address as one spelling: no brackets, lower case, and an IPv4-mapped IPv6 address as plain IPv4. */
|
|
12
|
+
export function normalizeAddress(address) {
|
|
13
|
+
const plain = address.toLowerCase().replace(/^\[|\]$/g, "");
|
|
14
|
+
return plain.startsWith("::ffff:") && plain.includes(".") ? plain.slice("::ffff:".length) : plain;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The host's proof that it holds the token: an HMAC of the caller's fresh challenge and of the address and port the request
|
|
18
|
+
* arrived on, keyed by the token. They are in it so that a listener on another port, or on another address with the same
|
|
19
|
+
* port (::1 against 127.0.0.1), can't relay the probe to the real host and hand its proof back: a proof made for one
|
|
20
|
+
* endpoint never verifies for another. The token itself never leaves; thincall.ts computes the same value from the socket
|
|
21
|
+
* it connected to and sends the token only to a host that proves it for that endpoint.
|
|
22
|
+
*/
|
|
23
|
+
export function hostProof(token, challenge, address, port) {
|
|
24
|
+
return createHmac("sha256", token).update(`tapline-proof-v1\n${challenge}\n${normalizeAddress(address)}\n${port}`).digest("hex");
|
|
25
|
+
}
|
|
26
|
+
export function toApiAnswer(result) {
|
|
27
|
+
const parts = [];
|
|
28
|
+
let image;
|
|
29
|
+
for (const block of result.content) {
|
|
30
|
+
if (block.type === "text")
|
|
31
|
+
parts.push(block.text);
|
|
32
|
+
else if (block.type === "image" && image === undefined)
|
|
33
|
+
image = { mimeType: block.mimeType, dataBase64: block.data };
|
|
34
|
+
}
|
|
35
|
+
return { text: parts.join("\n"), isError: result.isError === true, ...(image !== undefined ? { image } : {}) };
|
|
36
|
+
}
|
|
37
|
+
function plain(res, status, text) {
|
|
38
|
+
res.writeHead(status, { "content-type": "text/plain; charset=utf-8" });
|
|
39
|
+
res.end(`${text}\n`);
|
|
40
|
+
}
|
|
41
|
+
function clientOf(req) {
|
|
42
|
+
const raw = req.headers["x-agent-client"];
|
|
43
|
+
const value = (Array.isArray(raw) ? raw[0] : raw)?.replace(/[^\w .@/-]/g, "").slice(0, 60);
|
|
44
|
+
return value !== undefined && value !== "" ? value : undefined;
|
|
45
|
+
}
|
|
46
|
+
/** Answers `/api/<tool>`; false for any other path. Checks run in the order this computer, method, token. */
|
|
47
|
+
export function handleApi(req, res, context) {
|
|
48
|
+
const path = new URL(req.url ?? "/", "http://host").pathname;
|
|
49
|
+
if (!path.startsWith("/api/"))
|
|
50
|
+
return false;
|
|
51
|
+
if (!context.loopback) {
|
|
52
|
+
plain(res, 403, "Only from this computer.");
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
if (context.handler === undefined) {
|
|
56
|
+
plain(res, 404, 'The thin call is served by "tapline host" only, not by an agent\'s MCP server.');
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if (req.method !== "POST") {
|
|
60
|
+
// A thin call asks who it is talking to before it sends the token: only a host that holds the token can answer.
|
|
61
|
+
const challenge = req.headers["x-tapline-challenge"];
|
|
62
|
+
const port = req.socket.localPort;
|
|
63
|
+
const address = req.socket.localAddress;
|
|
64
|
+
const proof = typeof challenge === "string" && port !== undefined && address !== undefined && /^[0-9a-f]{16,128}$/.test(challenge)
|
|
65
|
+
? hostProof(context.token, challenge, address, port)
|
|
66
|
+
: undefined;
|
|
67
|
+
res.writeHead(405, { "content-type": "text/plain; charset=utf-8", ...(proof !== undefined ? { "x-tapline-proof": proof } : {}) });
|
|
68
|
+
res.end("POST only.\n");
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
const auth = req.headers.authorization;
|
|
72
|
+
if (typeof auth !== "string" || !auth.startsWith("Bearer ") || !safeEqual(auth.slice(7).trim(), context.token)) {
|
|
73
|
+
plain(res, 401, "Bearer token required.");
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
const handler = context.handler;
|
|
77
|
+
let tool;
|
|
78
|
+
try {
|
|
79
|
+
tool = decodeURIComponent(path.slice("/api/".length));
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
tool = "";
|
|
83
|
+
}
|
|
84
|
+
const client = clientOf(req);
|
|
85
|
+
const chunks = [];
|
|
86
|
+
let size = 0;
|
|
87
|
+
let tooLong = false;
|
|
88
|
+
let gone = false;
|
|
89
|
+
// A client that leaves before its answer is cancelled: queued work for it is never started.
|
|
90
|
+
const cancel = new AbortController();
|
|
91
|
+
res.on("close", () => {
|
|
92
|
+
if (!res.writableEnded)
|
|
93
|
+
cancel.abort();
|
|
94
|
+
});
|
|
95
|
+
// A peer that drops mid-body or resets: stop quietly, never throw an unhandled error event.
|
|
96
|
+
req.on("error", () => {
|
|
97
|
+
gone = true;
|
|
98
|
+
cancel.abort();
|
|
99
|
+
if (!res.writableEnded)
|
|
100
|
+
res.destroy();
|
|
101
|
+
});
|
|
102
|
+
req.on("aborted", () => {
|
|
103
|
+
gone = true;
|
|
104
|
+
cancel.abort();
|
|
105
|
+
});
|
|
106
|
+
req.on("data", (chunk) => {
|
|
107
|
+
size += chunk.length;
|
|
108
|
+
if (size > MAX_API_BODY)
|
|
109
|
+
tooLong = true;
|
|
110
|
+
else
|
|
111
|
+
chunks.push(chunk);
|
|
112
|
+
});
|
|
113
|
+
req.on("end", () => {
|
|
114
|
+
if (gone || (req.destroyed && !req.complete))
|
|
115
|
+
return;
|
|
116
|
+
let args;
|
|
117
|
+
try {
|
|
118
|
+
const text = Buffer.concat(chunks).toString("utf8").trim();
|
|
119
|
+
const parsed = tooLong ? undefined : text === "" ? {} : JSON.parse(text);
|
|
120
|
+
if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed))
|
|
121
|
+
args = parsed;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
args = undefined;
|
|
125
|
+
}
|
|
126
|
+
if (args === undefined) {
|
|
127
|
+
plain(res, 400, "Body: a JSON object of at most 1 MB.");
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
handler(tool, args, client, cancel.signal).then((result) => {
|
|
131
|
+
if (cancel.signal.aborted)
|
|
132
|
+
return; // nobody is waiting for the answer
|
|
133
|
+
if (result === undefined) {
|
|
134
|
+
plain(res, 404, `Unknown tool "${tool}".`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
res.writeHead(200, { "content-type": "application/json; charset=utf-8" });
|
|
138
|
+
res.end(JSON.stringify(toApiAnswer(result)));
|
|
139
|
+
}, (error) => {
|
|
140
|
+
if (cancel.signal.aborted)
|
|
141
|
+
return;
|
|
142
|
+
if (res.headersSent) {
|
|
143
|
+
res.end();
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
// Same shape as a tool's own failure, so a caller reads one kind of answer.
|
|
147
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
148
|
+
res.writeHead(200, { "content-type": "application/json; charset=utf-8" });
|
|
149
|
+
res.end(JSON.stringify({ text: `Error internal: ${message}`, isError: true }));
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/audit.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ export declare const auditResultSchema: z.ZodObject<{
|
|
|
26
26
|
disabled: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
27
27
|
selected: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
28
28
|
checked: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>>;
|
|
29
|
+
row: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
29
30
|
}, z.core.$strip>>>;
|
|
30
31
|
where: z.ZodOptional<z.ZodObject<{
|
|
31
32
|
frame: z.ZodOptional<z.ZodObject<{
|
|
@@ -48,6 +49,8 @@ export declare const auditResultSchema: z.ZodObject<{
|
|
|
48
49
|
checked: z.ZodArray<z.ZodString>;
|
|
49
50
|
}, z.core.$strip>;
|
|
50
51
|
export type AuditResult = z.infer<typeof auditResultSchema>;
|
|
52
|
+
/** An issue without an element: what is known of it, else "the screen" (only when nothing at all is). */
|
|
53
|
+
export declare function whereWords(where: AuditResult["issues"][number]["where"]): string;
|
|
51
54
|
/** The report: header, numbered issues (each `at` on its own line when known), then what was checked. */
|
|
52
55
|
export declare function formatAudit(title: string, result: AuditResult, asked: readonly string[] | undefined, pathOf?: (file: string) => string): string;
|
|
53
56
|
/** The screen's name for the header: the focused route's, else the app's. */
|
package/dist/audit.js
CHANGED
|
@@ -34,7 +34,7 @@ export const auditResultSchema = z.object({
|
|
|
34
34
|
checked: z.array(z.string()),
|
|
35
35
|
});
|
|
36
36
|
/** An issue without an element: what is known of it, else "the screen" (only when nothing at all is). */
|
|
37
|
-
function whereWords(where) {
|
|
37
|
+
export function whereWords(where) {
|
|
38
38
|
if (where === undefined)
|
|
39
39
|
return "the screen";
|
|
40
40
|
const name = where.label ?? where.text;
|
package/dist/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,6FAA6F;AAE7F,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,UAAU;IACV,YAAY;IACZ,aAAa;IACb,cAAc;IACd,cAAc;IACd,OAAO;IACP,mBAAmB;IACnB,SAAS;IACT,cAAc;CACN,CAAC;AAGX,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE;QAChC,oGAAoG;QACpG,KAAK,EAAE,CAAC;aACL,MAAM,CAAC;YACN,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;YACnG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC7B,CAAC;aACD,QAAQ,EAAE;QACb,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;KAChG,CAAC,CACH;IACD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC7B,CAAC,CAAC;AAGH,yGAAyG;AACzG,
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.d.ts
ADDED
package/dist/bin.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// The `tapline` command. A thin call must start in about 50 ms, so this file loads nothing at the top: `call` goes
|
|
3
|
+
// to thincall.ts (node: modules only) and every other command loads cli.ts (the host, MCP, qrcode, zod) lazily.
|
|
4
|
+
const argv = process.argv.slice(2);
|
|
5
|
+
async function start() {
|
|
6
|
+
if (argv[0] === "call") {
|
|
7
|
+
const { runThinCall } = await import("./thincall.js");
|
|
8
|
+
process.exitCode = await runThinCall(argv.slice(1));
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const { runMain } = await import("./cli.js");
|
|
12
|
+
runMain(argv);
|
|
13
|
+
}
|
|
14
|
+
start().catch((error) => {
|
|
15
|
+
process.stderr.write(`tapline: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
});
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,mHAAmH;AACnH,gHAAgH;AAChH,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,KAAK,UAAU,KAAK;IAClB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACtD,OAAO,CAAC,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/brief.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { TreeElement } from "./protocol.js";
|
|
2
|
+
/** The most lines a brief answer shows of a change block, or of a new screen (AGENT-TOOLS 1.13 §13.4). */
|
|
3
|
+
export declare const BRIEF_MAX_LINES = 12;
|
|
4
|
+
export interface BriefInput {
|
|
5
|
+
/** The answer's first line. */
|
|
6
|
+
first: string;
|
|
7
|
+
/** The `Place: …` line, when known (task 12 supplies it). */
|
|
8
|
+
place?: string;
|
|
9
|
+
/** `Same screen. Changes:`, shown above the block (not counted in the 12). */
|
|
10
|
+
label?: string;
|
|
11
|
+
/** The change block's lines, in order. */
|
|
12
|
+
changes: string[];
|
|
13
|
+
/** A new screen: its lines replace the change block. */
|
|
14
|
+
screen?: {
|
|
15
|
+
headers: string[];
|
|
16
|
+
actionable: string[];
|
|
17
|
+
newText: string[];
|
|
18
|
+
};
|
|
19
|
+
/** Never cut: `Alert:`, `Network:`, `Keyboard:`, `Place:`, `Note:`, `Error`, `Reflex:` lines and the off-screen count. */
|
|
20
|
+
fixed: string[];
|
|
21
|
+
}
|
|
22
|
+
/** A cut change block keeps `+` text lines ahead of `~` and `↕` lines; the rest keep their order. */
|
|
23
|
+
export declare function orderForCut(changes: string[]): string[];
|
|
24
|
+
/** Builds the brief answer's lines. `…<n> more: look shows them.` ends a cut block. */
|
|
25
|
+
export declare function briefLines(input: BriefInput): string[];
|
|
26
|
+
/**
|
|
27
|
+
* Pressable elements count as actionable: buttons, inputs, switches, links, tabs, list rows, radios, checkboxes,
|
|
28
|
+
* and any element that takes a tap, a toggle or typing (AGENT-TOOLS 1.13.1 item 1).
|
|
29
|
+
*/
|
|
30
|
+
export declare function isActionable(element: TreeElement): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* A new screen in brief: its headers, its actionable elements and the text that wasn't in the list the agent had
|
|
33
|
+
* (`previous`). One line each, as a full list writes them, so refs keep working.
|
|
34
|
+
*/
|
|
35
|
+
export declare function briefScreen(elements: TreeElement[], previous: TreeElement[], options?: {
|
|
36
|
+
eyes?: boolean;
|
|
37
|
+
}): {
|
|
38
|
+
headers: string[];
|
|
39
|
+
actionable: string[];
|
|
40
|
+
newText: string[];
|
|
41
|
+
};
|
package/dist/brief.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { actionsOf, formatElement, roleOf } from "./format.js";
|
|
2
|
+
/** The most lines a brief answer shows of a change block, or of a new screen (AGENT-TOOLS 1.13 §13.4). */
|
|
3
|
+
export const BRIEF_MAX_LINES = 12;
|
|
4
|
+
/** Lines that close an answer; the others (`Alert:`, `Keyboard:`, `Network:`, `Place:`, the off-screen count) stand above the block. */
|
|
5
|
+
const TAIL = /^(Note\b|Error\b|Reflex:)/;
|
|
6
|
+
/** A `+` line for a text element: `+ e12 text "Wrong password" …`. */
|
|
7
|
+
const ADDED_TEXT = /^\+ (?:e\d+ )?text(?: |$)/;
|
|
8
|
+
/** A cut change block keeps `+` text lines ahead of `~` and `↕` lines; the rest keep their order. */
|
|
9
|
+
export function orderForCut(changes) {
|
|
10
|
+
return [...changes.filter((line) => ADDED_TEXT.test(line)), ...changes.filter((line) => !ADDED_TEXT.test(line))];
|
|
11
|
+
}
|
|
12
|
+
/** The line that ends a cut block. */
|
|
13
|
+
function moreLine(count) {
|
|
14
|
+
return `…${count} more: look shows them.`;
|
|
15
|
+
}
|
|
16
|
+
/** At most `BRIEF_MAX_LINES` of `lines` (already in cut order), then how many were left out. */
|
|
17
|
+
function cut(lines) {
|
|
18
|
+
if (lines.length <= BRIEF_MAX_LINES)
|
|
19
|
+
return lines;
|
|
20
|
+
return [...lines.slice(0, BRIEF_MAX_LINES), moreLine(lines.length - BRIEF_MAX_LINES)];
|
|
21
|
+
}
|
|
22
|
+
/** Builds the brief answer's lines. `…<n> more: look shows them.` ends a cut block. */
|
|
23
|
+
export function briefLines(input) {
|
|
24
|
+
const out = [input.first];
|
|
25
|
+
if (input.place !== undefined)
|
|
26
|
+
out.push(input.place);
|
|
27
|
+
const above = input.fixed.filter((line) => !TAIL.test(line));
|
|
28
|
+
const below = input.fixed.filter((line) => TAIL.test(line));
|
|
29
|
+
if (input.screen !== undefined) {
|
|
30
|
+
// New text first: it is what says an action failed ("Wrong password"), so a cut never takes it.
|
|
31
|
+
out.push(...above, ...cut([...input.screen.newText, ...input.screen.headers, ...input.screen.actionable]));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
if (input.label !== undefined)
|
|
35
|
+
out.push(input.label);
|
|
36
|
+
out.push(...above);
|
|
37
|
+
out.push(...cut(input.changes.length > BRIEF_MAX_LINES ? orderForCut(input.changes) : input.changes));
|
|
38
|
+
}
|
|
39
|
+
out.push(...below);
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
/** Roles a person can act on; list rows, radios and checkboxes count with them (AGENT-TOOLS 1.13.1 item 1). */
|
|
43
|
+
const ACTIONABLE_ROLES = new Set(["button", "input", "switch", "link", "tab", "cell", "radio", "checkbox"]);
|
|
44
|
+
/**
|
|
45
|
+
* Pressable elements count as actionable: buttons, inputs, switches, links, tabs, list rows, radios, checkboxes,
|
|
46
|
+
* and any element that takes a tap, a toggle or typing (AGENT-TOOLS 1.13.1 item 1).
|
|
47
|
+
*/
|
|
48
|
+
export function isActionable(element) {
|
|
49
|
+
const role = roleOf(element);
|
|
50
|
+
if (role !== null && ACTIONABLE_ROLES.has(role))
|
|
51
|
+
return true;
|
|
52
|
+
return actionsOf(element).some((action) => action === "tap" || action === "toggle" || action === "type");
|
|
53
|
+
}
|
|
54
|
+
function textOfElement(element) {
|
|
55
|
+
return (element.text ?? "").trim();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A new screen in brief: its headers, its actionable elements and the text that wasn't in the list the agent had
|
|
59
|
+
* (`previous`). One line each, as a full list writes them, so refs keep working.
|
|
60
|
+
*/
|
|
61
|
+
export function briefScreen(elements, previous, options = {}) {
|
|
62
|
+
const seen = new Set(previous.map(textOfElement).filter((text) => text !== ""));
|
|
63
|
+
const line = (element) => formatElement(element, { eyes: options.eyes === true });
|
|
64
|
+
const headers = [];
|
|
65
|
+
const actionable = [];
|
|
66
|
+
const newText = [];
|
|
67
|
+
for (const element of elements) {
|
|
68
|
+
const role = roleOf(element);
|
|
69
|
+
if (role === "header")
|
|
70
|
+
headers.push(line(element));
|
|
71
|
+
else if (isActionable(element))
|
|
72
|
+
actionable.push(line(element));
|
|
73
|
+
else if (role === "text" && textOfElement(element) !== "" && !seen.has(textOfElement(element)))
|
|
74
|
+
newText.push(line(element));
|
|
75
|
+
}
|
|
76
|
+
return { headers, actionable, newText };
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../src/brief.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG/D,0GAA0G;AAC1G,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAiBlC,wIAAwI;AACxI,MAAM,IAAI,GAAG,2BAA2B,CAAC;AAEzC,sEAAsE;AACtE,MAAM,UAAU,GAAG,2BAA2B,CAAC;AAE/C,qGAAqG;AACrG,MAAM,UAAU,WAAW,CAAC,OAAiB;IAC3C,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnH,CAAC;AAED,sCAAsC;AACtC,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,IAAI,KAAK,yBAAyB,CAAC;AAC5C,CAAC;AAED,gGAAgG;AAChG,SAAS,GAAG,CAAC,KAAe;IAC1B,IAAI,KAAK,CAAC,MAAM,IAAI,eAAe;QAAE,OAAO,KAAK,CAAC;IAClD,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,MAAM,GAAG,GAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,gGAAgG;QAChG,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7G,CAAC;SAAM,CAAC;QACN,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACxG,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IACnB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+GAA+G;AAC/G,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAEjI;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAoB;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,IAAI,KAAK,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC;AAC3G,CAAC;AAED,SAAS,aAAa,CAAC,OAAoB;IACzC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,QAAuB,EACvB,QAAuB,EACvB,UAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,CAAC,OAAoB,EAAU,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;IACvG,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;aAC9C,IAAI,YAAY,CAAC,OAAO,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;aAC1D,IAAI,IAAI,KAAK,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9H,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAC1C,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,2 +1,42 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
import { type RuntimeOptions } from "./runtime.js";
|
|
3
|
+
/** The command line's words and options, in one place so a test can read them without starting a host. */
|
|
4
|
+
export declare function parseCli(argv: string[]): {
|
|
5
|
+
values: {
|
|
6
|
+
port?: string | undefined;
|
|
7
|
+
host?: string | undefined;
|
|
8
|
+
scheme?: string | undefined;
|
|
9
|
+
screenshots?: string | undefined;
|
|
10
|
+
viewer?: string | undefined;
|
|
11
|
+
"metro-port"?: string | undefined;
|
|
12
|
+
"https-port"?: string | undefined;
|
|
13
|
+
stop?: boolean | undefined;
|
|
14
|
+
wait?: string | undefined;
|
|
15
|
+
since?: string | undefined;
|
|
16
|
+
junit?: string | undefined;
|
|
17
|
+
"update-references"?: boolean | undefined;
|
|
18
|
+
"no-log"?: boolean | undefined;
|
|
19
|
+
policy?: string | undefined;
|
|
20
|
+
"no-policy"?: boolean | undefined;
|
|
21
|
+
"no-dialog"?: boolean | undefined;
|
|
22
|
+
brief?: boolean | undefined;
|
|
23
|
+
"ux-rules"?: string | undefined;
|
|
24
|
+
accounts?: string | undefined;
|
|
25
|
+
maps?: string | undefined;
|
|
26
|
+
"viewer-link"?: boolean | undefined;
|
|
27
|
+
project?: string | undefined;
|
|
28
|
+
"dry-run"?: boolean | undefined;
|
|
29
|
+
app?: boolean | undefined;
|
|
30
|
+
"no-install"?: boolean | undefined;
|
|
31
|
+
help?: boolean | undefined;
|
|
32
|
+
};
|
|
33
|
+
positionals: string[];
|
|
34
|
+
};
|
|
35
|
+
/** What `mcp` and the standalone host both take, from the parsed options (`--brief` and the rest). */
|
|
36
|
+
export declare function runtimeOptionsOf(values: ReturnType<typeof parseCli>["values"], options: {
|
|
37
|
+
port?: string;
|
|
38
|
+
host?: string;
|
|
39
|
+
}): RuntimeOptions;
|
|
40
|
+
export declare function main(argv: string[]): Promise<number>;
|
|
41
|
+
/** Runs the command line and exits with its code (a negative code means a host keeps running). */
|
|
42
|
+
export declare function runMain(argv: string[]): void;
|