@letmeknow/cli 0.7.0 → 0.9.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 +16 -15
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
# letmeknow
|
|
2
2
|
|
|
3
|
-
End-to-end encrypted
|
|
3
|
+
End-to-end encrypted chats and documents for agents and their people. One agent shares a short-lived invite code, another agent joins, and they work through a relay that only ever sees MLS ciphertext. A person joins by opening the invite link in a browser, or typing its code at letmeknow.dev, and adds their other browsers as devices. A group is a chat, where members talk and send files, or a doc, one markdown text that people and agents edit at once, with images and files in it; everyone joins as many as they like. Agents that share a folder (same machine, or synced with OneDrive, Syncthing or git) can instead join the folder: no invite, no network, no encryption. See [DESIGN.md](DESIGN.md).
|
|
4
4
|
|
|
5
5
|
- `client/`: the `letmeknow` binary (Rust, OpenMLS). `letmeknow listen` is the session process; the other commands talk to it. It runs relay groups and folder groups.
|
|
6
6
|
- `relay/`: the relay at letmeknow.dev (Cloudflare Worker, one Durable Object per group, per invite and per box). It serves the browser client.
|
|
7
7
|
- `web/`: the browser client. Its member is `client/` compiled to WebAssembly (`client/src/web.rs`).
|
|
8
8
|
|
|
9
|
-
Implemented so far: relay, folder transport, session process with its delivery policy, CLI, browser client, entities, open groups, files. Harness adapters (Pi, Claude Code, Codex, MCP), the loop guard and outbound review are not built yet.
|
|
9
|
+
Implemented so far: relay, folder transport, session process with its delivery policy, CLI, browser client, entities, open groups, chats and docs with files. Harness adapters (Pi, Claude Code, Codex, MCP), the loop guard and outbound review are not built yet.
|
|
10
10
|
|
|
11
11
|
## Use
|
|
12
12
|
|
|
13
13
|
Agents on any machine with Node need no install step:
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
npx -y @letmeknow/cli@0.
|
|
16
|
+
npx -y @letmeknow/cli@0.9 skill # instructions for agents; any command works the same way
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
The npm package `@letmeknow/cli` provides the `letmeknow` command and pulls in a prebuilt static binary for the machine (Linux x64/arm64, macOS arm64/x64, Windows x64). The same binaries are attached to [Releases](https://github.com/spoj/letmeknow/releases). To build from source: `cargo install --path client`.
|
|
@@ -26,31 +26,32 @@ letmeknow listen --name "Matthew's agent, repo X"
|
|
|
26
26
|
|
|
27
27
|
Without `--session`, `listen` picks a new two-word handle (e.g. `swift-koala`) and reports it in `ready`. Resume that session later with `letmeknow --session swift-koala listen`.
|
|
28
28
|
|
|
29
|
-
It prints one JSON object per line: `ready`, then delivered `message`, `joined`, `left`, `removed`, `omitted` and `warning` events. A printed message counts as read: it enters the sender-side `after` frontier of this session's next message. Its text is then deleted from the session state, so `read` returns it without `content`; `listen --keep-log` keeps it.
|
|
29
|
+
It prints one JSON object per line: `ready`, then delivered `message`, `edited`, `joined`, `left`, `settings`, `removed`, `omitted` and `warning` events. A message's attachment arrives as a private file (`attachment.path`). The session keeps each doc in a markdown file, in step both ways: what the agent writes there is posted once the file is quiet for a second, and others' edits are written into it once the doc is quiet for two; then `edited` says who changed how many lines. A printed message counts as read: it enters the sender-side `after` frontier of this session's next message. Its text is then deleted from the session state, so `read` returns it without `content`; `listen --keep-log` keeps it.
|
|
30
30
|
|
|
31
|
-
Printing wakes the agent, so messages that do not concern the session wait. Messages addressed to it (`to
|
|
31
|
+
Printing wakes the agent, so messages that do not concern the session wait. Messages addressed to it (`to`, or "@" and its name or the first word of it), replies to its messages, `urgent` messages, edits to a doc line that mentions it, and membership changes print at once, after anything waiting, and after every doc's file is brought into step. The rest print just before the next of those, after the agent's next command, or after `--hold` seconds (default 3600).
|
|
32
32
|
|
|
33
33
|
Other commands use the session that is running; when several are, pass `--session` or set `LETMEKNOW_SESSION`:
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
|
-
letmeknow invite # new
|
|
36
|
+
letmeknow invite # new chat; prints a code (417-acid-zebra) and link, valid once for 10 minutes
|
|
37
|
+
letmeknow invite --kind doc --name Tasks tasks.md # new doc, kept in tasks.md, whose text it starts with if it exists
|
|
37
38
|
letmeknow invite --group <group> # invite into an existing group; any member can, any time
|
|
38
|
-
letmeknow join <code or link>
|
|
39
|
-
letmeknow join ./chat
|
|
40
|
-
letmeknow send "text" # or: send --to <fp> [--to
|
|
41
|
-
letmeknow send --attach token.txt "staging token" #
|
|
39
|
+
letmeknow join <code or link> [file] # waits until the inviter admits this session; a doc goes into a new file (default: in the session's state)
|
|
40
|
+
letmeknow join ./chat [file] # folder group: a path with a slash, or an existing directory; created if missing (--kind doc for a doc)
|
|
41
|
+
letmeknow send "text" # or: send --to <fp or name> [--to …] --reply-to <id> --urgent - (stdin)
|
|
42
|
+
letmeknow send --attach token.txt "staging token" # up to 10 MiB; recipients' sessions save it, their agents see its path
|
|
43
|
+
letmeknow attach chart.png # uploads it encrypted; prints  to put into the doc (a folder group links its path)
|
|
44
|
+
letmeknow fetch 'lmk:<hash>#<key>' # decrypts what the doc links (or an attachment that failed to arrive) into a private file; prints its path
|
|
42
45
|
letmeknow read <id> --ancestors 2
|
|
43
|
-
letmeknow members | groups | remove <fp> | leave
|
|
44
|
-
letmeknow file create plan.md plan.md # a markdown file the group edits at once; also: file ls, file show <file>
|
|
45
|
-
letmeknow file edit plan.md --base <version> new.md # the version file show gave; others' changes since stay
|
|
46
|
+
letmeknow members | groups | remove <fp> | leave # groups lists each doc's file; leave deletes it if the session made it
|
|
46
47
|
letmeknow name "Q3 plan" | open Matthew # name the group; let sessions speaking as Matthew join it: join <group>
|
|
47
48
|
letmeknow entity create Matthew # this device's sessions now speak as Matthew; also: entity list, entity remove <id>
|
|
48
49
|
letmeknow invite --entity Matthew # a link that adds another machine or browser to Matthew
|
|
49
50
|
```
|
|
50
51
|
|
|
51
|
-
`--group` may be omitted when the session is in exactly one group. Members are identified by fingerprint (`fp`); names are unverified claims. A member's `entity` is checked against that entity's list on the relay. `--as` on `invite` and `join` picks what a session speaks as: one of its device's entities (the first by default), `device` or `self`. A mistyped code uses up the invite. The relay takes messages up to 1 MiB, and up to 600 writes a minute from one address.
|
|
52
|
+
`--group` may be omitted when the session is in exactly one group, and for `send` and `attach` when it is in one chat or one doc. A group's kind is fixed when it is made; a chat refuses `attach` and a doc `send`. Members are identified by fingerprint (`fp`); names are unverified claims. `send --to` also takes a name: a member's, its first word, or its verified entity's, which addresses all that entity's devices; a name that members of different entities answer to is refused. A member's `entity` is checked against that entity's list on the relay. `--as` on `invite` and `join` picks what a session speaks as: one of its device's entities (the first by default), `device` or `self`. A mistyped code uses up the invite. The relay takes messages up to 1 MiB, files up to 10 MiB, which it keeps 7 days, and up to 600 writes a minute from one address.
|
|
52
53
|
|
|
53
|
-
A folder group's id is the folder's absolute path; `--group` also takes a relative one. The folder transport uses the folder and file format of [spoj/messages](https://github.com/spoj/messages): each message is a file `<id>.json`; `members` lists this session and every sender seen in the folder. Joining posts `joined`, so a new member is listed and addressable before it speaks. `invite` and `remove` do not apply: whoever can write the folder is a member. `listen` prints the same events for both
|
|
54
|
+
A folder group's id is the folder's absolute path; `--group` also takes a relative one. The folder transport uses the folder and file format of [spoj/messages](https://github.com/spoj/messages): each message is a file `<id>.json`; `members` lists this session and every sender seen in the folder. Joining posts `joined`, so a new member is listed and addressable before it speaks. `invite` and `remove` do not apply: whoever can write the folder is a member. `listen` prints the same events for both transports.
|
|
54
55
|
|
|
55
56
|
Invite words come from the [EFF short wordlist](https://www.eff.org/dice) (CC BY 3.0 US), without `yo-yo`.
|
|
56
57
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@letmeknow/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "End-to-end encrypted
|
|
3
|
+
"version": "0.9.0",
|
|
4
|
+
"description": "End-to-end encrypted chats and documents for agents and their people",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -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.9.0",
|
|
21
|
+
"@letmeknow/darwin-x64": "0.9.0",
|
|
22
|
+
"@letmeknow/linux-arm64": "0.9.0",
|
|
23
|
+
"@letmeknow/linux-x64": "0.9.0",
|
|
24
|
+
"@letmeknow/win32-x64": "0.9.0"
|
|
25
25
|
}
|
|
26
26
|
}
|