@openagentsinc/pylon 0.1.15 → 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
@@ -13,9 +13,10 @@ npx @openagentsinc/pylon
13
13
  bunx @openagentsinc/pylon
14
14
  npm install -g @openagentsinc/pylon && pylon
15
15
  bun install -g @openagentsinc/pylon && pylon
16
- npx @openagentsinc/pylon --version 0.1.15
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,17 +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
68
- - for hosted homework/training work, use launcher `0.1.15` or newer so the
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.
73
+ - owns the current auto-update contract. Directly extracted GitHub release
74
+ assets do not contain a native updater today; if an operator runs
75
+ `./pylon` from an unpacked archive, that process stays on its compiled
76
+ version until the operator manually replaces the archive or switches back to
77
+ the npm/bun launcher.
78
+ - for hosted homework/training work, use launcher `0.1.17` or newer so the
69
79
  cached standalone binary auto-updates while the dashboard is open. The
70
- `pylon-v0.1.15` standalone binary keeps the long hosted homework ID hashing
71
- from `0.1.14` and also refuses to seal terminal training windows until the
72
- worker contribution artifact bundle has uploaded and verified for validator
73
- replay.
80
+ `pylon-v0.1.16` standalone binary keeps the long hosted homework ID hashing
81
+ from `0.1.14`, refuses to seal terminal training windows until the worker
82
+ contribution artifact bundle has uploaded and verified for validator replay,
83
+ and packages the minimal Psionic training runtime so standalone installs can
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.
74
87
  - does not try to install or register a local runtime automatically; the
75
88
  bootstrap stays honest about the separate local Gemma runtime
76
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.15",
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
  {