@openagentsinc/pylon 0.1.10 → 0.1.11

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
@@ -3,8 +3,8 @@
3
3
  Bootstrap the latest tagged standalone `Pylon` release asset from GitHub
4
4
  Releases, fall back to a deterministic source build when no matching asset
5
5
  exists for the local platform, stream first-run status updates in the terminal,
6
- and start the Pylon default earning loop without Cargo when prebuilt binaries are
7
- available.
6
+ and start the Pylon terminal UI without Cargo when prebuilt binaries are
7
+ available. The terminal UI manages the long-lived earning worker.
8
8
 
9
9
  ## Usage
10
10
 
@@ -13,9 +13,9 @@ 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.10
16
+ npx @openagentsinc/pylon --version 0.1.11
17
17
  npx @openagentsinc/pylon --no-launch
18
- npx @openagentsinc/pylon --download-curated-cache --model gemma-4-e2b --diagnostic-repeats 2
18
+ npx @openagentsinc/pylon --download-curated-cache --model gemma-4-e2b --run-diagnostics
19
19
  npx @openagentsinc/pylon --verbose
20
20
  ```
21
21
 
@@ -45,13 +45,17 @@ The launcher:
45
45
  - ends first run with an explicit verdict such as `fully online`, `runtime
46
46
  ready`, or `installed but runtime missing`, plus exact next-step guidance
47
47
  - runs `pylon --help`, `init`, `status --json`, and `inventory --json`
48
- - runs `pylon gemma diagnose <model> --json`
48
+ - skips Gemma diagnostics by default because hosted homework training does not
49
+ require local Gemma weights
50
+ - only runs `pylon gemma diagnose <model> --json` when `--run-diagnostics` is
51
+ set
49
52
  - only runs `pylon gemma download <model>` when `--download-curated-cache` is
50
53
  set, because the optional GGUF cache does not satisfy the sellable runtime by
51
54
  itself
52
55
  - falls back to `curl` for release metadata and asset downloads when the Node
53
56
  fetch path fails in constrained network contexts
54
- - starts the installed `pylon` earning loop by default after the smoke path
57
+ - starts the installed `pylon-tui` by default after the smoke path; that TUI
58
+ starts and supervises the earning worker
55
59
  unless `--no-launch` is set
56
60
  - does not try to install or register a local runtime automatically; the
57
61
  bootstrap stays honest about the separate Ollama-compatible runtime
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openagentsinc/pylon",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
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
@@ -83,8 +83,9 @@ Description:
83
83
  or a specific tagged Pylon version when --version is set. If no matching
84
84
  asset exists for the local platform, fetch the exact tagged source checkout
85
85
  and build it locally instead. Cache the binaries, run the first-run smoke
86
- path, and then start the Pylon default earning loop by default with live status
87
- updates. The launcher checks GitHub for newer tagged pylon-v... releases on
86
+ path, and then start the Pylon terminal UI by default. The terminal UI manages
87
+ the earning worker and keeps live status visible. The launcher checks GitHub
88
+ for newer tagged pylon-v... releases on
88
89
  each default run, but only caches the standalone binaries under the local
89
90
  bootstrap root; it does not replace your global npm or bun pylon command.
90
91
 
@@ -98,13 +99,14 @@ Options:
98
99
  Default: ${DEFAULT_MODEL_ID}
99
100
  --download-curated-cache Prefetch the optional Hugging Face GGUF
100
101
  cache before launching pylon.
101
- --diagnostic-repeats <n> Repeat count for pylon gemma diagnose.
102
+ --run-diagnostics Run optional pylon gemma diagnose.
103
+ --diagnostic-repeats <n> Repeat count when diagnostics are enabled.
102
104
  Default: ${DEFAULT_DIAGNOSTIC_REPEATS}
103
- --diagnostic-max-output-tokens <n> Max output tokens for diagnostics.
105
+ --diagnostic-max-output-tokens <n> Max output tokens when diagnostics are enabled.
104
106
  Default: ${DEFAULT_DIAGNOSTIC_MAX_OUTPUT_TOKENS}
105
107
  --skip-model-download Keep the curated GGUF cache skipped.
106
- --skip-diagnostics Skip pylon gemma diagnose.
107
- --no-launch Do not start pylon after bootstrap.
108
+ --skip-diagnostics Keep optional pylon gemma diagnose skipped.
109
+ --no-launch Do not start pylon-tui after bootstrap.
108
110
  --verbose Print extra network and recovery detail.
109
111
  --debug-network Alias for --verbose.
110
112
  --json Emit a machine-readable JSON summary.
@@ -128,7 +130,7 @@ export function parseArgs(argv) {
128
130
  diagnosticRepeats: DEFAULT_DIAGNOSTIC_REPEATS,
129
131
  diagnosticMaxOutputTokens: DEFAULT_DIAGNOSTIC_MAX_OUTPUT_TOKENS,
130
132
  skipModelDownload: true,
131
- skipDiagnostics: false,
133
+ skipDiagnostics: true,
132
134
  noLaunch: false,
133
135
  verbose: false,
134
136
  json: false,
@@ -171,6 +173,9 @@ export function parseArgs(argv) {
171
173
  case "--download-curated-cache":
172
174
  options.skipModelDownload = false;
173
175
  break;
176
+ case "--run-diagnostics":
177
+ options.skipDiagnostics = false;
178
+ break;
174
179
  case "--diagnostic-repeats":
175
180
  options.diagnosticRepeats = parseIntegerFlag(
176
181
  argv[++index],
@@ -321,8 +326,8 @@ export async function main(argv = process.argv.slice(2), dependencies = {}) {
321
326
  );
322
327
  } else {
323
328
  reporter?.warning(
324
- "Skipped Pylon launch",
325
- "pass no flag to start the default earning loop",
329
+ "Skipped Pylon terminal UI launch",
330
+ "pass no flag to open pylon-tui and start the earning worker",
326
331
  );
327
332
  }
328
333
  }
package/src/index.js CHANGED
@@ -1757,6 +1757,8 @@ export async function bootstrapInstalledPylon(
1757
1757
  options.diagnosticRepeats ?? DEFAULT_DIAGNOSTIC_REPEATS;
1758
1758
  const diagnosticMaxOutputTokens =
1759
1759
  options.diagnosticMaxOutputTokens ?? DEFAULT_DIAGNOSTIC_MAX_OUTPUT_TOKENS;
1760
+ const skipModelDownload = options.skipModelDownload ?? true;
1761
+ const skipDiagnostics = options.skipDiagnostics ?? true;
1760
1762
  emitTelemetry(telemetryClient, "installer_smoke_test_started", {
1761
1763
  release_tag: options.tagName ?? `pylon-v${options.version}`,
1762
1764
  release_commit: options.sourceCommit ?? null,
@@ -1793,7 +1795,7 @@ export async function bootstrapInstalledPylon(
1793
1795
  );
1794
1796
 
1795
1797
  let download = null;
1796
- if (!options.skipModelDownload) {
1798
+ if (!skipModelDownload) {
1797
1799
  emitStatus(onStatus, "Downloading curated model bundle", model);
1798
1800
  download = await runPylonJson(
1799
1801
  pylonPath,
@@ -1810,7 +1812,7 @@ export async function bootstrapInstalledPylon(
1810
1812
  }
1811
1813
 
1812
1814
  let diagnostic = null;
1813
- if (!options.skipDiagnostics) {
1815
+ if (!skipDiagnostics) {
1814
1816
  emitStatus(onStatus, "Running first-run diagnostic", model);
1815
1817
  try {
1816
1818
  diagnostic = await runPylonJson(
@@ -1839,7 +1841,11 @@ export async function bootstrapInstalledPylon(
1839
1841
  );
1840
1842
  }
1841
1843
  } else {
1842
- emitStatus(onStatus, "Skipping first-run diagnostic", model);
1844
+ emitStatus(
1845
+ onStatus,
1846
+ "Skipping optional Gemma diagnostic",
1847
+ "use --run-diagnostics when validating local inference separately",
1848
+ );
1843
1849
  }
1844
1850
 
1845
1851
  const diagnosticResult =
@@ -1917,9 +1923,13 @@ export async function launchInstalledPylon(
1917
1923
  onStatus = null,
1918
1924
  } = {},
1919
1925
  ) {
1920
- const pylonPath = path.resolve(options.pylonPath);
1921
- emitStatus(onStatus, "Starting Pylon default earning loop", path.basename(pylonPath));
1922
- return runProcessImpl(pylonPath, [], {
1926
+ const pylonTuiPath = path.resolve(options.pylonTuiPath);
1927
+ emitStatus(
1928
+ onStatus,
1929
+ "Starting Pylon terminal UI",
1930
+ `${path.basename(pylonTuiPath)} manages the earning worker`,
1931
+ );
1932
+ return runProcessImpl(pylonTuiPath, [], {
1923
1933
  env: buildPylonEnv(options),
1924
1934
  stdio: "inherit",
1925
1935
  });
@@ -1989,7 +1999,7 @@ function renderBootstrapNextSteps(summary, outcome) {
1989
1999
  ];
1990
2000
 
1991
2001
  if (outcome.verdict === "fully online" || outcome.verdict === "runtime ready") {
1992
- lines.push("Next step: run `pylon`; it starts the default online earning loop.");
2002
+ lines.push("Next step: run `pylon`; it opens the TUI and starts the earning worker.");
1993
2003
  return lines;
1994
2004
  }
1995
2005