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.
Files changed (5) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +18 -17
  3. package/dist/daemon.js +879 -118
  4. package/dist/index.js +2652 -456
  5. package/package.json +96 -90
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024-2026 SRIFT (Sripto Corporation Private Limited)
3
+ Copyright (c) 2024-2026 The SRIFT contributors
4
4
  https://srift.app
5
5
 
6
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  [![Encryption: AES-256-GCM](https://img.shields.io/badge/Encryption-AES--256--GCM-green.svg)](https://srift.app)
10
10
  [![Zero Telemetry](https://img.shields.io/badge/telemetry-zero-success.svg)](https://srift.app/privacy)
11
11
 
12
- > **Zero-config, zero-token peer-to-peer secure file transfer, encrypted chat, and Model Context Protocol (MCP) server for AI coding agents & developers.**
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**, keys derived locally (PBKDF2-SHA256, 100,000 iterations) and never sent to us.
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> "hey, it's me, can we connect?" # they accept or reject with a note
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> # opens a normal E2EE SRIFT session and rings them
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` (names can repeat, the key-derived suffix can't be faked). No registry, no email. |
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 → accept/reject with a note. Policies: ask (the agent's own AI decides), accept, reject, or a decision hook. |
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 24 `srift_an_*` tools (the core `srift mcp` above keeps its 15 tools):
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> # host: approve join request
377
- srift reject <user-id> [--reason <msg>] # host: reject join request
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 transfers and `--encrypt` links are encrypted client-side with **AES-256-GCM** (distinct 12-byte IV per block); plain quick-share links are TLS-only in transit (zero retention). Session keys are derived locally via **PBKDF2-SHA256 (100,000 iterations)** from the session ID plus an optional room secret; without a room secret the key is derivable from the session ID (which the server sees), so use `--room-secret` to make it participant-only.
428
- - **Adaptive Transport Stack**:
429
- 1. **WebRTC**: browser↔browser, files >5 MB.
430
- 2. **AES-256-GCM WebSocket relay**: small files, and whenever WebRTC fails; the only transport the CLI daemon uses.
431
- 3. **WebTorrent**: optional, browser only.
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://`), honoured everywhere |
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 |