frely-cli 0.20.1 → 0.20.5
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/dist/agent-help.d.ts +6 -6
- package/dist/agent-help.js +3 -3
- package/dist/agent-help.js.map +1 -1
- package/dist/computer/builtin.d.ts +12 -0
- package/dist/computer/builtin.js +31 -0
- package/dist/computer/builtin.js.map +1 -0
- package/dist/computer/command.d.ts +3 -3
- package/dist/computer/command.js +24 -21
- package/dist/computer/command.js.map +1 -1
- package/dist/computer/ocu.d.ts +5 -1
- package/dist/computer/ocu.js +21 -3
- package/dist/computer/ocu.js.map +1 -1
- package/dist/computer/server.d.ts +5 -4
- package/dist/computer/server.js +9 -8
- package/dist/computer/server.js.map +1 -1
- package/dist/computer/toolset.d.ts +1 -1
- package/dist/computer/toolset.js +1 -1
- package/dist/computer/toolset.js.map +1 -1
- package/dist/runtime/iroh-native.d.ts +6 -0
- package/dist/runtime/iroh-native.js +7 -0
- package/dist/runtime/iroh-native.js.map +1 -0
- package/dist/runtime/local-mcp.d.ts +2 -0
- package/dist/runtime/local-mcp.js +4 -1
- package/dist/runtime/local-mcp.js.map +1 -1
- package/dist/runtime/mcp.js +24 -4
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/runtime/p2p.d.ts +72 -0
- package/dist/runtime/p2p.js +279 -0
- package/dist/runtime/p2p.js.map +1 -0
- package/dist/runtime/transfer.js +1 -1
- package/dist/runtime/transfer.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { IS_STANDALONE } from "../cli-launch.js";
|
|
2
|
+
import { embeddedIroh } from "./iroh-native.js";
|
|
3
|
+
import { TRANSFER_MAX_BYTES } from "./transfer.js";
|
|
4
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
5
|
+
const ALPN = Array.from(Buffer.from("frely/transfer/1"));
|
|
6
|
+
const CHUNK = 256 * 1024;
|
|
7
|
+
const CONNECT_TIMEOUT_MS = 30_000;
|
|
8
|
+
/** After connecting, wait this long for a direct path before sending over the relay. */
|
|
9
|
+
const DIRECT_WAIT_MS = 5_000;
|
|
10
|
+
const SEND_WAIT_MS = 100_000;
|
|
11
|
+
const LISTEN_TIMEOUT_MS = 10 * 60_000;
|
|
12
|
+
const IDLE_CLOSE_MS = 10 * 60_000;
|
|
13
|
+
const MAX_HEADER = 4096;
|
|
14
|
+
const MAX_JOBS = 32;
|
|
15
|
+
/** The module, or null on a platform that has no iroh build (Intel Macs) or when it cannot be loaded. */
|
|
16
|
+
async function loadIroh() {
|
|
17
|
+
const unwrap = (module) => (module?.default ?? module);
|
|
18
|
+
if (embeddedIroh)
|
|
19
|
+
return unwrap(embeddedIroh);
|
|
20
|
+
// The single file embeds the module or has none; only the npm package resolves it from node_modules (not bundled).
|
|
21
|
+
if (IS_STANDALONE)
|
|
22
|
+
return null;
|
|
23
|
+
const name = "@number0/iroh";
|
|
24
|
+
try {
|
|
25
|
+
return unwrap(await import(name));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** The relays to use: one https URL or a list of up to four (iroh picks the closest as home relay); none means direct only. */
|
|
32
|
+
function relayUrlsOf(value) {
|
|
33
|
+
if (value === undefined || value === null || value === "")
|
|
34
|
+
return [];
|
|
35
|
+
const list = Array.isArray(value) ? value : [value];
|
|
36
|
+
if (list.length > 4 || list.some((entry) => typeof entry !== "string"))
|
|
37
|
+
throw new Error("relayUrl must be a string or a list of at most four strings.");
|
|
38
|
+
return list.map((entry) => {
|
|
39
|
+
const url = new URL(entry);
|
|
40
|
+
if (url.protocol !== "https:" || url.username || url.password)
|
|
41
|
+
throw new Error("The relay URL must be https without credentials.");
|
|
42
|
+
return url.toString();
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const timeout = (work, ms, message) => new Promise((resolve, reject) => {
|
|
46
|
+
const timer = setTimeout(() => reject(new Error(message)), ms);
|
|
47
|
+
timer.unref();
|
|
48
|
+
work.then((value) => { clearTimeout(timer); resolve(value); }, (error) => { clearTimeout(timer); reject(error); });
|
|
49
|
+
});
|
|
50
|
+
/** One iroh endpoint per process, started when a transfer first needs it and closed after ten idle minutes. */
|
|
51
|
+
export class P2pTransfers {
|
|
52
|
+
endpoint = null;
|
|
53
|
+
starting = null;
|
|
54
|
+
boundRelay = null;
|
|
55
|
+
secret = null;
|
|
56
|
+
idle = null;
|
|
57
|
+
active = 0;
|
|
58
|
+
jobs = new Map();
|
|
59
|
+
cancels = new Map();
|
|
60
|
+
async supported() { return (await loadIroh()) !== null; }
|
|
61
|
+
/** This process's node id. The relay admits an id before it connects, so the key exists before any endpoint is bound. */
|
|
62
|
+
async info() {
|
|
63
|
+
const iroh = await this.module();
|
|
64
|
+
this.secret ??= iroh.SecretKey.generate();
|
|
65
|
+
return { supported: true, id: this.secret.public().toString() };
|
|
66
|
+
}
|
|
67
|
+
/** This endpoint's address once it is connected to the Frely relay (or, without one, its local sockets). */
|
|
68
|
+
address(endpoint, relays) {
|
|
69
|
+
const addr = endpoint.addr();
|
|
70
|
+
const direct = addr.directAddresses();
|
|
71
|
+
const addresses = direct.length > 0 || relays.length > 0 ? direct : endpoint.boundSockets().map((socket) => socket.replace("0.0.0.0", "127.0.0.1").replace("[::]", "[::1]"));
|
|
72
|
+
return { id: endpoint.id().toString(), relayUrl: addr.relayUrl() ?? relays[0] ?? null, directAddresses: addresses };
|
|
73
|
+
}
|
|
74
|
+
status(jobId) {
|
|
75
|
+
const job = this.jobs.get(jobId);
|
|
76
|
+
if (!job)
|
|
77
|
+
throw new Error("Unknown transfer job.");
|
|
78
|
+
return { ...job };
|
|
79
|
+
}
|
|
80
|
+
/** Waits for the one expected peer and writes its file; returns at once, the job runs in the background. */
|
|
81
|
+
async listen(workspace, input) {
|
|
82
|
+
const relays = relayUrlsOf(input.relayUrl);
|
|
83
|
+
this.hold();
|
|
84
|
+
let job;
|
|
85
|
+
let endpoint;
|
|
86
|
+
try {
|
|
87
|
+
endpoint = await this.start(relays);
|
|
88
|
+
job = this.newJob("receive", input.bytes);
|
|
89
|
+
job.address = this.address(endpoint, relays);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
this.release();
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
const waiting = new Promise((_, reject) => { this.cancels.set(job.jobId, () => reject(new Error("Cancelled."))); });
|
|
96
|
+
waiting.catch(() => undefined);
|
|
97
|
+
void (async () => {
|
|
98
|
+
let peer;
|
|
99
|
+
let bi;
|
|
100
|
+
try {
|
|
101
|
+
peer = await Promise.race([timeout(this.acceptFrom(endpoint, input.from), LISTEN_TIMEOUT_MS, "Nobody sent the file in time."), waiting]);
|
|
102
|
+
this.cancels.delete(job.jobId);
|
|
103
|
+
bi = await peer.acceptBi();
|
|
104
|
+
const header = JSON.parse(Buffer.from(await bi.recv.readExact(Buffer.from(await bi.recv.readExact(4)).readUInt32BE(0))).toString("utf8"));
|
|
105
|
+
if (header.bytes !== input.bytes || header.sha256 !== input.sha256)
|
|
106
|
+
throw new Error("The sender offered a different file than expected.");
|
|
107
|
+
const written = await workspace.writeStream(input.path, this.body(bi.recv, input.bytes), input.overwrite, { bytes: input.bytes, sha256: input.sha256 });
|
|
108
|
+
await bi.send.writeAll(Array.from(Buffer.from("ok")));
|
|
109
|
+
await bi.send.finish();
|
|
110
|
+
await timeout(peer.closed(), 5000, "").catch(() => undefined);
|
|
111
|
+
Object.assign(job, { status: "done", path: written.path });
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
const message = error instanceof Error ? error.message : "Receiving failed.";
|
|
115
|
+
Object.assign(job, { status: "failed", error: message });
|
|
116
|
+
// Tell the sender why instead of leaving it to wait for the connection to time out.
|
|
117
|
+
await bi?.send.writeAll(Array.from(Buffer.from(message.slice(0, 200)))).then(() => bi?.send.finish()).catch(() => undefined);
|
|
118
|
+
peer?.close(2n, Array.from(Buffer.from("failed")));
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
this.cancels.delete(job.jobId);
|
|
122
|
+
this.release();
|
|
123
|
+
}
|
|
124
|
+
})();
|
|
125
|
+
return { ...job };
|
|
126
|
+
}
|
|
127
|
+
/** Stops a receive job that is still waiting for its sender (so a retry on another relay setting can bind); no effect once data flows. */
|
|
128
|
+
cancel(jobId) {
|
|
129
|
+
this.cancels.get(jobId)?.();
|
|
130
|
+
return this.status(jobId);
|
|
131
|
+
}
|
|
132
|
+
/** Sends one file to a prepared peer. Waits up to 100 seconds, then leaves the job running. */
|
|
133
|
+
async send(workspace, input) {
|
|
134
|
+
const iroh = await this.module();
|
|
135
|
+
const relays = relayUrlsOf(input.relayUrl);
|
|
136
|
+
const job = this.newJob("send", input.bytes);
|
|
137
|
+
this.hold();
|
|
138
|
+
const run = (async () => {
|
|
139
|
+
const endpoint = await this.start(relays);
|
|
140
|
+
const { handle, bytes } = await workspace.openForTransfer(input.path, TRANSFER_MAX_BYTES);
|
|
141
|
+
try {
|
|
142
|
+
if (bytes !== input.bytes)
|
|
143
|
+
throw new Error("The file changed after it was prepared.");
|
|
144
|
+
const target = new iroh.EndpointAddr(iroh.EndpointId.fromString(input.to.id), input.to.relayUrl, input.to.directAddresses);
|
|
145
|
+
const connection = await timeout(endpoint.connect(target, ALPN), CONNECT_TIMEOUT_MS, "Could not reach the other device.");
|
|
146
|
+
await this.preferDirect(connection);
|
|
147
|
+
const bi = await connection.openBi();
|
|
148
|
+
const header = Buffer.from(JSON.stringify({ bytes, sha256: input.sha256 }));
|
|
149
|
+
const length = Buffer.alloc(4);
|
|
150
|
+
length.writeUInt32BE(header.length, 0);
|
|
151
|
+
await bi.send.writeAll(Array.from(Buffer.concat([length, header])));
|
|
152
|
+
const hash = createHash("sha256");
|
|
153
|
+
for await (const chunk of handle.createReadStream({ autoClose: false, start: 0, highWaterMark: CHUNK })) {
|
|
154
|
+
hash.update(chunk);
|
|
155
|
+
await bi.send.writeAll(Array.from(chunk));
|
|
156
|
+
}
|
|
157
|
+
if (hash.digest("hex") !== input.sha256)
|
|
158
|
+
throw new Error("The file changed while it was being sent.");
|
|
159
|
+
await bi.send.finish();
|
|
160
|
+
const answer = Buffer.from(await bi.recv.readToEnd(256)).toString("utf8");
|
|
161
|
+
if (answer !== "ok")
|
|
162
|
+
throw new Error(answer || "The other device did not confirm the file.");
|
|
163
|
+
const relayPaths = connection.paths().filter((path) => path.isRelay);
|
|
164
|
+
const relayBytes = relayPaths.reduce((sum, path) => sum + path.stats.udpTxBytes + path.stats.udpRxBytes, 0);
|
|
165
|
+
Object.assign(job, { status: "done", relayBytes, viaRelay: relayBytes > 0 });
|
|
166
|
+
connection.close(0n, []);
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
await handle.close();
|
|
170
|
+
}
|
|
171
|
+
})().catch((error) => { Object.assign(job, { status: "failed", error: error instanceof Error ? error.message : "Sending failed." }); }).finally(() => this.release());
|
|
172
|
+
await Promise.race([run, new Promise((resolve) => setTimeout(resolve, SEND_WAIT_MS).unref())]);
|
|
173
|
+
return { ...job };
|
|
174
|
+
}
|
|
175
|
+
async close() {
|
|
176
|
+
if (this.idle)
|
|
177
|
+
clearTimeout(this.idle);
|
|
178
|
+
const endpoint = this.endpoint;
|
|
179
|
+
this.endpoint = null;
|
|
180
|
+
this.starting = null;
|
|
181
|
+
this.boundRelay = null;
|
|
182
|
+
await endpoint?.close().catch(() => undefined);
|
|
183
|
+
}
|
|
184
|
+
async module() {
|
|
185
|
+
const iroh = await loadIroh();
|
|
186
|
+
if (!iroh)
|
|
187
|
+
throw new Error("This device cannot do direct transfers (no iroh build for this platform).");
|
|
188
|
+
return iroh;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* The endpoint, bound with this process's key and only the Frely relay (no n0 public relays or discovery). It is bound when
|
|
192
|
+
* a transfer needs it, after the relay has admitted the node id from `info`, and waits until the relay is its home.
|
|
193
|
+
*/
|
|
194
|
+
async start(relays) {
|
|
195
|
+
const relayKey = relays.join(" ");
|
|
196
|
+
const iroh = await this.module();
|
|
197
|
+
this.secret ??= iroh.SecretKey.generate();
|
|
198
|
+
if (this.starting && this.boundRelay === relayKey)
|
|
199
|
+
return this.starting;
|
|
200
|
+
if (this.endpoint && this.boundRelay === relayKey)
|
|
201
|
+
return this.endpoint;
|
|
202
|
+
if (this.active > 1)
|
|
203
|
+
throw new Error("A transfer on another relay is running; try again when it has finished.");
|
|
204
|
+
await this.close();
|
|
205
|
+
this.boundRelay = relayKey;
|
|
206
|
+
const secret = this.secret;
|
|
207
|
+
this.starting = (async () => {
|
|
208
|
+
const builder = iroh.Endpoint.builder();
|
|
209
|
+
builder.applyMinimal();
|
|
210
|
+
builder.secretKey(secret.toBytes());
|
|
211
|
+
builder.alpns([ALPN]);
|
|
212
|
+
builder.relayMode(relays.length > 0 ? iroh.RelayMode.customFromUrls(relays) : iroh.RelayMode.disabled());
|
|
213
|
+
const endpoint = await builder.bind();
|
|
214
|
+
this.endpoint = endpoint;
|
|
215
|
+
if (relays.length > 0)
|
|
216
|
+
await timeout(endpoint.online(), CONNECT_TIMEOUT_MS, "Could not reach the Frely relay.");
|
|
217
|
+
return endpoint;
|
|
218
|
+
})();
|
|
219
|
+
this.starting.catch(() => { this.starting = null; this.boundRelay = null; });
|
|
220
|
+
return this.starting;
|
|
221
|
+
}
|
|
222
|
+
/** The connection starts on the relay; give hole punching a few seconds so a file that can go direct does not use relay allowance. */
|
|
223
|
+
async preferDirect(connection) {
|
|
224
|
+
const deadline = Date.now() + DIRECT_WAIT_MS;
|
|
225
|
+
while (Date.now() < deadline) {
|
|
226
|
+
if (connection.paths().some((path) => path.isSelected && !path.isRelay))
|
|
227
|
+
return;
|
|
228
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
async acceptFrom(endpoint, from) {
|
|
232
|
+
for (;;) {
|
|
233
|
+
const incoming = await endpoint.acceptNext();
|
|
234
|
+
if (!incoming)
|
|
235
|
+
throw new Error("The device stopped listening.");
|
|
236
|
+
const connection = await (await incoming.accept()).connect();
|
|
237
|
+
if (connection.remoteId().toString() === from)
|
|
238
|
+
return connection;
|
|
239
|
+
connection.close(1n, Array.from(Buffer.from("unexpected peer")));
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async *body(recv, bytes) {
|
|
243
|
+
let remaining = bytes;
|
|
244
|
+
while (remaining > 0) {
|
|
245
|
+
const chunk = await recv.read(Math.min(remaining, CHUNK));
|
|
246
|
+
if (!chunk || chunk.length === 0)
|
|
247
|
+
throw new Error("The sender stopped early.");
|
|
248
|
+
remaining -= chunk.length;
|
|
249
|
+
yield Buffer.from(chunk);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
newJob(role, bytes) {
|
|
253
|
+
if (this.jobs.size >= MAX_JOBS) {
|
|
254
|
+
for (const [id, job] of this.jobs) {
|
|
255
|
+
if (job.status !== "running") {
|
|
256
|
+
this.jobs.delete(id);
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const job = { jobId: `p2p_${randomBytes(8).toString("hex")}`, status: "running", role, bytes };
|
|
262
|
+
this.jobs.set(job.jobId, job);
|
|
263
|
+
return job;
|
|
264
|
+
}
|
|
265
|
+
hold() { this.active += 1; if (this.idle) {
|
|
266
|
+
clearTimeout(this.idle);
|
|
267
|
+
this.idle = null;
|
|
268
|
+
} }
|
|
269
|
+
release() { this.active -= 1; this.armIdle(); }
|
|
270
|
+
armIdle() {
|
|
271
|
+
if (this.active > 0)
|
|
272
|
+
return;
|
|
273
|
+
if (this.idle)
|
|
274
|
+
clearTimeout(this.idle);
|
|
275
|
+
this.idle = setTimeout(() => { void this.close(); }, IDLE_CLOSE_MS);
|
|
276
|
+
this.idle.unref();
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=p2p.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p2p.js","sourceRoot":"","sources":["../../src/runtime/p2p.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/transfer.js
CHANGED
|
@@ -5,7 +5,7 @@ import { isIP } from "node:net";
|
|
|
5
5
|
export const TRANSFER_MAX_BYTES = 100 * 1024 * 1024;
|
|
6
6
|
/** Request `_meta` key the relay sets on the hidden transfer_* calls; the relay removes it from whatever a client sent. */
|
|
7
7
|
export const TRANSFER_META_KEY = "frely/transfer";
|
|
8
|
-
export const TRANSFER_TOOLS = new Set(["transfer_prepare", "transfer_upload", "transfer_download"]);
|
|
8
|
+
export const TRANSFER_TOOLS = new Set(["transfer_prepare", "transfer_upload", "transfer_download", "transfer_p2p_info", "transfer_p2p_listen", "transfer_p2p_send", "transfer_p2p_status", "transfer_p2p_cancel"]);
|
|
9
9
|
const TIMEOUT_MS = 10 * 60_000;
|
|
10
10
|
const HEADER_NAMES = /^(?:content-type|x-amz-[a-z0-9-]+)$/u;
|
|
11
11
|
export function transferAllowedFromMeta(meta) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/runtime/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGhC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACpD,2HAA2H;AAC3H,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/runtime/transfer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "frely-cli",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.5",
|
|
4
4
|
"description": "Frely account CLI and local MCP runtime",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -50,5 +50,8 @@
|
|
|
50
50
|
"@types/node": "^22.18.1",
|
|
51
51
|
"@types/ws": "^8.18.1",
|
|
52
52
|
"typescript": "^5.9.2"
|
|
53
|
+
},
|
|
54
|
+
"optionalDependencies": {
|
|
55
|
+
"@number0/iroh": "^1.1.0"
|
|
53
56
|
}
|
|
54
57
|
}
|