salt-agent-sdk 0.1.0 → 0.18.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +941 -30
  3. package/dist/actions.d.ts +21 -5
  4. package/dist/actions.d.ts.map +1 -1
  5. package/dist/actions.js +673 -54
  6. package/dist/actions.js.map +1 -1
  7. package/dist/ask.d.ts +83 -0
  8. package/dist/ask.d.ts.map +1 -0
  9. package/dist/ask.js +215 -0
  10. package/dist/ask.js.map +1 -0
  11. package/dist/chatPrivacy.d.ts +34 -0
  12. package/dist/chatPrivacy.d.ts.map +1 -0
  13. package/dist/chatPrivacy.js +60 -0
  14. package/dist/chatPrivacy.js.map +1 -0
  15. package/dist/client.d.ts +2783 -35
  16. package/dist/client.d.ts.map +1 -1
  17. package/dist/client.js +1200 -143
  18. package/dist/client.js.map +1 -1
  19. package/dist/config.d.ts +16 -6
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/config.js +16 -5
  22. package/dist/config.js.map +1 -1
  23. package/dist/crypto.d.ts +62 -0
  24. package/dist/crypto.d.ts.map +1 -1
  25. package/dist/crypto.js +121 -0
  26. package/dist/crypto.js.map +1 -1
  27. package/dist/delegations.d.ts +25 -8
  28. package/dist/delegations.d.ts.map +1 -1
  29. package/dist/delegations.js +67 -11
  30. package/dist/delegations.js.map +1 -1
  31. package/dist/device/client.d.ts +161 -0
  32. package/dist/device/client.d.ts.map +1 -0
  33. package/dist/device/client.js +601 -0
  34. package/dist/device/client.js.map +1 -0
  35. package/dist/device/host.d.ts +222 -0
  36. package/dist/device/host.d.ts.map +1 -0
  37. package/dist/device/host.js +891 -0
  38. package/dist/device/host.js.map +1 -0
  39. package/dist/device/http.d.ts +12 -0
  40. package/dist/device/http.d.ts.map +1 -0
  41. package/dist/device/http.js +124 -0
  42. package/dist/device/http.js.map +1 -0
  43. package/dist/device/index.d.ts +5 -0
  44. package/dist/device/index.d.ts.map +1 -0
  45. package/dist/device/index.js +27 -0
  46. package/dist/device/index.js.map +1 -0
  47. package/dist/device/protocol.d.ts +312 -0
  48. package/dist/device/protocol.d.ts.map +1 -0
  49. package/dist/device/protocol.js +435 -0
  50. package/dist/device/protocol.js.map +1 -0
  51. package/dist/identities.d.ts +9 -2
  52. package/dist/identities.d.ts.map +1 -1
  53. package/dist/identities.js +33 -3
  54. package/dist/identities.js.map +1 -1
  55. package/dist/identity.d.ts +155 -0
  56. package/dist/identity.d.ts.map +1 -0
  57. package/dist/identity.js +196 -0
  58. package/dist/identity.js.map +1 -0
  59. package/dist/identityShare.d.ts +129 -0
  60. package/dist/identityShare.d.ts.map +1 -0
  61. package/dist/identityShare.js +308 -0
  62. package/dist/identityShare.js.map +1 -0
  63. package/dist/ids.d.ts +11 -0
  64. package/dist/ids.d.ts.map +1 -0
  65. package/dist/ids.js +17 -0
  66. package/dist/ids.js.map +1 -0
  67. package/dist/index.d.ts +13 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +13 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/reconcile.d.ts +25 -0
  72. package/dist/reconcile.d.ts.map +1 -0
  73. package/dist/reconcile.js +60 -0
  74. package/dist/reconcile.js.map +1 -0
  75. package/dist/recovery.d.ts +51 -0
  76. package/dist/recovery.d.ts.map +1 -0
  77. package/dist/recovery.js +59 -0
  78. package/dist/recovery.js.map +1 -0
  79. package/dist/register.d.ts +32 -0
  80. package/dist/register.d.ts.map +1 -0
  81. package/dist/register.js +65 -0
  82. package/dist/register.js.map +1 -0
  83. package/dist/scriptJob.d.ts +92 -0
  84. package/dist/scriptJob.d.ts.map +1 -0
  85. package/dist/scriptJob.js +270 -0
  86. package/dist/scriptJob.js.map +1 -0
  87. package/dist/sessions.d.ts +131 -0
  88. package/dist/sessions.d.ts.map +1 -0
  89. package/dist/sessions.js +240 -0
  90. package/dist/sessions.js.map +1 -0
  91. package/dist/socket.d.ts +115 -0
  92. package/dist/socket.d.ts.map +1 -0
  93. package/dist/socket.js +1038 -0
  94. package/dist/socket.js.map +1 -0
  95. package/dist/webhook.d.ts +613 -24
  96. package/dist/webhook.d.ts.map +1 -1
  97. package/dist/webhook.js +1384 -83
  98. package/dist/webhook.js.map +1 -1
  99. package/dist/work.d.ts +57 -0
  100. package/dist/work.d.ts.map +1 -0
  101. package/dist/work.js +213 -0
  102. package/dist/work.js.map +1 -0
  103. package/package.json +26 -4
