frely-cli 0.3.4 → 0.3.6
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 +68 -2
- package/dist/auth.d.ts +19 -2
- package/dist/auth.js +206 -28
- package/dist/auth.js.map +1 -1
- package/dist/device/control.js +7 -6
- package/dist/device/control.js.map +1 -1
- package/dist/device/identity.d.ts +2 -0
- package/dist/device/identity.js +8 -0
- package/dist/device/identity.js.map +1 -1
- package/dist/device/protocol.d.ts +20 -2
- package/dist/device/protocol.js +17 -1
- package/dist/device/protocol.js.map +1 -1
- package/dist/device/relay-client.d.ts +1 -1
- package/dist/device/relay-client.js +96 -47
- package/dist/device/relay-client.js.map +1 -1
- package/dist/diagnostics.js +2 -1
- package/dist/diagnostics.js.map +1 -1
- package/dist/index.js +88 -60
- package/dist/index.js.map +1 -1
- package/dist/provider/control.d.ts +20 -0
- package/dist/provider/control.js +104 -0
- package/dist/provider/control.js.map +1 -0
- package/dist/provider/local.d.ts +13 -0
- package/dist/provider/local.js +110 -0
- package/dist/provider/local.js.map +1 -0
- package/dist/provider/state.d.ts +17 -0
- package/dist/provider/state.js +119 -0
- package/dist/provider/state.js.map +1 -0
- package/dist/runtime/mcp.js +2 -1
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/service.d.ts +1 -0
- package/dist/service.js +14 -5
- package/dist/service.js.map +1 -1
- package/dist/version.d.ts +1 -0
- package/dist/version.js +9 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/device/identity.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/device/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ export type DeviceRelayRequest = {
|
|
|
5
5
|
protocol: typeof DEVICE_RELAY_PROTOCOL;
|
|
6
6
|
type: "request";
|
|
7
7
|
id: string;
|
|
8
|
-
method: "mcp";
|
|
8
|
+
method: "mcp" | "provider";
|
|
9
9
|
payload: unknown;
|
|
10
10
|
};
|
|
11
11
|
export type DeviceRelayResponse = {
|
|
@@ -24,7 +24,25 @@ export type DeviceRelayCancel = {
|
|
|
24
24
|
type: "cancel";
|
|
25
25
|
id: string;
|
|
26
26
|
};
|
|
27
|
-
export type
|
|
27
|
+
export type DeviceRelayStreamStart = {
|
|
28
|
+
protocol: typeof DEVICE_RELAY_PROTOCOL;
|
|
29
|
+
type: "stream_start";
|
|
30
|
+
id: string;
|
|
31
|
+
status: number;
|
|
32
|
+
contentType: string;
|
|
33
|
+
};
|
|
34
|
+
export type DeviceRelayStreamChunk = {
|
|
35
|
+
protocol: typeof DEVICE_RELAY_PROTOCOL;
|
|
36
|
+
type: "stream_chunk";
|
|
37
|
+
id: string;
|
|
38
|
+
data: string;
|
|
39
|
+
};
|
|
40
|
+
export type DeviceRelayStreamEnd = {
|
|
41
|
+
protocol: typeof DEVICE_RELAY_PROTOCOL;
|
|
42
|
+
type: "stream_end";
|
|
43
|
+
id: string;
|
|
44
|
+
};
|
|
45
|
+
export type DeviceRelayEnvelope = DeviceRelayRequest | DeviceRelayResponse | DeviceRelayCancel | DeviceRelayStreamStart | DeviceRelayStreamChunk | DeviceRelayStreamEnd;
|
|
28
46
|
export declare class DeviceRelayProtocolError extends Error {
|
|
29
47
|
readonly code: "frame_invalid" | "frame_too_large" | "duplicate_request" | "inflight_limit";
|
|
30
48
|
constructor(code: "frame_invalid" | "frame_too_large" | "duplicate_request" | "inflight_limit");
|
package/dist/device/protocol.js
CHANGED
|
@@ -38,7 +38,7 @@ export function validateDeviceRelayEnvelope(value) {
|
|
|
38
38
|
assertRequestId(record.id);
|
|
39
39
|
if (record.type === "request") {
|
|
40
40
|
exactKeys(record, ["protocol", "type", "id", "method", "payload"]);
|
|
41
|
-
if (record.method !== "mcp")
|
|
41
|
+
if (record.method !== "mcp" && record.method !== "provider")
|
|
42
42
|
throw new DeviceRelayProtocolError("frame_invalid");
|
|
43
43
|
return;
|
|
44
44
|
}
|
|
@@ -46,6 +46,22 @@ export function validateDeviceRelayEnvelope(value) {
|
|
|
46
46
|
exactKeys(record, ["protocol", "type", "id"]);
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
|
+
if (record.type === "stream_start") {
|
|
50
|
+
exactKeys(record, ["protocol", "type", "id", "status", "contentType"]);
|
|
51
|
+
if (!Number.isSafeInteger(record.status) || Number(record.status) < 100 || Number(record.status) > 599 || typeof record.contentType !== "string" || record.contentType.length < 1 || record.contentType.length > 128 || !/^[\x20-\x7e]+$/u.test(record.contentType))
|
|
52
|
+
throw new DeviceRelayProtocolError("frame_invalid");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (record.type === "stream_chunk") {
|
|
56
|
+
exactKeys(record, ["protocol", "type", "id", "data"]);
|
|
57
|
+
if (typeof record.data !== "string" || record.data.length < 1 || record.data.length > 1024 * 1024)
|
|
58
|
+
throw new DeviceRelayProtocolError("frame_invalid");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (record.type === "stream_end") {
|
|
62
|
+
exactKeys(record, ["protocol", "type", "id"]);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
49
65
|
if (record.type === "response") {
|
|
50
66
|
if (typeof record.ok !== "boolean")
|
|
51
67
|
throw new DeviceRelayProtocolError("frame_invalid");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/device/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAgC,CAAC;AACtE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5D,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/device/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,10 @@ import WebSocket from "ws";
|
|
|
2
2
|
import { connectionGrant, ensureDevice } from "./control.js";
|
|
3
3
|
import { DEVICE_RELAY_DEFAULT_MAX_INFLIGHT, DEVICE_RELAY_MAX_FRAME_BYTES, DEVICE_RELAY_PROTOCOL, decodeDeviceRelayEnvelope, encodeDeviceRelayEnvelope, } from "./protocol.js";
|
|
4
4
|
import { RelayMcpSession } from "../runtime/relay-mcp.js";
|
|
5
|
+
import { openLocalProviderRequest, readLocalProviderBody } from "../provider/local.js";
|
|
5
6
|
export async function serveDeviceRelay(options) {
|
|
6
7
|
const device = await ensureDevice();
|
|
7
|
-
const session = await RelayMcpSession.create(options.workspace);
|
|
8
|
+
const session = options.workspace ? await RelayMcpSession.create(options.workspace) : null;
|
|
8
9
|
const log = options.log ?? (() => undefined);
|
|
9
10
|
let delayMs = 1000;
|
|
10
11
|
try {
|
|
@@ -24,16 +25,13 @@ export async function serveDeviceRelay(options) {
|
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
27
|
finally {
|
|
27
|
-
await session
|
|
28
|
+
await session?.close();
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
async function serveConnection(websocketUrl, accessToken, deviceId, session, signal, log) {
|
|
31
32
|
await new Promise((resolve, reject) => {
|
|
32
33
|
const socket = new WebSocket(websocketUrl, DEVICE_RELAY_PROTOCOL, {
|
|
33
|
-
headers: {
|
|
34
|
-
authorization: `Bearer ${accessToken}`,
|
|
35
|
-
"x-frely-device-id": deviceId,
|
|
36
|
-
},
|
|
34
|
+
headers: { authorization: `Bearer ${accessToken}`, "x-frely-device-id": deviceId },
|
|
37
35
|
maxPayload: DEVICE_RELAY_MAX_FRAME_BYTES,
|
|
38
36
|
perMessageDeflate: false,
|
|
39
37
|
handshakeTimeout: 15_000,
|
|
@@ -41,16 +39,16 @@ async function serveConnection(websocketUrl, accessToken, deviceId, session, sig
|
|
|
41
39
|
const inflight = new Map();
|
|
42
40
|
const cancelled = new Set();
|
|
43
41
|
let finished = false;
|
|
44
|
-
const heartbeat = setInterval(() => {
|
|
45
|
-
|
|
46
|
-
socket.ping();
|
|
47
|
-
}, 30_000);
|
|
42
|
+
const heartbeat = setInterval(() => { if (socket.readyState === WebSocket.OPEN)
|
|
43
|
+
socket.ping(); }, 30_000);
|
|
48
44
|
heartbeat.unref?.();
|
|
49
45
|
const finish = (error) => {
|
|
50
46
|
if (finished)
|
|
51
47
|
return;
|
|
52
48
|
finished = true;
|
|
53
49
|
clearInterval(heartbeat);
|
|
50
|
+
for (const item of inflight.values())
|
|
51
|
+
item.controller.abort();
|
|
54
52
|
signal.removeEventListener("abort", onAbort);
|
|
55
53
|
socket.removeAllListeners();
|
|
56
54
|
if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)
|
|
@@ -62,7 +60,7 @@ async function serveConnection(websocketUrl, accessToken, deviceId, session, sig
|
|
|
62
60
|
};
|
|
63
61
|
const onAbort = () => finish();
|
|
64
62
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
65
|
-
socket.once("open", () => log(`
|
|
63
|
+
socket.once("open", () => log(`Device Relay connected for device ${deviceId}.`));
|
|
66
64
|
socket.once("error", (error) => finish(error));
|
|
67
65
|
socket.once("close", (code, reason) => {
|
|
68
66
|
if (signal.aborted)
|
|
@@ -82,10 +80,12 @@ async function serveConnection(websocketUrl, accessToken, deviceId, session, sig
|
|
|
82
80
|
async function handleFrame(data, socket, inflight, cancelled, session) {
|
|
83
81
|
const envelope = decodeDeviceRelayEnvelope(data);
|
|
84
82
|
if (envelope.type === "cancel") {
|
|
85
|
-
const
|
|
86
|
-
if (
|
|
83
|
+
const item = inflight.get(envelope.id);
|
|
84
|
+
if (item) {
|
|
87
85
|
cancelled.add(envelope.id);
|
|
88
|
-
|
|
86
|
+
item.controller.abort();
|
|
87
|
+
if (item.request.method === "mcp")
|
|
88
|
+
session?.cancel(item.request.payload);
|
|
89
89
|
}
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
@@ -99,60 +99,109 @@ async function handleFrame(data, socket, inflight, cancelled, session) {
|
|
|
99
99
|
send(socket, errorResponse(envelope.id, "inflight_limit", "Device Relay request window is full."));
|
|
100
100
|
return;
|
|
101
101
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
102
|
+
const controller = new AbortController();
|
|
103
|
+
inflight.set(envelope.id, { request: envelope, controller });
|
|
104
|
+
const operation = envelope.method === "provider"
|
|
105
|
+
? executeProviderRequest(envelope, socket, controller.signal, cancelled)
|
|
106
|
+
: executeMcpRequest(envelope, session).then((payload) => {
|
|
107
|
+
if (!cancelled.has(envelope.id))
|
|
108
|
+
send(socket, { protocol: DEVICE_RELAY_PROTOCOL, type: "response", id: envelope.id, ok: true, payload });
|
|
109
|
+
});
|
|
110
|
+
void operation.catch((error) => {
|
|
107
111
|
if (!cancelled.has(envelope.id))
|
|
108
|
-
send(socket, errorResponse(envelope.id, "mcp_execution_failed", safeMessage(error)));
|
|
112
|
+
send(socket, errorResponse(envelope.id, envelope.method === "mcp" ? "mcp_execution_failed" : "provider_execution_failed", safeMessage(error)));
|
|
109
113
|
}).finally(() => {
|
|
110
114
|
inflight.delete(envelope.id);
|
|
111
115
|
cancelled.delete(envelope.id);
|
|
112
116
|
});
|
|
113
117
|
}
|
|
114
|
-
function
|
|
115
|
-
if (
|
|
118
|
+
async function executeMcpRequest(request, session) {
|
|
119
|
+
if (!session)
|
|
120
|
+
throw new Error("MCP workspace is not configured on this device.");
|
|
121
|
+
return session.execute(request.payload);
|
|
122
|
+
}
|
|
123
|
+
async function executeProviderRequest(request, socket, signal, cancelled) {
|
|
124
|
+
const opened = await openLocalProviderRequest(request.payload, signal);
|
|
125
|
+
if (opened.contentType !== "text/event-stream") {
|
|
126
|
+
const body = await readLocalProviderBody(opened.response);
|
|
127
|
+
if (!cancelled.has(request.id))
|
|
128
|
+
send(socket, {
|
|
129
|
+
protocol: DEVICE_RELAY_PROTOCOL, type: "response", id: request.id, ok: true,
|
|
130
|
+
payload: { status: opened.status, contentType: opened.contentType, body },
|
|
131
|
+
});
|
|
116
132
|
return;
|
|
133
|
+
}
|
|
134
|
+
if (cancelled.has(request.id))
|
|
135
|
+
return;
|
|
136
|
+
await sendAsync(socket, { protocol: DEVICE_RELAY_PROTOCOL, type: "stream_start", id: request.id, status: opened.status, contentType: opened.contentType });
|
|
137
|
+
const reader = opened.response.body?.getReader();
|
|
138
|
+
if (!reader) {
|
|
139
|
+
await sendAsync(socket, { protocol: DEVICE_RELAY_PROTOCOL, type: "stream_end", id: request.id });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
let completed = false;
|
|
117
143
|
try {
|
|
118
|
-
|
|
144
|
+
while (!cancelled.has(request.id)) {
|
|
145
|
+
const part = await reader.read();
|
|
146
|
+
if (part.done) {
|
|
147
|
+
completed = true;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
for (let offset = 0; offset < part.value.byteLength; offset += 256 * 1024) {
|
|
151
|
+
const chunk = part.value.subarray(offset, Math.min(offset + 256 * 1024, part.value.byteLength));
|
|
152
|
+
if (cancelled.has(request.id))
|
|
153
|
+
break;
|
|
154
|
+
await sendAsync(socket, { protocol: DEVICE_RELAY_PROTOCOL, type: "stream_chunk", id: request.id, data: Buffer.from(chunk).toString("base64url") });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
119
157
|
}
|
|
120
158
|
catch (error) {
|
|
121
|
-
|
|
122
|
-
|
|
159
|
+
if (signal.aborted || cancelled.has(request.id))
|
|
160
|
+
return;
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
reader.releaseLock();
|
|
165
|
+
}
|
|
166
|
+
if (completed && !cancelled.has(request.id) && socket.readyState === WebSocket.OPEN) {
|
|
167
|
+
await sendAsync(socket, { protocol: DEVICE_RELAY_PROTOCOL, type: "stream_end", id: request.id });
|
|
123
168
|
}
|
|
124
169
|
}
|
|
125
|
-
function
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
170
|
+
function send(socket, envelope) {
|
|
171
|
+
if (socket.readyState !== WebSocket.OPEN)
|
|
172
|
+
return;
|
|
173
|
+
try {
|
|
174
|
+
socket.send(encodeDeviceRelayEnvelope(envelope));
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
if (envelope.type !== "response")
|
|
178
|
+
return;
|
|
179
|
+
const fallback = errorResponse(envelope.id, "response_too_large", "Device Relay response exceeds the frame limit.");
|
|
180
|
+
socket.send(encodeDeviceRelayEnvelope(fallback));
|
|
181
|
+
}
|
|
133
182
|
}
|
|
134
|
-
function
|
|
135
|
-
if (
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
183
|
+
async function sendAsync(socket, envelope) {
|
|
184
|
+
if (socket.readyState !== WebSocket.OPEN)
|
|
185
|
+
throw new Error("Device Relay connection is not open.");
|
|
186
|
+
const encoded = encodeDeviceRelayEnvelope(envelope);
|
|
187
|
+
await new Promise((resolve, reject) => {
|
|
188
|
+
socket.send(encoded, (error) => error ? reject(error) : resolve());
|
|
189
|
+
});
|
|
140
190
|
}
|
|
141
|
-
function
|
|
142
|
-
|
|
143
|
-
return message.replace(/[\r\n]+/gu, " ").slice(0, 240);
|
|
191
|
+
function errorResponse(id, code, message) {
|
|
192
|
+
return { protocol: DEVICE_RELAY_PROTOCOL, type: "response", id, ok: false, error: { code: code.slice(0, 64), message: message.slice(0, 512) } };
|
|
144
193
|
}
|
|
194
|
+
function rawDataBuffer(data) { if (Buffer.isBuffer(data))
|
|
195
|
+
return data; if (data instanceof ArrayBuffer)
|
|
196
|
+
return Buffer.from(data); return Buffer.concat(data); }
|
|
197
|
+
function safeMessage(error) { return (error instanceof Error ? error.message : String(error)).replace(/[\r\n]+/gu, " ").slice(0, 240); }
|
|
145
198
|
async function wait(ms, signal) {
|
|
146
199
|
if (signal.aborted)
|
|
147
200
|
return;
|
|
148
201
|
await new Promise((resolve) => {
|
|
149
202
|
const timer = setTimeout(done, ms);
|
|
150
203
|
const onAbort = () => done();
|
|
151
|
-
function done() {
|
|
152
|
-
clearTimeout(timer);
|
|
153
|
-
signal.removeEventListener("abort", onAbort);
|
|
154
|
-
resolve();
|
|
155
|
-
}
|
|
204
|
+
function done() { clearTimeout(timer); signal.removeEventListener("abort", onAbort); resolve(); }
|
|
156
205
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
157
206
|
});
|
|
158
207
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../../src/device/relay-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAA2B,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EACL,iCAAiC,EACjC,4BAA4B,EAC5B,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,
|
|
1
|
+
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../../src/device/relay-client.ts"],"names":[],"mappings":"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"}
|
package/dist/diagnostics.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { inspectAuth, probeCredentialStore, whoami } from "./auth.js";
|
|
2
2
|
import { currentDevice } from "./device/control.js";
|
|
3
3
|
import { serviceStatus } from "./service.js";
|
|
4
|
+
import { VERSION } from "./version.js";
|
|
4
5
|
export async function statusSnapshot() {
|
|
5
6
|
const auth = await inspectAuth();
|
|
6
7
|
let device = null;
|
|
@@ -8,7 +9,7 @@ export async function statusSnapshot() {
|
|
|
8
9
|
device = await currentDevice().catch(() => null);
|
|
9
10
|
const service = await serviceStatus().catch(() => ({ installed: false, active: false, platform: process.platform }));
|
|
10
11
|
return {
|
|
11
|
-
version:
|
|
12
|
+
version: VERSION,
|
|
12
13
|
node: process.version,
|
|
13
14
|
platform: process.platform,
|
|
14
15
|
auth,
|
package/dist/diagnostics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { stdin, stdout } from "node:process";
|
|
4
|
-
import {
|
|
4
|
+
import { loginDevice, logout, requireLogin, whoami } from "./auth.js";
|
|
5
5
|
import { doctor, statusSnapshot } from "./diagnostics.js";
|
|
6
6
|
import { currentDevice, ensureDevice, revokeDevice } from "./device/control.js";
|
|
7
|
+
import { createLocalProviderToken, loadOrCreateDeviceIdentity } from "./device/identity.js";
|
|
7
8
|
import { serveDeviceRelay } from "./device/relay-client.js";
|
|
8
9
|
import { startStdioMcp } from "./runtime/mcp.js";
|
|
9
|
-
import { installMcpService, serviceStatus, startMcpService, stopMcpService, uninstallMcpService } from "./service.js";
|
|
10
|
-
|
|
10
|
+
import { installDeviceRelayService, installMcpService, serviceStatus, startMcpService, stopMcpService, uninstallMcpService } from "./service.js";
|
|
11
|
+
import { discoverLocalModels } from "./provider/local.js";
|
|
12
|
+
import { finalizeLocalProvider, listPersonalProviderSlots, prepareLocalProvider, waitForLocalProviderRelay } from "./provider/control.js";
|
|
13
|
+
import { getLocalProvider, isSupportedLocalModelName, listLocalProviders, normalizeLoopbackOpenAiBaseUrl, saveLocalProvider } from "./provider/state.js";
|
|
14
|
+
import { VERSION } from "./version.js";
|
|
11
15
|
async function main() {
|
|
12
16
|
const args = process.argv.slice(2);
|
|
13
17
|
const command = args[0];
|
|
@@ -21,9 +25,11 @@ async function main() {
|
|
|
21
25
|
if (!stdin.isTTY || !stdout.isTTY)
|
|
22
26
|
throw new Error("`frely login` requires an interactive TTY.");
|
|
23
27
|
const relay = option(args, "--relay");
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
const result = await loginDevice(relay, ({ verificationUri, userCode }) => {
|
|
29
|
+
stdout.write(`Open this URL to authorize Frely CLI:\n${verificationUri}\n`);
|
|
30
|
+
stdout.write(`Device code: ${userCode}\nWaiting for approval...\n`);
|
|
31
|
+
});
|
|
32
|
+
const user = result.user;
|
|
27
33
|
const service = await serviceStatus().catch(() => null);
|
|
28
34
|
if (service?.installed && !service.active)
|
|
29
35
|
await startMcpService().catch(() => undefined);
|
|
@@ -65,6 +71,76 @@ async function main() {
|
|
|
65
71
|
process.exitCode = 1;
|
|
66
72
|
return;
|
|
67
73
|
}
|
|
74
|
+
if (command === "provider" && args[1] === "share") {
|
|
75
|
+
const driver = args[2] ?? "ollama";
|
|
76
|
+
if (driver !== "ollama" && driver !== "openai-compatible")
|
|
77
|
+
throw new Error("Provider driver must be `ollama` or `openai-compatible`.");
|
|
78
|
+
const auth = await requireLogin();
|
|
79
|
+
const device = await ensureDevice();
|
|
80
|
+
const defaultUrl = driver === "ollama" ? "http://127.0.0.1:11434/v1" : "http://127.0.0.1:8080/v1";
|
|
81
|
+
const baseUrl = normalizeLoopbackOpenAiBaseUrl(option(args, "--url") ?? defaultUrl);
|
|
82
|
+
const selectedModels = option(args, "--models")?.split(",").map((value) => value.trim()).filter(Boolean);
|
|
83
|
+
const models = selectedModels?.length ? [...new Set(selectedModels)] : await discoverLocalModels(baseUrl);
|
|
84
|
+
if (models.length < 1 || models.length > 256 || models.some((model) => !isSupportedLocalModelName(model)))
|
|
85
|
+
throw new Error("At least one valid model is required; model names cannot contain whitespace or `/`.");
|
|
86
|
+
const slots = await listPersonalProviderSlots();
|
|
87
|
+
const requestedSlot = option(args, "--slot");
|
|
88
|
+
const slot = requestedSlot ? slots.find((candidate) => candidate.id === requestedSlot) : slots.find((candidate) => candidate.lifecycle === "active" && candidate.provider === null);
|
|
89
|
+
if (!slot)
|
|
90
|
+
throw new Error(requestedSlot ? "The requested personal Provider slot is unavailable." : "No empty active personal Provider slot is available.");
|
|
91
|
+
if (slot.lifecycle !== "active" || slot.provider !== null)
|
|
92
|
+
throw new Error("The selected personal Provider slot is not empty and active.");
|
|
93
|
+
const name = (option(args, "--name") ?? `${driver === "ollama" ? "Ollama" : "Local"}: ${models[0]}`).slice(0, 128);
|
|
94
|
+
const prepared = await prepareLocalProvider({ deviceId: device.deviceId, slotId: slot.id, name, models });
|
|
95
|
+
await saveLocalProvider({ providerId: prepared.providerId, name, driver, baseUrl, providerBaseUrl: prepared.providerBaseUrl, models, createdAt: new Date().toISOString() });
|
|
96
|
+
const service = await installDeviceRelayService();
|
|
97
|
+
const identity = await loadOrCreateDeviceIdentity(auth.config.relayUrl, auth.user.id);
|
|
98
|
+
const token = createLocalProviderToken(identity, device.deviceId, auth.user.id, prepared.providerId);
|
|
99
|
+
try {
|
|
100
|
+
await waitForLocalProviderRelay(prepared.providerBaseUrl, token);
|
|
101
|
+
await finalizeLocalProvider({ providerId: prepared.providerId, token });
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
throw new Error(`Provider ${prepared.providerId} is prepared but not ready. Run \`frely provider finalize ${prepared.providerId}\`. ${error instanceof Error ? error.message : String(error)}`);
|
|
105
|
+
}
|
|
106
|
+
stdout.write(`Provider: ${prepared.providerId}\n`);
|
|
107
|
+
stdout.write(`Models: ${models.join(", ")}\n`);
|
|
108
|
+
stdout.write(`Device Relay: ${service.active ? "running" : "installed"}\n`);
|
|
109
|
+
stdout.write("The Provider is ready for Access Point creation in Frely.\n");
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (command === "provider" && args[1] === "finalize") {
|
|
113
|
+
const providerId = args[2] ?? "";
|
|
114
|
+
if (!/^prv_[0-9a-f]{24}$/u.test(providerId))
|
|
115
|
+
throw new Error("Usage: frely provider finalize <provider-id>");
|
|
116
|
+
const auth = await requireLogin();
|
|
117
|
+
const device = await ensureDevice();
|
|
118
|
+
const provider = await getLocalProvider(providerId);
|
|
119
|
+
if (!provider)
|
|
120
|
+
throw new Error("Local Provider is not configured on this device.");
|
|
121
|
+
const service = await installDeviceRelayService();
|
|
122
|
+
const identity = await loadOrCreateDeviceIdentity(auth.config.relayUrl, auth.user.id);
|
|
123
|
+
const token = createLocalProviderToken(identity, device.deviceId, auth.user.id, providerId);
|
|
124
|
+
await waitForLocalProviderRelay(provider.providerBaseUrl, token);
|
|
125
|
+
await finalizeLocalProvider({ providerId, token });
|
|
126
|
+
stdout.write(`Provider: ${providerId}\n`);
|
|
127
|
+
stdout.write(`Models: ${provider.models.join(", ")}\n`);
|
|
128
|
+
stdout.write(`Device Relay: ${service.active ? "running" : "installed"}\n`);
|
|
129
|
+
stdout.write("The Provider is ready for Access Point creation in Frely.\n");
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (command === "provider" && args[1] === "list") {
|
|
133
|
+
await requireLogin();
|
|
134
|
+
const providers = await listLocalProviders();
|
|
135
|
+
if (args.includes("--json"))
|
|
136
|
+
stdout.write(`${JSON.stringify({ providers }, null, 2)}\n`);
|
|
137
|
+
else if (providers.length === 0)
|
|
138
|
+
stdout.write("No local Providers are configured on this device.\n");
|
|
139
|
+
else
|
|
140
|
+
for (const provider of providers)
|
|
141
|
+
stdout.write(`${provider.providerId} ${provider.driver} ${provider.name} ${provider.models.join(", ")}\n`);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
68
144
|
if (command === "mcp" && args[1] === "setup") {
|
|
69
145
|
await requireLogin();
|
|
70
146
|
const workspace = resolve(option(args, "--workspace") || process.cwd());
|
|
@@ -114,13 +190,14 @@ async function main() {
|
|
|
114
190
|
}
|
|
115
191
|
if (command === "mcp" && args[1] === "serve") {
|
|
116
192
|
await requireLogin();
|
|
117
|
-
const
|
|
193
|
+
const providerOnly = args.includes("--provider-only");
|
|
194
|
+
const workspace = providerOnly ? undefined : resolve(option(args, "--workspace") || process.cwd());
|
|
118
195
|
const controller = new AbortController();
|
|
119
196
|
const stop = () => controller.abort();
|
|
120
197
|
process.once("SIGINT", stop);
|
|
121
198
|
process.once("SIGTERM", stop);
|
|
122
199
|
try {
|
|
123
|
-
await serveDeviceRelay({ workspace, signal: controller.signal, log: (message) => process.stderr.write(`${message}\n`) });
|
|
200
|
+
await serveDeviceRelay({ ...(workspace ? { workspace } : {}), signal: controller.signal, log: (message) => process.stderr.write(`${message}\n`) });
|
|
124
201
|
}
|
|
125
202
|
finally {
|
|
126
203
|
process.off("SIGINT", stop);
|
|
@@ -190,6 +267,9 @@ function usage() {
|
|
|
190
267
|
" frely whoami\n" +
|
|
191
268
|
" frely status [--json]\n" +
|
|
192
269
|
" frely doctor [--json]\n" +
|
|
270
|
+
" frely provider share [ollama|openai-compatible] [--url <loopback-v1-url>] [--models <a,b>] [--slot <slot-id>] [--name <name>]\n" +
|
|
271
|
+
" frely provider list [--json]\n" +
|
|
272
|
+
" frely provider finalize <provider-id>\n" +
|
|
193
273
|
" frely mcp setup [--workspace <path>]\n" +
|
|
194
274
|
" frely mcp url [--json]\n" +
|
|
195
275
|
" frely mcp status [--json]\n" +
|
|
@@ -199,58 +279,6 @@ function usage() {
|
|
|
199
279
|
" frely mcp revoke\n" +
|
|
200
280
|
" frely mcp stdio [--workspace <path>]\n");
|
|
201
281
|
}
|
|
202
|
-
async function promptLine(label) {
|
|
203
|
-
const { createInterface } = await import("node:readline/promises");
|
|
204
|
-
const rl = createInterface({ input: stdin, output: stdout });
|
|
205
|
-
try {
|
|
206
|
-
return await rl.question(label);
|
|
207
|
-
}
|
|
208
|
-
finally {
|
|
209
|
-
rl.close();
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
async function promptSecret(label) {
|
|
213
|
-
if (!stdin.isTTY || typeof stdin.setRawMode !== "function")
|
|
214
|
-
throw new Error("A TTY is required for password input.");
|
|
215
|
-
stdout.write(label);
|
|
216
|
-
stdin.setRawMode(true);
|
|
217
|
-
stdin.resume();
|
|
218
|
-
stdin.setEncoding("utf8");
|
|
219
|
-
return new Promise((resolvePromise, rejectPromise) => {
|
|
220
|
-
let value = "";
|
|
221
|
-
let settled = false;
|
|
222
|
-
const cleanup = () => {
|
|
223
|
-
if (settled)
|
|
224
|
-
return;
|
|
225
|
-
settled = true;
|
|
226
|
-
stdin.off("data", onData);
|
|
227
|
-
stdin.setRawMode(false);
|
|
228
|
-
stdin.pause();
|
|
229
|
-
stdout.write("\n");
|
|
230
|
-
};
|
|
231
|
-
const onData = (chunk) => {
|
|
232
|
-
for (const char of String(chunk)) {
|
|
233
|
-
if (char === "\u0003") {
|
|
234
|
-
cleanup();
|
|
235
|
-
rejectPromise(new Error("Login cancelled."));
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
if (char === "\r" || char === "\n") {
|
|
239
|
-
cleanup();
|
|
240
|
-
resolvePromise(value);
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
if (char === "\u007f" || char === "\b") {
|
|
244
|
-
value = value.slice(0, -1);
|
|
245
|
-
continue;
|
|
246
|
-
}
|
|
247
|
-
if (char >= " ")
|
|
248
|
-
value += char;
|
|
249
|
-
}
|
|
250
|
-
};
|
|
251
|
-
stdin.on("data", onData);
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
282
|
main().catch((error) => {
|
|
255
283
|
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
256
284
|
process.exitCode = 1;
|