tapline-host 1.6.2 → 1.7.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 (108) hide show
  1. package/dist/accounts.d.ts +129 -12
  2. package/dist/accounts.js +844 -75
  3. package/dist/accounts.js.map +1 -1
  4. package/dist/actionlog.d.ts +11 -4
  5. package/dist/actionlog.js +22 -1
  6. package/dist/actionlog.js.map +1 -1
  7. package/dist/animations.d.ts +4 -2
  8. package/dist/animations.js +7 -7
  9. package/dist/animations.js.map +1 -1
  10. package/dist/api.d.ts +7 -1
  11. package/dist/api.js +12 -1
  12. package/dist/api.js.map +1 -1
  13. package/dist/audit.d.ts +1 -0
  14. package/dist/auditlog.d.ts +40 -0
  15. package/dist/auditlog.js +150 -0
  16. package/dist/auditlog.js.map +1 -0
  17. package/dist/cli.d.ts +8 -0
  18. package/dist/cli.js +143 -7
  19. package/dist/cli.js.map +1 -1
  20. package/dist/control.d.ts +51 -0
  21. package/dist/control.js +110 -0
  22. package/dist/control.js.map +1 -1
  23. package/dist/doctor.d.ts +6 -0
  24. package/dist/doctor.js +61 -4
  25. package/dist/doctor.js.map +1 -1
  26. package/dist/drive.d.ts +5 -2
  27. package/dist/drive.js +50 -13
  28. package/dist/drive.js.map +1 -1
  29. package/dist/elicit.d.ts +47 -0
  30. package/dist/elicit.js +87 -0
  31. package/dist/elicit.js.map +1 -1
  32. package/dist/format.d.ts +6 -0
  33. package/dist/format.js +25 -4
  34. package/dist/format.js.map +1 -1
  35. package/dist/grants.d.ts +297 -0
  36. package/dist/grants.js +938 -0
  37. package/dist/grants.js.map +1 -0
  38. package/dist/grantscmd.d.ts +34 -0
  39. package/dist/grantscmd.js +100 -0
  40. package/dist/grantscmd.js.map +1 -0
  41. package/dist/hostfacts.d.ts +23 -0
  42. package/dist/hostfacts.js +65 -0
  43. package/dist/hostfacts.js.map +1 -0
  44. package/dist/inspect.d.ts +3 -2
  45. package/dist/inspect.js +20 -8
  46. package/dist/inspect.js.map +1 -1
  47. package/dist/mapcmd.d.ts +2 -2
  48. package/dist/mcp.js +1 -1
  49. package/dist/nochange.d.ts +1 -0
  50. package/dist/otpclient.d.ts +79 -0
  51. package/dist/otpclient.js +362 -0
  52. package/dist/otpclient.js.map +1 -0
  53. package/dist/pidlock.d.ts +99 -0
  54. package/dist/pidlock.js +382 -0
  55. package/dist/pidlock.js.map +1 -0
  56. package/dist/places.d.ts +11 -0
  57. package/dist/places.js +28 -2
  58. package/dist/places.js.map +1 -1
  59. package/dist/policy.d.ts +2 -1
  60. package/dist/policy.js +5 -2
  61. package/dist/policy.js.map +1 -1
  62. package/dist/protocol.d.ts +4 -0
  63. package/dist/protocol.js +2 -0
  64. package/dist/protocol.js.map +1 -1
  65. package/dist/report.d.ts +8 -0
  66. package/dist/report.js +34 -1
  67. package/dist/report.js.map +1 -1
  68. package/dist/routes.d.ts +1 -1
  69. package/dist/routes.js +27 -11
  70. package/dist/routes.js.map +1 -1
  71. package/dist/runschedule.d.ts +119 -0
  72. package/dist/runschedule.js +281 -0
  73. package/dist/runschedule.js.map +1 -0
  74. package/dist/runtime.d.ts +48 -1
  75. package/dist/runtime.js +214 -18
  76. package/dist/runtime.js.map +1 -1
  77. package/dist/schedule.d.ts +145 -0
  78. package/dist/schedule.js +401 -0
  79. package/dist/schedule.js.map +1 -0
  80. package/dist/schedulehost.d.ts +73 -0
  81. package/dist/schedulehost.js +391 -0
  82. package/dist/schedulehost.js.map +1 -0
  83. package/dist/script.d.ts +2 -0
  84. package/dist/script.js +2 -0
  85. package/dist/script.js.map +1 -1
  86. package/dist/server.d.ts +6 -0
  87. package/dist/server.js +3 -1
  88. package/dist/server.js.map +1 -1
  89. package/dist/thincall.d.ts +13 -0
  90. package/dist/thincall.js +139 -59
  91. package/dist/thincall.js.map +1 -1
  92. package/dist/tool-text-data.d.ts +1 -1
  93. package/dist/tool-text-data.js +1 -1
  94. package/dist/tool-text-data.js.map +1 -1
  95. package/dist/tool-text.d.ts +1 -1
  96. package/dist/tools.d.ts +116 -6
  97. package/dist/tools.js +758 -134
  98. package/dist/tools.js.map +1 -1
  99. package/dist/unlockcmd.d.ts +44 -0
  100. package/dist/unlockcmd.js +80 -0
  101. package/dist/unlockcmd.js.map +1 -0
  102. package/dist/uxcheck.d.ts +1 -0
  103. package/dist/vault.d.ts +75 -0
  104. package/dist/vault.js +395 -0
  105. package/dist/vault.js.map +1 -0
  106. package/package.json +1 -1
  107. package/skills/tapline/SKILL.md +34 -6
  108. package/skills/tapline/references/setup.md +11 -1
