@outerlayer/cli 0.8.4 → 0.8.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @outerlayer/cli
2
2
 
3
+ ## 0.8.5
4
+
5
+ ### Patch Changes
6
+
7
+ - 32bd8fd: A runner its service started through `current` no longer says it cannot update itself while it is already draining to restart onto a version `runner install` put in place. That line told the operator to restart the runner, but the restart was already scheduled. The runner now logs only that it is taking no new work and will restart once its builds finish. A runner started by hand, or one whose service starts a version directory, still gets the line, because nothing restarts it for them.
8
+
3
9
  ## 0.8.4
4
10
 
5
11
  ### Patch Changes
@@ -1 +1 @@
1
- {"id":"2026-10-05T21:17:18.405Z+2bfc970","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-05T22:28:11.797Z+f8373f9","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-LUY6I65J.js';
3
+ import { probeCredentials } from './chunk-ZMKXBWIK.js';
4
4
  import './chunk-IS4DIGBQ.js';
5
5
  import './chunk-I2UOAV7X.js';
6
6
  import './chunk-4KPMIGBQ.js';
@@ -7,7 +7,7 @@ import { writeJobFile, readJobFile, readJobFileChecked } from './chunk-T6OIJQRT.
7
7
  import { RUNNER_PROTOCOL } from './chunk-AIW6GLET.js';
8
8
  import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-UGP76IZ5.js';
9
9
  import { placeholderQueues, placeholderProblem } from './chunk-SWGQAURM.js';
10
- import { currentVersion, entryIn, versionDir, startedThroughCurrent, writeMarker, readMarker, removeMarker, switchCurrent, cleanVersions, isInLayout, stagingDir } from './chunk-TI7B7UEO.js';
10
+ import { writeMarker, readMarker, currentVersion, removeMarker, entryIn, versionDir, startedThroughCurrent, switchCurrent, cleanVersions, isInLayout, stagingDir } from './chunk-TI7B7UEO.js';
11
11
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
12
12
  import { RepoFilter } from './chunk-TBT347UY.js';
13
13
  import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, provisionContainer, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandLine, BuildTokens, classifyRefusal, refusalCode, measureDisk, createRunnerLog, setUpRunnerCgroup, parseCpuList, ensureTunnel, keepGhConfigCurrent, createContainerRuntime, formatClock } from './chunk-GJ3OWUFO.js';
