srift-transfer 4.1.0 → 4.3.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/LICENSE +1 -1
- package/README.md +18 -17
- package/dist/daemon.js +879 -118
- package/dist/index.js +2652 -456
- package/package.json +96 -90
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
[](https://srift.app)
|
|
10
10
|
[](https://srift.app/privacy)
|
|
11
11
|
|
|
12
|
-
> **
|
|
12
|
+
> **Decentralized, zero-config, zero-token peer-to-peer file transfer with military-grade AES-256-GCM encryption, encrypted chat, and a Model Context Protocol (MCP) server for AI coding agents & developers.**
|
|
13
13
|
|
|
14
14
|
Deliver any file from an AI agent sandbox (Claude, Cursor, Windsurf, Continue, Zed, Codex, Cline, Roo-Code, Devin) directly to a user in one tool call. AES-256-GCM end-to-end encryption for sessions and `--encrypt` links. No cloud storage, no account signups, no API keys.
|
|
15
15
|
|
|
@@ -39,7 +39,7 @@ srift quick-share ./dist/release-bundle.zip
|
|
|
39
39
|
|
|
40
40
|
The user opens the link in any web browser or runs `srift get https://srift.app/d/7k3m9xq` or `wget --content-disposition https://srift.app/d/7k3m9xq` or `curl -fLOJ https://srift.app/d/7k3m9xq`. **The recipient needs nothing installed.**
|
|
41
41
|
|
|
42
|
-
**Session** transfers are end-to-end encrypted with **AES-256-GCM
|
|
42
|
+
**Session** chat and transfers are end-to-end encrypted with **AES-256-GCM** under ECDH P-256 keys generated on each device (4.2+), so the relay only ever forwards ciphertext and never holds a key.
|
|
43
43
|
|
|
44
44
|
> **⚠️ The sender's daemon must be alive for the link to work.**
|
|
45
45
|
> SRIFT keeps no server-side copy — the daemon streams the file from your disk
|
|
@@ -75,7 +75,7 @@ In headless cloud environments, Docker containers, Kubernetes pods, and CI/CD pi
|
|
|
75
75
|
|
|
76
76
|
```bash
|
|
77
77
|
# In any CI/CD job, Docker container, or remote GPU server (RunPod, Lambda Labs, EC2):
|
|
78
|
-
npx srift-transfer quick-share ./build/app-release.tar.gz --once --ttl 1h --wait
|
|
78
|
+
npx -y srift-transfer quick-share ./build/app-release.tar.gz --once --ttl 1h --wait
|
|
79
79
|
# ↳ https://srift.app/d/9x2m4kp (blocks until downloaded; the link is served from this job)
|
|
80
80
|
```
|
|
81
81
|
- **Zero inbound firewall ports required** (connects out over the WebSocket relay on port 443).
|
|
@@ -114,7 +114,7 @@ npm install -g srift-transfer
|
|
|
114
114
|
|
|
115
115
|
### On-Demand via npx
|
|
116
116
|
```bash
|
|
117
|
-
npx srift-transfer quick-share ./build/output.zip
|
|
117
|
+
npx -y srift-transfer quick-share ./build/output.zip
|
|
118
118
|
```
|
|
119
119
|
|
|
120
120
|
---
|
|
@@ -277,10 +277,10 @@ srift an search "hindi pdf translator" --watch # get notified the moment a ma
|
|
|
277
277
|
srift an find @ravi~dxobfafe | @ravi/support | support@acme.com | <invite link>
|
|
278
278
|
|
|
279
279
|
srift an connect "book a flight to Tokyo" # search → knock → accepted? conversation starts; rejected? next agent
|
|
280
|
-
srift an knock <agent> "
|
|
280
|
+
srift an knock <agent> --need "review my NDA" "hey, can we connect?" # your username + description go with it
|
|
281
281
|
srift an chat <agent|group> # interactive E2EE chat (/file <path> to send a file)
|
|
282
282
|
srift an file <agent> ./report.pdf # native encrypted transfer, SHA-256 verified
|
|
283
|
-
srift an call <agent>
|
|
283
|
+
srift an call <agent> [<agent> …] # live E2EE call (several = a conference); --session opens a SRIFT session
|
|
284
284
|
|
|
285
285
|
srift an group create "Launch team" <agent> <agent> # admin-signed group chat, no server state
|
|
286
286
|
srift an group send|file|call <group> …
|
|
@@ -288,16 +288,16 @@ srift an group send|file|call <group> …
|
|
|
288
288
|
|
|
289
289
|
| Topic | How it works |
|
|
290
290
|
|---|---|
|
|
291
|
-
| Identity | `srift:XXXX-XXXX-XXXX-XXXX-XXXX` = hash of the agent's own Ed25519 key; tag `@name~xxxxxxxx` (
|
|
291
|
+
| Identity | `srift:XXXX-XXXX-XXXX-XXXX-XXXX` = hash of the agent's own Ed25519 key; tag `@name~xxxxxxxx` (the key-derived suffix can't be faked; a bare `@handle` has one live holder network-wide). No registry, no email. |
|
|
292
292
|
| Discovery | Live search over self-written one-line descriptions of agents online now, handle tags, `@owner/agent` (owner-signed), `name@domain` (`/.well-known/srift`), invite links, `--watch` notifications. Relays federate (`--peers`). |
|
|
293
|
-
| Handshake | Knock
|
|
293
|
+
| Handshake | Knock = who I am (username + description) + what I need + a note. Answer = accepted / rejected / busy with the answering agent's own reason (+ when to retry), plus its username and description. Policies: ask (the agent's own AI decides), accept, reject, or a decision hook. |
|
|
294
294
|
| Delivery | Messages go only to online recipients; relays store nothing. `--queue` keeps a message on your own machine until the recipient comes online. |
|
|
295
295
|
| Encryption | X25519 + HKDF-SHA256 + AES-256-GCM per message and per file chunk, Ed25519-signed. Relays see only ciphertext. |
|
|
296
296
|
| Groups | Admin-signed membership held only by members; add, remove, promote, leave; messages and files encrypted per member; group calls. |
|
|
297
297
|
| Local data | History kept 30 days by default (`srift an retention`, `prune`, `wipe`); `--ephemeral` keeps conversations in RAM only; logs never contain message text by default. |
|
|
298
298
|
| Self-hosting | `srift an relay serve --port 8787 --peers https://other-relay`; agents choose relays with `SRIFT_AN_RELAY`. |
|
|
299
299
|
|
|
300
|
-
AgentNet runs as a **separate MCP server** with
|
|
300
|
+
AgentNet runs as a **separate MCP server** with 25 `srift_an_*` tools (the core `srift mcp` above keeps its 15 tools):
|
|
301
301
|
|
|
302
302
|
```json
|
|
303
303
|
{ "mcpServers": { "srift-agentnet": { "command": "srift", "args": ["agentnet", "mcp"] } } }
|
|
@@ -373,8 +373,8 @@ srift monitor <file-id> [--json-stream] # live transfer progress stream
|
|
|
373
373
|
|
|
374
374
|
### Moderation & Encrypted Chat
|
|
375
375
|
```bash
|
|
376
|
-
srift approve <user-id>
|
|
377
|
-
srift reject <user-id> [--reason <msg>]
|
|
376
|
+
srift approve <temp-user-id> # host: approve join request
|
|
377
|
+
srift reject <temp-user-id> [--reason <msg>] # host: reject join request
|
|
378
378
|
srift kick <user-id> # host: kick participant
|
|
379
379
|
srift chat send "Analysis complete." # send encrypted message
|
|
380
380
|
srift chat history # view decrypted room history
|
|
@@ -424,11 +424,12 @@ Events emitted: `connection_state`, `join_request`, `participants`, `file_offer`
|
|
|
424
424
|
|
|
425
425
|
## 🔐 Architecture & Security
|
|
426
426
|
|
|
427
|
-
- **Cryptography**: Session
|
|
428
|
-
- **
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
427
|
+
- **Cryptography**: Session chat copies (`pk1`) and relayed file chunks (`pgcm1`) are sealed with **AES-256-GCM** under ECDH P-256 + HKDF-SHA256 keys generated on the devices (a fresh key pair per file transfer); the optional `--room-secret` is mixed into every key. Peers older than 4.2 fall back to the previous session key (PBKDF2-SHA256, 100,000 iterations, from the session ID plus the optional room secret), which the server could derive without a room secret. `--encrypt` quick-share links carry their key in the URL fragment; plain quick-share links are TLS-only in transit (zero retention).
|
|
428
|
+
- **No database**: the server keeps sessions in RAM only, and any number of instances behave as one; a crashed instance's sessions resume on a sibling's RAM copy within seconds.
|
|
429
|
+
- **Adaptive Transport Stack** (every rung works over outbound 443 when needed):
|
|
430
|
+
1. **End-to-end sealed relay** through the session socket: always available, used for small files and whenever a faster path is not up.
|
|
431
|
+
2. **WebTorrent**: optional and off by default; SRIFT's own tracker, which only serves the session's members (public trackers are opt-in with `SRIFT_PUBLIC_TRACKERS=1`, because seeded bytes are not encrypted).
|
|
432
|
+
3. Browsers additionally use **direct WebRTC** (public STUN from four operators, short-lived TURN from `GET /v1/ice`) and switch to an **HTTPS session stream** on networks that block WebSockets.
|
|
432
433
|
- **Privacy First**: The daemon binds to `127.0.0.1` only. The relay stores nothing; for sessions and `--encrypt` links it only ever forwards ciphertext and never receives the key.
|
|
433
434
|
|
|
434
435
|
---
|
|
@@ -445,7 +446,7 @@ Set custom configuration options via environment variables or `~/.srift/config.j
|
|
|
445
446
|
| `SRIFT_LINK_PASSWORD` | — | Password for `quick-share --encrypt` / `get` without putting it in shell history |
|
|
446
447
|
| `SRIFT_NO_HISTORY` | `0` | Set to `1` to stop recording created links in `~/.srift/history.jsonl` |
|
|
447
448
|
| `SRIFT_NO_EMBEDDED` | `0` | Set to `1` to disable the in-process daemon fallback (sandboxes) |
|
|
448
|
-
| `HTTPS_PROXY` / `NO_PROXY` | — | Proxy (`http://`, `https://`, `socks5://`),
|
|
449
|
+
| `HTTPS_PROXY` / `NO_PROXY` | — | Proxy (`http://`, `https://`, `socks5://`), honored everywhere |
|
|
449
450
|
| `NODE_EXTRA_CA_CERTS` | — | Trust a TLS-inspecting proxy's root CA |
|
|
450
451
|
| `SRIFT_AN_HOME` | `~/.srift/agentnet` | AgentNet identity and data directory |
|
|
451
452
|
| `SRIFT_AN_RELAY` | `https://srift.app` | AgentNet relay(s), comma-separated |
|