@@ -0,0 +1,601 @@
1
+ "use strict";
2
+ // The AGENT side of device control: createDeviceClient.
3
+ //
4
+ // It opens a control session on a device the agent holds a `device.*` mandate
5
+ // for, then sends commands (observe / click / type / ...) and awaits the
6
+ // device's results. It NEVER contacts the device directly and never learns
7
+ // more than the lane carries: every command is the plaintext of a lane message
8
+ // the transport encrypts for the lane readers and posts; every result is a
9
+ // lane message the dispatcher decrypts and feeds back in here.
10
+ //
11
+ // This module is transport-agnostic on purpose (DEVICE_PROTOCOL.md / the P1
12
+ // contract: "Pure, injected transports, fakes in tests"). The REST calls and
13
+ // the encrypt-and-post are injected as `DeviceClientTransport`; httpDevice
14
+ // Transport (below) wires them to a real SaltClient, and tests pass a fake.
15
+ //
16
+ // What it does NOT do: capture a screen or synthesise input. Those live only
17
+ // on the device, behind the host's injected handlers. This side just asks.
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.DevicePausedError = exports.DeviceSessionLiveError = void 0;
20
+ exports.createDeviceClient = createDeviceClient;
21
+ const protocol_js_1 = require("./protocol.js");
22
+ const ids_js_1 = require("../ids.js");
23
+ /** Thrown by a transport's openSession on `409 {code:"session_live", session_id}`:
24
+ * this agent already has a live session on the device. open() reattaches. */
25
+ class DeviceSessionLiveError extends Error {
26
+ sessionId;
27
+ constructor(sessionId) {
28
+ super("session_live");
29
+ this.name = "DeviceSessionLiveError";
30
+ this.sessionId = sessionId;
31
+ }
32
+ }
33
+ exports.DeviceSessionLiveError = DeviceSessionLiveError;
34
+ /** A command was refused (or not sent) because the session is paused: the
35
+ * person is using the machine, or a secure field needs them. Wait for the
36
+ * `resumed` state (onState) and try again. */
37
+ class DevicePausedError extends protocol_js_1.DeviceProtocolError {
38
+ reason;
39
+ constructor(reason) {
40
+ super("paused", `device session paused: ${reason}`);
41
+ this.name = "DevicePausedError";
42
+ this.reason = reason;
43
+ }
44
+ }
45
+ exports.DevicePausedError = DevicePausedError;
46
+ class CommandTimeout extends Error {
47
+ }
48
+ class CommandAborted extends Error {
49
+ }
50
+ /** After the agent aborts a task it asks the device to stop and waits this long for the device's
51
+ * own `stopped` result (which carries the steps so far) before giving up on it. */
52
+ const TASK_ABORT_GRACE_MS = 10_000;
53
+ function createDeviceClient(transport, params, options = {}) {
54
+ const approvalTimeoutMs = options.approvalTimeoutMs ?? 150_000;
55
+ const commandTimeoutMs = options.commandTimeoutMs ?? 30_000;
56
+ const commandTtlMs = options.commandTtlMs ?? protocol_js_1.COMMAND_TTL_MS;
57
+ let meta = null;
58
+ let readers = null;
59
+ let seq = 0;
60
+ let pausedReason = null;
61
+ const pending = new Map();
62
+ const listeners = { active: [], ended: [], ask: [] };
63
+ const stateListeners = [];
64
+ let openResolve = null;
65
+ let openReject = null;
66
+ let openTimer = null;
67
+ // Single flight: commands run one at a time, in call order.
68
+ let tail = Promise.resolve();
69
+ let inFlight = 0;
70
+ const earlyEnded = new Map();
71
+ // The device's clock minus ours, learned from `clock_skew` / `expired` replies.
72
+ let clockOffsetMs = 0;
73
+ function emit(event, ...args) {
74
+ for (const cb of listeners[event] ?? []) {
75
+ try {
76
+ cb(...args);
77
+ }
78
+ catch {
79
+ /* a listener throwing never breaks the stream */
80
+ }
81
+ }
82
+ }
83
+ function emitState(s) {
84
+ for (const cb of stateListeners) {
85
+ try {
86
+ cb(s);
87
+ }
88
+ catch {
89
+ /* a listener throwing never breaks the stream */
90
+ }
91
+ }
92
+ }
93
+ function readersFrom(m) {
94
+ if (!m.chat || !m.chat.readers?.length)
95
+ return null;
96
+ return { chatId: m.chat.id, publicKeys: m.chat.readers };
97
+ }
98
+ function failAll(err) {
99
+ for (const p of pending.values()) {
100
+ clearTimeout(p.timer);
101
+ p.reject(err);
102
+ }
103
+ pending.clear();
104
+ }
105
+ function clearOpenTimer() {
106
+ if (openTimer)
107
+ clearTimeout(openTimer);
108
+ openTimer = null;
109
+ }
110
+ /** The approval clock runs only while `requested`, never while `queued`. */
111
+ function startApprovalTimer() {
112
+ if (!openReject || openTimer)
113
+ return;
114
+ openTimer = setTimeout(() => {
115
+ openTimer = null;
116
+ const rej = openReject;
117
+ openResolve = openReject = null;
118
+ rej?.(new protocol_js_1.DeviceProtocolError("failed", "device did not approve in time"));
119
+ }, approvalTimeoutMs);
120
+ if (typeof openTimer.unref === "function") {
121
+ openTimer.unref();
122
+ }
123
+ }
124
+ function settleOpen(m) {
125
+ clearOpenTimer();
126
+ const res = openResolve;
127
+ openResolve = openReject = null;
128
+ res?.(m);
129
+ }
130
+ /** The session just became (or was found) active. Readers come from the
131
+ * payload; if absent they are fetched once. */
132
+ function becomeActive(m, announce) {
133
+ meta = { ...m, status: "active" };
134
+ pausedReason = null;
135
+ readers = readersFrom(meta);
136
+ const finish = () => {
137
+ settleOpen(meta);
138
+ if (announce) {
139
+ emit("active", meta);
140
+ emitState({ state: "active" });
141
+ }
142
+ };
143
+ if (readers || !transport.fetchSession)
144
+ return finish();
145
+ const sid = meta.id;
146
+ void transport
147
+ .fetchSession(sid)
148
+ .then((f) => {
149
+ if (meta && (0, ids_js_1.sameId)(meta.id, sid) && f) {
150
+ meta = { ...meta, ...f, status: meta.status };
151
+ readers = readersFrom(meta);
152
+ }
153
+ })
154
+ .catch(() => undefined)
155
+ .then(finish);
156
+ }
157
+ function resetSession() {
158
+ meta = null;
159
+ readers = null;
160
+ pausedReason = null;
161
+ seq = 0;
162
+ clockOffsetMs = 0;
163
+ }
164
+ async function open(o = {}) {
165
+ const wait = o.wait !== false;
166
+ if (meta && (meta.status === "active" || meta.status === "paused"))
167
+ return meta;
168
+ // A previous session's leftovers must never leak into this one.
169
+ resetSession();
170
+ // Register the waiter SYNCHRONOUSLY, before the POST's await yields: the
171
+ // device's `device_session_active` delivery can race ahead of the POST
172
+ // response, and it must find a resolver already in place.
173
+ let waiter = null;
174
+ if (wait) {
175
+ waiter = new Promise((resolve, reject) => {
176
+ openResolve = resolve;
177
+ openReject = reject;
178
+ });
179
+ waiter.catch(() => undefined); // a rejection is delivered to the caller below
180
+ }
181
+ let created;
182
+ try {
183
+ created = await transport.openSession(params.deviceId, o.intent !== undefined ? { intent: o.intent } : undefined);
184
+ }
185
+ catch (e) {
186
+ if (e instanceof DeviceSessionLiveError)
187
+ return reattach(e.sessionId, waiter);
188
+ clearOpenTimer();
189
+ openResolve = openReject = null;
190
+ throw e;
191
+ }
192
+ seq = 0;
193
+ const early = earlyEnded.get(String(created.id));
194
+ earlyEnded.clear();
195
+ if (early !== undefined) {
196
+ meta = created;
197
+ handleDelivery("device_session_ended", { session_id: created.id, end_reason: early });
198
+ throw new protocol_js_1.DeviceProtocolError("failed", `session ended: ${early}`);
199
+ }
200
+ // If a delivery already moved us on while the POST was in flight, its
201
+ // fields (status, chat) win; otherwise take the POST's view.
202
+ meta = meta ? { ...created, ...meta } : created;
203
+ switch (meta.status) {
204
+ case "active":
205
+ becomeActive(meta, true);
206
+ return waiter ? waiter : meta;
207
+ case "queued":
208
+ emitState({ state: "queued", position: meta.position ?? 1 });
209
+ break;
210
+ case "requested":
211
+ emitState({ state: "requested" });
212
+ startApprovalTimer();
213
+ break;
214
+ default:
215
+ break;
216
+ }
217
+ if (!waiter)
218
+ return meta;
219
+ return waiter;
220
+ }
221
+ async function reattach(sessionId, waiter) {
222
+ try {
223
+ if (!transport.reattachSession)
224
+ throw new protocol_js_1.DeviceProtocolError("failed", "transport cannot reattach");
225
+ const r = await transport.reattachSession(sessionId);
226
+ seq = r.last_seq; // continue at last_seq + 1
227
+ if (r.session.status === "paused") {
228
+ meta = { ...r.session };
229
+ readers = readersFrom(meta);
230
+ pausedReason = meta.pause_reason ?? "paused";
231
+ settleOpen(meta);
232
+ emitState({ state: "paused", reason: pausedReason });
233
+ }
234
+ else {
235
+ becomeActive(r.session, true);
236
+ }
237
+ return waiter ? await waiter : meta;
238
+ }
239
+ catch (e) {
240
+ clearOpenTimer();
241
+ openResolve = openReject = null;
242
+ throw e;
243
+ }
244
+ }
245
+ function requireActive() {
246
+ if (pausedReason !== null)
247
+ throw new DevicePausedError(pausedReason);
248
+ if (!meta || meta.status !== "active") {
249
+ throw new protocol_js_1.DeviceProtocolError("failed", "no active device session");
250
+ }
251
+ if (!readers) {
252
+ throw new protocol_js_1.DeviceProtocolError("failed", "session active but lane readers unknown");
253
+ }
254
+ return { m: meta, r: readers };
255
+ }
256
+ /** Post one plaintext and wait for the result keyed to `id`. On the client
257
+ * timeout, tell the device to drop it (`cancel {id}`) and fail. A task's cancel
258
+ * also names the task in `re`, and an aborted task gets a short grace to report. */
259
+ async function sendAndWait(id, plaintext, r, m, op, ropts = {}) {
260
+ const isTask = op === "task";
261
+ let aborted = false;
262
+ const result = new Promise((resolve, reject) => {
263
+ const timer = setTimeout(() => {
264
+ pending.delete(id);
265
+ reject(new CommandTimeout(`${op} timed out`));
266
+ }, ropts.timeoutMs ?? commandTimeoutMs);
267
+ pending.set(id, { resolve, reject, timer, onProgress: ropts.onProgress });
268
+ });
269
+ result.catch(() => undefined);
270
+ const cancelBody = () => (0, protocol_js_1.encodeDeviceMessage)({ v: protocol_js_1.DEVICE_PROTOCOL_VERSION, id: (0, protocol_js_1.deviceMessageId)(), seq: Math.max(seq, 1), op: "cancel", session: m.id, ...(isTask ? { re: id } : {}) }, { id });
271
+ const onAbort = () => {
272
+ const p = pending.get(id);
273
+ if (!p || aborted)
274
+ return;
275
+ aborted = true;
276
+ // Ask the device to stop, then give it a moment to say how far it got.
277
+ void transport.postCommand(cancelBody(), r).catch(() => undefined);
278
+ clearTimeout(p.timer);
279
+ p.timer = setTimeout(() => {
280
+ pending.delete(id);
281
+ p.reject(new CommandAborted("task aborted"));
282
+ }, TASK_ABORT_GRACE_MS);
283
+ };
284
+ if (ropts.signal) {
285
+ if (ropts.signal.aborted)
286
+ queueMicrotask(onAbort);
287
+ else
288
+ ropts.signal.addEventListener("abort", onAbort, { once: true });
289
+ }
290
+ try {
291
+ try {
292
+ await transport.postCommand(plaintext, r);
293
+ }
294
+ catch (e) {
295
+ const p = pending.get(id);
296
+ if (p) {
297
+ clearTimeout(p.timer);
298
+ pending.delete(id);
299
+ }
300
+ throw e;
301
+ }
302
+ try {
303
+ return await result;
304
+ }
305
+ catch (e) {
306
+ if (e instanceof CommandTimeout) {
307
+ // Out-of-band and best effort: consumes no seq. A command that already
308
+ // started keeps its stored result on the device for a retry by id.
309
+ await transport.postCommand(cancelBody(), r).catch(() => undefined);
310
+ throw new protocol_js_1.DeviceProtocolError("failed", e.message);
311
+ }
312
+ if (e instanceof CommandAborted)
313
+ throw new protocol_js_1.DeviceProtocolError("failed", e.message);
314
+ throw e;
315
+ }
316
+ }
317
+ finally {
318
+ ropts.signal?.removeEventListener("abort", onAbort);
319
+ }
320
+ }
321
+ async function execute(op, args, ropts) {
322
+ if (ropts?.signal?.aborted)
323
+ throw new protocol_js_1.DeviceProtocolError("failed", "task aborted");
324
+ const { m, r } = requireActive();
325
+ const id = (0, protocol_js_1.deviceMessageId)(); // reused by every resend of this command
326
+ seq += 1;
327
+ let resynced = false;
328
+ let refreshed = false;
329
+ let skewed = false;
330
+ for (;;) {
331
+ const plaintext = (0, protocol_js_1.encodeDeviceMessage)({ v: protocol_js_1.DEVICE_PROTOCOL_VERSION, id, seq, op, session: m.id, exp: Date.now() + clockOffsetMs + commandTtlMs }, args);
332
+ const res = await sendAndWait(id, plaintext, r, m, op, ropts);
333
+ if (res.op !== "error")
334
+ return res;
335
+ const b = (res.body ?? {});
336
+ const expected = typeof b.expected_seq === "number" ? b.expected_seq : undefined;
337
+ if (typeof b.now === "number" && Number.isFinite(b.now))
338
+ clockOffsetMs = b.now - Date.now();
339
+ if (b.code === "clock_skew" && !skewed) {
340
+ skewed = true;
341
+ if (expected !== undefined)
342
+ seq = expected;
343
+ continue; // same id and seq, exp corrected to the device's clock
344
+ }
345
+ if (b.code === "out_of_order" && expected !== undefined && !resynced) {
346
+ resynced = true;
347
+ seq = expected; // resend with the SAME id so it cannot run twice
348
+ continue;
349
+ }
350
+ if (b.code === "expired" && !refreshed) {
351
+ refreshed = true;
352
+ if (expected !== undefined)
353
+ seq = expected;
354
+ continue; // same id and seq, fresh exp
355
+ }
356
+ if (b.code === "paused") {
357
+ if (expected !== undefined)
358
+ seq = expected - 1;
359
+ // Not a state change (deliveries own that): just fail this call.
360
+ throw new DevicePausedError(b.reason ?? "paused");
361
+ }
362
+ if (expected !== undefined)
363
+ seq = expected - 1;
364
+ return res;
365
+ }
366
+ }
367
+ function request(op, args, ropts) {
368
+ if (pausedReason !== null)
369
+ return Promise.reject(new DevicePausedError(pausedReason));
370
+ const run = inFlight === 0 ? execute(op, args, ropts) : tail.then(() => execute(op, args, ropts));
371
+ inFlight += 1;
372
+ tail = run.then(() => undefined, () => undefined).then(() => {
373
+ inFlight -= 1;
374
+ });
375
+ return run;
376
+ }
377
+ // Typed wrappers. Each throws a DeviceProtocolError on an `error` result and
378
+ // on an `ask` result (the person has to act at the machine first).
379
+ function expect(op, wantOp) {
380
+ return async (args, ropts) => {
381
+ const res = await request(op, args, ropts);
382
+ if (res.op === "error") {
383
+ const b = (res.body ?? {});
384
+ throw new protocol_js_1.DeviceProtocolError(b.code ?? "failed", b.message);
385
+ }
386
+ if (res.op === "ask") {
387
+ const reason = (res.body ?? {}).reason ?? "the device is waiting for the person";
388
+ emit("ask", reason);
389
+ throw new protocol_js_1.DeviceProtocolError("needs_approval", reason);
390
+ }
391
+ if (res.op !== wantOp) {
392
+ throw new protocol_js_1.DeviceProtocolError("failed", `expected ${wantOp}, got ${res.op}`);
393
+ }
394
+ return res.body;
395
+ };
396
+ }
397
+ const doObserve = expect("observe", "observation");
398
+ const doClick = expect("click", "ack");
399
+ const doType = expect("type", "ack");
400
+ const doKey = expect("key", "ack");
401
+ const doScroll = expect("scroll", "ack");
402
+ const doSubmit = expect("submit", "ack");
403
+ const doFocus = expect("focus_app", "ack");
404
+ const doListApps = expect("list_apps", "apps");
405
+ const doReadFile = expect("read_file", "file");
406
+ const doWriteFile = expect("write_file", "ack");
407
+ const doTask = expect("task", "task_result");
408
+ function handleDelivery(kind, body) {
409
+ if (!kind.startsWith("device_session"))
410
+ return;
411
+ const b = (body ?? {});
412
+ const type = typeof b.type === "string" ? b.type : kind;
413
+ // New deliveries carry `event`; the legacy ones only a `device_session_<x>` type.
414
+ const ev = typeof b.event === "string" ? b.event : type.replace(/^device_session_?/, "");
415
+ // The API's delivery IS the session JSON plus type/event/session_id; older
416
+ // shapes nest it under `session`.
417
+ const flat = typeof b.id === "string" && typeof b.status === "string";
418
+ const sess = b.session && typeof b.session === "object"
419
+ ? b.session
420
+ : flat
421
+ ? { ...b }
422
+ : undefined;
423
+ if (flat && sess) {
424
+ delete sess.type;
425
+ delete sess.event;
426
+ delete sess.session_id;
427
+ }
428
+ const sid = (sess?.id ?? b.session_id);
429
+ // A delivery about another computer is not ours (an agent can hold sessions on several).
430
+ const dev = (sess?.device_id ?? b.device_id);
431
+ if (dev !== undefined && !(0, ids_js_1.sameId)(dev, params.deviceId))
432
+ return;
433
+ if (meta && sid !== undefined && !(0, ids_js_1.sameId)(sid, meta.id))
434
+ return;
435
+ const status = (b.status ?? sess?.status);
436
+ switch (ev) {
437
+ case "active":
438
+ case "promoted": {
439
+ if (!meta && !sess)
440
+ return;
441
+ const merged = { ...(meta ?? {}), ...(sess ?? {}) };
442
+ if (sid !== undefined)
443
+ merged.id = sid;
444
+ if (ev === "active" || status === "active") {
445
+ becomeActive(merged, true);
446
+ }
447
+ else {
448
+ meta = { ...merged, status: "requested" };
449
+ emitState({ state: "requested" });
450
+ startApprovalTimer();
451
+ }
452
+ break;
453
+ }
454
+ case "queue_moved": {
455
+ if (!meta)
456
+ return;
457
+ const position = Number(b.position);
458
+ if (!Number.isFinite(position))
459
+ return;
460
+ meta = { ...meta, status: "queued", position };
461
+ emitState({ state: "queued", position });
462
+ break;
463
+ }
464
+ case "paused": {
465
+ if (!meta)
466
+ return;
467
+ const reason = (b.pause_reason ?? b.reason ?? "paused");
468
+ pausedReason = reason;
469
+ meta = { ...meta, status: "paused", pause_reason: reason };
470
+ emitState({ state: "paused", reason });
471
+ break;
472
+ }
473
+ case "resumed": {
474
+ if (!meta)
475
+ return;
476
+ pausedReason = null;
477
+ meta = { ...meta, status: "active", pause_reason: undefined };
478
+ emitState({ state: "resumed" });
479
+ break;
480
+ }
481
+ case "ended": {
482
+ // Before the session is known, an `ended` may be about an OLDER session of
483
+ // this agent: hold it, apply it only if it turns out to be ours.
484
+ if (!meta) {
485
+ if (sid !== undefined)
486
+ earlyEnded.set(String(sid), b.end_reason ?? "ended");
487
+ return;
488
+ }
489
+ const reason = b.end_reason ?? "ended";
490
+ if (meta)
491
+ meta.status = "ended";
492
+ pausedReason = null;
493
+ readers = null;
494
+ clearOpenTimer();
495
+ const err = new protocol_js_1.DeviceProtocolError("failed", `session ended: ${reason}`);
496
+ const rej = openReject;
497
+ openResolve = openReject = null;
498
+ rej?.(err);
499
+ failAll(err);
500
+ emit("ended", reason);
501
+ emitState({ state: "ended", reason });
502
+ break;
503
+ }
504
+ default:
505
+ break;
506
+ }
507
+ }
508
+ function handleLaneMessage(plaintext) {
509
+ let decoded;
510
+ try {
511
+ decoded = (0, protocol_js_1.decodeDeviceMessage)(plaintext);
512
+ }
513
+ catch {
514
+ return false; // a malformed device line from the device: not ours to answer
515
+ }
516
+ if (!decoded)
517
+ return false;
518
+ const { header, body } = decoded;
519
+ if (!meta || !(0, ids_js_1.sameId)(header.session, meta.id))
520
+ return false;
521
+ if (header.re === undefined)
522
+ return false; // a result always answers a command id
523
+ const p = pending.get(header.re);
524
+ if (!p)
525
+ return false;
526
+ if (header.op === "progress") {
527
+ // Non-final: the command stays pending. Delivered in the order the device sent them; a
528
+ // line that arrives after a newer one is dropped, and only the allow-listed fields get through.
529
+ const line = (0, protocol_js_1.normalizeProgress)(body);
530
+ if (p.onProgress && line && (p.lastProgressSeq === undefined || header.seq > p.lastProgressSeq)) {
531
+ p.lastProgressSeq = header.seq;
532
+ try {
533
+ p.onProgress(line);
534
+ }
535
+ catch {
536
+ /* a callback throwing never breaks the stream */
537
+ }
538
+ }
539
+ return true;
540
+ }
541
+ clearTimeout(p.timer);
542
+ pending.delete(header.re);
543
+ p.resolve({ op: header.op, body });
544
+ return true;
545
+ }
546
+ return {
547
+ open,
548
+ observe: (args) => doObserve(args ?? { target: "screen" }),
549
+ click: (args) => doClick(args).then(() => undefined),
550
+ type: (text) => doType({ text }).then(() => undefined),
551
+ key: (keys) => doKey({ keys }).then(() => undefined),
552
+ scroll: (args) => doScroll(args).then(() => undefined),
553
+ submit: (element) => doSubmit({ element }).then(() => undefined),
554
+ focusApp: (app) => doFocus({ app }).then(() => undefined),
555
+ listApps: () => doListApps(),
556
+ readFile: (path) => doReadFile({ path }),
557
+ writeFile: (path, contentB64) => doWriteFile({ path, content_b64: contentB64 }).then(() => undefined),
558
+ async task(goal, opts = {}) {
559
+ // Refuses here what the device would refuse, before anything is sent.
560
+ const args = (0, protocol_js_1.taskCommandBody)(goal, { doneWhen: opts.doneWhen, maxSteps: opts.maxSteps, timeoutS: opts.timeoutS });
561
+ const timeoutS = args.timeout_s ?? protocol_js_1.TASK_TIMEOUT_S_DEFAULT;
562
+ const body = await doTask(args, {
563
+ timeoutMs: timeoutS * 1000 + protocol_js_1.TASK_CLIENT_GRACE_MS,
564
+ onProgress: opts.onProgress,
565
+ signal: opts.signal,
566
+ });
567
+ return (0, protocol_js_1.normalizeTaskResult)(body);
568
+ },
569
+ async stop() {
570
+ const id = meta?.id;
571
+ if (!id)
572
+ return;
573
+ try {
574
+ await transport.stopSession(id);
575
+ }
576
+ finally {
577
+ if (meta)
578
+ meta.status = "ended";
579
+ readers = null;
580
+ failAll(new protocol_js_1.DeviceProtocolError("failed", "session stopped"));
581
+ }
582
+ },
583
+ session: () => meta,
584
+ pausedReason: () => pausedReason,
585
+ handleDelivery,
586
+ handleLaneMessage,
587
+ on: (event, cb) => {
588
+ (listeners[event] ??= []).push(cb);
589
+ },
590
+ onState: (cb) => {
591
+ stateListeners.push(cb);
592
+ return () => {
593
+ const i = stateListeners.indexOf(cb);
594
+ if (i >= 0)
595
+ stateListeners.splice(i, 1);
596
+ };
597
+ },
598
+ _capabilityForOp: protocol_js_1.CAPABILITY_FOR_OP, // re-exported for consumers that gate before sending
599
+ };
600
+ }
601
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/device/client.ts"],"names":[],"mappings":"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"}