@@ -949,7 +949,7 @@ function considerNamedVersion(state, named) {
949
949
  const updating = decision === "update" && !retryHeld(state, named);
950
950
  state.pendingUpdate = updating ? named : void 0;
951
951
  if (!updating || state.preflightedUpdate !== named) state.preflightedUpdate = void 0;
952
- if (decision === "cannot_self_update" && !state.cannotSelfUpdateLogged) {
952
+ if (decision === "cannot_self_update" && !state.cannotSelfUpdateLogged && installedSwitchOf(state, update).kind !== "restart") {
953
953
  state.cannotSelfUpdateLogged = true;
954
954
  logOf(state).line(`this runner cannot update itself to ${named}: ${blocker}`);
955
955
  }
@@ -980,19 +980,23 @@ function reportUpdateResult(state, version, result) {
980
980
  const retryAt = new Date(result.retryAtMs).toISOString().slice(11, 16);
981
981
  logOf(state).error(`could not update to ${version}: ${result.detail} \xB7 attempt ${result.attempts}, trying again after ${retryAt} UTC`);
982
982
  }
983
- function restartOntoInstalled(state) {
984
- const update = state.deps.update;
985
- if (update === void 0) return false;
983
+ function installedSwitchOf(state, update) {
986
984
  const configPath = state.config.configPath;
987
- const own = ownVersionOf(state.deps);
988
985
  const current = currentVersion(configPath);
989
- const decision = decideInstalledSwitch({
990
- own,
986
+ return decideInstalledSwitch({
987
+ own: ownVersionOf(state.deps),
991
988
  current,
992
989
  fromCurrent: startedThroughCurrent(configPath, update.entryPath),
993
990
  underService: update.underService === true,
994
991
  installed: current !== void 0 && existsSync(entryIn(versionDir(configPath, current)))
995
992
  });
993
+ }
994
+ function restartOntoInstalled(state) {
995
+ const update = state.deps.update;
996
+ if (update === void 0) return false;
997
+ const configPath = state.config.configPath;
998
+ const own = ownVersionOf(state.deps);
999
+ const decision = installedSwitchOf(state, update);
996
1000
  if (decision.kind === "none") {
997
1001
  state.installedSwitch = void 0;
998
1002
  return false;
@@ -1956,7 +1960,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
1956
1960
  const outcome = await onStartUnderMarker({
1957
1961
  configPath,
1958
1962
  own: ownVersionOf(deps),
1959
- check: update.check ? () => update.check(configPath) : async () => (await import('./check-NJX52PBN.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
1963
+ check: update.check ? () => update.check(configPath) : async () => (await import('./check-HWYLSMEL.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
1960
1964
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
1961
1965
  log
1962
1966
  });
@@ -4452,7 +4452,7 @@ function registerRunnerCommands(program2) {
4452
4452
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
4453
4453
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
4454
4454
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-OOBPCY7Q.js');
4455
- const { start, RunnerStartError } = await import('./loop-C34EVXAP.js');
4455
+ const { start, RunnerStartError } = await import('./loop-FN67ZHLO.js');
4456
4456
  const { RunnerAlreadyRunningError } = await import('./pidfile-UZRH774M.js');
4457
4457
  const configPath = opts.config ?? defaultRunnerConfigPath();
4458
4458
  try {
@@ -4468,7 +4468,7 @@ function registerRunnerCommands(program2) {
4468
4468
  });
4469
4469
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
4470
4470
  const { defaultRunnerConfigPath } = await import('./config-OOBPCY7Q.js');
4471
- const { runRunnerCheck } = await import('./check-NJX52PBN.js');
4471
+ const { runRunnerCheck } = await import('./check-HWYLSMEL.js');
4472
4472
  const configPath = opts.config ?? defaultRunnerConfigPath();
4473
4473
  const result = await runRunnerCheck(configPath);
4474
4474
  if (!result.ok) {
@@ -4768,14 +4768,14 @@ Next:
4768
4768
  });
4769
4769
  runnerCmd.command("stop").description("Take no more work; wait for running jobs to finish, then exit").option("--config <path>", "the cloud config file naming the runner to stop").option("--now", "end running jobs immediately, with outcome stopped").action(async (opts) => {
4770
4770
  const { defaultRunnerConfigPath } = await import('./config-OOBPCY7Q.js');
4771
- const { requestStop } = await import('./loop-C34EVXAP.js');
4771
+ const { requestStop } = await import('./loop-FN67ZHLO.js');
4772
4772
  const configPath = opts.config ?? defaultRunnerConfigPath();
4773
4773
  await requestStop(configPath, Boolean(opts.now));
4774
4774
  });
4775
4775
  runnerCmd.command("status").description("List running jobs; with --recent, finished ones too").option("--config <path>", "the cloud config file naming the runner to inspect").option("--recent", "also list finished jobs, newest first, capped at 20").option("--json", "machine-readable JSON output").action(async (opts) => {
4776
4776
  const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-OOBPCY7Q.js');
4777
4777
  const { jobsDir, runnerDir } = await import('./paths-OYKMVYJP.js');
4778
- const { listJobFiles, runnerProcessState } = await import('./loop-C34EVXAP.js');
4778
+ const { listJobFiles, runnerProcessState } = await import('./loop-FN67ZHLO.js');
4779
4779
  const { renderStatus } = await import('./status-7RNWHYG6.js');
4780
4780
  const { readHousekeepingRecord } = await import('./record-C43U4PKS.js');
4781
4781
  const path2 = await import('path');
@@ -4828,7 +4828,7 @@ Next:
4828
4828
  });
4829
4829
  runnerCmd.command("logs").argument("<item>", "the work item's number in the factory").description("Print the newest attempt's log for one item").option("--config <path>", "the cloud config file naming the runner to inspect").option("-f, --follow", "keep printing as the log grows").action(async (itemArg, opts) => {
4830
4830
  const { defaultRunnerConfigPath } = await import('./config-OOBPCY7Q.js');
4831
- const { listJobFiles } = await import('./loop-C34EVXAP.js');
4831
+ const { listJobFiles } = await import('./loop-FN67ZHLO.js');
4832
4832
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-H55NWW4H.js');
4833
4833
  const configPath = opts.config ?? defaultRunnerConfigPath();
4834
4834
  const item = parseTrackerNumber(itemArg);
package/dist/index.js CHANGED
@@ -22,5 +22,5 @@ if (argv[0] === "statusline") {
22
22
  process.exit(0);
23
23
  }
24
24
  (await import('./hook-fast-CFLLVMSV.js')).recordLinkExitFailure(argv);
25
- var { runCli } = await import('./cli-JXPTHJHQ.js');
25
+ var { runCli } = await import('./cli-5QAP7N4A.js');
26
26
  await runCli(process.argv);
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { RunnerStartError, listJobFiles, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick } from './chunk-LUY6I65J.js';
3
+ export { RunnerStartError, listJobFiles, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick } from './chunk-ZMKXBWIK.js';
4
4
  import './chunk-IS4DIGBQ.js';
5
5
  import './chunk-I2UOAV7X.js';
6
6
  import './chunk-4KPMIGBQ.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@outerlayer/cli",
3
- "version": "0.8.4",
3
+ "version": "0.8.5",
4
4
  "description": "OuterLayer CLI — commands: init, connect, doctor, login, logout, sync, daemon (alias: watch), emit, work, runner, hooks, mcp, import, context. Capture and sync coding-agent sessions, and record proof of factory work.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Magu Studios, Inc.",