@lumi.ai/runner 0.3.5 → 0.3.6

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 (3) hide show
  1. package/README.md +16 -3
  2. package/dist/cli.js +6 -9
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -37,10 +37,23 @@ runner id and Ship list from the approval — nothing is copied or pasted. If yo
37
37
 
38
38
  `setup` then runs `doctor` and offers to install the background service.
39
39
 
40
- For CI or headless provisioning there is a non-interactive path:
40
+ ### A server or VPS
41
+
42
+ `setup` is interactive and refuses without a terminal, but it does not need a browser **on that
43
+ machine**:
44
+
45
+ ```bash
46
+ lumi-runner setup --no-browser
47
+ ```
48
+
49
+ It prints the approval link and an 8-character code. Open the link anywhere you do have a browser,
50
+ approve this Ship, and the server finishes on its own — nothing is pasted back.
51
+
52
+ For CI or unattended provisioning, where nobody is at a terminal at all, paste a Ship key from the
53
+ Daemons page instead:
41
54
 
42
55
  ```bash
43
- lumi-runner login --token <customToken> --api-key <key> --project <projectId>
56
+ lumi-runner login --key <shipKey> --api-key <firebaseWebApiKey> --project <projectId>
44
57
  ```
45
58
 
46
59
  ## Commands
@@ -48,7 +61,7 @@ lumi-runner login --token <customToken> --api-key <key> --project <projectId>
48
61
  | Command | What it does |
49
62
  |---|---|
50
63
  | `setup` | One-time onboarding: login → pick Ships → doctor → background service |
51
- | `login` | Connect this machine (browser approval, or `--token` for CI) |
64
+ | `login` | Connect this machine (browser approval, `--no-browser` for a server, or `--key` for CI) |
52
65
  | `ship add [ids…]` / `remove` / `list` | Which Ships this machine serves (omit ids to pick from a list) |
53
66
  | `doctor` | **Preflight** — can this machine actually run a job? Non-zero exit if not |
54
67
  | `service install` / `uninstall` / `restart` / `status` | Run the daemon in the background, always |
package/dist/cli.js CHANGED
@@ -432,6 +432,10 @@ var SECRET_DOCS = {
432
432
  */
433
433
  runnerKey: "runnerKey"
434
434
  };
435
+ function missingSecretsFor(engineId, secrets) {
436
+ const bag = secrets;
437
+ return getEngine(engineId).requiredSecrets.filter((req) => !bag?.[req.key]).map((req) => req.label);
438
+ }
435
439
 
436
440
  // ../shared/dist/ship.js
437
441
  var DEFAULT_SHIP_SETTINGS = {
@@ -533,7 +537,7 @@ function mcpUrl(config2) {
533
537
  }
534
538
 
535
539
  // src/version.ts
536
- var RUNNER_VERSION = true ? "0.3.5" : "0.0.0-dev";
540
+ var RUNNER_VERSION = true ? "0.3.6" : "0.0.0-dev";
537
541
 
538
542
  // src/auth.ts
539
543
  import { signInWithCustomToken } from "firebase/auth";
@@ -1594,9 +1598,6 @@ async function loadRunnerSecrets(db, shipId) {
1594
1598
  );
1595
1599
  return snap.exists() ? snap.data() : null;
1596
1600
  }
1597
- function missingSecretsFor(engineId, secrets) {
1598
- return getEngine(engineId).requiredSecrets.filter((req) => !secrets?.[req.key]).map((req) => req.label);
1599
- }
1600
1601
 
1601
1602
  // src/jobs/engineLimits.ts
1602
1603
  import {
@@ -1835,7 +1836,6 @@ async function startDaemon() {
1835
1836
  if (moved?.migrated) log2(`Moved runner config from ${moved.from} to ${moved.to}.`);
1836
1837
  const startedAt = Date.now();
1837
1838
  let currentJob = null;
1838
- const secretsOk = /* @__PURE__ */ new Map();
1839
1839
  const approved = /* @__PURE__ */ new Map();
1840
1840
  const warnedUnapproved = /* @__PURE__ */ new Set();
1841
1841
  const shipRunnerRef = (shipId) => doc7(sess(shipId).fb.db, COLLECTIONS.ships, shipId, COLLECTIONS.runners, config2.runnerId);
@@ -1855,7 +1855,6 @@ async function startDaemon() {
1855
1855
  status: "online",
1856
1856
  lastSeenAt: now,
1857
1857
  startedAt,
1858
- keyPresent: secretsOk.get(shipId) ?? false,
1859
1858
  currentJob: currentJob ?? null,
1860
1859
  lastLogLines: [...logLines]
1861
1860
  },
@@ -2057,9 +2056,7 @@ async function startDaemon() {
2057
2056
  }
2058
2057
  }
2059
2058
  async function loadSecrets(shipId) {
2060
- const secrets = await loadRunnerSecrets(sess(shipId).fb.db, shipId);
2061
- secretsOk.set(shipId, missingSecretsFor(DEFAULT_ENGINE_ID, secrets).length === 0);
2062
- return secrets;
2059
+ return loadRunnerSecrets(sess(shipId).fb.db, shipId);
2063
2060
  }
2064
2061
  async function processJob(shipId, queuedJob) {
2065
2062
  const job = await claim(shipId, queuedJob);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumi.ai/runner",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
4
4
  "type": "module",
5
5
  "description": "Lumi Crew runner daemon — claims jobs from your Ships and executes them as headless Claude sessions on your own machine.",
6
6
  "//name": "The ONLY package in this monorepo published to the public registry, so it is the one that does not follow the internal @lumi/crew-* convention: `@lumi` is not a scope we own, `@lumi.ai` is (the npm org). The workspace DIRECTORY stays packages/crew/runner — renaming the package is not renaming the folder.",