@intentic/machine 1.331.0 → 1.332.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 (230) hide show
  1. package/README.md +56 -4
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +1 -1
  4. package/dist/app.js.map +1 -1
  5. package/dist/autostart/autostart.js +1 -1
  6. package/dist/autostart/autostart.js.map +1 -1
  7. package/dist/cli-ui.d.ts +10 -0
  8. package/dist/cli-ui.d.ts.map +1 -0
  9. package/dist/cli-ui.js +62 -0
  10. package/dist/cli-ui.js.map +1 -0
  11. package/dist/commands.d.ts.map +1 -1
  12. package/dist/commands.js +61 -26
  13. package/dist/commands.js.map +1 -1
  14. package/dist/daemon-base.d.ts +1 -0
  15. package/dist/daemon-base.d.ts.map +1 -1
  16. package/dist/daemon-base.js +21 -18
  17. package/dist/daemon-base.js.map +1 -1
  18. package/dist/device/audit.d.ts.map +1 -1
  19. package/dist/device/audit.js.map +1 -1
  20. package/dist/device/commands.d.ts +8 -6
  21. package/dist/device/commands.d.ts.map +1 -1
  22. package/dist/device/commands.js +64 -42
  23. package/dist/device/commands.js.map +1 -1
  24. package/dist/device/connection.d.ts.map +1 -1
  25. package/dist/device/connection.js +2 -3
  26. package/dist/device/connection.js.map +1 -1
  27. package/dist/device/grant.d.ts +7 -0
  28. package/dist/device/grant.d.ts.map +1 -1
  29. package/dist/device/loopback-catch.d.ts.map +1 -1
  30. package/dist/device/loopback-catch.js +1 -1
  31. package/dist/device/loopback-catch.js.map +1 -1
  32. package/dist/device/mcp.d.ts.map +1 -1
  33. package/dist/device/mcp.js +19 -0
  34. package/dist/device/mcp.js.map +1 -1
  35. package/dist/device/policy.d.ts.map +1 -1
  36. package/dist/device/policy.js +3 -5
  37. package/dist/device/policy.js.map +1 -1
  38. package/dist/device/router.d.ts +7 -0
  39. package/dist/device/router.d.ts.map +1 -1
  40. package/dist/device/router.js +17 -5
  41. package/dist/device/router.js.map +1 -1
  42. package/dist/device/sandbox-cli.d.ts +12 -1
  43. package/dist/device/sandbox-cli.d.ts.map +1 -1
  44. package/dist/device/sandbox-cli.js +90 -18
  45. package/dist/device/sandbox-cli.js.map +1 -1
  46. package/dist/device/sandbox-rounds/keeper.d.ts +28 -1
  47. package/dist/device/sandbox-rounds/keeper.d.ts.map +1 -1
  48. package/dist/device/sandbox-rounds/keeper.js +115 -18
  49. package/dist/device/sandbox-rounds/keeper.js.map +1 -1
  50. package/dist/device/sandbox-rounds/sleep.d.ts +52 -0
  51. package/dist/device/sandbox-rounds/sleep.d.ts.map +1 -0
  52. package/dist/device/sandbox-rounds/sleep.js +115 -0
  53. package/dist/device/sandbox-rounds/sleep.js.map +1 -0
  54. package/dist/device/tools/agent.js +1 -1
  55. package/dist/device/tools/agent.js.map +1 -1
  56. package/dist/device/tools/android.d.ts.map +1 -1
  57. package/dist/device/tools/android.js +7 -62
  58. package/dist/device/tools/android.js.map +1 -1
  59. package/dist/device/tools/describe.d.ts +6 -0
  60. package/dist/device/tools/describe.d.ts.map +1 -1
  61. package/dist/device/tools/describe.js +30 -9
  62. package/dist/device/tools/describe.js.map +1 -1
  63. package/dist/device/tools/ic-binary.d.ts +7 -0
  64. package/dist/device/tools/ic-binary.d.ts.map +1 -1
  65. package/dist/device/tools/ic-binary.js +16 -8
  66. package/dist/device/tools/ic-binary.js.map +1 -1
  67. package/dist/device/tools/logs/logs.d.ts +30 -0
  68. package/dist/device/tools/logs/logs.d.ts.map +1 -0
  69. package/dist/device/tools/logs/logs.js +147 -0
  70. package/dist/device/tools/logs/logs.js.map +1 -0
  71. package/dist/device/tools/programs/artifacts.d.ts.map +1 -1
  72. package/dist/device/tools/programs/artifacts.js +5 -10
  73. package/dist/device/tools/programs/artifacts.js.map +1 -1
  74. package/dist/device/tools/programs/{tunnel.d.ts → device-tunnel.d.ts} +1 -1
  75. package/dist/device/tools/programs/device-tunnel.d.ts.map +1 -0
  76. package/dist/device/tools/programs/{tunnel.js → device-tunnel.js} +1 -1
  77. package/dist/device/tools/programs/device-tunnel.js.map +1 -0
  78. package/dist/device/tools/programs/isolated.d.ts +0 -1
  79. package/dist/device/tools/programs/isolated.d.ts.map +1 -1
  80. package/dist/device/tools/programs/isolated.js +8 -10
  81. package/dist/device/tools/programs/isolated.js.map +1 -1
  82. package/dist/device/tools/programs/programs.d.ts.map +1 -1
  83. package/dist/device/tools/programs/programs.js +87 -35
  84. package/dist/device/tools/programs/programs.js.map +1 -1
  85. package/dist/device/tools/sandboxes.d.ts.map +1 -1
  86. package/dist/device/tools/sandboxes.js +11 -10
  87. package/dist/device/tools/sandboxes.js.map +1 -1
  88. package/dist/device/tools/shell.d.ts +3 -4
  89. package/dist/device/tools/shell.d.ts.map +1 -1
  90. package/dist/device/tools/shell.js +24 -86
  91. package/dist/device/tools/shell.js.map +1 -1
  92. package/dist/engine-env.d.ts +15 -0
  93. package/dist/engine-env.d.ts.map +1 -0
  94. package/dist/engine-env.js +80 -0
  95. package/dist/engine-env.js.map +1 -0
  96. package/dist/environments/commands.d.ts +7 -1
  97. package/dist/environments/commands.d.ts.map +1 -1
  98. package/dist/environments/commands.js +37 -31
  99. package/dist/environments/commands.js.map +1 -1
  100. package/dist/environments/machine-upgrade.d.ts +8 -1
  101. package/dist/environments/machine-upgrade.d.ts.map +1 -1
  102. package/dist/environments/machine-upgrade.js +35 -26
  103. package/dist/environments/machine-upgrade.js.map +1 -1
  104. package/dist/environments/machine.d.ts +5 -4
  105. package/dist/environments/machine.d.ts.map +1 -1
  106. package/dist/environments/machine.js +13 -16
  107. package/dist/environments/machine.js.map +1 -1
  108. package/dist/environments/wsl.d.ts.map +1 -1
  109. package/dist/environments/wsl.js +4 -7
  110. package/dist/environments/wsl.js.map +1 -1
  111. package/dist/install.d.ts.map +1 -1
  112. package/dist/install.js +28 -30
  113. package/dist/install.js.map +1 -1
  114. package/dist/resident/last-exit.d.ts +40 -0
  115. package/dist/resident/last-exit.d.ts.map +1 -0
  116. package/dist/resident/last-exit.js +147 -0
  117. package/dist/resident/last-exit.js.map +1 -0
  118. package/dist/resident/log-roll.d.ts +8 -0
  119. package/dist/resident/log-roll.d.ts.map +1 -0
  120. package/dist/resident/log-roll.js +30 -0
  121. package/dist/resident/log-roll.js.map +1 -0
  122. package/dist/{resident.d.ts → resident/resident.d.ts} +1 -1
  123. package/dist/resident/resident.d.ts.map +1 -0
  124. package/dist/{resident.js → resident/resident.js} +52 -27
  125. package/dist/resident/resident.js.map +1 -0
  126. package/dist/{supervision.d.ts → resident/supervision.d.ts} +7 -3
  127. package/dist/resident/supervision.d.ts.map +1 -0
  128. package/dist/{supervision.js → resident/supervision.js} +17 -14
  129. package/dist/resident/supervision.js.map +1 -0
  130. package/dist/resident/watchdog.d.ts +24 -0
  131. package/dist/resident/watchdog.d.ts.map +1 -0
  132. package/dist/resident/watchdog.js +69 -0
  133. package/dist/resident/watchdog.js.map +1 -0
  134. package/dist/status.d.ts +14 -8
  135. package/dist/status.d.ts.map +1 -1
  136. package/dist/status.js +141 -107
  137. package/dist/status.js.map +1 -1
  138. package/dist/sync/attach-commands.d.ts +1 -1
  139. package/dist/sync/attach-commands.d.ts.map +1 -1
  140. package/dist/sync/attach-commands.js +19 -12
  141. package/dist/sync/attach-commands.js.map +1 -1
  142. package/dist/sync/commands.d.ts +6 -3
  143. package/dist/sync/commands.d.ts.map +1 -1
  144. package/dist/sync/commands.js +149 -113
  145. package/dist/sync/commands.js.map +1 -1
  146. package/dist/sync/exec.d.ts +9 -0
  147. package/dist/sync/exec.d.ts.map +1 -1
  148. package/dist/sync/exec.js +21 -22
  149. package/dist/sync/exec.js.map +1 -1
  150. package/dist/sync/folders.d.ts.map +1 -1
  151. package/dist/sync/folders.js +3 -14
  152. package/dist/sync/folders.js.map +1 -1
  153. package/dist/sync/forget-command.d.ts +1 -1
  154. package/dist/sync/forget-command.d.ts.map +1 -1
  155. package/dist/sync/forget-command.js +10 -7
  156. package/dist/sync/forget-command.js.map +1 -1
  157. package/dist/sync/git-bridge.d.ts.map +1 -1
  158. package/dist/sync/git-bridge.js +4 -2
  159. package/dist/sync/git-bridge.js.map +1 -1
  160. package/dist/sync/local-sandboxes.d.ts.map +1 -1
  161. package/dist/sync/local-sandboxes.js +2 -4
  162. package/dist/sync/local-sandboxes.js.map +1 -1
  163. package/dist/sync/mirror.d.ts.map +1 -1
  164. package/dist/sync/mirror.js +7 -16
  165. package/dist/sync/mirror.js.map +1 -1
  166. package/dist/sync/mutagen.d.ts.map +1 -1
  167. package/dist/sync/mutagen.js +33 -37
  168. package/dist/sync/mutagen.js.map +1 -1
  169. package/dist/sync/project/project-commands.d.ts +7 -2
  170. package/dist/sync/project/project-commands.d.ts.map +1 -1
  171. package/dist/sync/project/project-commands.js +110 -46
  172. package/dist/sync/project/project-commands.js.map +1 -1
  173. package/dist/sync/project/project-files.d.ts +4 -6
  174. package/dist/sync/project/project-files.d.ts.map +1 -1
  175. package/dist/sync/project/project-files.js +4 -6
  176. package/dist/sync/project/project-files.js.map +1 -1
  177. package/dist/sync/project/project-local.d.ts.map +1 -1
  178. package/dist/sync/project/project-local.js +3 -19
  179. package/dist/sync/project/project-local.js.map +1 -1
  180. package/dist/sync/project/project-remote.js +4 -4
  181. package/dist/sync/project/project-transfer.d.ts +13 -30
  182. package/dist/sync/project/project-transfer.d.ts.map +1 -1
  183. package/dist/sync/project/project-transfer.js +1 -1
  184. package/dist/sync/project/project-transfer.js.map +1 -1
  185. package/dist/sync/retire.d.ts.map +1 -1
  186. package/dist/sync/retire.js +3 -3
  187. package/dist/sync/retire.js.map +1 -1
  188. package/dist/sync/siblings.d.ts.map +1 -1
  189. package/dist/sync/siblings.js +3 -6
  190. package/dist/sync/siblings.js.map +1 -1
  191. package/dist/sync/ssh.d.ts +1 -1
  192. package/dist/sync/ssh.d.ts.map +1 -1
  193. package/dist/sync/ssh.js +8 -7
  194. package/dist/sync/ssh.js.map +1 -1
  195. package/dist/sync/swap-pause.d.ts.map +1 -1
  196. package/dist/sync/swap-pause.js +2 -2
  197. package/dist/sync/swap-pause.js.map +1 -1
  198. package/dist/upgrade.d.ts +7 -0
  199. package/dist/upgrade.d.ts.map +1 -1
  200. package/dist/upgrade.js +24 -13
  201. package/dist/upgrade.js.map +1 -1
  202. package/dist/upkeep/doctor.d.ts +4 -2
  203. package/dist/upkeep/doctor.d.ts.map +1 -1
  204. package/dist/upkeep/doctor.js +40 -26
  205. package/dist/upkeep/doctor.js.map +1 -1
  206. package/dist/upkeep/login.js +1 -1
  207. package/dist/upkeep/login.js.map +1 -1
  208. package/dist/upkeep/retention.d.ts +6 -0
  209. package/dist/upkeep/retention.d.ts.map +1 -1
  210. package/dist/upkeep/retention.js +55 -3
  211. package/dist/upkeep/retention.js.map +1 -1
  212. package/dist/upkeep/retired.js +1 -1
  213. package/dist/upkeep/retired.js.map +1 -1
  214. package/dist/upkeep/second-ic.d.ts.map +1 -1
  215. package/dist/upkeep/second-ic.js +4 -6
  216. package/dist/upkeep/second-ic.js.map +1 -1
  217. package/dist/upkeep/trash.d.ts.map +1 -1
  218. package/dist/upkeep/trash.js +5 -6
  219. package/dist/upkeep/trash.js.map +1 -1
  220. package/package.json +9 -9
  221. package/dist/device/tools/programs/tunnel.d.ts.map +0 -1
  222. package/dist/device/tools/programs/tunnel.js.map +0 -1
  223. package/dist/resident.d.ts.map +0 -1
  224. package/dist/resident.js.map +0 -1
  225. package/dist/supervision.d.ts.map +0 -1
  226. package/dist/supervision.js.map +0 -1
  227. package/dist/watchdog.d.ts +0 -13
  228. package/dist/watchdog.d.ts.map +0 -1
  229. package/dist/watchdog.js +0 -38
  230. package/dist/watchdog.js.map +0 -1
