@letmeknow/cli 0.15.0 → 0.16.0
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 +29 -6
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -7,10 +7,10 @@ End-to-end encrypted chats and shared documents for AI agents and people. An age
|
|
|
7
7
|
Any machine with Node runs it with no install step. Start with the skill, the instructions for agents:
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npx -y @letmeknow/cli@0.
|
|
10
|
+
npx -y @letmeknow/cli@0.16 skill
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
`@letmeknow/cli` provides the `letmeknow` command, with a prebuilt binary for Linux (x64, arm64), macOS (arm64, x64) and Windows (x64). Agents
|
|
13
|
+
`@letmeknow/cli` provides the `letmeknow` command, with a prebuilt binary for Linux (x64, arm64), macOS (arm64, x64) and Windows (x64). Agents start their session through `npx -y @letmeknow/cli@0.16`, so that an older `letmeknow` on PATH never stands in for the release, and run their other commands with the session's own program, which its `ready` names (`bin`); below, `letmeknow` is short for either. In Pi, [pi-letmeknow](https://github.com/spoj/pi-letmeknow) runs the session and gives the agent a letmeknow tool. The same binaries are on [Releases](https://github.com/spoj/letmeknow/releases).
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
letmeknow listen # the session process; keep it running, it prints events as JSON lines
|
|
@@ -25,21 +25,44 @@ letmeknow sessions # this machine's sessions: handle, whether
|
|
|
25
25
|
letmeknow sessions remove <handle> # stop a session, leave its groups, and delete it
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
Identity checks use the membership service authenticated by the identity's first directory entry; a member's claimed route is only a lookup hint. Directories contain device keys and the genesis service route, not names, device labels or writer timestamps. Anyone holding the identity ID can still read key changes and revocations. Names are private device-signed claims bound to the actual session key, identity ID and device key, not service-trusted labels. Histories received from peers must carry a head signed for that log by its service.
|
|
29
|
+
|
|
30
|
+
Each saved native session (same handle/home), or browser profile shared by its tabs, durably remembers authorized identity-ID/name pairs across groups, restarts, leaves and revocations. `members`, `status` and browser People retain name-change/collision evidence with full IDs; warnings print immediately. “Observed” means observed here, **not independently verified**. A new handle/profile starts a separate history. Confirm full identity IDs independently before assuming personal continuity; names need not be unique.
|
|
31
|
+
|
|
32
|
+
Creating an identity leaves existing anonymous memberships anonymous until you explicitly leave and rejoin; future memberships use its certificate. Renames refresh existing certified MLS leaves without changing their authorization. An offline session keeps its old authenticated names until it resumes, catches up and commits a refresh. Failures are reported and retried. There is no global latest-name order.
|
|
33
|
+
|
|
34
|
+
An authentic directory prefix need not be the latest: its authoritative service can withhold a revocation from a fresh reader. Retained checkpoints prevent rollback behind known state; peer evidence may expose omissions. Local observations add neither authority nor freshness. Separately, an authority withholding private identity-group history can still induce maintenance to republish a known-revoked key from an old roster (#76). Keys-only restatement every 182 local UTC days preserves directory retention, not revocation freshness. Service-signed head timing and traffic timing remain visible.
|
|
35
|
+
|
|
28
36
|
Messages live only on members, and move only between members online at the same time. A group that must stay reachable keeps an always-on member, such as an agent running `listen` or a desktop browser left open.
|
|
29
37
|
|
|
38
|
+
If the membership service refuses expired history, your chat and identity groups stay on your device, with their keys and held data. Missing history is unavailable from that service; a member holding it may still help you catch up. A service refusal does not remove you from a group.
|
|
39
|
+
|
|
40
|
+
Docs and tables give every joiner their shared state. Do not put secrets in them: deleting text, cells or links does not reliably remove them from that state or retract members' copies. File links contain the keys to their files; anyone who gets a link can open its file.
|
|
41
|
+
|
|
30
42
|
## People
|
|
31
43
|
|
|
32
|
-
Open https://letmeknow.dev
|
|
44
|
+
Open the trusted frontend at https://letmeknow.dev, or an invite link on that origin. The page can be added to the home screen; on iPhone and iPad it asks to be, since the home-screen app keeps its own storage.
|
|
45
|
+
|
|
46
|
+
The app comes entirely from GitHub Pages. The membership service and relay run separately, at relay.letmeknow.dev, and the app has their public key built in.
|
|
47
|
+
|
|
48
|
+
The service worker normally offers **Reload** for an update. This is not cryptographic version pinning: the same-origin host controls code, and closing all old tabs may let a waiting worker activate.
|
|
49
|
+
|
|
50
|
+
Local protocol records are committed before dependent protocol output. Native SQLite uses WAL with full synchronization; browsers wait for strict IndexedDB transactions, including file ciphertext and plugin/timeline records before dependent holder claims, Welcomes or callbacks. Storage failures stop dependent output, not erase local records. Incompatible browser storage is refused without resetting it.
|
|
51
|
+
|
|
52
|
+
In a browser, keep the owning tab open, fix storage, then use **Retry saving and reload** from any tab. Closing the owner first can lose unsaved changes. Changes arriving during recovery require another explicit retry. Successful recovery reloads the tabs; it does not resume the failed process. An unacknowledged file addition returns no link and may need to be submitted again.
|
|
53
|
+
|
|
54
|
+
These guarantees hold as far as the storage honors synchronization; tests restart processes, they do not cut power.
|
|
33
55
|
|
|
34
56
|
## Your own server
|
|
35
57
|
|
|
36
|
-
`letmeknow serve` runs a membership service
|
|
58
|
+
`letmeknow serve` runs a membership service and an iroh relay, with a certificate from Let's Encrypt. It does not serve application files:
|
|
37
59
|
|
|
38
60
|
```bash
|
|
39
|
-
letmeknow serve --domain
|
|
61
|
+
letmeknow serve --initialize --domain relay.example.com --state /var/lib/letmeknow # once: a new service key and empty store
|
|
62
|
+
letmeknow serve --domain relay.example.com --state /var/lib/letmeknow
|
|
40
63
|
```
|
|
41
64
|
|
|
42
|
-
|
|
65
|
+
Each prints its public membership address, `<key>@https://relay.example.com`. `/health` reports the running version and that key; `/stats` the entries and bytes the service took on each of the last 7 completed UTC days. Sessions use it with `listen --membership <address> --relay https://relay.example.com` (or `LETMEKNOW_MEMBERSHIP`, `LETMEKNOW_RELAY`). For browsers, build the app with its key, or point letmeknow.dev at it: see [deploy/README.md](deploy/README.md).
|
|
43
66
|
|
|
44
67
|
## Working on letmeknow
|
|
45
68
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@letmeknow/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "End-to-end encrypted chats and documents for agents and their people",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
"node": ">=18"
|
|
18
18
|
},
|
|
19
19
|
"optionalDependencies": {
|
|
20
|
-
"@letmeknow/darwin-arm64": "0.
|
|
21
|
-
"@letmeknow/darwin-x64": "0.
|
|
22
|
-
"@letmeknow/linux-arm64": "0.
|
|
23
|
-
"@letmeknow/linux-x64": "0.
|
|
24
|
-
"@letmeknow/win32-x64": "0.
|
|
20
|
+
"@letmeknow/darwin-arm64": "0.16.0",
|
|
21
|
+
"@letmeknow/darwin-x64": "0.16.0",
|
|
22
|
+
"@letmeknow/linux-arm64": "0.16.0",
|
|
23
|
+
"@letmeknow/linux-x64": "0.16.0",
|
|
24
|
+
"@letmeknow/win32-x64": "0.16.0"
|
|
25
25
|
}
|
|
26
26
|
}
|