@openagentsinc/pylon 0.1.16 → 0.1.17

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 CHANGED
@@ -16,6 +16,7 @@ bun install -g @openagentsinc/pylon && pylon
16
16
  npx @openagentsinc/pylon --version 0.1.16
17
17
  npx @openagentsinc/pylon --no-launch
18
18
  npx @openagentsinc/pylon --no-updates
19
+ npx @openagentsinc/pylon status --json
19
20
  npx @openagentsinc/pylon --download-curated-cache --model gemma-4-e2b --run-diagnostics
20
21
  npx @openagentsinc/pylon --verbose
21
22
  ```
@@ -60,23 +61,29 @@ The launcher:
60
61
  - starts the installed `pylon-tui` by default after the smoke path; that TUI
61
62
  starts and supervises the earning worker
62
63
  unless `--no-launch` is set
64
+ - forwards CLI subcommands such as `pylon status --json` to the installed
65
+ `pylon` binary after bootstrap instead of opening `pylon-tui`
63
66
  - while the TUI is running on the default release track, checks GitHub Releases
64
- every 30 seconds and restarts the TUI from a newer trusted cached release
67
+ on a six-hour cadence and restarts the TUI from a newer trusted cached release
65
68
  without replacing the global npm/bun command
66
69
  - use `--no-updates` to keep the current installed release running without
67
- background GitHub release checks; `--version` remains a pinned release run
70
+ background GitHub release checks; `--version` remains a pinned release run.
71
+ Set `GITHUB_TOKEN` or `GH_TOKEN` when you want authenticated GitHub release
72
+ lookups.
68
73
  - owns the current auto-update contract. Directly extracted GitHub release
69
74
  assets do not contain a native updater today; if an operator runs
70
75
  `./pylon` from an unpacked archive, that process stays on its compiled
71
76
  version until the operator manually replaces the archive or switches back to
72
77
  the npm/bun launcher.
73
- - for hosted homework/training work, use launcher `0.1.16` or newer so the
78
+ - for hosted homework/training work, use launcher `0.1.17` or newer so the
74
79
  cached standalone binary auto-updates while the dashboard is open. The
75
80
  `pylon-v0.1.16` standalone binary keeps the long hosted homework ID hashing
76
81
  from `0.1.14`, refuses to seal terminal training windows until the worker
77
82
  contribution artifact bundle has uploaded and verified for validator replay,
78
83
  and packages the minimal Psionic training runtime so standalone installs can
79
- advertise homework-worker capability.
84
+ advertise homework-worker capability. Launcher `0.1.17` adds CLI subcommand
85
+ forwarding and bounds background GitHub release checks to avoid
86
+ unauthenticated rate-limit churn.
80
87
  - does not try to install or register a local runtime automatically; the
81
88
  bootstrap stays honest about the separate local Gemma runtime
82
89
  prerequisite instead of mutating the host behind the user's back
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openagentsinc/pylon",
3
- "version": "0.1.16",
3
+ "version": "0.1.17",
4
4
  "description": "Bootstrap the standalone OpenAgents Pylon release asset and run first-run smoke checks.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/cli.js CHANGED
@@ -6,11 +6,11 @@ import {
6
6
  DEFAULT_RELEASE_REPO,
7
7
  bootstrapInstalledPylon,
8
8
  ensureReleaseInstall,
9
- launchInstalledPylon,
10
9
  launchInstalledPylonWithUpdates,
11
10
  resolveBootstrapOutcome,
12
11
  resolvePlatformTarget,
13
12
  renderBootstrapSummary,
13
+ runInstalledPylonCli,
14
14
  } from "./index.js";
15
15
  import {
16
16
  createTelemetryClient,
@@ -78,6 +78,8 @@ export function usage() {
78
78
  npx @openagentsinc/pylon [options]
79
79
  bunx @openagentsinc/pylon [options]
80
80
  pylon [options]
81
+ pylon [options] <pylon-command> [pylon-options]
82
+ pylon [options] -- <pylon-command> [pylon-options]
81
83
 
82
84
  Description:
83
85
  Download the latest tagged standalone Pylon release asset for this machine,
@@ -86,11 +88,15 @@ Description:
86
88
  and build it locally instead. Cache the binaries, run the first-run smoke
87
89
  path, and then start the Pylon terminal UI by default. The terminal UI manages
88
90
  the earning worker and keeps live status visible. The launcher checks GitHub
89
- for newer tagged pylon-v... releases on each default run and every 30 seconds
91
+ for newer tagged pylon-v... releases on each default run and periodically
90
92
  while the dashboard is open. Only releases initiated by AtlantisPleb are
91
93
  accepted. New standalone binaries are cached under the local bootstrap root;
92
94
  the global npm or bun pylon command is not replaced.
93
95
 
96
+ When a Pylon command is provided, the launcher bootstraps the managed release
97
+ and forwards that command to the installed pylon binary instead of opening
98
+ pylon-tui. For example: pylon status --json.
99
+
94
100
  Options:
95
101
  --version <x.y.z> Resolve a specific Pylon release.
96
102
  --install-root <path> Override the launcher cache/install root.
@@ -109,7 +115,7 @@ Options:
109
115
  --skip-model-download Keep the curated GGUF cache skipped.
110
116
  --skip-diagnostics Keep optional pylon gemma diagnose skipped.
111
117
  --no-launch Do not start pylon-tui after bootstrap.
112
- --no-updates Disable 30-second GitHub release polling
118
+ --no-updates Disable background GitHub release polling
113
119
  and dashboard restart while pylon runs.
114
120
  --verbose Print extra network and recovery detail.
115
121
  --debug-network Alias for --verbose.
@@ -140,10 +146,19 @@ export function parseArgs(argv) {
140
146
  verbose: false,
141
147
  json: false,
142
148
  help: false,
149
+ pylonArgs: [],
143
150
  };
144
151
 
145
152
  for (let index = 0; index < argv.length; index += 1) {
146
153
  const arg = argv[index];
154
+ if (arg === "--") {
155
+ options.pylonArgs = argv.slice(index + 1);
156
+ break;
157
+ }
158
+ if (!arg.startsWith("-")) {
159
+ options.pylonArgs = argv.slice(index);
160
+ break;
161
+ }
147
162
  switch (arg) {
148
163
  case "--version":
149
164
  options.version = argv[++index];
@@ -241,6 +256,7 @@ export async function main(argv = process.argv.slice(2), dependencies = {}) {
241
256
  ensureReleaseInstallImpl = ensureReleaseInstall,
242
257
  bootstrapInstalledPylonImpl = bootstrapInstalledPylon,
243
258
  launchInstalledPylonImpl = launchInstalledPylonWithUpdates,
259
+ runInstalledPylonCliImpl = runInstalledPylonCli,
244
260
  createTelemetryClientImpl = createTelemetryClient,
245
261
  } = dependencies;
246
262
  const options = parseArgs(argv);
@@ -320,7 +336,21 @@ export async function main(argv = process.argv.slice(2), dependencies = {}) {
320
336
  reporter?.warning(`Pylon ${outcome.verdict}`, outcome.detail);
321
337
  }
322
338
  console.log(renderBootstrapSummary(summary));
323
- if (!options.noLaunch) {
339
+ if (options.pylonArgs.length > 0) {
340
+ await runInstalledPylonCliImpl(
341
+ {
342
+ ...options,
343
+ ...install,
344
+ version: install.version,
345
+ },
346
+ options.pylonArgs,
347
+ {
348
+ ...dependencies,
349
+ onStatus: reporter?.status,
350
+ telemetryClient,
351
+ },
352
+ );
353
+ } else if (!options.noLaunch) {
324
354
  await launchInstalledPylonImpl(
325
355
  {
326
356
  ...options,
package/src/index.js CHANGED
@@ -20,7 +20,7 @@ export const DEFAULT_MODEL_ID = "gemma-4-e4b";
20
20
  export const DEFAULT_DIAGNOSTIC_REPEATS = 3;
21
21
  export const DEFAULT_DIAGNOSTIC_MAX_OUTPUT_TOKENS = 96;
22
22
  export const DEFAULT_FETCH_TIMEOUT_MS = 15_000;
23
- export const DEFAULT_UPDATE_CHECK_INTERVAL_MS = 30_000;
23
+ export const DEFAULT_UPDATE_CHECK_INTERVAL_MS = 6 * 60 * 60 * 1000;
24
24
  export const DEFAULT_TRUSTED_RELEASE_AUTHOR = "AtlantisPleb";
25
25
  const PYLON_RELEASE_TAG_PREFIX = "pylon-v";
26
26
  const RELEASE_ASSET_INSTALL_METHOD = "release_asset";
@@ -215,8 +215,9 @@ function requestHeaders() {
215
215
  accept: "application/vnd.github+json",
216
216
  "user-agent": "@openagentsinc/pylon bootstrap",
217
217
  };
218
- if (process.env.GITHUB_TOKEN) {
219
- headers.authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
218
+ const githubToken = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;
219
+ if (githubToken) {
220
+ headers.authorization = `Bearer ${githubToken}`;
220
221
  }
221
222
  return headers;
222
223
  }
@@ -2016,6 +2017,26 @@ export async function launchInstalledPylon(
2016
2017
 
2017
2018
  export const launchInstalledPylonTui = launchInstalledPylon;
2018
2019
 
2020
+ export async function runInstalledPylonCli(
2021
+ options,
2022
+ args = [],
2023
+ {
2024
+ runProcessImpl = runProcess,
2025
+ onStatus = null,
2026
+ } = {},
2027
+ ) {
2028
+ const pylonPath = path.resolve(options.pylonPath);
2029
+ emitStatus(
2030
+ onStatus,
2031
+ "Running Pylon CLI command",
2032
+ [path.basename(pylonPath), ...args].join(" "),
2033
+ );
2034
+ return runProcessImpl(pylonPath, args, {
2035
+ env: buildPylonEnv(options),
2036
+ stdio: "inherit",
2037
+ });
2038
+ }
2039
+
2019
2040
  export async function launchInstalledPylonWithUpdates(
2020
2041
  options,
2021
2042
  {