@@ -4,31 +4,34 @@ import { setTimeout as sleep } from "node:timers/promises";
4
4
  import { errorMessage } from "@intentic/base/errors";
5
5
  import { plural } from "@intentic/base/format";
6
6
  import { autostart, claimPidFile, holdPidFile, releasePidFile, stopProcess } from "@intentic/local-agent";
7
- import { beginTrial } from "./agent-trial.js";
8
- import { MACHINE_AUTOSTART } from "./autostart/autostart.js";
9
- import { baseDir, runPidPath } from "./config.js";
10
- import { startAutoBackup } from "./device/sandbox-rounds/auto-backup.js";
11
- import { startAutoPrepare } from "./device/sandbox-rounds/auto-prepare.js";
12
- import { LINK_STAMP_MS, linkStatePath, readLinks, stampLinkStates } from "./device/config.js";
13
- import { connect, reachedOverLoopback } from "./device/connection.js";
14
- import { hostedSlugs, keeperOn, startKeeper } from "./device/sandbox-rounds/keeper.js";
15
- import { startProbationWatch } from "./device/sandbox-rounds/probation-watch.js";
16
- import { readChannelSlugs } from "./device/sandbox-rounds/swap-records.js";
17
- import { fleet } from "./device/tools/sandboxes.js";
18
- import { takeOverCommandLedger } from "./device/tools/command-ledger.js";
19
- import { stopRunningCommands } from "./device/tools/shell.js";
20
- import { superviseChildren } from "./environments/children.js";
21
- import { startAutoUpgrade } from "./environments/auto-upgrade.js";
22
- import { heldDistros, SUPERVISOR_ENV, supervisedByWindows, updateMachineConfig, withoutChild } from "./environments/machine.js";
23
- import { UPGRADE_ENV } from "./environments/machine-upgrade.js";
24
- import { sweepBin } from "./release.js";
7
+ import { beginTrial } from "../agent-trial.js";
8
+ import { MACHINE_AUTOSTART } from "../autostart/autostart.js";
9
+ import { baseDir, runLogPath, runPidPath } from "../config.js";
10
+ import { startAutoBackup } from "../device/sandbox-rounds/auto-backup.js";
11
+ import { startAutoPrepare } from "../device/sandbox-rounds/auto-prepare.js";
12
+ import { LINK_STAMP_MS, linkStatePath, readLinks, stampLinkStates } from "../device/config.js";
13
+ import { connect, reachedOverLoopback } from "../device/connection.js";
14
+ import { hostedSlugs, keeperOn, startKeeper } from "../device/sandbox-rounds/keeper.js";
15
+ import { startProbationWatch } from "../device/sandbox-rounds/probation-watch.js";
16
+ import { readChannelSlugs } from "../device/sandbox-rounds/swap-records.js";
17
+ import { fleet } from "../device/tools/sandboxes.js";
18
+ import { takeOverCommandLedger } from "../device/tools/command-ledger.js";
19
+ import { stopRunningCommands } from "../device/tools/shell.js";
20
+ import { syncEngineEnv } from "../engine-env.js";
21
+ import { superviseChildren } from "../environments/children.js";
22
+ import { startAutoUpgrade } from "../environments/auto-upgrade.js";
23
+ import { heldDistros, SUPERVISOR_ENV, supervisedByWindows, updateMachineConfig, withoutChild } from "../environments/machine.js";
24
+ import { UPGRADE_ENV } from "../environments/machine-upgrade.js";
25
+ import { sweepBin } from "../release.js";
25
26
  import { assertSupervisor, machineLauncher, readResident, retireResident, startResident } from "./supervision.js";
