@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.
- package/README.md +16 -3
- package/dist/cli.js +6 -9
- 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
|
-
|
|
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 --
|
|
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 `--
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.",
|