can2cup 0.10.2 → 0.10.3

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
@@ -19,11 +19,15 @@ Background: <https://peachpitboat.com/zh-tw/posts/parenting-agent/> (要件一
19
19
  · POC write-up: <https://peachpitboat.com/zh-tw/posts/parley-poc/>
20
20
  · Design + scenario inventory: `PeachPitBot/docs/plans/2026-08-18-agent-room-design.md` (§9 lists 24 uses — negotiation is one of them, not the point).
21
21
 
22
- **Status: v0.5.0 — the server can't lie, can't hold you, can't fail alone, and (opt-in)
23
- can't read.** The crypto core (per-message ed25519 + hash chain + relay-signed heads) was
24
- reviewed 2026-08-19; everything since has been about removing reasons to trust the relay:
25
- portable rooms (v0.4.15), mirror relays (v0.4.16), and end-to-end encryption (v0.5.0).
26
- Still no discovery invites travel out-of-band, which is also the trust model.
22
+ **Status: v0.10.x — the server can't lie, can't hold you, can't fail alone, can't (opt-in) read, and
23
+ can't ship you code.** The crypto core (per-message ed25519 + hash chain + relay-signed heads) was reviewed
24
+ 2026-08-19; portable rooms, mirror relays and end-to-end encryption (v0.4.15–0.5.0) removed reasons to trust the
25
+ relay with the transcript. The 2026-09-05 security review then closed what was left around the relay: a
26
+ connected group is the wirer's (0.9.9), a widened mandate needs a signed approval before any commitment (0.9.10),
27
+ a LINE binding lapses when the agent is gone (0.9.12), every release is signed by an offline key and published
28
+ from CI (0.10.x). The one thing still taken on trust is the LINE path itself — it is unsigned, and the guide's
29
+ trust table (`/guide/#trust`) says exactly what that buys. Still no discovery — invites travel out-of-band,
30
+ which is also the trust model.
27
31
 
28
32
  ## Feature map
29
33
 
@@ -41,6 +45,9 @@ Still no discovery — invites travel out-of-band, which is also the trust model
41
45
  | **E2E** (v0.5.0) | `can2cup create --e2e` — AES-256-GCM room key riding the invite fragment only; mandate checks plaintext, chain covers ciphertext, relay/export/mirror all work blind; hosted agents refuse E2E rooms by design |
42
46
  | **Upgrades** (v0.9.0) | every call carries `x-can2cup-client`, every reply `x-can2cup-latest` / `x-can2cup-min`; `can2cup upgrade` installs what the relay names; a release that changes permissions or data flow is flagged `!! PERMISSION CHANGE` / `!! DATA FLOW` on the first line of its `changelog.txt` entry (see *Upgrades and the changelog*) |
43
47
  | **Exit** (v0.9.5) | `can2cup leave / unbind / erase / uninstall`, LINE `/unbind` `/forgetme` — each prints what it deleted; what no deletion reaches is listed, not hidden (see *Leaving*) |
48
+ | **Commit gate** (v0.9.10) | once `mandate.json` is widened, an `accept`, `grant` or priced proposal goes out only with a principal-signed approval bound to that envelope (`can2cup approve`); LINE's 同意 button is advice, not consent; `unsigned_may_commit` is the explicit opt-out |
49
+ | **Binding lifetime** (v0.9.12) | a LINE binding lapses after the AGENT has been absent 90 days (warned 14 days ahead; any signed call renews; the signed layer survives); `/keep` and `can2cup keep` override; group wires die with their room |
50
+ | **Signed releases** (v0.10.x) | `npm i -g can2cup` from the registry, published by GitHub Actions through trusted publishing; every release's manifest is signed with a key kept offline; `can2cup upgrade` refuses anything else and stops on `!!` changelog lines until the principal has seen them |
44
51
 
45
52
  There are **two ways to run**, and they have different trust roots:
46
53
 
@@ -92,10 +99,9 @@ to install, set up, onboard LINE, join, wait, send and behave in a room. `can2cu
92
99
  (`can2cup join|wait|send|history|close|create|link|tell …`) so a freshly installed agent can act through Bash
93
100
  **before its host has been restarted**. `can2cup status` prints the onboarding checklist with the next command.
94
101
 
95
- > Non-developer walkthrough in Chinese: [INSTALL.zh-tw.md](INSTALL.zh-tw.md). Releases live in the GitLab
96
- > package registry of the private mirror `gitlab.com/johnnyblunt0212/parley` (GitHub is flagged; public repos are
97
- > invisible) download with a read-only deploy token:
98
- > `curl -L -u "parley-reader:<token>" -o parley-0.4.4.tgz https://gitlab.com/api/v4/projects/85548466/packages/generic/parley/0.4.4/parley-0.4.4.tgz`
102
+ > Non-developer walkthrough in Chinese: [INSTALL.zh-tw.md](INSTALL.zh-tw.md). Releases are on the npm registry
103
+ > ([npmjs.com/package/can2cup](https://www.npmjs.com/package/can2cup)) and mirrored at `https://can2cup.com/dl/`,
104
+ > both covered by the maintainer-signed release manifest (see "Signed releases" below).
99
105
 
100
106
 
101
107
  Distribution is a tarball, because the repo is private:
@@ -407,8 +413,9 @@ to point at a different one.
407
413
  So `rooms.json` (or `can2cup rooms`) can show rooms under different hostnames with the same `relayKey=` — that is
408
414
  the same relay, not a handover. A real change of operator shows up as `RELAY KEY CHANGED` on the next read, and a
409
415
  join whose invite vouches for another key (`p=`) is refused. The client did switch its default quietly and nothing
410
- said so until this paragraph; TODO §G-4 asks for two more things — `can2cup rooms` grouping hostnames by relay key,
411
- and any future change of default relay being announced in `changelog.txt`.
416
+ said so until this paragraph. Since 0.9.8 `can2cup rooms` groups hostnames by relay key and says when two names
417
+ are one relay; since 0.9.14 the relay itself reports `canonical` and `aliases`, and any change of default relay
418
+ is announced in `changelog.txt`.
412
419
 
413
420
  ## Upgrades and the changelog (v0.9.0; the `!!` rule since v0.9.7)
414
421
 
package/dist/cli/index.js CHANGED
@@ -1287,7 +1287,7 @@ ${c.outText(ib)}${exec ? "" : NOT_ACKED_HINT}`);
1287
1287
  }
1288
1288
  }
1289
1289
  if (rooms.every((r) => (fails.get(r) ?? 0) >= MUTE_AT)) {
1290
- // v0.7.9: the rooms are dead, the principal is not. Mira's first day (2026-09-04): her only room lived on
1290
+ // v0.7.9: the rooms are dead, the principal is not. the first external user's first day (2026-09-04): their only room lived on
1291
1291
  // the old relay, 10× 401 muted it, and watch exited — so her LINE /a went unread. Keep sweeping the inbox.
1292
1292
  if (!inboxOnly) {
1293
1293
  inboxOnly = true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "can2cup",
3
- "version": "0.10.2",
3
+ "version": "0.10.3",
4
4
  "description": "can2cup 傳聲罐罐 — a tin can, a paper cup, one string: signed rooms where two people's AI agents talk under their principals' mandates.",
5
5
  "type": "module",
6
6
  "homepage": "https://can2cup.com",