26
- import { mirrorHeartbeatPath, readState } from "./sync/config.js";
27
- import { runMirrorWatch } from "./sync/mirror.js";
28
- import { startUpkeep } from "./upkeep/reconcile.js";
29
- import { MACHINE_VERSION } from "./version.js";
27
+ import { mirrorHeartbeatPath, readState } from "../sync/config.js";
28
+ import { runMirrorWatch } from "../sync/mirror.js";
29
+ import { startUpkeep } from "../upkeep/reconcile.js";
30
+ import { MACHINE_VERSION } from "../version.js";
31
+ import { beginExitRecord, lastExitPath, reasonForCode, recordExit, recordUnexpectedExits, stampAlive, thisRun } from "./last-exit.js";
32
+ import { startLogRoll } from "./log-roll.js";
30
33
  import { startWatchdog } from "./watchdog.js";
31
- import { WINDOWS_SIDE } from "./environments/wsl.js";
34
+ import { WINDOWS_SIDE } from "../environments/wsl.js";
32
35
  export const readResidentPid = async () => (await readResident())?.pid;
33
36
  export const readResidentBuild = async () => (await readResident())?.build;
34
37
  export const signalExitCode = (signal) => 128 + (constants.signals[signal] ?? 15);
@@ -46,7 +49,7 @@ export const keptSandboxes = async () => {
46
49
  ? await hostedSlugs(async () => (await fleet({ current: false })).map(({ slug, keptElsewhere }) => ({ slug, keptElsewhere })), async () => await readChannelSlugs())
47
50
  : [];
48
51
  };
