frely-cli 0.23.13 → 0.23.14
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/local/approvals.js +2 -2
- package/dist/agent/local/approvals.js.map +1 -1
- package/dist/agent/local/command.js +1 -1
- package/dist/agent/local/command.js.map +1 -1
- package/dist/agent-help.d.ts +28 -40
- package/dist/agent-help.js +14 -16
- package/dist/agent-help.js.map +1 -1
- package/dist/auth.d.ts +14 -0
- package/dist/auth.js +60 -14
- package/dist/auth.js.map +1 -1
- package/dist/cloud/direct.d.ts +28 -0
- package/dist/cloud/direct.js +49 -0
- package/dist/cloud/direct.js.map +1 -0
- package/dist/cloud.d.ts +16 -6
- package/dist/cloud.js +82 -23
- package/dist/cloud.js.map +1 -1
- package/dist/controller/args.js +1 -1
- package/dist/controller/args.js.map +1 -1
- package/dist/controller/client.d.ts +30 -15
- package/dist/controller/client.js +41 -25
- package/dist/controller/client.js.map +1 -1
- package/dist/controller/commands.d.ts +1 -1
- package/dist/controller/commands.js +4 -25
- package/dist/controller/commands.js.map +1 -1
- package/dist/credential-file.js +5 -2
- package/dist/credential-file.js.map +1 -1
- package/dist/index.js +13 -12
- package/dist/index.js.map +1 -1
- package/dist/network-files.js +4 -1
- package/dist/network-files.js.map +1 -1
- package/dist/share/control.js +2 -2
- package/dist/share/control.js.map +1 -1
- package/dist/skill/access.js +2 -2
- package/dist/skill/access.js.map +1 -1
- package/dist/skill/cloud-item.js +9 -4
- package/dist/skill/cloud-item.js.map +1 -1
- package/dist/skill/entry.d.ts +12 -1
- package/dist/skill/entry.js +13 -2
- package/dist/skill/entry.js.map +1 -1
- package/dist/skill/managed.d.ts +2 -0
- package/dist/skill/managed.js +8 -1
- package/dist/skill/managed.js.map +1 -1
- package/dist/skill/registry.js +4 -1
- package/dist/skill/registry.js.map +1 -1
- package/dist/skill/remote-mcp.js +3 -3
- package/dist/skill/remote-mcp.js.map +1 -1
- package/package.json +1 -1
- package/skills/frely-cli/SKILL.md +1 -1
- package/dist/controller/dpop.d.ts +0 -24
- package/dist/controller/dpop.js +0 -26
- package/dist/controller/dpop.js.map +0 -1
- package/dist/controller/session.d.ts +0 -58
- package/dist/controller/session.js +0 -268
- package/dist/controller/session.js.map +0 -1
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
-
import { randomBytes } from "node:crypto";
|
|
3
|
-
import { homedir, hostname, platform } from "node:os";
|
|
4
|
-
import { dirname, join, resolve } from "node:path";
|
|
5
|
-
import { credentialStore } from "../credential-store.js";
|
|
6
|
-
import { createEncryptedCredentialStore } from "../credential-file.js";
|
|
7
|
-
import { openVerificationUrl, requireLogin } from "../auth.js";
|
|
8
|
-
import { ensureDevice } from "../device/control.js";
|
|
9
|
-
import { VERSION } from "../version.js";
|
|
10
|
-
import { createDpopProof, dpopKeyFromPem, generateDpopKey } from "./dpop.js";
|
|
11
|
-
export const CONTROLLER_CLIENT_ID = "frely-cli-controller";
|
|
12
|
-
const SCOPE = "mcp:invoke offline_access";
|
|
13
|
-
const SERVICE = "frely-cli-controller-v1";
|
|
14
|
-
const TIMEOUT_MS = 15_000;
|
|
15
|
-
/** The exit codes of the controller commands. */
|
|
16
|
-
export const EXIT = { ok: 0, cli: 1, tool: 2, approval: 3, auth: 4, offline: 5, limit: 6 };
|
|
17
|
-
/** A failure with the exit code the command ends with. */
|
|
18
|
-
export class ControllerError extends Error {
|
|
19
|
-
exitCode;
|
|
20
|
-
constructor(message, exitCode) {
|
|
21
|
-
super(message);
|
|
22
|
-
this.exitCode = exitCode;
|
|
23
|
-
this.name = "ControllerError";
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
/** The address of FrelyMCP, the resource the controller token is for (mirrors the server: the dedicated MCP host for Frely's own sites). */
|
|
27
|
-
export function controllerMcpUrl(relayUrl, env = process.env) {
|
|
28
|
-
if (env.FRELY_MCP_URL)
|
|
29
|
-
return new URL(env.FRELY_MCP_URL).toString();
|
|
30
|
-
const url = new URL(relayUrl);
|
|
31
|
-
if (url.hostname === "frely.cloud" || url.hostname === "app.frely.cloud")
|
|
32
|
-
return "https://mcp.frely.cloud/mcp";
|
|
33
|
-
return `${url.origin}/mcp/devices`;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Where the session lives: the OS credential store, or on a headless Linux (no Secret Service) an encrypted file whose key sits in a
|
|
37
|
-
* separate state file. The file only keeps a copied vault unreadable; the same user's processes can still read both, which is why the
|
|
38
|
-
* tokens are also bound to the DPoP key and why Claude Code is told not to read this folder.
|
|
39
|
-
*/
|
|
40
|
-
export function sessionStore(env = process.env) {
|
|
41
|
-
const config = env.XDG_CONFIG_HOME || join(homedir(), ".config");
|
|
42
|
-
const fallback = () => {
|
|
43
|
-
const keyFile = resolve(env.XDG_STATE_HOME || join(homedir(), ".local", "state"), "frely", "controller.key");
|
|
44
|
-
const key = async () => {
|
|
45
|
-
try {
|
|
46
|
-
return (await readFile(keyFile, "utf8")).trim();
|
|
47
|
-
}
|
|
48
|
-
catch { /* Created below. */ }
|
|
49
|
-
const fresh = randomBytes(32).toString("hex");
|
|
50
|
-
await mkdir(dirname(keyFile), { recursive: true, mode: 0o700 });
|
|
51
|
-
await writeFile(keyFile, fresh + "\n", { mode: 0o600, flag: "wx" }).catch(async () => undefined);
|
|
52
|
-
await chmod(keyFile, 0o600).catch(() => undefined);
|
|
53
|
-
return (await readFile(keyFile, "utf8")).trim();
|
|
54
|
-
};
|
|
55
|
-
const vault = async () => createEncryptedCredentialStore(resolve(config, "frely", "controller-vault-v1"), await key());
|
|
56
|
-
return { getPassword: async (s, a) => (await vault()).getPassword(s, a), setPassword: async (s, a, v) => (await vault()).setPassword(s, a, v), deletePassword: async (s, a) => (await vault()).deletePassword(s, a) };
|
|
57
|
-
};
|
|
58
|
-
const headless = process.platform === "linux" && env.FRELY_CREDENTIAL_KEY === undefined && (env.FRELY_CREDENTIAL_STORE ?? "auto") === "auto";
|
|
59
|
-
if (!headless)
|
|
60
|
-
return credentialStore;
|
|
61
|
-
const file = fallback();
|
|
62
|
-
// The OS store first; only a machine without one keeps the session in the encrypted file.
|
|
63
|
-
return {
|
|
64
|
-
async getPassword(service, account) { return (await file.getPassword(service, account)) ?? await credentialStore.getPassword(service, account).catch(() => null); },
|
|
65
|
-
async setPassword(service, account, password) {
|
|
66
|
-
if (await file.getPassword(service, account) === null) {
|
|
67
|
-
try {
|
|
68
|
-
await credentialStore.setPassword(service, account, password);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
catch { /* No Secret Service. */ }
|
|
72
|
-
}
|
|
73
|
-
await file.setPassword(service, account, password);
|
|
74
|
-
},
|
|
75
|
-
async deletePassword(service, account) { const removed = await file.deletePassword(service, account); return await credentialStore.deletePassword(service, account).catch(() => false) || removed; },
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
const accountOf = (relayUrl, userId) => `${new URL(relayUrl).origin}|${userId}`;
|
|
79
|
-
async function ownerOf() {
|
|
80
|
-
const account = await requireLogin().catch(() => { throw new ControllerError("Not signed in. Run frely login first.", EXIT.auth); });
|
|
81
|
-
return { relayUrl: account.config.relayUrl, userId: account.user.id };
|
|
82
|
-
}
|
|
83
|
-
export async function readSession(store = sessionStore()) {
|
|
84
|
-
const { relayUrl, userId } = await ownerOf();
|
|
85
|
-
const raw = await store.getPassword(SERVICE, accountOf(relayUrl, userId));
|
|
86
|
-
if (!raw)
|
|
87
|
-
return null;
|
|
88
|
-
const value = JSON.parse(raw);
|
|
89
|
-
if (value.version !== 1 || value.relayUrl !== relayUrl)
|
|
90
|
-
return null;
|
|
91
|
-
return value;
|
|
92
|
-
}
|
|
93
|
-
async function writeSession(session, store = sessionStore()) {
|
|
94
|
-
const { userId } = await ownerOf();
|
|
95
|
-
await store.setPassword(SERVICE, accountOf(session.relayUrl, userId), JSON.stringify(session));
|
|
96
|
-
}
|
|
97
|
-
export async function deleteSession(store = sessionStore()) {
|
|
98
|
-
const { relayUrl, userId } = await ownerOf();
|
|
99
|
-
await store.deletePassword(PENDING_SERVICE, accountOf(relayUrl, userId)).catch(() => false);
|
|
100
|
-
return store.deletePassword(SERVICE, accountOf(relayUrl, userId));
|
|
101
|
-
}
|
|
102
|
-
const formHeaders = (relayUrl, dpop) => ({ "content-type": "application/x-www-form-urlencoded", origin: relayUrl, accept: "application/json", dpop });
|
|
103
|
-
async function tokenRequest(relayUrl, key, body) {
|
|
104
|
-
const url = `${relayUrl}/api/auth/oauth2/token`;
|
|
105
|
-
return fetch(url, { method: "POST", headers: formHeaders(relayUrl, createDpopProof(key, { method: "POST", url })), body: body.toString(), redirect: "error", signal: AbortSignal.timeout(TIMEOUT_MS) });
|
|
106
|
-
}
|
|
107
|
-
function parseTokens(payload) {
|
|
108
|
-
if (typeof payload.access_token !== "string" || !payload.access_token.startsWith("fmcp_at_") || typeof payload.refresh_token !== "string" || typeof payload.expires_in !== "number") {
|
|
109
|
-
throw new ControllerError("Frely returned an invalid controller token.", EXIT.auth);
|
|
110
|
-
}
|
|
111
|
-
return { accessToken: payload.access_token, refreshToken: payload.refresh_token, expiresAt: Date.now() + payload.expires_in * 1000 };
|
|
112
|
-
}
|
|
113
|
-
/** Maps a refused token request to the exit code a script can act on. */
|
|
114
|
-
function tokenFailure(response, payload) {
|
|
115
|
-
const detail = typeof payload.error_description === "string" ? payload.error_description : typeof payload.error === "string" ? payload.error : `HTTP ${response.status}`;
|
|
116
|
-
if (response.status === 403 && payload.error === "access_denied")
|
|
117
|
-
return new ControllerError(detail, EXIT.limit);
|
|
118
|
-
return new ControllerError(detail, EXIT.auth);
|
|
119
|
-
}
|
|
120
|
-
const delay = (ms) => new Promise((done) => setTimeout(done, ms));
|
|
121
|
-
const PENDING_SERVICE = "frely-cli-controller-pending-v1";
|
|
122
|
-
async function readPending(relayUrl, store = sessionStore()) {
|
|
123
|
-
const { userId } = await ownerOf();
|
|
124
|
-
const raw = await store.getPassword(PENDING_SERVICE, accountOf(relayUrl, userId)).catch(() => null);
|
|
125
|
-
if (!raw)
|
|
126
|
-
return null;
|
|
127
|
-
try {
|
|
128
|
-
const value = JSON.parse(raw);
|
|
129
|
-
return value.version === 1 && value.relayUrl === relayUrl && value.expiresAt - 5_000 > Date.now() ? value : null;
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
async function writePending(pending, relayUrl, store = sessionStore()) {
|
|
136
|
-
const { userId } = await ownerOf();
|
|
137
|
-
if (pending)
|
|
138
|
-
await store.setPassword(PENDING_SERVICE, accountOf(relayUrl, userId), JSON.stringify(pending));
|
|
139
|
-
else
|
|
140
|
-
await store.deletePassword(PENDING_SERVICE, accountOf(relayUrl, userId)).catch(() => false);
|
|
141
|
-
}
|
|
142
|
-
/** Asks Frely for a device code, tells it which computer is asking (the approval page repeats that beside the address the request came from) and keeps the request. */
|
|
143
|
-
async function startLogin(relayUrl) {
|
|
144
|
-
const device = await ensureDevice();
|
|
145
|
-
const mcpUrl = controllerMcpUrl(relayUrl);
|
|
146
|
-
const key = generateDpopKey();
|
|
147
|
-
const codeResponse = await fetch(`${relayUrl}/api/auth/device/code`, {
|
|
148
|
-
method: "POST", headers: { "content-type": "application/x-www-form-urlencoded", origin: relayUrl, accept: "application/json" }, redirect: "error", signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
149
|
-
body: new URLSearchParams({ client_id: CONTROLLER_CLIENT_ID, scope: SCOPE, resource: mcpUrl }).toString(),
|
|
150
|
-
});
|
|
151
|
-
const code = await codeResponse.json().catch(() => ({}));
|
|
152
|
-
if (!codeResponse.ok || typeof code.device_code !== "string" || typeof code.user_code !== "string" || typeof code.verification_uri_complete !== "string") {
|
|
153
|
-
throw new ControllerError(typeof code.error_description === "string" ? code.error_description : `Frely refused the controller request (HTTP ${codeResponse.status}).`, EXIT.auth);
|
|
154
|
-
}
|
|
155
|
-
const claim = await fetch(`${relayUrl}/api/auth/device/controller`, {
|
|
156
|
-
method: "POST", headers: { "content-type": "application/json", origin: relayUrl, accept: "application/json" }, redirect: "error", signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
157
|
-
body: JSON.stringify({ action: "put", userCode: code.user_code, controller: { deviceId: device.deviceId, hostname: hostname(), platform: platform(), cliVersion: VERSION } }),
|
|
158
|
-
});
|
|
159
|
-
if (!claim.ok)
|
|
160
|
-
throw new ControllerError(`Frely would not take this computer's details (HTTP ${claim.status}). Update Frely CLI and try again.`, EXIT.auth);
|
|
161
|
-
const link = new URL(code.verification_uri_complete);
|
|
162
|
-
if (link.origin !== relayUrl)
|
|
163
|
-
throw new ControllerError("Frely returned an unexpected approval link.", EXIT.auth);
|
|
164
|
-
const pending = {
|
|
165
|
-
version: 1, relayUrl, mcpUrl, deviceId: device.deviceId, privateKeyPem: key.privateKeyPem, deviceCode: code.device_code, userCode: code.user_code, link: link.toString(),
|
|
166
|
-
expiresAt: Date.now() + (typeof code.expires_in === "number" ? code.expires_in : 900) * 1000, intervalMs: (typeof code.interval === "number" ? code.interval : 5) * 1000,
|
|
167
|
-
};
|
|
168
|
-
await writePending(pending, relayUrl);
|
|
169
|
-
return pending;
|
|
170
|
-
}
|
|
171
|
-
const approvalNotice = (pending) => `Approve this computer to control your Frely devices.\nCode: ${pending.userCode}\nOpen: ${pending.link}\n(You will be asked to type the code and confirm with a passkey or authenticator code.)\n`;
|
|
172
|
-
/**
|
|
173
|
-
* Trades the approved device code for tokens, once or until the code expires. Returns null when `wait` is false and the owner has not
|
|
174
|
-
* decided yet; an expired or denied request is forgotten and throws.
|
|
175
|
-
*/
|
|
176
|
-
async function pollLogin(pending, wait) {
|
|
177
|
-
const key = dpopKeyFromPem(pending.privateKeyPem);
|
|
178
|
-
let interval = pending.intervalMs;
|
|
179
|
-
while (Date.now() < pending.expiresAt) {
|
|
180
|
-
if (wait)
|
|
181
|
-
await delay(interval);
|
|
182
|
-
const response = await tokenRequest(pending.relayUrl, key, new URLSearchParams({
|
|
183
|
-
grant_type: "urn:ietf:params:oauth:grant-type:device_code", device_code: pending.deviceCode, client_id: CONTROLLER_CLIENT_ID, resource: pending.mcpUrl, controller_device_id: pending.deviceId,
|
|
184
|
-
}));
|
|
185
|
-
const payload = await response.json().catch(() => ({}));
|
|
186
|
-
if (response.ok) {
|
|
187
|
-
const session = { version: 1, relayUrl: pending.relayUrl, mcpUrl: pending.mcpUrl, deviceId: pending.deviceId, privateKeyPem: pending.privateKeyPem, ...parseTokens(payload) };
|
|
188
|
-
await writeSession(session);
|
|
189
|
-
await writePending(null, pending.relayUrl);
|
|
190
|
-
return session;
|
|
191
|
-
}
|
|
192
|
-
if (payload.error === "authorization_pending" || payload.error === "slow_down") {
|
|
193
|
-
if (payload.error === "slow_down")
|
|
194
|
-
interval += 5000;
|
|
195
|
-
if (!wait)
|
|
196
|
-
return null;
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
|
-
await writePending(null, pending.relayUrl);
|
|
200
|
-
if (payload.error === "expired_token")
|
|
201
|
-
throw new ControllerError("The approval request expired. Run the command again.", EXIT.auth);
|
|
202
|
-
if (payload.error === "access_denied" && response.status !== 403)
|
|
203
|
-
throw new ControllerError("The request was denied.", EXIT.auth);
|
|
204
|
-
throw tokenFailure(response, payload);
|
|
205
|
-
}
|
|
206
|
-
await writePending(null, pending.relayUrl);
|
|
207
|
-
throw new ControllerError("The approval request expired. Run the command again.", EXIT.auth);
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Signs this computer in as a controller: a device-code authorization the owner approves in a browser (with a passkey or authenticator code),
|
|
211
|
-
* which issues tokens bound to a new key kept here. Waits for the approval and takes it by itself; a request an earlier command left
|
|
212
|
-
* unapproved is continued instead of asking for a new code.
|
|
213
|
-
*/
|
|
214
|
-
export async function controllerLogin(options = {}) {
|
|
215
|
-
const notify = options.notify ?? ((text) => { process.stderr.write(text); });
|
|
216
|
-
const { relayUrl } = await ownerOf();
|
|
217
|
-
const pending = await readPending(relayUrl) ?? await startLogin(relayUrl);
|
|
218
|
-
notify(approvalNotice(pending));
|
|
219
|
-
if (options.openBrowser !== false && process.env.FRELY_NO_BROWSER !== "1")
|
|
220
|
-
openVerificationUrl(pending.link);
|
|
221
|
-
return (await pollLogin(pending, true));
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* The sign-in for a command nobody can type into (a script, an AI tool): never waits. It picks up an approval the owner has given since the last
|
|
225
|
-
* run; otherwise it shows the approval link and ends with the "approval needed" exit code, and the same command run again continues from the same request.
|
|
226
|
-
*/
|
|
227
|
-
export async function requestControllerLogin() {
|
|
228
|
-
const { relayUrl } = await ownerOf();
|
|
229
|
-
const pending = await readPending(relayUrl) ?? await startLogin(relayUrl);
|
|
230
|
-
const session = await pollLogin(pending, false);
|
|
231
|
-
if (session)
|
|
232
|
-
return session;
|
|
233
|
-
throw new ControllerError(`${approvalNotice(pending)}After approving, run the same command again. To wait for the approval instead: frely controller login\n`, EXIT.approval);
|
|
234
|
-
}
|
|
235
|
-
/** Exchanges the refresh token; a session that another process already renewed is taken from the store instead of spent twice. */
|
|
236
|
-
export async function refreshSession(session) {
|
|
237
|
-
const key = dpopKeyFromPem(session.privateKeyPem);
|
|
238
|
-
const response = await tokenRequest(session.relayUrl, key, new URLSearchParams({ grant_type: "refresh_token", refresh_token: session.refreshToken, client_id: CONTROLLER_CLIENT_ID, resource: session.mcpUrl }));
|
|
239
|
-
const payload = await response.json().catch(() => ({}));
|
|
240
|
-
if (!response.ok) {
|
|
241
|
-
const stored = await readSession().catch(() => null);
|
|
242
|
-
if (stored && stored.refreshToken !== session.refreshToken)
|
|
243
|
-
return stored;
|
|
244
|
-
if (payload.error === "invalid_grant")
|
|
245
|
-
await deleteSession().catch(() => false);
|
|
246
|
-
throw new ControllerError("This computer's controller authorization has ended. Run the command again to approve it in your browser.", EXIT.auth);
|
|
247
|
-
}
|
|
248
|
-
const next = { ...session, ...parseTokens(payload) };
|
|
249
|
-
await writeSession(next);
|
|
250
|
-
return next;
|
|
251
|
-
}
|
|
252
|
-
/** Signs the controller session out: revokes the refresh token on the server (the connection stays listed until disconnected on the web) and forgets it here. */
|
|
253
|
-
export async function controllerLogout() {
|
|
254
|
-
const session = await readSession();
|
|
255
|
-
if (!session)
|
|
256
|
-
return false;
|
|
257
|
-
const key = dpopKeyFromPem(session.privateKeyPem);
|
|
258
|
-
const url = `${session.relayUrl}/api/auth/oauth2/revoke`;
|
|
259
|
-
const response = await fetch(url, {
|
|
260
|
-
method: "POST", headers: { "content-type": "application/x-www-form-urlencoded", origin: session.relayUrl, dpop: createDpopProof(key, { method: "POST", url }) }, redirect: "error", signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
261
|
-
body: new URLSearchParams({ client_id: CONTROLLER_CLIENT_ID, token: session.refreshToken, token_type_hint: "refresh_token" }).toString(),
|
|
262
|
-
}).catch(() => null);
|
|
263
|
-
if (!response?.ok)
|
|
264
|
-
throw new ControllerError("The controller authorization could not be revoked. Try again, or disconnect this computer in My Devices on the web.", EXIT.auth);
|
|
265
|
-
await deleteSession();
|
|
266
|
-
return true;
|
|
267
|
-
}
|
|
268
|
-
//# sourceMappingURL=session.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/controller/session.ts"],"names":[],"mappings":"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"}
|