package/dist/runtime.d.ts CHANGED
@@ -1,10 +1,42 @@
1
1
  import { type HostConfig, type ResolveOptions } from "./config.js";
2
- import { type GitProbe } from "./accounts.js";
2
+ import { type AccountsLoad, type GitProbe } from "./accounts.js";
3
+ import type { VaultDeps } from "./vault.js";
4
+ import { type OtpService } from "./otpclient.js";
3
5
  import { Confirmations } from "./confirm.js";
6
+ import { MapRegistry } from "./places.js";
7
+ import { type PolicyFile } from "./policy.js";
4
8
  import { TaplineHost, type ListenResult } from "./server.js";
5
9
  import { TaplineTools } from "./tools.js";
6
10
  /** How long a client of the thin call may stay silent before its tools (its report, its journey) are dropped. */
7
11
  export declare const CLIENT_IDLE_MS: number;
12
+ /** The pseudo-tools of `/api` a scheduled run uses on a running host (read-only facts, and the run-wide lease). */
13
+ export declare const HOST_FACTS_TOOL = "_host_facts";
14
+ export declare const LEASE_TOOL = "_lease";
15
+ /** How long a run-wide lease stands without a renewal. */
16
+ export declare const LEASE_TTL_MS = 45000;
17
+ /** A path as one spelling for a comparison: its real path when it exists, else the absolute one; case folded on Windows. */
18
+ export declare function canonicalPath(path: string): string;
19
+ /**
20
+ * What a running host was started with: paths and flags, and hashes of what it has LOADED (never the content). The same path is not
21
+ * the same policy: asked for its facts, the host first reloads its policy, vault and maps from disk into its live state and reports
22
+ * hashes of that, and a run compares them with what it would load itself.
23
+ */
24
+ export interface HostFacts {
25
+ version: 3;
26
+ /** Random, made when this host started: a run pins it and every later call must reach this very host. */
27
+ instance: string;
28
+ /** The policy file's canonical path; null for the built-in policy. */
29
+ policy: string | null;
30
+ noPolicy: boolean;
31
+ accounts: string | null;
32
+ maps: string;
33
+ /** sha256 of the loaded policy's canonical JSON; null for the built-in policy. */
34
+ policyHash: string | null;
35
+ /** HMAC-SHA256, keyed with the host token, of the decrypted vault's canonical JSON (values and per-app permissions); null when there is no vault. */
36
+ accountsHash: string | null;
37
+ /** sha256 over the canonical JSON of every map the host now holds (read from disk again). */
38
+ mapsHash: string;
39
+ }
8
40
  /** The client id of a thin call that names none. */
9
41
  export declare const ANONYMOUS_CLIENT = "anonymous";