49
- const keptNote = (kept) => `this machine runs ${plural(kept.length, "sandbox", "sandboxes")} (${kept.join(", ")}), so the agent stays to bring ${kept.length === 1 ? "it" : "them"} back after a restart. \`intentic-machine sandbox keeper off\` lets it go.`;
52
+ const keptNote = (kept) => `this device runs ${plural(kept.length, "sandbox", "sandboxes")} (${kept.join(", ")}), so the agent stays to bring ${kept.length === 1 ? "it" : "them"} back after a restart; turning the sandbox keeper off lets it go.`;
50
53
  export const ensureResident = async (log, { forGood = false } = {}) => {
51
54
  if (nothingToServe(await readServed())) {
52
55
  const kept = forGood ? [] : await keptSandboxes();
@@ -81,7 +84,7 @@ const claim = async (record, supervised, log) => {
81
84
  }
82
85
  const claimed = await claimPidFile(runPidPath, baseDir, record);
83
86
  if (!claimed.claimed) {
84
- log(`a machine agent is already running (pid ${claimed.holder.pid}): leaving it alone. Stop it with \`intentic-machine run --stop\` first.`);
87
+ log(`An agent is already running (pid ${claimed.holder.pid}): leaving it alone. intentic-machine run --stop stops it first.`);
85
88
  }
86
89
  return claimed.claimed;
87
90
  };
@@ -151,7 +154,7 @@ const runtimeOf = (supervised, trial, kept, lease, log) => {
151
154
  });
152
155
  const later = supervised ? SUPERVISED_ROUND_DELAY_MS : 0;
153
156
  const upkeep = startUpkeep(log, lease.supervisor);
154
- const rounds = [watch, keeper, startAutoPrepare(log, { delayMs: later }), startAutoBackup(log, { delayMs: later }), upkeep];
157
+ const rounds = [watch, keeper, startAutoPrepare(log, { delayMs: later }), startAutoBackup(log, { delayMs: later }), upkeep, startLogRoll(runLogPath, log)];
155
158
  const autoUpgrade = supervised ? undefined : startAutoUpgrade(log);
156
159
  const unproven = trial.prove(log);
