@intentic/machine 1.240.0 → 1.243.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/README.md +47 -11
- package/dist/computer/commands.d.ts.map +1 -1
- package/dist/computer/commands.js +3 -1
- package/dist/computer/commands.js.map +1 -1
- package/dist/computer/connection.d.ts +6 -1
- package/dist/computer/connection.d.ts.map +1 -1
- package/dist/computer/connection.js +12 -6
- package/dist/computer/connection.js.map +1 -1
- package/dist/{sync/daemon-base.d.ts → daemon-base.d.ts} +9 -7
- package/dist/daemon-base.d.ts.map +1 -0
- package/dist/{sync/daemon-base.js → daemon-base.js} +8 -8
- package/dist/daemon-base.js.map +1 -0
- package/dist/install.d.ts +0 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +9 -4
- package/dist/install.js.map +1 -1
- package/dist/installed.d.ts +7 -0
- package/dist/installed.d.ts.map +1 -0
- package/dist/installed.js +44 -0
- package/dist/installed.js.map +1 -0
- package/dist/resident.d.ts +1 -0
- package/dist/resident.d.ts.map +1 -1
- package/dist/resident.js +4 -3
- package/dist/resident.js.map +1 -1
- package/dist/status.d.ts +1 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +15 -1
- package/dist/status.js.map +1 -1
- package/dist/sync/commands.d.ts.map +1 -1
- package/dist/sync/commands.js +3 -1
- package/dist/sync/commands.js.map +1 -1
- package/dist/sync/mirror.js +1 -1
- package/dist/sync/mirror.js.map +1 -1
- package/dist/sync/report.d.ts +1 -1
- package/dist/sync/report.d.ts.map +1 -1
- package/dist/sync/report.js +7 -7
- package/dist/sync/report.js.map +1 -1
- package/dist/sync/tunnel.d.ts +3 -2
- package/dist/sync/tunnel.d.ts.map +1 -1
- package/dist/sync/tunnel.js.map +1 -1
- package/dist/upgrade.d.ts +11 -4
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +31 -7
- package/dist/upgrade.js.map +1 -1
- package/package.json +9 -9
- package/dist/sync/daemon-base.d.ts.map +0 -1
- package/dist/sync/daemon-base.js.map +0 -1
package/README.md
CHANGED
|
@@ -13,7 +13,8 @@ running" one answer instead of two halves of one.
|
|
|
13
13
|
The **computer half** (`src/computer/`, the machine side of the `host` capability):
|
|
14
14
|
|
|
15
15
|
- Dial each linked sandbox — one outbound WebSocket, enrollment token in the first frame, oRPC after that; the
|
|
16
|
-
machine *serves* `hostContract`, so no port ever opens here.
|
|
16
|
+
machine *serves* `hostContract`, so no port ever opens here. Where it dials is the shared resolver's answer
|
|
17
|
+
(below), re-asked on every reconnect, so a sandbox on this very machine stays connected with its tunnel down.
|
|
17
18
|
- Expose the tool surface (`run_command`, files, screenshot, `describe`; deliberately no delete — trash is
|
|
18
19
|
recoverable) as MCP carried verbatim, so a machine can learn a tool without a daemon release.
|
|
19
20
|
- Enforce the owner's scopes **here**, never in the sandbox, and append every call to an audit log that
|
|
@@ -30,23 +31,37 @@ The **sync half** (`src/sync/`, the machine side of desktop sync):
|
|
|
30
31
|
a one-way backup of the sandbox's own state.
|
|
31
32
|
- Serve the SSH transport itself on loopback (the sandbox's sshd reached over its HTTPS surface), mirror every
|
|
32
33
|
workspace port onto this machine's localhost, and bridge git so commits appear in local clones.
|
|
33
|
-
- **Dial a sandbox that runs on this very machine directly** ([src/sync/daemon-base.ts](src/sync/daemon-base.ts)):
|
|
34
|
-
the container publishes its daemon on `127.0.0.1:<port derived from the sandbox id>`, so the transport, the
|
|
35
|
-
ports poll and the machine report use that instead of sending a multi-gigabyte Mutagen sync out to the
|
|
36
|
-
reachability edge and back to the same laptop. A candidate is adopted only if the daemon's unauthenticated
|
|
37
|
-
`/health` answers with the id we expected — a port is not a sandbox, and the sync token is what would be
|
|
38
|
-
presented to whoever holds it. The sandbox's public URL stays the floor under every pairing, and a pairing
|
|
39
|
-
sitting on it is re-probed each minute, so a container started after the watcher gets promoted with no restart.
|
|
40
34
|
- Own the **port-mirroring switch** (`sync mirror off|on`, optionally `--sandbox <id>`): mirroring is the one
|
|
41
35
|
thing here that writes to *this* computer's localhost, so the flag lives on this side, survives a restart, and
|
|
42
36
|
is read every tick. File sync, the state backup and the git bridge are untouched by it — the point is to stop
|
|
43
37
|
the ports without unpairing the sandbox. The sandbox's Computers tab has a button for it, and that button runs
|
|
44
|
-
this very command over the `host` capability, so the two can never disagree.
|
|
38
|
+
this very command over the `host` capability, so the two can never disagree. The same is true of the other
|
|
39
|
+
three verbs — `sync pause`, `sync resume` and `sync uninstall --sandbox <id>`.
|
|
40
|
+
|
|
41
|
+
**Both scopes are buttons, because both scopes are commands.** With `--sandbox` these act on one pairing, and
|
|
42
|
+
that is the switch under that pairing's own folder and ports in the tab. Run BARE they act on every sandbox
|
|
43
|
+
this machine pairs, which is what they mean in a terminal and what "turn this off on this laptop" should mean
|
|
44
|
+
on screen, so the machine's own row carries a **File syncing** and a **Port mirroring** switch that omit the
|
|
45
|
+
flag. The tab never sends a bare `sync uninstall`: unpairing is the one verb here that a fresh one-liner is the
|
|
46
|
+
only way back from, so the button always names the pairing it ends. A machine whose pairings disagree (one
|
|
47
|
+
mirroring, one not — which the per-pairing switches exist to allow) is drawn as such rather than collapsed to
|
|
48
|
+
one position, and offered both directions.
|
|
45
49
|
- Register Mutagen's daemon for login autostart — on Windows through the launcher stub, because Mutagen's own
|
|
46
50
|
registration flashes a console window at every boot.
|
|
47
51
|
|
|
48
52
|
**Shared** (`src/`): the one resident loop (`run`), the merged `status` (and its `--json` envelope the desktop
|
|
49
|
-
app's tray reads), self-`upgrade` with automatic rollback,
|
|
53
|
+
app's tray reads), self-`upgrade` with automatic rollback, the autostart spec, and **where a sandbox's daemon is
|
|
54
|
+
dialled** ([src/daemon-base.ts](src/daemon-base.ts)). A sandbox usually runs in a container on this very
|
|
55
|
+
machine, which publishes its daemon on `127.0.0.1:<port derived from the sandbox id>`, so every dial either half
|
|
56
|
+
makes — the computer socket, both enrollments, the sync transport, the ports poll, the machine report — tries
|
|
57
|
+
that address first and the public URL last. A candidate is adopted only if the daemon's unauthenticated
|
|
58
|
+
`/health` answers with the id we expected: a port is not a sandbox, and a token is what would be presented to
|
|
59
|
+
whoever holds it. For the sync half the shortcut saves a multi-gigabyte Mutagen sync a trip out to the
|
|
60
|
+
reachability edge and back to the same laptop. For the computer half it is reachability itself: the socket used
|
|
61
|
+
to dial the public URL and nothing else, so a sandbox whose tunnel was down read "offline" on its own Computers
|
|
62
|
+
tab, with every button there gone, while this same process was polling it over loopback. The watcher re-probes
|
|
63
|
+
a pairing sitting on the public URL each minute, so a container started later is promoted with no restart; the
|
|
64
|
+
socket re-resolves on every reconnect.
|
|
50
65
|
|
|
51
66
|
## The resident loop
|
|
52
67
|
|
|
@@ -58,12 +73,33 @@ halves in one process ([src/resident.ts](src/resident.ts)):
|
|
|
58
73
|
- The process exits — and takes the login entry with it — only when **both** halves have nothing to serve.
|
|
59
74
|
- On a signal it exits `128+signal`, never 0: a supervisor must restart what it did not stop, and the incident
|
|
60
75
|
that bought that rule is written out in [src/sync/mirror.ts](src/sync/mirror.ts).
|
|
76
|
+
- It stamps **the build it is running** into its pidfile (`pid boot build`). Nothing else knows it: replacing the
|
|
77
|
+
binary does not touch the process, so a machine can hold a current agent and keep serving a months-old one.
|
|
78
|
+
|
|
79
|
+
### Installed vs running
|
|
80
|
+
|
|
81
|
+
Two facts, and every surface now carries both. `agents.sync` in the machine report is the **file** at
|
|
82
|
+
`bin/intentic-machine` ([src/installed.ts](src/installed.ts)); `watcher.build` is the **loop** running from it.
|
|
83
|
+
They drift whenever a binary lands without a restart — a card's one-liner re-run, a copy dropped in, an upgrade
|
|
84
|
+
in one environment while the loop runs in another — and the gap used to be invisible: whichever process built the
|
|
85
|
+
report stamped its own version into the one field, so the same machine answered its running build to the sandbox
|
|
86
|
+
its loop posts to and its installed build to one reading over a `host` capability.
|
|
87
|
+
|
|
88
|
+
- `intentic-machine status` says which is which, and the summary the tray reads leads with `OLD BUILD RUNNING`.
|
|
89
|
+
- The Computers row says it beside the pid, with the two commands that close it.
|
|
90
|
+
- `intentic-machine upgrade` restarts a loop that is behind the installed binary even when there is nothing to
|
|
91
|
+
download, and after a swap it verifies that the loop which came up **is** the new build rather than that some
|
|
92
|
+
process is alive — the check the old agent passed just as well as the new one.
|
|
93
|
+
- A loop already on the installed build is never bounced, and a loop that is stopped is never started: `run
|
|
94
|
+
--stop` is a thing people do on purpose.
|
|
61
95
|
|
|
62
96
|
## Key files
|
|
63
97
|
|
|
64
98
|
- [src/commands.ts](src/commands.ts) — the CLI surface: `computer setup|uninstall|updates`, `sync setup|pause|resume|mirror|uninstall`, shared `run|status|version|upgrade|uninstall`.
|
|
65
99
|
- [src/install.ts](src/install.ts) — what every `setup` runs first: self-update (then re-exec), PATH repair, the Windows launcher stub. Everything the install scripts used to decide, decided once here.
|
|
66
|
-
- [src/upgrade.ts](src/upgrade.ts) — `upgrade`: what is published, then download → probe → stop → swap → start, with a rollback behind every step.
|
|
100
|
+
- [src/upgrade.ts](src/upgrade.ts) — `upgrade`: what is published, then download → probe → stop → swap → start, with a rollback behind every step, and a restart when the file is current but the loop is not.
|
|
101
|
+
- [src/installed.ts](src/installed.ts) — which build the *file* at `bin/intentic-machine` is, as opposed to the one running: free while the two agree, one probe per swap after they stop.
|
|
102
|
+
- [src/daemon-base.ts](src/daemon-base.ts) — where a sandbox's daemon is dialled, for both halves: loopback first when `/health` proves it is ours, the public URL as the floor.
|
|
67
103
|
- [src/resident.ts](src/resident.ts) — the one loop, its pidfile, and `reconcileResidency`.
|
|
68
104
|
- [src/computer/auto-prepare.ts](src/computer/auto-prepare.ts) — the background update-download tick; the judgement about *what* to download stays in `ic sandbox prepare --auto`, on purpose.
|
|
69
105
|
- [src/status.ts](src/status.ts) — both halves as one answer; `--json` is what the desktop app and tray read.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/computer/commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,GAAG,EAA0B,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/computer/commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,GAAG,EAA0B,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAwKlE,eAAO,MAAM,iBAAiB,QAAe,GAAG,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CA2BhF,CAAC;AA6CF,eAAO,MAAM,gBAAgB;;;;CAAgC,CAAC"}
|
|
@@ -2,12 +2,14 @@ import { rm } from "node:fs/promises";
|
|
|
2
2
|
import { sleep } from "@intentic/base/async";
|
|
3
3
|
import { createUi } from "@intentic/local-agent";
|
|
4
4
|
import { buildCommand } from "@stricli/core";
|
|
5
|
+
import { resolveDaemonBase } from "../daemon-base.js";
|
|
5
6
|
import { prepareSetup } from "../install.js";
|
|
6
7
|
import { reconcileResidency } from "../resident.js";
|
|
7
8
|
import { auditPath, configPath, readLinks, readPrepareUpdates, removeLinks, upsertLink, writePrepareUpdates } from "./config.js";
|
|
8
9
|
const enroll = async (sandboxUrl, pairToken, { attempts = 10, delayMs = 3000 } = {}) => {
|
|
9
|
-
const url = `${sandboxUrl.replace(/\/$/, "")}/system/hosts/enroll`;
|
|
10
10
|
for (let attempt = 1;; attempt++) {
|
|
11
|
+
const { base } = await resolveDaemonBase(sandboxUrl);
|
|
12
|
+
const url = `${base}/system/hosts/enroll`;
|
|
11
13
|
let response;
|
|
12
14
|
try {
|
|
13
15
|
response = await fetch(url, { method: "POST", headers: { "x-intentic-pair": pairToken } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/computer/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAoC,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,YAAY,EAAuB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAiB,SAAS,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAgBhJ,MAAM,MAAM,GAAG,KAAK,EAChB,UAAkB,EAClB,SAAiB,EACjB,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,GAA4C,EAAE,EACrC,EAAE;IAC5C,
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/computer/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAoC,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,YAAY,EAAuB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAiB,SAAS,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAgBhJ,MAAM,MAAM,GAAG,KAAK,EAChB,UAAkB,EAClB,SAAiB,EACjB,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,GAA4C,EAAE,EACrC,EAAE;IAC5C,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAOhC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,GAAG,IAAI,sBAAsB,CAAC;QAC1C,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACD,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;gBACtB,MAAM,KAAK,CAAC;YAChB,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0DAA0D,OAAO,IAAI,QAAQ,MAAM,CAAC,CAAC;YAC1G,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACrB,SAAS;QACb,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,2GAA2G,CAAC,CAAC;QACjI,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAC;YAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,QAAQ,CAAC,MAAM,gBAAgB,OAAO,IAAI,QAAQ,MAAM,CAAC,CAAC;YAC9H,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACrB,SAAS;QACb,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,MAAM,MAAM,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsC,CAAC;IACxE,CAAC;AACL,CAAC,CAAC;AAOF,MAAM,KAAK,GAAG,YAAY,CAAa;IACnC,IAAI,EAAE,EAAE,KAAK,EAAE,6EAA6E,EAAE;IAC9F,UAAU,EAAE;QACR,KAAK,EAAE;YACH,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,0DAA0D,EAAE;YACzG,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,gEAAgE,EAAE;SACnH;KACJ;IACD,KAAK,CAAC,IAAI,CAAuB,KAAiB;QAI9C,MAAM,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAKvG,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,GAAG,GAAQ,EAAE,CAAC,IAAI,CAAC;QACzB,EAAE,CAAC,KAAK,CAAC,kCAAkC,EAAE,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC;YACD,MAAM,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;gBAAS,CAAC;YACP,EAAE,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACL,CAAC;CACJ,CAAC,CAAC;AAMH,MAAM,UAAU,GAAwB;IACpC,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,EAAE;IACzE,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,EAAE;CACvE,CAAC;AAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,EAAM,EAAE,GAAQ,EAAE,KAAiB,EAAiB,EAAE;IAC1E,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,4CAA4C,CAAC,CAAC;IAC5E,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAK9D,MAAM,IAAI,GAAa;QACnB,UAAU,EAAE,KAAK,CAAC,GAAG;QACrB,EAAE;QACF,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE;KACpI,CAAC;IAOF,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACrC,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,sCAAsC,CAAC,CAAC;IAKrE,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAG9B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAChC,EAAE,CAAC,QAAQ,CACP,6BAA6B,EAC7B,EAAE,EACF,MAAM,KAAK,CAAC;QACR,CAAC,CAAC,qFAAqF;QACvF,CAAC,CAAC,0GAA0G,MAAM,iBAAiB,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAClK;QACI,CAAC,UAAU,EAAE,yBAAyB,CAAC;QACvC,CAAC,YAAY,EAAE,qCAAqC,CAAC;KACxD,CACJ,CAAC;AACN,CAAC,CAAC;AAMF,MAAM,SAAS,GAAG,YAAY,CAAiB;IAC3C,IAAI,EAAE,EAAE,KAAK,EAAE,gEAAgE,EAAE;IACjF,UAAU,EAAE;QACR,KAAK,EAAE;YAGH,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,uDAAuD,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC7H;KACJ;IACD,KAAK,CAAC,IAAI,CAAuB,KAAqB;QAClD,MAAM,GAAG,GAAG,CAAC,OAAe,EAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACtF,MAAM,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;CACJ,CAAC,CAAC;AAOH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAQ,EAAE,OAAgB,EAAiB,EAAE;IACjF,MAAM,IAAI,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3E,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;IAC/B,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,qCAAqC,IAAI,oBAAoB,CAAC,CAAC;QACnE,OAAO;IACX,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAIpB,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClB,GAAG,CACC,qBAAqB,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,MAAM,WAAW,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CACvJ,CAAC;QACF,OAAO;IACX,CAAC;IACD,GAAG,CACC,OAAO,CAAC,MAAM,KAAK,CAAC;QAChB,CAAC,CAAC,+CAA+C;QACjD,CAAC,CAAC,qBAAqB,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iGAAiG,CAChL,CAAC;IACF,GAAG,CAAC,+CAA+C,SAAS,GAAG,CAAC,CAAC;AACrE,CAAC,CAAC;AAWF,MAAM,OAAO,GAAG,YAAY,CAAe;IACvC,IAAI,EAAE,EAAE,KAAK,EAAE,iHAAiH,EAAE;IAClI,UAAU,EAAE;QACR,KAAK,EAAE;YACH,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,kDAAkD,EAAE;YAClF,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,4CAA4C,EAAE;SAChF;KACJ;IACD,KAAK,CAAC,IAAI,CAAuB,KAAmB;QAChD,MAAM,GAAG,GAAG,CAAC,OAAe,EAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACtF,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC1B,GAAG,CACC,CAAC,MAAM,kBAAkB,EAAE,CAAC;gBACxB,CAAC,CAAC,uJAAuJ;gBACzJ,CAAC,CAAC,0IAA0I,CACnJ,CAAC;YACF,OAAO;QACX,CAAC;QACD,MAAM,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAIpC,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC9B,GAAG,CACC,KAAK,CAAC,EAAE;YACJ,CAAC,CAAC,kEAAkE;YACpE,CAAC,CAAC,6GAA6G,CACtH,CAAC;IACN,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { Log } from "@intentic/local-agent";
|
|
2
|
+
import { type DaemonBase } from "../daemon-base.js";
|
|
2
3
|
import { type HostLink } from "./config.js";
|
|
3
4
|
export interface HostConnection {
|
|
4
5
|
readonly done: Promise<void>;
|
|
5
6
|
readonly stop: () => void;
|
|
6
7
|
}
|
|
7
|
-
export
|
|
8
|
+
export interface Dial {
|
|
9
|
+
readonly resolveBase: (sandboxUrl: string) => Promise<DaemonBase>;
|
|
10
|
+
readonly socket: (url: string) => WebSocket;
|
|
11
|
+
}
|
|
12
|
+
export declare const connect: (config: HostLink, version: string, log: Log, dial?: Dial) => HostConnection;
|
|
8
13
|
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/computer/connection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/computer/connection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,aAAa,CAAC;AAwC5D,MAAM,WAAW,cAAc;IAE3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;CAC7B;AAKD,MAAM,WAAW,IAAI;IACjB,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAClE,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;CAC/C;AAID,eAAO,MAAM,OAAO,WAAY,QAAQ,WAAW,MAAM,OAAO,GAAG,SAAQ,IAAI,KAAc,cA4F5F,CAAC"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { createBackoff } from "@intentic/base/async";
|
|
2
2
|
import { hostConnectUrl } from "@intentic/sandbox-contract";
|
|
3
3
|
import { RPCHandler } from "@orpc/server/websocket";
|
|
4
|
+
import { resolveDaemonBase } from "../daemon-base.js";
|
|
4
5
|
import { rememberScopes } from "./config.js";
|
|
5
6
|
import { createHostRouter } from "./router.js";
|
|
6
7
|
const RETRY_MIN_MS = 1_000;
|
|
7
8
|
const RETRY_MAX_MS = 30_000;
|
|
8
9
|
const STABLE_MS = 60_000;
|
|
9
10
|
const UNAUTHORIZED = 1008;
|
|
10
|
-
|
|
11
|
+
const realDial = { resolveBase: resolveDaemonBase, socket: (url) => new WebSocket(url) };
|
|
12
|
+
export const connect = (config, version, log, dial = realDial) => {
|
|
11
13
|
let scopes = config.scopes;
|
|
12
14
|
const handler = new RPCHandler(createHostRouter({
|
|
13
15
|
scopes: () => scopes,
|
|
@@ -25,14 +27,18 @@ export const connect = (config, version, log) => {
|
|
|
25
27
|
const done = new Promise((resolvePromise) => {
|
|
26
28
|
resolveDone = resolvePromise;
|
|
27
29
|
});
|
|
28
|
-
const open = () => {
|
|
29
|
-
const
|
|
30
|
+
const open = async () => {
|
|
31
|
+
const { base, local } = await dial.resolveBase(config.sandboxUrl);
|
|
32
|
+
if (stopped) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const ws = dial.socket(hostConnectUrl(base));
|
|
30
36
|
socket = ws;
|
|
31
37
|
ws.addEventListener("open", () => {
|
|
32
38
|
openedAt = Date.now();
|
|
33
39
|
handler.upgrade(ws);
|
|
34
40
|
ws.send(JSON.stringify({ type: "hello", token: config.token, version }));
|
|
35
|
-
log(`connected to ${config.sandboxUrl} as "${config.id}"`);
|
|
41
|
+
log(`connected to ${config.sandboxUrl}${local ? ` over loopback (${base})` : ""} as "${config.id}"`);
|
|
36
42
|
});
|
|
37
43
|
ws.addEventListener("close", (event) => {
|
|
38
44
|
socket = undefined;
|
|
@@ -49,11 +55,11 @@ export const connect = (config, version, log) => {
|
|
|
49
55
|
const delay = ladder.next(openedAt === undefined ? 0 : Date.now() - openedAt);
|
|
50
56
|
openedAt = undefined;
|
|
51
57
|
log(`disconnected (${event.code}); reconnecting in ${Math.round(delay / 1000)}s`);
|
|
52
|
-
setTimeout(open, delay);
|
|
58
|
+
setTimeout(() => void open(), delay);
|
|
53
59
|
});
|
|
54
60
|
ws.addEventListener("error", () => log("connection error"));
|
|
55
61
|
};
|
|
56
|
-
open();
|
|
62
|
+
void open();
|
|
57
63
|
return {
|
|
58
64
|
done,
|
|
59
65
|
stop: () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/computer/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAmB,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAiB,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/computer/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
import type { Log } from "@intentic/local-agent";
|
|
2
|
-
import type { Pairing } from "./config.js";
|
|
3
|
-
export type DaemonTarget = Pick<Pairing, "sandboxId" | "sandboxUrl">;
|
|
4
2
|
export declare const daemonIdOf: (sandboxUrl: string) => string | undefined;
|
|
5
|
-
export declare const candidateBases: (
|
|
3
|
+
export declare const candidateBases: (sandboxUrl: string) => readonly string[];
|
|
6
4
|
export declare const probeDaemonBase: (base: string, expectedId: string, fetchImpl?: typeof fetch) => Promise<boolean>;
|
|
7
5
|
export interface DaemonBase {
|
|
8
6
|
readonly base: string;
|
|
9
7
|
readonly local: boolean;
|
|
10
8
|
}
|
|
11
|
-
export declare const resolveDaemonBase: (
|
|
9
|
+
export declare const resolveDaemonBase: (sandboxUrl: string, fetchImpl?: typeof fetch) => Promise<DaemonBase>;
|
|
12
10
|
export declare const PROMOTION_INTERVAL_MS = 60000;
|
|
11
|
+
export interface DaemonTarget {
|
|
12
|
+
readonly sandboxId: string;
|
|
13
|
+
readonly sandboxUrl: string;
|
|
14
|
+
}
|
|
13
15
|
export interface DaemonBases {
|
|
14
16
|
readonly resolve: (pairing: DaemonTarget) => Promise<string>;
|
|
15
17
|
readonly failed: (sandboxId: string) => void;
|
|
16
18
|
}
|
|
17
19
|
export declare const createDaemonBases: (log: Log, fetchImpl?: typeof fetch, now?: () => number) => DaemonBases;
|
|
18
|
-
export interface
|
|
19
|
-
readonly pairing:
|
|
20
|
+
export interface Dialed<T extends DaemonTarget> {
|
|
21
|
+
readonly pairing: T;
|
|
20
22
|
readonly base: string;
|
|
21
23
|
}
|
|
22
|
-
export declare const dialedPairings: (pairings: readonly
|
|
24
|
+
export declare const dialedPairings: <T extends DaemonTarget>(pairings: readonly T[], bases: DaemonBases) => Promise<readonly Dialed<T>[]>;
|
|
23
25
|
//# sourceMappingURL=daemon-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-base.d.ts","sourceRoot":"","sources":["../src/daemon-base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AA2EjD,eAAO,MAAM,UAAU,eAAgB,MAAM,KAAG,MAAM,GAAG,SAGxD,CAAC;AAaF,eAAO,MAAM,cAAc,eAAgB,MAAM,KAAG,SAAS,MAAM,EAUlE,CAAC;AAOF,eAAO,MAAM,eAAe,SAAgB,MAAM,cAAc,MAAM,cAAa,OAAO,KAAK,KAAW,OAAO,CAAC,OAAO,CAWxH,CAAC;AAIF,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CAC3B;AAcD,eAAO,MAAM,iBAAiB,eAAsB,MAAM,cAAa,OAAO,KAAK,KAAW,OAAO,CAAC,UAAU,CAe/G,CAAC;AAsBF,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAI5C,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC/B;AAkBD,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7D,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAID,eAAO,MAAM,iBAAiB,QAAS,GAAG,cAAa,OAAO,KAAK,QAAe,MAAM,MAAM,KAAc,WAuC3G,CAAC;AAMF,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,YAAY;IAC1C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAQD,eAAO,MAAM,cAAc,GAAU,CAAC,SAAS,YAAY,YAAY,SAAS,CAAC,EAAE,SAAS,WAAW,KAAG,OAAO,CAAC,SAAS,MAAM,CAAC,CAAC,CAAC,EAAE,CAC7B,CAAC"}
|
|
@@ -6,9 +6,9 @@ export const daemonIdOf = (sandboxUrl) => {
|
|
|
6
6
|
const label = sandboxIdFromUrl(sandboxUrl);
|
|
7
7
|
return label !== undefined && DAEMON_ID.test(label) ? label : undefined;
|
|
8
8
|
};
|
|
9
|
-
export const candidateBases = (
|
|
10
|
-
const floor =
|
|
11
|
-
const id = daemonIdOf(
|
|
9
|
+
export const candidateBases = (sandboxUrl) => {
|
|
10
|
+
const floor = sandboxUrl.replace(/\/$/, "");
|
|
11
|
+
const id = daemonIdOf(sandboxUrl);
|
|
12
12
|
if (id === undefined) {
|
|
13
13
|
return [floor];
|
|
14
14
|
}
|
|
@@ -28,9 +28,9 @@ export const probeDaemonBase = async (base, expectedId, fetchImpl = fetch) => {
|
|
|
28
28
|
return false;
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
|
-
export const resolveDaemonBase = async (
|
|
32
|
-
const candidates = candidateBases(
|
|
33
|
-
const expected = daemonIdOf(
|
|
31
|
+
export const resolveDaemonBase = async (sandboxUrl, fetchImpl = fetch) => {
|
|
32
|
+
const candidates = candidateBases(sandboxUrl);
|
|
33
|
+
const expected = daemonIdOf(sandboxUrl);
|
|
34
34
|
for (const [index, candidate] of candidates.entries()) {
|
|
35
35
|
if (index === candidates.length - 1) {
|
|
36
36
|
return { base: candidate, local: false };
|
|
@@ -39,7 +39,7 @@ export const resolveDaemonBase = async (pairing, fetchImpl = fetch) => {
|
|
|
39
39
|
return { base: candidate, local: true };
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
-
return { base:
|
|
42
|
+
return { base: sandboxUrl.replace(/\/$/, ""), local: false };
|
|
43
43
|
};
|
|
44
44
|
export const PROMOTION_INTERVAL_MS = 60_000;
|
|
45
45
|
export const createDaemonBases = (log, fetchImpl = fetch, now = Date.now) => {
|
|
@@ -51,7 +51,7 @@ export const createDaemonBases = (log, fetchImpl = fetch, now = Date.now) => {
|
|
|
51
51
|
if (kept !== undefined && !kept.stale && (kept.local || at - kept.at < PROMOTION_INTERVAL_MS)) {
|
|
52
52
|
return kept.base;
|
|
53
53
|
}
|
|
54
|
-
const verdict = await resolveDaemonBase(pairing, fetchImpl);
|
|
54
|
+
const verdict = await resolveDaemonBase(pairing.sandboxUrl, fetchImpl);
|
|
55
55
|
held.set(pairing.sandboxId, { ...verdict, at, stale: false });
|
|
56
56
|
if (kept !== undefined && kept.base === verdict.base) {
|
|
57
57
|
return verdict.base;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-base.js","sourceRoot":"","sources":["../src/daemon-base.ts"],"names":[],"mappings":"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"}
|
package/dist/install.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type Log } from "@intentic/local-agent";
|
|
2
2
|
import { type UpgradeExec, type UpgradeOutcome } from "./upgrade.js";
|
|
3
3
|
export declare const SELF_UPDATE_GUARD_ENV = "INTENTIC_MACHINE_NO_SELF_UPDATE";
|
|
4
|
-
export declare const residentCameUp: () => Promise<boolean>;
|
|
5
4
|
export declare const machineUpgradeExec: (out: Log) => UpgradeExec;
|
|
6
5
|
export interface SelfUpdateIo {
|
|
7
6
|
readonly installed: string;
|
package/dist/install.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,GAAG,EAAuB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,GAAG,EAAuB,MAAM,uBAAuB,CAAC;AAMtE,OAAO,EAAyC,KAAK,WAAW,EAAE,KAAK,cAAc,EAAkB,MAAM,cAAc,CAAC;AAkB5H,eAAO,MAAM,qBAAqB,oCAAoC,CAAC;AAsBvE,eAAO,MAAM,kBAAkB,QAAS,GAAG,KAAG,WAAqF,CAAC;AAYpI,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,KAAK,CAAC;CACvD;AAQD,eAAO,MAAM,qBAAqB,OAC1B,YAAY,OACX,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,QACjC,SAAS,MAAM,EAAE,OAClB,GAAG,KACT,OAAO,CAAC,IAAI,CAmBd,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAS,GAAG,KAAG,YAY1C,CAAC;AA0BH,eAAO,MAAM,qBAAqB,WAAY,MAAM,UAAU,MAAM,KAAG,MAAM,GAAG,SAM/E,CAAC;AAwDF,eAAO,MAAM,qBAAqB,QAAe,GAAG,KAAG,OAAO,CAAC,IAAI,CAmBlE,CAAC;AAKF,eAAO,MAAM,YAAY,QAAe,GAAG,QAAQ,SAAS,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CAWlF,CAAC"}
|
package/dist/install.js
CHANGED
|
@@ -6,16 +6,21 @@ import { pollUntil } from "@intentic/base/async";
|
|
|
6
6
|
import { errorMessage } from "@intentic/base/errors";
|
|
7
7
|
import { WINDOWS_LAUNCH_STUB } from "@intentic/local-agent";
|
|
8
8
|
import { DEV_VERSION } from "@intentic/sandbox-contract";
|
|
9
|
-
import {
|
|
9
|
+
import { agentPath } from "./installed.js";
|
|
10
|
+
import { readResidentBuild, readResidentPid, reconcileResidency, stopResident } from "./resident.js";
|
|
10
11
|
import { binDir } from "./sync/config.js";
|
|
11
12
|
import { archToken, download } from "./sync/mutagen.js";
|
|
12
|
-
import {
|
|
13
|
+
import { assetUrl, realUpgradeExec, runUpgrade, upgradeMessage } from "./upgrade.js";
|
|
13
14
|
import { MACHINE_VERSION } from "./version.js";
|
|
14
15
|
export const SELF_UPDATE_GUARD_ENV = "INTENTIC_MACHINE_NO_SELF_UPDATE";
|
|
15
16
|
const RESIDENT_START_TIMEOUT_MS = 10_000;
|
|
16
17
|
const RESIDENT_START_POLL_MS = 200;
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
const restartResident = async () => {
|
|
19
|
+
await reconcileResidency(() => undefined);
|
|
20
|
+
await pollUntil(async () => (await readResidentPid()) !== undefined, { intervalMs: RESIDENT_START_POLL_MS, timeoutMs: RESIDENT_START_TIMEOUT_MS });
|
|
21
|
+
return await readResidentBuild();
|
|
22
|
+
};
|
|
23
|
+
export const machineUpgradeExec = (out) => realUpgradeExec(stopResident, restartResident, readResidentBuild, out);
|
|
19
24
|
const runningAsInstalledAgent = async () => {
|
|
20
25
|
const from = await realpath(process.execPath).catch(() => undefined);
|
|
21
26
|
const at = await realpath(agentPath).catch(() => undefined);
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAY,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const agentPath: string;
|
|
2
|
+
export declare const buildOf: (at: string | undefined, started: {
|
|
3
|
+
readonly at: string | undefined;
|
|
4
|
+
readonly ours: boolean;
|
|
5
|
+
}, own: string, ask: (at: string) => string | undefined) => string | undefined;
|
|
6
|
+
export declare const installedBuild: () => string | undefined;
|
|
7
|
+
//# sourceMappingURL=installed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installed.d.ts","sourceRoot":"","sources":["../src/installed.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,SAAS,QAAyC,CAAC;AAqDhE,eAAO,MAAM,OAAO,OACZ,MAAM,GAAG,SAAS,WACb;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,OAC/D,MAAM,OACN,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,KACxC,MAAM,GAAG,SAKX,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,MAAM,GAAG,SAAwG,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { realpathSync, statSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { binDir } from "./sync/config.js";
|
|
5
|
+
import { exe } from "./sync/mutagen.js";
|
|
6
|
+
import { MACHINE_VERSION } from "./version.js";
|
|
7
|
+
export const agentPath = join(binDir, `intentic-machine${exe}`);
|
|
8
|
+
const PROBE_TIMEOUT_MS = 30_000;
|
|
9
|
+
const identity = () => {
|
|
10
|
+
try {
|
|
11
|
+
const info = statSync(agentPath);
|
|
12
|
+
return `${info.size}:${Math.round(info.mtimeMs)}`;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const STARTED_FROM = identity();
|
|
19
|
+
const IS_INSTALLED_AGENT = (() => {
|
|
20
|
+
try {
|
|
21
|
+
return realpathSync(process.execPath) === realpathSync(agentPath);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
})();
|
|
27
|
+
let probed;
|
|
28
|
+
const probe = (of) => {
|
|
29
|
+
if (probed?.of === of) {
|
|
30
|
+
return probed.version;
|
|
31
|
+
}
|
|
32
|
+
const result = spawnSync(agentPath, ["version"], { encoding: "utf8", timeout: PROBE_TIMEOUT_MS, windowsHide: true });
|
|
33
|
+
const version = result.status === 0 ? /^\d+\.\d+\.\d+$/.exec(result.stdout.trim())?.[0] : undefined;
|
|
34
|
+
probed = { of, version };
|
|
35
|
+
return version;
|
|
36
|
+
};
|
|
37
|
+
export const buildOf = (at, started, own, ask) => {
|
|
38
|
+
if (at === undefined) {
|
|
39
|
+
return own;
|
|
40
|
+
}
|
|
41
|
+
return started.ours && at === started.at ? own : ask(at);
|
|
42
|
+
};
|
|
43
|
+
export const installedBuild = () => buildOf(identity(), { at: STARTED_FROM, ours: IS_INSTALLED_AGENT }, MACHINE_VERSION, probe);
|
|
44
|
+
//# sourceMappingURL=installed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installed.js","sourceRoot":"","sources":["../src/installed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAsB/C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,mBAAmB,GAAG,EAAE,CAAC,CAAC;AAIhE,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAIhC,MAAM,QAAQ,GAAG,GAAuB,EAAE;IACtC,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC,CAAC;AAKF,MAAM,YAAY,GAAG,QAAQ,EAAE,CAAC;AAChC,MAAM,kBAAkB,GAAG,CAAC,GAAY,EAAE;IACtC,IAAI,CAAC;QACD,OAAO,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,YAAY,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC,EAAE,CAAC;AAIL,IAAI,MAAiF,CAAC;AAEtF,MAAM,KAAK,GAAG,CAAC,EAAU,EAAsB,EAAE;IAC7C,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,OAAO,CAAC;IAC1B,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAIrH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpG,MAAM,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;IACzB,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,OAAO,GAAG,CACnB,EAAsB,EACtB,OAAoE,EACpE,GAAW,EACX,GAAuC,EACrB,EAAE;IACpB,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACnB,OAAO,GAAG,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,IAAI,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAuB,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC"}
|
package/dist/resident.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type CliLauncher, type Log } from "@intentic/local-agent";
|
|
2
2
|
export declare const machineLauncher: () => CliLauncher;
|
|
3
3
|
export declare const readResidentPid: () => Promise<number | undefined>;
|
|
4
|
+
export declare const readResidentBuild: () => Promise<string | undefined>;
|
|
4
5
|
export declare const startResident: (log: Log) => Promise<void>;
|
|
5
6
|
export declare const stopResident: () => Promise<number | undefined>;
|
|
6
7
|
export declare const reconcileResidency: (log: Log) => Promise<void>;
|
package/dist/resident.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resident.d.ts","sourceRoot":"","sources":["../src/resident.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,WAAW,EAIhB,KAAK,GAAG,EAMX,MAAM,uBAAuB,CAAC;AAiC/B,eAAO,MAAM,eAAe,QAAO,WAA8C,CAAC;AAGlF,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"resident.d.ts","sourceRoot":"","sources":["../src/resident.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,WAAW,EAIhB,KAAK,GAAG,EAMX,MAAM,uBAAuB,CAAC;AAiC/B,eAAO,MAAM,eAAe,QAAO,WAA8C,CAAC;AAGlF,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC,MAAM,GAAG,SAAS,CAA2C,CAAC;AAa/G,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,MAAM,GAAG,SAAS,CAA4C,CAAC;AAUlH,eAAO,MAAM,aAAa,QAAe,GAAG,KAAG,OAAO,CAAC,IAAI,CAQ1D,CAAC;AAMF,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,MAAM,GAAG,SAAS,CAiB/D,CAAC;AAiBF,eAAO,MAAM,kBAAkB,QAAe,GAAG,KAAG,OAAO,CAAC,IAAI,CAY/D,CAAC;AAsBF,eAAO,MAAM,aAAa,QAAe,GAAG,KAAG,OAAO,CAAC,IAAI,CA2D1D,CAAC"}
|
package/dist/resident.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { rm } from "node:fs/promises";
|
|
2
2
|
import { setTimeout as sleep } from "node:timers/promises";
|
|
3
|
-
import { cliLauncher, isProcessAlive,
|
|
3
|
+
import { cliLauncher, isProcessAlive, livePidRecord, pidFileBody, registerAutostart, spawnDetached, unregisterAutostart, writeSecretFile, } from "@intentic/local-agent";
|
|
4
4
|
import { MACHINE_AUTOSTART } from "./autostart.js";
|
|
5
5
|
import { startAutoPrepare } from "./computer/auto-prepare.js";
|
|
6
6
|
import { readLinks } from "./computer/config.js";
|
|
@@ -10,7 +10,8 @@ import { mirrorHeartbeatPath, readState } from "./sync/config.js";
|
|
|
10
10
|
import { runMirrorWatch, signalExitCode } from "./sync/mirror.js";
|
|
11
11
|
import { MACHINE_VERSION } from "./version.js";
|
|
12
12
|
export const machineLauncher = () => cliLauncher("intentic-machine");
|
|
13
|
-
export const readResidentPid = async () => await
|
|
13
|
+
export const readResidentPid = async () => (await livePidRecord(runPidPath))?.pid;
|
|
14
|
+
export const readResidentBuild = async () => (await livePidRecord(runPidPath))?.note;
|
|
14
15
|
const RESIDENT_EXIT_TIMEOUT_MS = 2000;
|
|
15
16
|
const RESIDENT_EXIT_POLL_MS = 50;
|
|
16
17
|
export const startResident = async (log) => {
|
|
@@ -59,7 +60,7 @@ export const runForeground = async (log) => {
|
|
|
59
60
|
log(`a machine agent is already running (pid ${holder}): leaving it alone. Stop it with \`intentic-machine run --stop\` first.`);
|
|
60
61
|
return;
|
|
61
62
|
}
|
|
62
|
-
await writeSecretFile(runPidPath, baseDir, await pidFileBody());
|
|
63
|
+
await writeSecretFile(runPidPath, baseDir, await pidFileBody(process.pid, MACHINE_VERSION));
|
|
63
64
|
const [links, state] = await Promise.all([readLinks(), readState()]);
|
|
64
65
|
if (links.length === 0 && state.pairings.length === 0) {
|
|
65
66
|
log("nothing to serve: no sandbox is linked to this computer and none is paired for sync. Connect one from a card in your sandbox.");
|
package/dist/resident.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resident.js","sourceRoot":"","sources":["../src/resident.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAEH,WAAW,EACX,cAAc,EACd,
|
|
1
|
+
{"version":3,"file":"resident.js","sourceRoot":"","sources":["../src/resident.ts"],"names":[],"mappings":"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"}
|
package/dist/status.d.ts
CHANGED
|
@@ -17,5 +17,6 @@ export declare const statusSummary: (running: number | undefined, links: number,
|
|
|
17
17
|
export declare const machineStatus: (mutagen: string | undefined) => Promise<MachineStatus>;
|
|
18
18
|
export declare const pairingLine: (pairing: MachineReport["pairings"][number]) => string;
|
|
19
19
|
export declare const watcherLine: (watcher: MachineReport["watcher"], now: number) => string;
|
|
20
|
+
export declare const buildSkewLine: (report: MachineReport) => string | undefined;
|
|
20
21
|
export declare const status: import("@stricli/core").Command<CommandContext>;
|
|
21
22
|
//# sourceMappingURL=status.d.ts.map
|
package/dist/status.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAe,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAoBlE,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAK1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,SAAS;YAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IACpI,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAChC;AAMD,eAAO,MAAM,aAAa,YAAa,MAAM,GAAG,SAAS,SAAS,MAAM,QAAQ,aAAa,OAAO,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAe,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAoBlE,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAK1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,SAAS;YAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IACpI,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAChC;AAMD,eAAO,MAAM,aAAa,YAAa,MAAM,GAAG,SAAS,SAAS,MAAM,QAAQ,aAAa,OAAO,MAAM,KAAG,MAwB5G,CAAC;AAEF,eAAO,MAAM,aAAa,YAAmB,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC,aAAa,CAStF,CAAC;AAyCF,eAAO,MAAM,WAAW,YAAa,aAAa,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAG,MAUxE,CAAC;AAUF,eAAO,MAAM,WAAW,YAAa,aAAa,CAAC,SAAS,CAAC,OAAO,MAAM,KAAG,MAc5E,CAAC;AAQF,eAAO,MAAM,aAAa,WAAY,aAAa,KAAG,MAAM,GAAG,SAK9D,CAAC;AAqCF,eAAO,MAAM,MAAM,iDA+DjB,CAAC"}
|
package/dist/status.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { buildCommand } from "@stricli/core";
|
|
2
|
-
import { watcherStalled } from "@intentic/sandbox-contract";
|
|
2
|
+
import { watcherBuildSkew, watcherStalled } from "@intentic/sandbox-contract";
|
|
3
3
|
import { auditPath, readLinks } from "./computer/config.js";
|
|
4
4
|
import { runLogPath } from "./config.js";
|
|
5
5
|
import { readResidentPid } from "./resident.js";
|
|
@@ -21,6 +21,10 @@ export const statusSummary = (running, links, sync, now) => {
|
|
|
21
21
|
if (sync.pairings.length > 0 && watcherStalled(sync.watcher, now)) {
|
|
22
22
|
return `STALLED · ${halves.join(" · ")}`;
|
|
23
23
|
}
|
|
24
|
+
const skew = watcherBuildSkew(sync);
|
|
25
|
+
if (skew !== undefined) {
|
|
26
|
+
return `OLD BUILD RUNNING (${skew.running}, ${skew.installed} installed) · ${halves.join(" · ")}`;
|
|
27
|
+
}
|
|
24
28
|
return halves.join(" · ");
|
|
25
29
|
};
|
|
26
30
|
export const machineStatus = async (mutagen) => {
|
|
@@ -66,12 +70,22 @@ export const watcherLine = (watcher, now) => {
|
|
|
66
70
|
? `Agent: running (pid ${watcher.pid}), no completed sync pass reported yet (a pass finishes within seconds of startup; an agent older than this one never reports them).`
|
|
67
71
|
: `Agent: running (pid ${watcher.pid}), last sync pass ${Math.round(since / 1000)}s ago`;
|
|
68
72
|
};
|
|
73
|
+
export const buildSkewLine = (report) => {
|
|
74
|
+
const skew = watcherBuildSkew(report);
|
|
75
|
+
return skew === undefined
|
|
76
|
+
? undefined
|
|
77
|
+
: `Agent: running ${skew.running}, but ${skew.installed} is installed on this machine — the loop keeps the build it started with. Restart it with \`intentic-machine run --stop\` then \`intentic-machine run\`.`;
|
|
78
|
+
};
|
|
69
79
|
const printReport = (report, out) => {
|
|
70
80
|
out(`Paired sandboxes (${report.pairings.length}):`);
|
|
71
81
|
for (const pairing of report.pairings) {
|
|
72
82
|
out(pairingLine(pairing));
|
|
73
83
|
}
|
|
74
84
|
out(watcherLine(report.watcher, Date.now()));
|
|
85
|
+
const skew = buildSkewLine(report);
|
|
86
|
+
if (skew !== undefined) {
|
|
87
|
+
out(skew);
|
|
88
|
+
}
|
|
75
89
|
out(`Ports (${report.ports.length}):`);
|
|
76
90
|
for (const port of report.ports) {
|
|
77
91
|
out(portLine(port));
|