10
42
  export interface RuntimeOptions extends ResolveOptions {
@@ -21,14 +53,20 @@ export interface RuntimeOptions extends ResolveOptions {
21
53
  accounts?: string;
22
54
  /** Tests: the git questions the accounts file is checked with. */
23
55
  gitProbe?: GitProbe;
56
+ /** Tests: how a one-time code is asked of Tapwright's daemon (AGENT-TOOLS 1.14 §20.4). Default: the real daemon. */
57
+ otp?: OtpService;
24
58
  /** `--brief`: actions answer briefly unless a call says `brief: false` (AGENT-TOOLS 1.13 §13.4). */
25
59
  brief?: boolean;
60
+ /** Tests: how a protected vault is opened (DPAPI, keychain). Default: this system's own. */
61
+ vaultDeps?: VaultDeps;
26
62
  /** `--maps DIR`: where the apps' maps live, `<DIR>/<app id>/` (AGENT-TOOLS 1.13 §18.9). Default `~/.tapline/maps`. */
27
63
  maps?: string;
28
64
  /** Serve `POST /api/<tool>`: set by a standalone `tapline host`, never by an agent's MCP server (AGENT-TOOLS 1.13 §18.10). */
29
65
  api?: boolean;
30
66
  /** Where the host's own lines go. Default: stderr with a `[tapline]` prefix (stdout is the MCP protocol's). */
31
67
  log?: (message: string) => void;
68
+ /** Tests: how long another client's action waits for a scheduled run's lease before it answers `busy`. Default 30 s. */
69
+ leaseGiveUpMs?: number;
32
70
  /** Clock for the idle sweep (tests). Default Date.now. */
33
71
  clock?: () => number;
34
72
  /** Opens the live view in a browser (tests). Default: this computer's default browser. */
@@ -45,11 +83,20 @@ export interface Runtime {
45
83
  port: number;
46
84
  viewerLinks: string[];
47
85
  remoteViewer: boolean;
86
+ /** The maps this host holds, one per app. */
87
+ maps: MapRegistry;
88
+ /** The policy and the vault as the host holds them now (they change when a scheduled run's facts query reloads them). */
89
+ live: {
90
+ policy(): PolicyFile;
91
+ accounts(): AccountsLoad | undefined;
92
+ };
48
93
  /**
49
94
  * A tools object for one client; the same object for the same id. `undefined` is the connection itself (one MCP
50
95
  * server). Other ids are dropped after 30 minutes without a call.
51
96
  */
52
97
  toolsFor(clientId: string | undefined): TaplineTools;
98
+ /** True while a person (live view) or an agent is driving the phone, or the live view has paused agents (a scheduled run waits, §22.3). */
99
+ phoneInUse(): boolean;
53
100
  close(): Promise<void>;
54
101
  }
55
102
  /**
package/dist/runtime.js CHANGED
@@ -1,22 +1,44 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { randomBytes } from "node:crypto";
3
- import { join } from "node:path";
3
+ import { realpathSync } from "node:fs";
4
+ import { join, resolve } from "node:path";
4
5
  import { configDir, hostUrl, markPaired, pairedBefore, reachableHost, resolveConfig, screenshotMode, viewerMode, } from "./config.js";
5
- import { loadAccounts } from "./accounts.js";
6
+ import { historyStore, loadAccounts, redactAll } from "./accounts.js";
7
+ import { bounded, ScheduleTimeout, VAULT_LOAD_TIMEOUT_MS } from "./runschedule.js";
8
+ import { createOtpService } from "./otpclient.js";
6
9
  import { Confirmations } from "./confirm.js";
7
- import { ControlQueue } from "./control.js";
8
- import { isToolName, callTool } from "./dispatch.js";
10
+ import { ControlQueue, PhoneLease } from "./control.js";
11
+ import { isToolName, callTool, TOOL_META } from "./dispatch.js";
12
+ import { hashMapsLoaded, policyFingerprint } from "./hostfacts.js";
9
13
  import { realRunner } from "./journeyexport.js";
10
14
  import { MapRegistry } from "./places.js";
15
+ import { AuditLog } from "./auditlog.js";
16
+ import { GrantBook } from "./grants.js";
11
17
  import { DEFAULT_POLICY, NO_POLICY, loadPolicy } from "./policy.js";
12
- import { TaplineHost } from "./server.js";
18
+ import { TaplineError, TaplineHost } from "./server.js";
13
19
  import { restoreAnimations } from "./animations.js";
14
- import { TaplineTools } from "./tools.js";
20
+ import { TaplineTools, describeError } from "./tools.js";
15
21
  import { NO_UX_RULES, loadUxRules } from "./uxcheck.js";
16
22
  import { VIEWER_ACCEPTS, ViewerHub, viewerStatusForHost } from "./viewer.js";
17
23
  import { VIEWER_HTML } from "./viewer-page.js";
18
24
  /** How long a client of the thin call may stay silent before its tools (its report, its journey) are dropped. */
19
25
  export const CLIENT_IDLE_MS = 30 * 60 * 1000;
26
+ /** The pseudo-tools of `/api` a scheduled run uses on a running host (read-only facts, and the run-wide lease). */
27
+ export const HOST_FACTS_TOOL = "_host_facts";
28
+ export const LEASE_TOOL = "_lease";
29
+ /** How long a run-wide lease stands without a renewal. */
30
+ export const LEASE_TTL_MS = 45_000;
31
+ /** A path as one spelling for a comparison: its real path when it exists, else the absolute one; case folded on Windows. */
32
+ export function canonicalPath(path) {
33
+ let full;
34
+ try {
35
+ full = realpathSync.native(path);
36
+ }
37
+ catch {
38
+ full = resolve(path);
39
+ }
40
+ return process.platform === "win32" ? full.toLowerCase() : full;
41
+ }
20
42
  /** What a queued call answers when its client left before it started (nobody reads it). */
21
43
  const CANCELLED = { content: [{ type: "text", text: "Error cancelled: the client left before this call started, so it never ran." }], isError: true };
22
44
  /** The client id of a thin call that names none. */
@@ -57,24 +79,74 @@ export async function createRuntime(options = {}) {
57
79
  // house rules (1.12 §17.3): --ux-rules FILE; a bad file stops the host with a plain message.
58
80
  screenshots = screenshotMode(options.screenshots, options.env);
59
81
  viewer = viewerMode(options.viewer, options.env);
82
+ const instanceId = randomBytes(16).toString("hex");
60
83
  policy = options.noPolicy === true ? NO_POLICY : options.policy !== undefined ? loadPolicy(options.policy) : DEFAULT_POLICY;
61
84
  if (options.uxRules !== undefined)
62
85
  uxRules = loadUxRules(options.uxRules);
63
86
  // 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);
87
+ // The load is bounded: a keychain or DPAPI call that stalls is killed, and the host starts with no accounts and says why (never hangs).
88
+ let accounts;
89
+ if (options.accounts !== undefined) {
90
+ const file = options.accounts;
91
+ try {
92
+ accounts = await bounded("loading the vault", VAULT_LOAD_TIMEOUT_MS, (signal) => loadAccounts(file, options.gitProbe, options.vaultDeps, signal));
93
+ }
94
+ catch (error) {
95
+ if (!(error instanceof ScheduleTimeout))
96
+ throw error;
97
+ accounts = { store: null, blocked: `the vault file can't be opened: ${error.message}` };
98
+ }
99
+ }
100
+ if (accounts !== undefined) {
101
+ const said = accounts.store === null ? accounts.blocked : accounts.note;
102
+ if (said !== undefined)
103
+ log(said);
104
+ }
67
105
  const config = await resolveConfig(options);
68
106
  const clients = new Map();
107
+ // One-time codes (AGENT-TOOLS 1.14 §20.4): a code typed in this session is scrubbed from everything the host passes on, as a vault value is.
108
+ const otp = options.otp ?? createOtpService({ env: options.env });
109
+ // The policy and vault the host runs under now: a facts query reloads them from disk (reloadLive below).
110
+ // Redaction is cumulative for the session (§20.3): a vault value that was loaded once stays scrubbed until the process ends, even
111
+ // after a reload replaced it; only the current values can be typed. `retired` holds the stores a reload replaced.
112
+ const retired = [];
113
+ const retiredPrints = new Set();
114
+ const withHistory = (load) => {
115
+ if (load.store === null)
116
+ return load;
117
+ // One scrubber over the current and every retired value, matched together against the original text (never chained).
118
+ return { ...load, store: historyStore(load.store, retired) };
119
+ };
120
+ let currentRaw = accounts;
121
+ const live = { policy, accounts: accounts === undefined ? undefined : withHistory(accounts) };
69
122
  const host = new TaplineHost({
70
- ...(accounts?.store != null ? { redact: accounts.store.redact } : {}),
123
+ redact: (text) => redactAll(live.accounts?.store, otp.codes, text),
124
+ redactsVault: accounts?.store != null,
71
125
  token: config.token,
72
126
  port: config.port,
73
127
  portFallback: config.portFallback,
74
128
  hosts: config.hosts,
75
129
  ...(options.api === true
76
130
  ? {
77
- api: async (tool, args, clientId, signal) => isToolName(tool) ? thinCall(tool, args, clientId, signal) : undefined,
131
+ api: async (tool, args, clientId, signal, credentials) => {
132
+ // A caller that pinned an instance is refused by any other host: the run never falls through to one with other settings.
133
+ if (credentials.instance !== undefined && credentials.instance !== instanceId) {
134
+ return { content: [{ type: "text", text: "Error wrong_host: this is not the host the schedule checked (another instance answers here); nothing was run." }], isError: true };
135
+ }
136
+ if (tool === HOST_FACTS_TOOL) {
137
+ // Reload first, then report what is loaded: a vault that can't be read, or a policy that no longer loads, is an error.
138
+ try {
139
+ return { content: [{ type: "text", text: JSON.stringify({ ...facts, ...(await reloadLive()) }) }] };
140
+ }
141
+ catch (error) {
142
+ const why = error instanceof Error ? error.message : String(error);
143
+ return { content: [{ type: "text", text: `Error facts_unavailable: the host could not reload what it runs under (${why}); don't reuse it.` }], isError: true };
144
+ }
145
+ }
146
+ if (tool === LEASE_TOOL)
147
+ return leaseCall(args, clientId, credentials.lease);
148
+ return isToolName(tool) ? thinCall(tool, args, clientId, signal, credentials.lease) : undefined;
149
+ },
78
150
  }
79
151
  : {}),
80
152
  });
@@ -110,17 +182,38 @@ export async function createRuntime(options = {}) {
110
182
  ...(remoteViewer ? [`http://${config.tailscaleIp}:${port}/viewer?token=${viewerToken} (from your own devices on Tailscale)`] : []),
111
183
  ];
112
184
  const control = new ControlQueue();
185
+ const lease = new PhoneLease({ now: clock, ...(options.leaseGiveUpMs !== undefined ? { giveUpMs: options.leaseGiveUpMs } : {}) });
186
+ const mapsDir = options.maps ?? join(configDir(options.env), "maps");
187
+ const facts = {
188
+ version: 3,
189
+ instance: instanceId,
190
+ policy: options.noPolicy !== true && options.policy !== undefined ? canonicalPath(options.policy) : null,
191
+ noPolicy: options.noPolicy === true,
192
+ accounts: options.accounts !== undefined ? canonicalPath(options.accounts) : null,
193
+ maps: canonicalPath(mapsDir),
194
+ };
113
195
  const confirmations = new Confirmations();
114
196
  let hub;
115
197
  const openBrowser = options.openBrowser ?? openInBrowser;
116
198
  // One map per app for every client of this host: places, roads and links grow as agents drive (§18.9).
117
199
  const maps = new MapRegistry({ mapsDir: options.maps ?? join(configDir(options.env), "maps") });
118
- const toolsOptions = {
200
+ // Grants (AGENT-TOOLS 1.14 §19) live in the policy file: no file, no grants. The audit log (§23) has no off switch.
201
+ const audit = new AuditLog(join(configDir(options.env), "audit"));
202
+ audit.open();
203
+ let grants;
204
+ if (options.noPolicy !== true && options.policy !== undefined) {
205
+ grants = new GrantBook({ policyPath: options.policy, audit });
206
+ // Prune at start (§19.4): the uses of a grant that has ended or was revoked.
207
+ void grants.prune().catch(() => undefined);
208
+ }
209
+ const fixedOptions = {
119
210
  maps,
211
+ audit,
212
+ otp,
213
+ lease,
214
+ ...(grants !== undefined ? { grants } : {}),
120
215
  ...(options.brief === true ? { brief: true } : {}),
121
- policy,
122
216
  uxRules,
123
- ...(accounts !== undefined ? { accounts } : {}),
124
217
  confirmations,
125
218
  canConfirm: viewer !== "off",
126
219
  connect: { url, name: config.name },
@@ -147,20 +240,120 @@ export async function createRuntime(options = {}) {
147
240
  viewerFeed: () => hub?.feed() ?? { on: false, quality: "balanced" },
148
241
  }),
149
242
  };
243
+ // Every tools object reads the policy and the vault through these getters, so a reload reaches the ones already made.
244
+ const optionsWith = (extra) => ({
245
+ ...fixedOptions,
246
+ ...extra,
247
+ get policy() {
248
+ return live.policy;
249
+ },
250
+ get accounts() {
251
+ return live.accounts;
252
+ },
253
+ });
150
254
  // 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);
255
+ const primary = new TaplineTools(host, optionsWith({}));
256
+ // Serialized: two facts queries must not discard each other's freshly loaded maps.
257
+ let reloading = Promise.resolve();
258
+ /**
259
+ * Reads the policy, the vault (decrypting it again) and the maps from disk into the live state, and answers hashes of what is now
260
+ * loaded. Rejects, changing nothing that was loaded before, when the policy or the vault can't be read.
261
+ */
262
+ function reloadLive() {
263
+ const run = async () => {
264
+ const nextPolicy = options.noPolicy !== true && options.policy !== undefined ? loadPolicy(options.policy) : null;
265
+ let nextAccounts;
266
+ let accountsHash = null;
267
+ if (options.accounts !== undefined) {
268
+ const loaded = await bounded("loading the vault", VAULT_LOAD_TIMEOUT_MS, (signal) => loadAccounts(options.accounts, options.gitProbe, options.vaultDeps, signal));
269
+ if (loaded.store === null)
270
+ throw new Error(loaded.blocked.replace(/[.\s]+$/, ""));
271
+ if (loaded.fingerprint === undefined)
272
+ throw new Error("the vault can't be fingerprinted");
273
+ accountsHash = loaded.fingerprint(config.token);
274
+ nextAccounts = loaded;
275
+ }
276
+ if (nextPolicy !== null)
277
+ live.policy = nextPolicy;
278
+ if (nextAccounts !== undefined) {
279
+ const before = currentRaw;
280
+ if (before?.store != null && nextAccounts.store !== null) {
281
+ const oldPrint = before.fingerprint?.(config.token);
282
+ const newPrint = nextAccounts.fingerprint?.(config.token);
283
+ if ((oldPrint === undefined || oldPrint !== newPrint) && (oldPrint === undefined || !retiredPrints.has(oldPrint))) {
284
+ retired.push(before.store);
285
+ if (oldPrint !== undefined)
286
+ retiredPrints.add(oldPrint);
287
+ }
288
+ }
289
+ currentRaw = nextAccounts;
290
+ live.accounts = withHistory(nextAccounts);
291
+ }
292
+ await maps.reload();
293
+ const mapsHash = hashMapsLoaded(mapsDir, (app) => {
294
+ const map = maps.forApp({ id: app, name: app });
295
+ return map === undefined ? null : { status: map.loadedStatus(), data: map.data() };
296
+ });
297
+ return { policyHash: nextPolicy === null ? null : policyFingerprint(nextPolicy), accountsHash, mapsHash };
298
+ };
299
+ const answer = reloading.then(run, run);
300
+ reloading = answer.catch(() => undefined);
301
+ return answer;
302
+ }
152
303
  /** 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) {
304
+ function thinCall(tool, args, clientId, signal, leaseCredential) {
305
+ // A credential that is not the standing holder's (expired included) is a run that lost the phone: refused, even when no one holds the lease now.
306
+ try {
307
+ lease.assertCurrent(leaseCredential);
308
+ }
309
+ catch (error) {
310
+ if (!(error instanceof TaplineError))
311
+ throw error;
312
+ return Promise.resolve({ content: [{ type: "text", text: describeError(error) }], isError: true });
313
+ }
154
314
  // A thin call never uses the MCP server's tools: those hold its dialog and the OKs given for its calls.
155
315
  const tools = toolsFor(clientId ?? ANONYMOUS_CLIENT);
156
316
  // Calls that share a tools object run one after another: they share its per-call state (a run's account).
157
317
  const before = lanes.get(tools) ?? Promise.resolve();
158
318
  // 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)))));
319
+ // Every tool that changes anything waits behind a scheduled run's lease (not only the touches); the holder's credential goes through.
320
+ const run = () => tools.asThinCall(() => callTool(tools, tool, args));
321
+ const mutating = !TOOL_META[tool].readOnly;
322
+ // A lease that stays held for the whole wait answers `busy`, as a tool does for its own refusals.
323
+ const gated = () => tools.leaseGate(run).catch((error) => {
324
+ if (!(error instanceof TaplineError))
325
+ throw error;
326
+ return { content: [{ type: "text", text: describeError(error) }], isError: true };
327
+ });
328
+ const answer = before.then(() => (signal.aborted ? CANCELLED : tools.withCall(signal, () => (mutating ? gated() : run()), leaseCredential)));
160
329
  lanes.set(tools, answer.then(() => undefined, () => undefined));
161
330
  return answer;
162
331
  }
163
332
  const lanes = new WeakMap();
333
+ /**
334
+ * `_lease {action: "acquire" | "renew" | "release"}`: a scheduled run's hold on the phone (§22.3). The first acquire answers an
335
+ * unguessable credential; renew and release (and every call the run makes) must present it, and a client label alone never counts.
336
+ */
337
+ function leaseCall(args, clientId, credential) {
338
+ const owner = clientId ?? ANONYMOUS_CLIENT;
339
+ const reply = (body, isError = false) => ({
340
+ content: [{ type: "text", text: JSON.stringify(body) }],
341
+ ...(isError ? { isError: true } : {}),
342
+ });
343
+ const action = args["action"];
344
+ if (action === "release")
345
+ return reply({ ok: lease.release(credential) });
346
+ if (action === "acquire" || action === "renew") {
347
+ const ttl = typeof args["ttl_ms"] === "number" ? args["ttl_ms"] : LEASE_TTL_MS;
348
+ if (action === "renew")
349
+ return reply(lease.renew(credential, ttl) ? { ok: true } : { ok: false, by: "lost" });
350
+ const taken = lease.acquire(owner, ttl, control.driver() === "person" || control.paused(), credential);
351
+ if (!taken.ok)
352
+ return reply({ ok: false, by: taken.by });
353
+ return reply(credential === undefined ? { ok: true, credential: taken.credential } : { ok: true });
354
+ }
355
+ return reply({ error: "action is acquire, renew or release" }, true);
356
+ }
164
357
  function toolsFor(clientId) {
165
358
  if (clientId === undefined)
166
359
  return primary;
@@ -177,7 +370,7 @@ export async function createRuntime(options = {}) {
177
370
  return known.tools;
178
371
  }
179
372
  // The call log names the agent by this id.
180
- const tools = new TaplineTools(host, { ...toolsOptions, clientId: () => clientId, confirmScope: "api" });
373
+ const tools = new TaplineTools(host, optionsWith({ clientId: () => clientId, confirmScope: "api" }));
181
374
  clients.set(clientId, { tools, lastUsed: now });
182
375
  return tools;
183
376
  }
@@ -238,7 +431,10 @@ export async function createRuntime(options = {}) {
238
431
  port,
239
432
  viewerLinks,
240
433
  remoteViewer,
434
+ maps,
435
+ live: { policy: () => live.policy, accounts: () => live.accounts },
241
436
  toolsFor,
437
+ phoneInUse: () => control.driver() !== null || control.paused(),
242
438
  // The maps are written at most once a second while driving, and in full here.
243
439
  close: async () => {
244
440
  await maps.flushAll().catch(() => undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * AGENT-TOOLS 1.14 §22.1: the schedule file and `tapline schedule add|list|remove`. One file per schedule in
4
+ * `~/.tapline/schedules/<name>.json`; on Windows each schedule is a Task Scheduler task that runs
5
+ * `tapline run-schedule <name>`. A time schedule wakes the PC to run; a file trigger's once-a-minute check never wakes the PC. The task is registered through an injected runner, so a test sees the exact command.
6
+ */
7
+ export declare const SCHEDULE_NAME: RegExp;
8
+ export declare const scheduleSchema: z.ZodObject<{
9
+ version: z.ZodLiteral<1>;
10
+ tool: z.ZodString;
11
+ route: z.ZodString;
12
+ with: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
13
+ at: z.ZodOptional<z.ZodNullable<z.ZodString>>;
14
+ trigger: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodObject<{
15
+ file: z.ZodString;
16
+ }, z.core.$strict>, z.ZodObject<{
17
+ notification: z.ZodString;
18
+ }, z.core.$strict>]>>>;
19
+ policy: z.ZodOptional<z.ZodNullable<z.ZodString>>;
20
+ accounts: z.ZodOptional<z.ZodNullable<z.ZodString>>;
21
+ maps: z.ZodOptional<z.ZodNullable<z.ZodString>>;
22
+ }, z.core.$loose>;
23
+ export interface Schedule {
24
+ version: 1;
25
+ tool: "tapline";
26
+ route: string;
27
+ with: Record<string, string>;
28
+ at: string | null;
29
+ trigger: {
30
+ file: string;
31
+ } | null;
32
+ policy: string | null;
33
+ accounts: string | null;
34
+ maps: string | null;
35
+ }
36
+ export declare function schedulesDir(configDir: string): string;
37
+ export declare function schedulePath(configDir: string, name: string): string;
38
+ export type ParsedAt = {
39
+ kind: "daily" | "weekdays";
40
+ hour: number;
41
+ minute: number;
42
+ } | {
43
+ kind: "once";
44
+ date: Date;
45
+ };
46
+ /** `HH:MM daily`, `HH:MM weekdays` or an ISO date-time (a single run; no zone means this computer's time). Null when it is none of them. */
47
+ export declare function parseAt(raw: string): ParsedAt | null;
48
+ export declare function clock24(at: {
49
+ hour: number;
50
+ minute: number;
51
+ }): string;
52
+ /** A date as this computer's local `yyyy-MM-ddTHH:mm:ss`, the form the task registration reads. */
53
+ export declare function localIso(date: Date): string;
54
+ export type ReadResult = {
55
+ ok: true;
56
+ schedule: Schedule;
57
+ } | {
58
+ ok: false;
59
+ message: string;
60
+ };
61
+ /** Reads and checks a schedule file. A relative `policy`, `accounts`, `maps` or trigger folder is relative to the file's folder. */
62
+ export declare function readScheduleFile(path: string): ReadResult;
63
+ /** The file as it is written: the spec's key order, `null` for what is unset. */
64
+ export declare function scheduleText(schedule: Schedule): string;
65
+ /**
66
+ * `@file` values (§22.1) become the text of that file, read when a run starts; a relative path is relative to the schedule file's
67
+ * folder. One trailing line ending is dropped (a caption file ends its last line, and that is not part of the caption).
68
+ */
69
+ export declare function resolveWith(values: Record<string, string>, scheduleFolder: string): {
70
+ ok: true;
71
+ values: Record<string, string>;
72
+ } | {
73
+ ok: false;
74
+ message: string;
75
+ };
76
+ export interface ProcResult {
77
+ code: number;
78
+ stdout: string;
79
+ stderr: string;
80
+ }
81
+ /** Runs a program with arguments (never a shell line) and extra environment variables; the registration passes every user value in the environment. */
82
+ export type SchedRunner = (command: string, args: string[], env: Record<string, string>) => Promise<ProcResult>;
83
+ export declare function taskName(name: string): string;
84
+ /**
85
+ * The registration script. It is a constant: the name, the paths and the time reach it as environment variables, never as text
86
+ * built into the script. The settings' `WakeToRun` is what wakes the PC, set for the time
87
+ * schedules only. A file trigger has no Task Scheduler form, so its task fires every minute and `run-schedule --check-trigger` runs
88
+ * only when a new file has appeared; it never wakes the PC (a laptop would never sleep).
89
+ */
90
+ export declare const REGISTER_SCRIPT: string;
91
+ export declare const UNREGISTER_SCRIPT: string;
92
+ export interface TaskEntry {
93
+ /** The node program that runs the CLI. */
94
+ exe: string;
95
+ /** The CLI's script (bin.js). */
96
+ script: string;
97
+ }
98
+ export declare function registerCall(entry: TaskEntry, name: string, schedule: Schedule): {
99
+ command: string;
100
+ args: string[];
101
+ env: Record<string, string>;
102
+ };
103
+ export declare function unregisterCall(name: string): {
104
+ command: string;
105
+ args: string[];
106
+ env: Record<string, string>;
107
+ };
108
+ export declare function triggerStatePath(configDir: string, name: string): string;
109
+ /** The files in a folder that appeared after `sinceMs` (by modified time), oldest first, and the newest time seen. Dotfiles are left out. */
110
+ export declare function newFilesSince(folder: string, sinceMs: number): {
111
+ files: string[];
112
+ newest: number;
113
+ };
114
+ export declare function readSeen(configDir: string, name: string): number | null;
115
+ export declare function writeSeen(configDir: string, name: string, t: number): void;
116
+ export interface ScheduleDeps {
117
+ configDir: string;
118
+ platform: NodeJS.Platform;
119
+ now: () => Date;
120
+ cwd: string;
121
+ run: SchedRunner;
122
+ entry: TaskEntry;
123
+ }
124
+ export interface AddOptions {
125
+ route: string | undefined;
126
+ name?: string | undefined;
127
+ at?: string | undefined;
128
+ with?: string[] | undefined;
129
+ onFile?: string | undefined;
130
+ onNotification?: string | undefined;
131
+ policy?: string | undefined;
132
+ accounts?: string | undefined;
133
+ maps?: string | undefined;
134
+ }
135
+ type Outcome = {
136
+ text: string;
137
+ code: number;
138
+ };
139
+ /** `tapline schedule add`: writes the file, then registers the task. A task that can't be registered leaves no file. */
140
+ export declare function scheduleAdd(options: AddOptions, deps: ScheduleDeps): Promise<Outcome>;
141
+ /** `tapline schedule list`: one line per schedule. */
142
+ export declare function scheduleList(configDir: string): Outcome;
143
+ /** `tapline schedule remove NAME`: unregisters the task, then deletes the file. A task that is already gone is not an error. */
144
+ export declare function scheduleRemove(name: string | undefined, deps: ScheduleDeps): Promise<Outcome>;
145
+ export {};