157
160
  const finish = async (code) => {
@@ -167,6 +170,8 @@ const runtimeOf = (supervised, trial, kept, lease, log) => {
167
170
  await stopRunningCommands();
168
171
  await trial.clean();
169
172
  await release();
173
+ const { reason, detail } = reasonForCode(code);
174
+ recordExit(reason, detail);
170
175
  process.exit(code);
171
176
  };
172
177
  for (const signal of ["SIGTERM", "SIGINT", "SIGHUP"]) {
@@ -179,6 +184,7 @@ const tick = async (runtime, lease, log) => {
179
184
  log("another machine agent took this environment over: leaving.");
180
185
  await runtime.finish(EXIT_REPLACED);
181
186
  }
187
+ syncEngineEnv();
182
188
  const now = await readServed().catch((error) => {
183
189
  log(`config unreadable (${errorMessage(error)}): keeping what already runs.`);
184
190
  return undefined;
@@ -198,6 +204,7 @@ const tick = async (runtime, lease, log) => {
198
204
  }
199
205
  }
200
206
  await stampLinks(runtime.connections);
207
+ await stampAlive();
201
208
  };
202
209
  const begin = async (supervised, log) => {
203
210
  const record = { pid: process.pid, build: MACHINE_VERSION };
@@ -224,13 +231,30 @@ const begin = async (supervised, log) => {
224
231
  await takeOverCommandLedger(log);
225
232
  return { served, lease, kept };
226
233
  };
234
+ const beginRecord = async (watchdog, log) => {
235
+ try {
236
+ const before = await beginExitRecord(process.pid, MACHINE_VERSION);
237
+ if (before !== undefined) {
238
+ log(before);
239
+ }
240
+ }
241
+ catch (error) {
242
+ log(`could not start this run's exit record (${errorMessage(error)}); the next agent will not know why this one ended.`);
243
+ return;
244
+ }
245
+ recordUnexpectedExits();
246
+ const run = thisRun();
247
+ if (run !== undefined) {
248
+ watchdog.record({ path: lastExitPath, base: run });
249
+ }
250
+ };
227
251
  const serving = (served) => [
228
252
  plural(served.links.length, "linked sandbox"),
229
253
  plural(served.pairings, "sync pairing"),
230
254
  ...(WINDOWS_SIDE ? [plural(served.children.length, "WSL distro")] : []),
231
255
  ].join(", ");
232
256
  export const runForeground = async (log) => {
233
- startWatchdog();
257
+ const watchdog = startWatchdog();
234
258
  const supervised = supervisedByWindows();
235
259
  delete process.env[SUPERVISOR_ENV];
236
260
  delete process.env[UPGRADE_ENV];
@@ -244,6 +268,7 @@ export const runForeground = async (log) => {
244
268
  await trial.clean();
245
269
  return;
246
270
  }
271
+ await beginRecord(watchdog, log);
247
272
  const runtime = runtimeOf(supervised, trial, started.kept, started.lease, log);
248
273
  log(`serving ${serving(started.served)}`);
249
274
  for (;;) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resident.js","sourceRoot":"","sources":["../../src/resident/resident.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,16 @@
1
1
  import { type AutostartKind, type CliLauncher, type Log, type PidRecord } from "@intentic/local-agent";
2
- import { WINDOWS_SUPERVISOR } from "./environments/machine.js";
2
+ import { WINDOWS_SUPERVISOR } from "../environments/machine.js";
3
3
  export declare const machineLauncher: () => CliLauncher;
4
4
  export declare const readResident: () => Promise<PidRecord | undefined>;
5
5
  export type Supervisor = AutostartKind | typeof WINDOWS_SUPERVISOR;
6
- export declare const stopResident: () => Promise<number | undefined>;
6
+ export interface StopWhy {
7
+ readonly reason: "stopped" | "restart" | "update";
8
+ readonly detail: string;
9
+ }
10
+ export declare const stopResident: (why?: StopWhy) => Promise<number | undefined>;
7
11
  export declare const startResident: (log: Log) => Promise<void>;
8
12
  export declare const waitOutSwaps: (log: Log) => Promise<void>;
9
- export declare const restartResident: (log: Log) => Promise<void>;
13
+ export declare const restartResident: (log: Log, why?: StopWhy) => Promise<void>;
10
14
  export declare const retireResident: (log: Log) => Promise<void>;
11
15
  export declare const assertSupervisor: (supervised: boolean, log: Log) => Promise<Supervisor>;
12
16
  //# sourceMappingURL=supervision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervision.d.ts","sourceRoot":"","sources":["../../src/resident/supervision.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,aAAa,EAElB,KAAK,WAAW,EAGhB,KAAK,GAAG,EACR,KAAK,SAAS,EAIjB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EAAmB,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAMjF,eAAO,MAAM,eAAe,QAAO,WAA8C,CAAC;AAIlF,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,SAAS,GAAG,SAAS,CAAoC,CAAC;AAGxG,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,OAAO,kBAAkB,CAAC;AA2BnE,MAAM,WAAW,OAAO;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAKD,eAAO,MAAM,YAAY,SAAe,OAAO,KAAqB,OAAO,CAAC,MAAM,GAAG,SAAS,CAc7F,CAAC;AAoBF,eAAO,MAAM,aAAa,QAAe,GAAG,KAAG,OAAO,CAAC,IAAI,CAoB1D,CAAC;AAQF,eAAO,MAAM,YAAY,QAAe,GAAG,KAAG,OAAO,CAAC,IAAI,CAazD,CAAC;AAEF,eAAO,MAAM,eAAe,QAAe,GAAG,QAAO,OAAO,KAAgE,OAAO,CAAC,IAAI,CAIvI,CAAC;AAGF,eAAO,MAAM,cAAc,QAAe,GAAG,KAAG,OAAO,CAAC,IAAI,CAG3D,CAAC;AAGF,eAAO,MAAM,gBAAgB,eAAsB,OAAO,OAAO,GAAG,KAAG,OAAO,CAAC,UAAU,CAWxF,CAAC"}
@@ -1,13 +1,14 @@
1
1
  import { rm } from "node:fs/promises";
2
2
  import { pollUntil } from "@intentic/base/async";
3
3
  import { autostart, cliLauncher, livePidRecord, releasePidFile, spawnDetached, stopProcess, } from "@intentic/local-agent";
4
- import { recordStopped } from "./agent-trial.js";
5
- import { MACHINE_AUTOSTART } from "./autostart/autostart.js";
6
- import { runLogPath, runPidPath } from "./config.js";
7
- import { linkStatePath } from "./device/config.js";
8
- import { CUTOVER_HOLDS_MS, readSwapRecords, swapsUnderway } from "./device/sandbox-rounds/swap-records.js";
9
- import { attachToWindows, WINDOWS_SUPERVISOR } from "./environments/machine.js";
10
- import { mirrorHeartbeatPath } from "./sync/config.js";
4
+ import { recordStopped } from "../agent-trial.js";
5
+ import { MACHINE_AUTOSTART } from "../autostart/autostart.js";
6
+ import { runLogPath, runPidPath } from "../config.js";
7
+ import { linkStatePath } from "../device/config.js";
8
+ import { CUTOVER_HOLDS_MS, readSwapRecords, swapsUnderway } from "../device/sandbox-rounds/swap-records.js";
9
+ import { attachToWindows, WINDOWS_SUPERVISOR } from "../environments/machine.js";
10
+ import { mirrorHeartbeatPath } from "../sync/config.js";
11
+ import { recordStopFor } from "./last-exit.js";
11
12
  export const machineLauncher = () => cliLauncher("intentic-machine");
12
13
  const machineAutostart = (log) => autostart(MACHINE_AUTOSTART, machineLauncher(), log);
13
14
  export const readResident = async () => await livePidRecord(runPidPath);
@@ -29,11 +30,13 @@ const waitForResident = async (reask) => {
29
30
  await pollUntil(came, { intervalMs: START_POLL_MS, timeoutMs: START_TIMEOUT_MS });
30
31
  return held;
31
32
  };
32
- export const stopResident = async () => {
33
+ const STOPPED_BY_HAND = { reason: "stopped", detail: "by `intentic-machine run --stop`" };
34
+ export const stopResident = async (why = STOPPED_BY_HAND) => {
33
35
  const held = await readResident();
34
36
  if (held === undefined) {
35
37
  return undefined;
36
38
  }
39
+ recordStopFor(held.pid, why.reason, why.detail);
37
40
  await stopProcess(held.pid, STOP_TIMEOUT_MS);
38
41
  await recordStopped(held.pid);
39
42
  if (await releasePidFile(runPidPath, held.pid)) {
@@ -42,14 +45,14 @@ export const stopResident = async () => {
42
45
  }
43
46
  return held.pid;
44
47
  };
45
- const started = (log, held, by) => log(`machine agent running in the background (pid ${held.pid}, ${by}). Details: ${runLogPath}`);
48
+ const started = (log, held, by) => log(`The agent is running in the background (pid ${held.pid}, ${by}); its log is ${runLogPath}.`);
46
49
  const startThroughWindows = async (log) => {
47
50
  if (!(await attachToWindows(log))) {
48
51
  return false;
49
52
  }
50
53
  const held = await waitForResident();
51
54
  if (held === undefined) {
52
- log("note: the Windows side took this distro over but its agent did not come up here in time; starting it directly.");
55
+ log("The Windows side took this distro over, but its agent did not come up here in time; starting it directly.");
53
56
  return false;
54
57
  }
55
58
  started(log, held, "kept running by the Windows side");
@@ -71,7 +74,7 @@ export const startResident = async (log) => {
71
74
  started(log, held, `started by its ${kind} entry`);
72
75
  return;
73
76
  }
74
- log(`note: the ${kind} login entry did not start the agent within ${START_TIMEOUT_MS / 1000}s; starting it directly.`);
77
+ log(`The ${kind} login entry did not start the agent within ${START_TIMEOUT_MS / 1000}s; starting it directly.`);
75
78
  }
76
79
  const pid = await spawnDetached(runLogPath, machineLauncher(), MACHINE_AUTOSTART.foregroundArgs);
77
80
  log(`machine agent running in the background (pid ${pid}). Details: ${runLogPath}`);
@@ -88,13 +91,13 @@ export const waitOutSwaps = async (log) => {
88
91
  return swapping === "";
89
92
  }, { intervalMs: SWAP_POLL_MS, timeoutMs: CUTOVER_HOLDS_MS });
90
93
  };
91
- export const restartResident = async (log) => {
94
+ export const restartResident = async (log, why = { reason: "restart", detail: "by `intentic-machine run`" }) => {
92
95
  await waitOutSwaps(log);
93
- await stopResident();
96
+ await stopResident(why);
94
97
  await startResident(log);
95
98
  };
96
99
  export const retireResident = async (log) => {
97
- await stopResident();
100
+ await stopResident({ reason: "stopped", detail: "retired: uninstalled, or nothing left to serve here" });
98
101
  await machineAutostart(log).unregister();
99
102
  };
100
103
  export const assertSupervisor = async (supervised, log) => {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervision.js","sourceRoot":"","sources":["../../src/resident/supervision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ExitRecord } from "./last-exit.js";
2
+ export declare const WATCHDOG_PING_MS = 5000;
3
+ export declare const WATCHDOG_STALL_MS: number;
4
+ export declare const stalledFor: (lastPing: number, now: number, limitMs: number) => number | undefined;
5
+ export declare const pausedAcross: (previousCheck: number, now: number, checkMs: number, limitMs: number) => boolean;
6
+ export declare const wallJump: (previousCheck: number, now: number, previousWall: number, wall: number) => number;
7
+ export declare const WALL_JUMP_MS = 10000;
8
+ export declare const AFTER_SLEEP_MS: number;
9
+ export declare const sleepLine: (seconds: number, at: Date) => string;
10
+ export declare const stallLine: (seconds: number, at: Date, sinceSleepSeconds?: number) => string;
11
+ export interface WatchdogRecord {
12
+ readonly path: string;
13
+ readonly base: ExitRecord;
14
+ }
15
+ export interface Watchdog {
16
+ readonly stop: () => void;
17
+ readonly record: (record: WatchdogRecord) => void;
18
+ }
19
+ export declare const startWatchdog: ({ pingMs, limitMs, jumpMs, }?: {
20
+ readonly pingMs?: number;
21
+ readonly limitMs?: number;
22
+ readonly jumpMs?: number;
23
+ }) => Watchdog;
24
+ //# sourceMappingURL=watchdog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchdog.d.ts","sourceRoot":"","sources":["../../src/resident/watchdog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAsBjD,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AACtC,eAAO,MAAM,iBAAiB,QAAa,CAAC;AAK5C,eAAO,MAAM,UAAU,aAAc,MAAM,OAAO,MAAM,WAAW,MAAM,KAAG,MAAM,GAAG,SACN,CAAC;AAQhF,eAAO,MAAM,YAAY,kBAAmB,MAAM,OAAO,MAAM,WAAW,MAAM,WAAW,MAAM,KAAG,OACvB,CAAC;AAO9E,eAAO,MAAM,QAAQ,kBAAmB,MAAM,OAAO,MAAM,gBAAgB,MAAM,QAAQ,MAAM,KAAG,MAAqD,CAAC;AAIxJ,eAAO,MAAM,YAAY,QAAS,CAAC;AAGnC,eAAO,MAAM,cAAc,QAAc,CAAC;AAG1C,eAAO,MAAM,SAAS,YAAa,MAAM,MAAM,IAAI,KAAG,MACmH,CAAC;AAI1K,eAAO,MAAM,SAAS,YAAa,MAAM,MAAM,IAAI,sBAAsB,MAAM,KAAG,MACiI,CAAC;AAmDpN,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAE1B,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;CACrD;AAID,eAAO,MAAM,aAAa,kCAIvB;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAQ,QAiB3F,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { Worker } from "node:worker_threads";
2
+ export const WATCHDOG_PING_MS = 5_000;
3
+ export const WATCHDOG_STALL_MS = 3 * 60_000;
4
+ export const stalledFor = (lastPing, now, limitMs) => now - lastPing >= limitMs ? Math.round((now - lastPing) / 1000) : undefined;
5
+ export const pausedAcross = (previousCheck, now, checkMs, limitMs) => now - previousCheck >= Math.min(Math.max(checkMs * 3, 3000), limitMs / 2);
6
+ export const wallJump = (previousCheck, now, previousWall, wall) => wall - previousWall - (now - previousCheck);
7
+ export const WALL_JUMP_MS = 10_000;
8
+ export const AFTER_SLEEP_MS = 10 * 60_000;
9
+ export const sleepLine = (seconds, at) => `[${at.toISOString()}] watchdog: the agent was paused for ${seconds} s (suspected sleep/resume, or the clock was set forward); not a stall, the count starts again\n`;
10
+ export const stallLine = (seconds, at, sinceSleepSeconds) => `[${at.toISOString()}] event loop stalled for ${seconds} s${sinceSleepSeconds === undefined ? "" : ` (${sinceSleepSeconds} s after a suspected sleep/resume)`}; exiting so the supervisor restarts the agent\n`;
11
+ const WORKER_SOURCE = `
12
+ const { parentPort, workerData } = require("node:worker_threads");
13
+ const { writeSync, writeFileSync } = require("node:fs");
14
+ const stalledFor = ${stalledFor.toString()};
15
+ const stallLine = ${stallLine.toString()};
16
+ const sleepLine = ${sleepLine.toString()};
17
+ const pausedAcross = ${pausedAcross.toString()};
18
+ const wallJump = ${wallJump.toString()};
19
+ const say = (line) => { try { writeSync(2, line); } catch { /* allow(silent-catch): a log that will not take the line must not keep a hung agent alive */ } };
20
+ let last = performance.now();
21
+ let checked = last;
22
+ let checkedWall = Date.now();
23
+ let sleptAt;
24
+ let record;
25
+ parentPort.on("message", (message) => {
26
+ last = performance.now();
27
+ if (typeof message === "object" && message !== null) record = message;
28
+ });
29
+ setInterval(() => {
30
+ const now = performance.now();
31
+ const wall = Date.now();
32
+ const jump = wallJump(checked, now, checkedWall, wall);
33
+ if (pausedAcross(checked, now, workerData.checkMs, workerData.limitMs) || jump >= workerData.jumpMs) {
34
+ last = now;
35
+ sleptAt = now;
36
+ say(sleepLine(Math.round(Math.max(wall - checkedWall, now - checked) / 1000), new Date()));
37
+ }
38
+ checked = now;
39
+ checkedWall = wall;
40
+ const seconds = stalledFor(last, now, workerData.limitMs);
41
+ if (seconds === undefined) return;
42
+ const sinceSleep = sleptAt !== undefined && now - sleptAt <= workerData.afterSleepMs ? Math.round((now - sleptAt) / 1000) : undefined;
43
+ const line = stallLine(seconds, new Date(), sinceSleep);
44
+ say(line);
45
+ if (record !== undefined) {
46
+ try {
47
+ writeFileSync(record.path, JSON.stringify({ ...record.base, reason: "watchdog", at: new Date().toISOString(), detail: line.slice(line.indexOf("]") + 2).trim() }) + "\\n");
48
+ } catch { /* allow(silent-catch): an unwritten record must not keep a hung agent alive; the line above says it */ }
49
+ }
50
+ process.kill(process.pid, "SIGKILL");
51
+ }, workerData.checkMs);
52
+ `;
53
+ export const startWatchdog = ({ pingMs = WATCHDOG_PING_MS, limitMs = WATCHDOG_STALL_MS, jumpMs = WALL_JUMP_MS, } = {}) => {
54
+ const worker = new Worker(WORKER_SOURCE, {
55
+ eval: true,
56
+ workerData: { limitMs, checkMs: Math.min(pingMs, limitMs), jumpMs, afterSleepMs: AFTER_SLEEP_MS },
57
+ });
58
+ worker.unref();
59
+ const ping = setInterval(() => worker.postMessage(0), pingMs);
60
+ ping.unref();
61
+ return {
62
+ stop: () => {
63
+ clearInterval(ping);
64
+ void worker.terminate();
65
+ },
66
+ record: (record) => worker.postMessage(record),
67
+ };
68
+ };
69
+ //# sourceMappingURL=watchdog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchdog.js","sourceRoot":"","sources":["../../src/resident/watchdog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAuB7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC;AAK5C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAE,GAAW,EAAE,OAAe,EAAsB,EAAE,CAC7F,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAQhF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,aAAqB,EAAE,GAAW,EAAE,OAAe,EAAE,OAAe,EAAW,EAAE,CAC1G,GAAG,GAAG,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;AAO9E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,aAAqB,EAAE,GAAW,EAAE,YAAoB,EAAE,IAAY,EAAU,EAAE,CAAC,IAAI,GAAG,YAAY,GAAG,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC;AAIxJ,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;AAGnC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,CAAC;AAG1C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,EAAQ,EAAU,EAAE,CAC3D,IAAI,EAAE,CAAC,WAAW,EAAE,wCAAwC,OAAO,kGAAkG,CAAC;AAI1K,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,EAAQ,EAAE,iBAA0B,EAAU,EAAE,CACvF,IAAI,EAAE,CAAC,WAAW,EAAE,4BAA4B,OAAO,KAAK,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,iBAAiB,oCAAoC,kDAAkD,CAAC;AAOpN,MAAM,aAAa,GAAG;;;qBAGD,UAAU,CAAC,QAAQ,EAAE;oBACtB,SAAS,CAAC,QAAQ,EAAE;oBACpB,SAAS,CAAC,QAAQ,EAAE;uBACjB,YAAY,CAAC,QAAQ,EAAE;mBAC3B,QAAQ,CAAC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCrC,CAAC;AAgBF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAC1B,MAAM,GAAG,gBAAgB,EACzB,OAAO,GAAG,iBAAiB,EAC3B,MAAM,GAAG,YAAY,GACxB,GAAsF,EAAE,EAAY,EAAE;IACnG,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,aAAa,EAAE;QACrC,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE;KACpG,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,CAAC;IAEf,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,OAAO;QACH,IAAI,EAAE,GAAG,EAAE;YACP,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;KACjD,CAAC;AACN,CAAC,CAAC"}
package/dist/status.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import type { DeviceScopes, DeviceReport } from "@intentic/sandbox-contract";
1
+ import type { Item } from "@intentic/local-agent";
2
+ import type { DeviceScopes, DevicePort, DeviceReport } from "@intentic/sandbox-contract";
2
3
  import type { PeerLinkState } from "@intentic/sandbox-contract/peer-dial";
3
- import { type CommandContext } from "@stricli/core";
4
+ import type { CommandContext } from "@stricli/core";
4
5
  export interface DeviceStatus {
5
6
  readonly version: string;
6
7
  readonly running?: number;
@@ -19,11 +20,16 @@ export interface StatusLink {
19
20
  }
20
21
  export declare const statusSummary: (running: number | undefined, links: number, sync: DeviceReport, now: number, connected?: number) => string;
21
22
  export declare const deviceStatus: (mutagen: string | undefined) => Promise<DeviceStatus>;
22
- export declare const conflictLines: (pairing: DeviceReport["pairings"][number]) => string[];
23
- export declare const pairingLine: (pairing: DeviceReport["pairings"][number]) => string;
24
- export declare const agentLine: (agent: DeviceReport["agent"], now: number) => string;
25
- export declare const buildSkewLine: (report: DeviceReport) => string | undefined;
26
- export declare const machineLine: (distro: string | undefined, supervisor: string | undefined, children: readonly string[]) => string | undefined;
27
- export declare const linkLine: (link: StatusLink) => string;
23
+ export declare const portItem: (port: DevicePort) => Item;
24
+ export declare const CONFLICTS_SAID = "Both ends changed these since they last agreed, so neither copy was overwritten and they have stopped syncing.";
25
+ export declare const CONFLICTS_SETTLED = "Resolve one by making both copies the same, or both gone; the session picks it up on its next pass.";
26
+ export declare const conflictItems: (pairing: DeviceReport["pairings"][number]) => Item[];
27
+ export declare const pairingItem: (pairing: DeviceReport["pairings"][number]) => Item;
28
+ export declare const agentItem: (agent: DeviceReport["agent"], now: number) => Item;
29
+ export declare const agentNote: (agent: DeviceReport["agent"], now: number) => string | undefined;
30
+ export declare const buildSkewItem: (report: DeviceReport) => Item | undefined;
31
+ export declare const placeLine: (distro: string | undefined, supervisor: string | undefined, children: readonly string[]) => string | undefined;
32
+ export declare const linkItem: (link: StatusLink) => Item;
33
+ export declare const grantLine: (link: StatusLink) => string;
28
34
  export declare const status: import("@stricli/core").Command<CommandContext>;
29
35
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAmE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC9I,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAkBlE,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE;QACb,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;QAEtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC/B;AAKD,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;CAClC;AAeD,eAAO,MAAM,aAAa,YAAa,MAAM,GAAG,SAAS,SAAS,MAAM,QAAQ,YAAY,OAAO,MAAM,cAAc,MAAM,KAAG,MA2B/H,CAAC;AAEF,eAAO,MAAM,YAAY,YAAmB,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC,YAAY,CAyBpF,CAAC;AAkEF,eAAO,MAAM,aAAa,YAAa,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAG,MAAM,EAe/E,CAAC;AAEF,eAAO,MAAM,WAAW,YAAa,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAG,MAgBvE,CAAC;AAMF,eAAO,MAAM,SAAS,UAAW,YAAY,CAAC,OAAO,CAAC,OAAO,MAAM,KAAG,MAarE,CAAC;AAKF,eAAO,MAAM,aAAa,WAAY,YAAY,KAAG,MAAM,GAAG,SAY7D,CAAC;AAGF,eAAO,MAAM,WAAW,WAAY,MAAM,GAAG,SAAS,cAAc,MAAM,GAAG,SAAS,YAAY,SAAS,MAAM,EAAE,KAAG,MAAM,GAAG,SAO9H,CAAC;AAGF,eAAO,MAAM,QAAQ,SAAU,UAAU,KAAG,MAW3C,CAAC;AA4FF,eAAO,MAAM,MAAM,iDAmDjB,CAAC"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,IAAI,EAAY,MAAM,uBAAuB,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAuD,UAAU,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC9I,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAmBpD,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE;QACb,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;QAEtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC/B;AAKD,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;CAClC;AAeD,eAAO,MAAM,aAAa,YAAa,MAAM,GAAG,SAAS,SAAS,MAAM,QAAQ,YAAY,OAAO,MAAM,cAAc,MAAM,KAAG,MA2B/H,CAAC;AAEF,eAAO,MAAM,YAAY,YAAmB,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC,YAAY,CAyBpF,CAAC;AAIF,eAAO,MAAM,QAAQ,SAAU,UAAU,KAAG,IAO3C,CAAC;AA8BF,eAAO,MAAM,cAAc,mHAAmH,CAAC;AAC/I,eAAO,MAAM,iBAAiB,wGAAwG,CAAC;AA0BvI,eAAO,MAAM,aAAa,YAAa,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAG,IAAI,EAU7E,CAAC;AAMF,eAAO,MAAM,WAAW,YAAa,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAG,IAqBvE,CAAC;AAMF,eAAO,MAAM,SAAS,UAAW,YAAY,CAAC,OAAO,CAAC,OAAO,MAAM,KAAG,IAiBrE,CAAC;AAGF,eAAO,MAAM,SAAS,UAAW,YAAY,CAAC,OAAO,CAAC,OAAO,MAAM,KAAG,MAAM,GAAG,SAU9E,CAAC;AAKF,eAAO,MAAM,aAAa,WAAY,YAAY,KAAG,IAAI,GAAG,SAY3D,CAAC;AAGF,eAAO,MAAM,SAAS,WAAY,MAAM,GAAG,SAAS,cAAc,MAAM,GAAG,SAAS,YAAY,SAAS,MAAM,EAAE,KAAG,MAAM,GAAG,SAO5H,CAAC;AAIF,eAAO,MAAM,QAAQ,SAAU,UAAU,KAAG,IAW3C,CAAC;AAEF,eAAO,MAAM,SAAS,SAAU,UAAU,KAAG,MACmI,CAAC;AA+EjL,eAAO,MAAM,MAAM,iDAmEjB,CAAC"}