byollm 0.1.1 → 0.1.2

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
@@ -1,5 +1,5 @@
1
1
  <!-- release-note 0.1.1 -->
2
- > **`0.1.1` is documentation only — nothing to upgrade.** `PROTOCOL_VERSION`
2
+ > **`0.1.2` is documentation only — nothing to upgrade.** `PROTOCOL_VERSION`
3
3
  > is still `2`, so a 0.1.0 party and a 0.1.1 party talk to each other in both
4
4
  > directions. No dependency, schema, wire field or on-disk shape moved.
5
5
  >
@@ -93,6 +93,14 @@ for one. It defaults to 2 GB. **It does not know how big your models are**, so
93
93
  set it to fit your largest. It does not apply to services whose compute happens
94
94
  somewhere else — a hosted model reached through a local port loads nothing here.
95
95
 
96
+ `autoUpdate` (default `false`) lets the daemon install new versions when it is
97
+ offered one. Offers are taken only from `updateAuthority` — the reference hub,
98
+ `https://hub.byollm.cloud`, when you leave it out — and never from any other
99
+ site you paired with, never from a direct-mode pairing, and never for an older
100
+ version. Every update is checked against its npm provenance before it runs and
101
+ rolled back if it fails; [`docs/security.md` §7a](https://github.com/oftomorrowinc/byollm/blob/main/docs/security.md#7a-updates)
102
+ says exactly what is checked.
103
+
96
104
  You do not have to write any of this by hand. `byollm services manage` asks
97
105
  what this machine has and writes the file for you, and it is safe to re-run:
98
106
  it shows what is already there.
@@ -146,35 +154,46 @@ The meter is the product, and it gets the same care as the loop.
146
154
 
147
155
  ```bash
148
156
  byollm status # what's connected, what's running, what you've done for others
149
- byollm sites # which sites this device serves, and which are waiting on you
150
- byollm approve <site> # say yes to a site that asked
157
+ byollm sites # which sites this device serves, and which keys it still holds
151
158
  byollm log # every prompt that has ever run here
152
159
  byollm log --full # the whole text, not the first line
153
- byollm stop # stop claiming work — the off switch, always yours
160
+ byollm stop # stop running in the background — the off switch, always yours
154
161
  byollm start # and bring it back
162
+ byollm forget <url> # drop a pairing entirely
155
163
  ```
156
164
 
157
- ### A site cannot add itself
165
+ ### Which sites this device serves is decided in your dashboard
158
166
 
159
167
  Pairing is with an *app* — a hub, a relay, your own server — and one pairing
160
168
  can cover several sites. Which sites arrives on the heartbeat, from the same
161
169
  party that routes the work.
162
170
 
163
- So a site that turns up after pairing **waits**. It is listed by
164
- `byollm sites` with its fingerprint, nothing is claimed for it, and it starts
165
- being served the moment you run `byollm approve <site>`. Compare the
166
- fingerprint against what the site itself shows you before you do.
167
-
168
- The reason is narrow and worth stating: the daemon pins each site's keys so
169
- that the party routing a job cannot choose which key signed it. If that party
170
- could also *add* a site, it could generate a keypair, announce it, sign its
171
- own work with it, and every pin check downstream would pass — because the
172
- list they check against is the thing it wrote. Approving is the one step it
173
- cannot perform for you.
174
-
175
- A key that moves under a site you already approved is refused rather than
176
- replaced, for the life of the pairing — including when the site leaves the
177
- list and comes back. Rotation is an explicit path, not a silent swap.
171
+ A site that turns up after pairing is **pinned and served** from that
172
+ heartbeat on. Nothing on this machine asks you first: `byollm approve` is
173
+ gone (it exits with a tombstone saying so), and which sites reach your device
174
+ is decided in the app's dashboard, where the person changing it is signed in
175
+ and can see what they are changing.
176
+
177
+ What you get instead is a notice. The first time a new site's work runs here,
178
+ the daemon says `now serving <site>, enabled from your dashboard` with the
179
+ site's fingerprint — on screen in `byollm run`, in `~/.byollm/service.log`
180
+ when it runs in the background — so a change made at the app is never silent
181
+ at the machine. `byollm sites` lists every site this device serves and
182
+ every key it still holds, with fingerprints, for comparing against what the
183
+ site itself shows you.
184
+
185
+ What the daemon still refuses, whatever the app says: a key that moves under
186
+ a site id it has already pinned, for the life of the pairing — including when
187
+ the site leaves the list and comes back (rotation is an explicit, signed path,
188
+ not a silent swap); and any job that does not carry a grant signed by the
189
+ control-plane key this device pinned when it paired. A party that can add a
190
+ site to your heartbeat still cannot sign work for it.
191
+
192
+ The trade is stated plainly in the spec (byollm_016, Amendment K): an app or
193
+ control plane that is compromised can point your device at a site you never
194
+ chose. Spend caps bound what that costs, the notice makes it visible, and the
195
+ levers are yours: `byollm stop` stops all work, `byollm forget <url>` drops
196
+ the pairing.
178
197
 
179
198
  Every prompt is appended to `~/.byollm/ingress.log` **before** it executes, so
180
199
  a job that wedges the computer still leaves a record of what it was. The file is
package/dist/bin.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  main
4
- } from "./chunk-OOC3ASS6.js";
4
+ } from "./chunk-K7QYAF7V.js";
5
5
 
6
6
  // src/bin.ts
7
7
  process.exitCode = await main(process.argv.slice(2));