frely-cli 0.23.12 → 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.
Files changed (86) hide show
  1. package/README.md +12 -12
  2. package/README.zh-CN.md +11 -11
  3. package/dist/agent/local/approvals.js +2 -2
  4. package/dist/agent/local/approvals.js.map +1 -1
  5. package/dist/agent/local/command.js +1 -1
  6. package/dist/agent/local/command.js.map +1 -1
  7. package/dist/agent-help.d.ts +82 -94
  8. package/dist/agent-help.js +40 -42
  9. package/dist/agent-help.js.map +1 -1
  10. package/dist/auth.d.ts +14 -0
  11. package/dist/auth.js +60 -14
  12. package/dist/auth.js.map +1 -1
  13. package/dist/cloud/direct.d.ts +28 -0
  14. package/dist/cloud/direct.js +49 -0
  15. package/dist/cloud/direct.js.map +1 -0
  16. package/dist/cloud.d.ts +16 -6
  17. package/dist/cloud.js +82 -23
  18. package/dist/cloud.js.map +1 -1
  19. package/dist/controller/args.js +1 -1
  20. package/dist/controller/args.js.map +1 -1
  21. package/dist/controller/client.d.ts +30 -15
  22. package/dist/controller/client.js +42 -26
  23. package/dist/controller/client.js.map +1 -1
  24. package/dist/controller/commands.d.ts +1 -1
  25. package/dist/controller/commands.js +4 -25
  26. package/dist/controller/commands.js.map +1 -1
  27. package/dist/credential-file.js +5 -2
  28. package/dist/credential-file.js.map +1 -1
  29. package/dist/device/relay-client.js +4 -0
  30. package/dist/device/relay-client.js.map +1 -1
  31. package/dist/diagnostics.js +8 -8
  32. package/dist/diagnostics.js.map +1 -1
  33. package/dist/index.js +56 -39
  34. package/dist/index.js.map +1 -1
  35. package/dist/local-mcp-command.d.ts +1 -1
  36. package/dist/local-mcp-command.js +6 -6
  37. package/dist/local-mcp-command.js.map +1 -1
  38. package/dist/mcp-authorization.d.ts +1 -1
  39. package/dist/mcp-authorization.js +10 -10
  40. package/dist/mcp-authorization.js.map +1 -1
  41. package/dist/mcp-command.d.ts +8 -6
  42. package/dist/mcp-command.js +53 -43
  43. package/dist/mcp-command.js.map +1 -1
  44. package/dist/network-files.js +4 -1
  45. package/dist/network-files.js.map +1 -1
  46. package/dist/remote-lock.d.ts +10 -0
  47. package/dist/remote-lock.js +24 -0
  48. package/dist/remote-lock.js.map +1 -0
  49. package/dist/runtime/mcp-lease.js +1 -1
  50. package/dist/runtime/mcp-lease.js.map +1 -1
  51. package/dist/runtime/mcp.js +1 -1
  52. package/dist/runtime/mcp.js.map +1 -1
  53. package/dist/runtime/sandbox-proxy.js +2 -2
  54. package/dist/runtime/sandbox-proxy.js.map +1 -1
  55. package/dist/runtime/workspace-registry.js +1 -1
  56. package/dist/runtime/workspace-registry.js.map +1 -1
  57. package/dist/share/control.js +2 -2
  58. package/dist/share/control.js.map +1 -1
  59. package/dist/skill/access.js +5 -5
  60. package/dist/skill/access.js.map +1 -1
  61. package/dist/skill/cloud-item.js +9 -4
  62. package/dist/skill/cloud-item.js.map +1 -1
  63. package/dist/skill/entry.d.ts +12 -1
  64. package/dist/skill/entry.js +14 -3
  65. package/dist/skill/entry.js.map +1 -1
  66. package/dist/skill/managed.d.ts +2 -0
  67. package/dist/skill/managed.js +8 -1
  68. package/dist/skill/managed.js.map +1 -1
  69. package/dist/skill/registry.js +4 -1
  70. package/dist/skill/registry.js.map +1 -1
  71. package/dist/skill/remote-mcp.js +3 -3
  72. package/dist/skill/remote-mcp.js.map +1 -1
  73. package/dist/update/auto-update.d.ts +1 -1
  74. package/dist/update/auto-update.js +1 -1
  75. package/dist/update/auto-update.js.map +1 -1
  76. package/dist/workspace-command.d.ts +1 -1
  77. package/dist/workspace-command.js +3 -3
  78. package/dist/workspace-command.js.map +1 -1
  79. package/package.json +1 -1
  80. package/skills/frely-cli/SKILL.md +1 -1
  81. package/dist/controller/dpop.d.ts +0 -24
  82. package/dist/controller/dpop.js +0 -26
  83. package/dist/controller/dpop.js.map +0 -1
  84. package/dist/controller/session.d.ts +0 -58
  85. package/dist/controller/session.js +0 -268
  86. package/dist/controller/session.js.map +0 -1
@@ -35,71 +35,71 @@ export declare const COMMANDS: readonly [{
35
35
  readonly effect: "read";
36
36
  readonly purpose: "Read this installed CLI's current Agent instructions.";
37
37
  }, {
38
- readonly id: "mcp.start";
39
- readonly usage: "frely mcp start [--workspace <path>] [--days 1..365] [--no-browser] [--json]";
38
+ readonly id: "link.on";
39
+ readonly usage: "frely link on [--workspace <path>] [--days 1..365] [--no-browser] [--json]";
40
40
  readonly auth: "account-and-browser-if-needed";
41
41
  readonly effect: "authorization-if-needed";
42
- readonly purpose: "Enable, renew, start and read device MCP. Without a stored login it first signs in through the browser (the page also registers new accounts; --no-browser only prints the sign-in URL and device code, which can be approved on any device signed in to Frely); that one approval also enables device MCP, so no second approval link is needed. Unconfigured: request browser approval for --workspace (default: the home directory), install and start the background service. Expired or --days given: renew with browser approval; the MCP URL stays the same. Otherwise start the service if it is not running. With FRELY_INSTALL_TOKEN (the one-time install command from list_devices or the Frely console), it signs in to that account (replacing any stored login) and preapproves device MCP with no browser or prompt. Prompts go to stderr; stdout holds only the URL, or JSON with HTTP transport and OAuth details. `frely mcp url` is a deprecated alias.";
42
+ readonly purpose: "Enable, renew, start and read device MCP. Without a stored login it first signs in through the browser (the page also registers new accounts; --no-browser only prints the sign-in URL and device code, which can be approved on any device signed in to Frely); that one approval also enables device MCP, so no second approval link is needed. Unconfigured: request browser approval for --workspace (default: the home directory), install and start the background service. Expired or --days given: renew with browser approval; the MCP URL stays the same. Otherwise start the service if it is not running. With FRELY_INSTALL_TOKEN (the one-time install command from list_devices or the Frely console), it signs in to that account (replacing any stored login) and preapproves device MCP with no browser or prompt. Prompts go to stderr; stdout holds only the URL, or JSON with HTTP transport and OAuth details.";
43
43
  }, {
44
- readonly id: "mcp.workspace.list";
45
- readonly usage: "frely mcp workspace list [--json]";
44
+ readonly id: "link.workspace.list";
45
+ readonly usage: "frely link workspace list [--json]";
46
46
  readonly auth: "mcp";
47
47
  readonly effect: "read";
48
48
  readonly purpose: "List workspace directories for this device; the primary is marked.";
49
49
  }, {
50
- readonly id: "mcp.workspace.add";
51
- readonly usage: "frely mcp workspace add [path]";
50
+ readonly id: "link.workspace.add";
51
+ readonly usage: "frely link workspace add [path]";
52
52
  readonly auth: "mcp";
53
53
  readonly effect: "local-write";
54
54
  readonly purpose: "Add an additional workspace directory for this device (default: current directory); takes effect on the running service without restart.";
55
55
  }, {
56
- readonly id: "mcp.workspace.remove";
57
- readonly usage: "frely mcp workspace remove <path>";
56
+ readonly id: "link.workspace.remove";
57
+ readonly usage: "frely link workspace remove <path>";
58
58
  readonly auth: "mcp";
59
59
  readonly effect: "local-write";
60
60
  readonly purpose: "Remove an additional workspace directory (the primary cannot be removed).";
61
61
  }, {
62
- readonly id: "mcp.local.list";
63
- readonly usage: "frely mcp local list [--json]";
62
+ readonly id: "link.local.list";
63
+ readonly usage: "frely link local list [--json]";
64
64
  readonly auth: "none";
65
65
  readonly effect: "read";
66
66
  readonly purpose: "List MCP servers on this device that remote clients could use: loopback HTTP servers found automatically plus ones added by hand. Every server is off for remote clients until the owner turns it on in the web console.";
67
67
  }, {
68
- readonly id: "mcp.local.add";
69
- readonly usage: "frely mcp local add <name> --url <http://127.0.0.1:port/path> [--header K=V] | frely mcp local add <name> [--env K=V] -- <command> [args...]";
68
+ readonly id: "link.local.add";
69
+ readonly usage: "frely link local add <name> --url <http://127.0.0.1:port/path> [--header K=V] | frely link local add <name> [--env K=V] -- <command> [args...]";
70
70
  readonly auth: "none";
71
71
  readonly effect: "local-write";
72
72
  readonly purpose: "Add a local MCP server by loopback URL or by the command that starts it (stdio). It is connected once to check it works; it stays off for remote clients until the owner turns it on in the web console.";
73
73
  }, {
74
- readonly id: "mcp.local.remove";
75
- readonly usage: "frely mcp local remove <name>";
74
+ readonly id: "link.local.remove";
75
+ readonly usage: "frely link local remove <name>";
76
76
  readonly auth: "none";
77
77
  readonly effect: "local-write";
78
78
  readonly purpose: "Remove a manually added local MCP server.";
79
79
  }, {
80
- readonly id: "mcp.status";
81
- readonly usage: "frely mcp status [--json]";
80
+ readonly id: "link.status";
81
+ readonly usage: "frely link status [--json]";
82
82
  readonly auth: "none";
83
83
  readonly effect: "read";
84
- readonly purpose: "Show whether device MCP is configured, its URL, workspace, authorization expiry and background service state. Makes no network request.";
84
+ readonly purpose: "Show the remote-control state (not enabled by default / on / off and locked here), its URL, workspace, authorization expiry and background service state. Makes no network request.";
85
85
  }, {
86
- readonly id: "mcp.stop";
87
- readonly usage: "frely mcp stop";
86
+ readonly id: "link.stop";
87
+ readonly usage: "frely link stop";
88
88
  readonly auth: "none";
89
89
  readonly effect: "local-service";
90
- readonly purpose: "Stop the local MCP background service without revoking authorization; frely mcp start resumes it. Supported updates restore running services without this command.";
90
+ readonly purpose: "Stop the local MCP background service without revoking authorization; frely link on resumes it. Supported updates restore running services without this command.";
91
91
  }, {
92
- readonly id: "mcp.auto-update";
93
- readonly usage: "frely mcp auto-update [on|off]";
92
+ readonly id: "link.auto-update";
93
+ readonly usage: "frely link auto-update [on|off]";
94
94
  readonly auth: "none";
95
95
  readonly effect: "local-write";
96
96
  readonly purpose: "Show or set whether this device's background service installs new stable versions of its own installation while idle and restarts itself. Off by default; macOS and Linux only.";
97
97
  }, {
98
- readonly id: "mcp.remove";
99
- readonly usage: "frely mcp remove";
98
+ readonly id: "link.off";
99
+ readonly usage: "frely link off";
100
100
  readonly auth: "account";
101
101
  readonly effect: "remote-write";
102
- readonly purpose: "Revoke device MCP for every connected client and uninstall the background service (kept running provider-only when local Providers exist).";
102
+ readonly purpose: "Turn remote control off and lock it on this computer: revoke the authorization for every connected client, uninstall the background service (kept running provider-only when local Providers exist) and write a local lock. The web page cannot turn it on again; only frely link on here can.";
103
103
  }, {
104
104
  readonly id: "mcp.stdio";
105
105
  readonly usage: "frely mcp stdio [--workspace <path>]";
@@ -289,87 +289,81 @@ export declare const COMMANDS: readonly [{
289
289
  }, {
290
290
  readonly id: "devices";
291
291
  readonly usage: "frely devices [--add] [--json]";
292
- readonly auth: "controller";
292
+ readonly auth: "login";
293
293
  readonly effect: "read";
294
294
  readonly purpose: "List your Frely devices with online state and workspaces (list_devices). --add prints a one-time install command for a new computer.";
295
295
  }, {
296
296
  readonly id: "run";
297
297
  readonly usage: "frely run <device> [--cwd <dir>] [--timeout <s>] [--background] -- <command> [--json] [--out <file>]";
298
- readonly auth: "controller";
298
+ readonly auth: "login";
299
299
  readonly effect: "remote-execution";
300
300
  readonly purpose: "Run a shell command on a device inside its sandbox and print its output; --background returns a process id. The command's own failure is exit code 2.";
301
301
  }, {
302
302
  readonly id: "ps";
303
303
  readonly usage: "frely ps <device>";
304
- readonly auth: "controller";
304
+ readonly auth: "login";
305
305
  readonly effect: "read";
306
306
  readonly purpose: "List background commands on a device.";
307
307
  }, {
308
308
  readonly id: "logs";
309
309
  readonly usage: "frely logs <device> <id> [--follow]";
310
- readonly auth: "controller";
310
+ readonly auth: "login";
311
311
  readonly effect: "read";
312
312
  readonly purpose: "Output of a background command; --follow shows it live until it ends.";
313
313
  }, {
314
314
  readonly id: "kill";
315
315
  readonly usage: "frely kill <device> <id>";
316
- readonly auth: "controller";
316
+ readonly auth: "login";
317
317
  readonly effect: "remote-execution";
318
318
  readonly purpose: "Stop a background command on a device.";
319
319
  }, {
320
320
  readonly id: "read";
321
321
  readonly usage: "frely read <device>:<path> [--lines a:b] [--json] [--out <file>]";
322
- readonly auth: "controller";
322
+ readonly auth: "login";
323
323
  readonly effect: "read";
324
324
  readonly purpose: "Print a file on a device (UTF-8, up to 1 MiB). A Windows drive path such as C:\\x is this computer, not a device.";
325
325
  }, {
326
326
  readonly id: "ls";
327
327
  readonly usage: "frely ls [<device>[:<path>]] [--json]";
328
- readonly auth: "controller";
328
+ readonly auth: "login";
329
329
  readonly effect: "read";
330
330
  readonly purpose: "List a folder on a device; with only a device, its workspace roots.";
331
331
  }, {
332
332
  readonly id: "grep";
333
333
  readonly usage: "frely grep <device>:<path> <text> [--regex] [--case] [--max <n>]";
334
- readonly auth: "controller";
334
+ readonly auth: "login";
335
335
  readonly effect: "read";
336
336
  readonly purpose: "Search file contents on a device.";
337
337
  }, {
338
338
  readonly id: "edit";
339
339
  readonly usage: "frely edit <device>:<path> (--from <local file> | --patch <json file>) [--overwrite]";
340
- readonly auth: "controller";
340
+ readonly auth: "login";
341
341
  readonly effect: "remote-write";
342
342
  readonly purpose: "Write a device file from a local file, or apply line-range edits from a JSON file.";
343
343
  }, {
344
344
  readonly id: "permission";
345
345
  readonly usage: "frely permission request <device> --resource <name> --reason <text> --command <text> | confirm <code> [A|B|C] | wait <short code> [--then '<command>']";
346
- readonly auth: "controller";
346
+ readonly auth: "login";
347
347
  readonly effect: "authorization";
348
348
  readonly purpose: "Ask the owner to open what the device sandbox blocks. Exit code 3 prints the approval link and the wait command: show the link to the user, then run `frely permission wait <short code> --then '<original command>'` in the background so the original command runs once they approve.";
349
349
  }, {
350
350
  readonly id: "tools";
351
351
  readonly usage: "frely tools [--json]";
352
- readonly auth: "controller";
352
+ readonly auth: "login";
353
353
  readonly effect: "read";
354
354
  readonly purpose: "Print FrelyMCP's own instructions and every tool it offers.";
355
355
  }, {
356
356
  readonly id: "call";
357
357
  readonly usage: "frely call <tool> [--json '<object>' | --input <file>] [--out <file>]";
358
- readonly auth: "controller";
358
+ readonly auth: "login";
359
359
  readonly effect: "subcommand-dependent";
360
360
  readonly purpose: "Call any FrelyMCP tool by name (browser, models, web_fetch, local_mcp_call, store, ...).";
361
- }, {
362
- readonly id: "controller";
363
- readonly usage: "frely controller login|logout|status";
364
- readonly auth: "browser";
365
- readonly effect: "authorization-if-needed";
366
- readonly purpose: "Authorize this computer to control your devices: shows a short code, you open the link, type the code and confirm with a passkey or authenticator code. The first controller command does this by itself in a terminal.";
367
361
  }, {
368
362
  readonly id: "api";
369
363
  readonly usage: "frely api list|describe|call [--wait] [--help]";
370
- readonly auth: "controller";
364
+ readonly auth: "login";
371
365
  readonly effect: "subcommand-dependent";
372
- readonly purpose: "Discover and call your Frely account's business operations (the same tools FrelyMCP offers through frely_list/frely_call). Runs on this computer's controller authorization; the first call requests browser approval (frely controller login). `list` is grouped and compact (add --json for the full tool list); use describe before call; parameters and results are JSON; --input reads a file up to 512 KiB. When a call needs the owner's approval the error links to it; run the call with --wait (in the foreground, tool timeout of at least 10 minutes) to show the user the link first and then block until they approve on their phone or the web, so the call finishes by itself and you need not be told. Never background or kill it.";
366
+ readonly purpose: "Discover and call your Frely account's business operations (the same tools FrelyMCP offers through frely_list/frely_call). Read-only discovery runs on the account's own login; the first write call asks you to approve this computer in a browser. `list` is grouped and compact (add --json for the full tool list); use describe before call; parameters and results are JSON; --input reads a file up to 512 KiB. When a call needs the owner's approval the error links to it; run the call with --wait (in the foreground, tool timeout of at least 10 minutes) to show the user the link first and then block until they approve on their phone or the web, so the call finishes by itself and you need not be told. Never background or kill it.";
373
367
  }, {
374
368
  readonly id: "app.install";
375
369
  readonly usage: "frely app install [--force] [--json]";
@@ -480,71 +474,71 @@ export declare function agentHelp(): {
480
474
  readonly effect: "read";
481
475
  readonly purpose: "Read this installed CLI's current Agent instructions.";
482
476
  }, {
483
- readonly id: "mcp.start";
484
- readonly usage: "frely mcp start [--workspace <path>] [--days 1..365] [--no-browser] [--json]";
477
+ readonly id: "link.on";
478
+ readonly usage: "frely link on [--workspace <path>] [--days 1..365] [--no-browser] [--json]";
485
479
  readonly auth: "account-and-browser-if-needed";
486
480
  readonly effect: "authorization-if-needed";
487
- readonly purpose: "Enable, renew, start and read device MCP. Without a stored login it first signs in through the browser (the page also registers new accounts; --no-browser only prints the sign-in URL and device code, which can be approved on any device signed in to Frely); that one approval also enables device MCP, so no second approval link is needed. Unconfigured: request browser approval for --workspace (default: the home directory), install and start the background service. Expired or --days given: renew with browser approval; the MCP URL stays the same. Otherwise start the service if it is not running. With FRELY_INSTALL_TOKEN (the one-time install command from list_devices or the Frely console), it signs in to that account (replacing any stored login) and preapproves device MCP with no browser or prompt. Prompts go to stderr; stdout holds only the URL, or JSON with HTTP transport and OAuth details. `frely mcp url` is a deprecated alias.";
481
+ readonly purpose: "Enable, renew, start and read device MCP. Without a stored login it first signs in through the browser (the page also registers new accounts; --no-browser only prints the sign-in URL and device code, which can be approved on any device signed in to Frely); that one approval also enables device MCP, so no second approval link is needed. Unconfigured: request browser approval for --workspace (default: the home directory), install and start the background service. Expired or --days given: renew with browser approval; the MCP URL stays the same. Otherwise start the service if it is not running. With FRELY_INSTALL_TOKEN (the one-time install command from list_devices or the Frely console), it signs in to that account (replacing any stored login) and preapproves device MCP with no browser or prompt. Prompts go to stderr; stdout holds only the URL, or JSON with HTTP transport and OAuth details.";
488
482
  }, {
489
- readonly id: "mcp.workspace.list";
490
- readonly usage: "frely mcp workspace list [--json]";
483
+ readonly id: "link.workspace.list";
484
+ readonly usage: "frely link workspace list [--json]";
491
485
  readonly auth: "mcp";
492
486
  readonly effect: "read";
493
487
  readonly purpose: "List workspace directories for this device; the primary is marked.";
494
488
  }, {
495
- readonly id: "mcp.workspace.add";
496
- readonly usage: "frely mcp workspace add [path]";
489
+ readonly id: "link.workspace.add";
490
+ readonly usage: "frely link workspace add [path]";
497
491
  readonly auth: "mcp";
498
492
  readonly effect: "local-write";
499
493
  readonly purpose: "Add an additional workspace directory for this device (default: current directory); takes effect on the running service without restart.";
500
494
  }, {
501
- readonly id: "mcp.workspace.remove";
502
- readonly usage: "frely mcp workspace remove <path>";
495
+ readonly id: "link.workspace.remove";
496
+ readonly usage: "frely link workspace remove <path>";
503
497
  readonly auth: "mcp";
504
498
  readonly effect: "local-write";
505
499
  readonly purpose: "Remove an additional workspace directory (the primary cannot be removed).";
506
500
  }, {
507
- readonly id: "mcp.local.list";
508
- readonly usage: "frely mcp local list [--json]";
501
+ readonly id: "link.local.list";
502
+ readonly usage: "frely link local list [--json]";
509
503
  readonly auth: "none";
510
504
  readonly effect: "read";
511
505
  readonly purpose: "List MCP servers on this device that remote clients could use: loopback HTTP servers found automatically plus ones added by hand. Every server is off for remote clients until the owner turns it on in the web console.";
512
506
  }, {
513
- readonly id: "mcp.local.add";
514
- readonly usage: "frely mcp local add <name> --url <http://127.0.0.1:port/path> [--header K=V] | frely mcp local add <name> [--env K=V] -- <command> [args...]";
507
+ readonly id: "link.local.add";
508
+ readonly usage: "frely link local add <name> --url <http://127.0.0.1:port/path> [--header K=V] | frely link local add <name> [--env K=V] -- <command> [args...]";
515
509
  readonly auth: "none";
516
510
  readonly effect: "local-write";
517
511
  readonly purpose: "Add a local MCP server by loopback URL or by the command that starts it (stdio). It is connected once to check it works; it stays off for remote clients until the owner turns it on in the web console.";
518
512
  }, {
519
- readonly id: "mcp.local.remove";
520
- readonly usage: "frely mcp local remove <name>";
513
+ readonly id: "link.local.remove";
514
+ readonly usage: "frely link local remove <name>";
521
515
  readonly auth: "none";
522
516
  readonly effect: "local-write";
523
517
  readonly purpose: "Remove a manually added local MCP server.";
524
518
  }, {
525
- readonly id: "mcp.status";
526
- readonly usage: "frely mcp status [--json]";
519
+ readonly id: "link.status";
520
+ readonly usage: "frely link status [--json]";
527
521
  readonly auth: "none";
528
522
  readonly effect: "read";
529
- readonly purpose: "Show whether device MCP is configured, its URL, workspace, authorization expiry and background service state. Makes no network request.";
523
+ readonly purpose: "Show the remote-control state (not enabled by default / on / off and locked here), its URL, workspace, authorization expiry and background service state. Makes no network request.";
530
524
  }, {
531
- readonly id: "mcp.stop";
532
- readonly usage: "frely mcp stop";
525
+ readonly id: "link.stop";
526
+ readonly usage: "frely link stop";
533
527
  readonly auth: "none";
534
528
  readonly effect: "local-service";
535
- readonly purpose: "Stop the local MCP background service without revoking authorization; frely mcp start resumes it. Supported updates restore running services without this command.";
529
+ readonly purpose: "Stop the local MCP background service without revoking authorization; frely link on resumes it. Supported updates restore running services without this command.";
536
530
  }, {
537
- readonly id: "mcp.auto-update";
538
- readonly usage: "frely mcp auto-update [on|off]";
531
+ readonly id: "link.auto-update";
532
+ readonly usage: "frely link auto-update [on|off]";
539
533
  readonly auth: "none";
540
534
  readonly effect: "local-write";
541
535
  readonly purpose: "Show or set whether this device's background service installs new stable versions of its own installation while idle and restarts itself. Off by default; macOS and Linux only.";
542
536
  }, {
543
- readonly id: "mcp.remove";
544
- readonly usage: "frely mcp remove";
537
+ readonly id: "link.off";
538
+ readonly usage: "frely link off";
545
539
  readonly auth: "account";
546
540
  readonly effect: "remote-write";
547
- readonly purpose: "Revoke device MCP for every connected client and uninstall the background service (kept running provider-only when local Providers exist).";
541
+ readonly purpose: "Turn remote control off and lock it on this computer: revoke the authorization for every connected client, uninstall the background service (kept running provider-only when local Providers exist) and write a local lock. The web page cannot turn it on again; only frely link on here can.";
548
542
  }, {
549
543
  readonly id: "mcp.stdio";
550
544
  readonly usage: "frely mcp stdio [--workspace <path>]";
@@ -734,87 +728,81 @@ export declare function agentHelp(): {
734
728
  }, {
735
729
  readonly id: "devices";
736
730
  readonly usage: "frely devices [--add] [--json]";
737
- readonly auth: "controller";
731
+ readonly auth: "login";
738
732
  readonly effect: "read";
739
733
  readonly purpose: "List your Frely devices with online state and workspaces (list_devices). --add prints a one-time install command for a new computer.";
740
734
  }, {
741
735
  readonly id: "run";
742
736
  readonly usage: "frely run <device> [--cwd <dir>] [--timeout <s>] [--background] -- <command> [--json] [--out <file>]";
743
- readonly auth: "controller";
737
+ readonly auth: "login";
744
738
  readonly effect: "remote-execution";
745
739
  readonly purpose: "Run a shell command on a device inside its sandbox and print its output; --background returns a process id. The command's own failure is exit code 2.";
746
740
  }, {
747
741
  readonly id: "ps";
748
742
  readonly usage: "frely ps <device>";
749
- readonly auth: "controller";
743
+ readonly auth: "login";
750
744
  readonly effect: "read";
751
745
  readonly purpose: "List background commands on a device.";
752
746
  }, {
753
747
  readonly id: "logs";
754
748
  readonly usage: "frely logs <device> <id> [--follow]";
755
- readonly auth: "controller";
749
+ readonly auth: "login";
756
750
  readonly effect: "read";
757
751
  readonly purpose: "Output of a background command; --follow shows it live until it ends.";
758
752
  }, {
759
753
  readonly id: "kill";
760
754
  readonly usage: "frely kill <device> <id>";
761
- readonly auth: "controller";
755
+ readonly auth: "login";
762
756
  readonly effect: "remote-execution";
763
757
  readonly purpose: "Stop a background command on a device.";
764
758
  }, {
765
759
  readonly id: "read";
766
760
  readonly usage: "frely read <device>:<path> [--lines a:b] [--json] [--out <file>]";
767
- readonly auth: "controller";
761
+ readonly auth: "login";
768
762
  readonly effect: "read";
769
763
  readonly purpose: "Print a file on a device (UTF-8, up to 1 MiB). A Windows drive path such as C:\\x is this computer, not a device.";
770
764
  }, {
771
765
  readonly id: "ls";
772
766
  readonly usage: "frely ls [<device>[:<path>]] [--json]";
773
- readonly auth: "controller";
767
+ readonly auth: "login";
774
768
  readonly effect: "read";
775
769
  readonly purpose: "List a folder on a device; with only a device, its workspace roots.";
776
770
  }, {
777
771
  readonly id: "grep";
778
772
  readonly usage: "frely grep <device>:<path> <text> [--regex] [--case] [--max <n>]";
779
- readonly auth: "controller";
773
+ readonly auth: "login";
780
774
  readonly effect: "read";
781
775
  readonly purpose: "Search file contents on a device.";
782
776
  }, {
783
777
  readonly id: "edit";
784
778
  readonly usage: "frely edit <device>:<path> (--from <local file> | --patch <json file>) [--overwrite]";
785
- readonly auth: "controller";
779
+ readonly auth: "login";
786
780
  readonly effect: "remote-write";
787
781
  readonly purpose: "Write a device file from a local file, or apply line-range edits from a JSON file.";
788
782
  }, {
789
783
  readonly id: "permission";
790
784
  readonly usage: "frely permission request <device> --resource <name> --reason <text> --command <text> | confirm <code> [A|B|C] | wait <short code> [--then '<command>']";
791
- readonly auth: "controller";
785
+ readonly auth: "login";
792
786
  readonly effect: "authorization";
793
787
  readonly purpose: "Ask the owner to open what the device sandbox blocks. Exit code 3 prints the approval link and the wait command: show the link to the user, then run `frely permission wait <short code> --then '<original command>'` in the background so the original command runs once they approve.";
794
788
  }, {
795
789
  readonly id: "tools";
796
790
  readonly usage: "frely tools [--json]";
797
- readonly auth: "controller";
791
+ readonly auth: "login";
798
792
  readonly effect: "read";
799
793
  readonly purpose: "Print FrelyMCP's own instructions and every tool it offers.";
800
794
  }, {
801
795
  readonly id: "call";
802
796
  readonly usage: "frely call <tool> [--json '<object>' | --input <file>] [--out <file>]";
803
- readonly auth: "controller";
797
+ readonly auth: "login";
804
798
  readonly effect: "subcommand-dependent";
805
799
  readonly purpose: "Call any FrelyMCP tool by name (browser, models, web_fetch, local_mcp_call, store, ...).";
806
- }, {
807
- readonly id: "controller";
808
- readonly usage: "frely controller login|logout|status";
809
- readonly auth: "browser";
810
- readonly effect: "authorization-if-needed";
811
- readonly purpose: "Authorize this computer to control your devices: shows a short code, you open the link, type the code and confirm with a passkey or authenticator code. The first controller command does this by itself in a terminal.";
812
800
  }, {
813
801
  readonly id: "api";
814
802
  readonly usage: "frely api list|describe|call [--wait] [--help]";
815
- readonly auth: "controller";
803
+ readonly auth: "login";
816
804
  readonly effect: "subcommand-dependent";
817
- readonly purpose: "Discover and call your Frely account's business operations (the same tools FrelyMCP offers through frely_list/frely_call). Runs on this computer's controller authorization; the first call requests browser approval (frely controller login). `list` is grouped and compact (add --json for the full tool list); use describe before call; parameters and results are JSON; --input reads a file up to 512 KiB. When a call needs the owner's approval the error links to it; run the call with --wait (in the foreground, tool timeout of at least 10 minutes) to show the user the link first and then block until they approve on their phone or the web, so the call finishes by itself and you need not be told. Never background or kill it.";
805
+ readonly purpose: "Discover and call your Frely account's business operations (the same tools FrelyMCP offers through frely_list/frely_call). Read-only discovery runs on the account's own login; the first write call asks you to approve this computer in a browser. `list` is grouped and compact (add --json for the full tool list); use describe before call; parameters and results are JSON; --input reads a file up to 512 KiB. When a call needs the owner's approval the error links to it; run the call with --wait (in the foreground, tool timeout of at least 10 minutes) to show the user the link first and then block until they approve on their phone or the web, so the call finishes by itself and you need not be told. Never background or kill it.";
818
806
  }, {
819
807
  readonly id: "app.install";
820
808
  readonly usage: "frely app install [--force] [--json]";
@@ -885,8 +873,8 @@ export declare function agentHelp(): {
885
873
  };
886
874
  export declare function cliUsage(): string;
887
875
  /**
888
- * A command group without a direct action (`frely mcp workspace`, `frely agent`,
876
+ * A command group without a direct action (`frely link workspace`, `frely agent`,
889
877
  * ...) prints the subcommands under it instead of running one.
890
878
  */
891
879
  export declare function subcommandUsage(group: string): string;
892
- export declare function mcpUsage(): string;
880
+ export declare function linkUsage(): string;
@@ -6,17 +6,17 @@ export const COMMANDS = [
6
6
  { id: "doctor", usage: "frely doctor [-v] [--json]", auth: "optional-account", effect: "diagnostic", purpose: "Show the signed-in account, installation, available updates, MCP and connection status; -v verifies the account online and runs detailed diagnostics." },
7
7
  { id: "update", usage: "frely update", auth: "none", effect: "local-write", purpose: "Update the current installation to the latest stable release. Windows prints a manual command; doctor checks versions." },
8
8
  { id: "help", usage: "frely help --agent --json", auth: "none", effect: "read", purpose: "Read this installed CLI's current Agent instructions." },
9
- { id: "mcp.start", usage: "frely mcp start [--workspace <path>] [--days 1..365] [--no-browser] [--json]", auth: "account-and-browser-if-needed", effect: "authorization-if-needed", purpose: "Enable, renew, start and read device MCP. Without a stored login it first signs in through the browser (the page also registers new accounts; --no-browser only prints the sign-in URL and device code, which can be approved on any device signed in to Frely); that one approval also enables device MCP, so no second approval link is needed. Unconfigured: request browser approval for --workspace (default: the home directory), install and start the background service. Expired or --days given: renew with browser approval; the MCP URL stays the same. Otherwise start the service if it is not running. With FRELY_INSTALL_TOKEN (the one-time install command from list_devices or the Frely console), it signs in to that account (replacing any stored login) and preapproves device MCP with no browser or prompt. Prompts go to stderr; stdout holds only the URL, or JSON with HTTP transport and OAuth details. `frely mcp url` is a deprecated alias." },
10
- { id: "mcp.workspace.list", usage: "frely mcp workspace list [--json]", auth: "mcp", effect: "read", purpose: "List workspace directories for this device; the primary is marked." },
11
- { id: "mcp.workspace.add", usage: "frely mcp workspace add [path]", auth: "mcp", effect: "local-write", purpose: "Add an additional workspace directory for this device (default: current directory); takes effect on the running service without restart." },
12
- { id: "mcp.workspace.remove", usage: "frely mcp workspace remove <path>", auth: "mcp", effect: "local-write", purpose: "Remove an additional workspace directory (the primary cannot be removed)." },
13
- { id: "mcp.local.list", usage: "frely mcp local list [--json]", auth: "none", effect: "read", purpose: "List MCP servers on this device that remote clients could use: loopback HTTP servers found automatically plus ones added by hand. Every server is off for remote clients until the owner turns it on in the web console." },
14
- { id: "mcp.local.add", usage: "frely mcp local add <name> --url <http://127.0.0.1:port/path> [--header K=V] | frely mcp local add <name> [--env K=V] -- <command> [args...]", auth: "none", effect: "local-write", purpose: "Add a local MCP server by loopback URL or by the command that starts it (stdio). It is connected once to check it works; it stays off for remote clients until the owner turns it on in the web console." },
15
- { id: "mcp.local.remove", usage: "frely mcp local remove <name>", auth: "none", effect: "local-write", purpose: "Remove a manually added local MCP server." },
16
- { id: "mcp.status", usage: "frely mcp status [--json]", auth: "none", effect: "read", purpose: "Show whether device MCP is configured, its URL, workspace, authorization expiry and background service state. Makes no network request." },
17
- { id: "mcp.stop", usage: "frely mcp stop", auth: "none", effect: "local-service", purpose: "Stop the local MCP background service without revoking authorization; frely mcp start resumes it. Supported updates restore running services without this command." },
18
- { id: "mcp.auto-update", usage: "frely mcp auto-update [on|off]", auth: "none", effect: "local-write", purpose: "Show or set whether this device's background service installs new stable versions of its own installation while idle and restarts itself. Off by default; macOS and Linux only." },
19
- { id: "mcp.remove", usage: "frely mcp remove", auth: "account", effect: "remote-write", purpose: "Revoke device MCP for every connected client and uninstall the background service (kept running provider-only when local Providers exist)." },
9
+ { id: "link.on", usage: "frely link on [--workspace <path>] [--days 1..365] [--no-browser] [--json]", auth: "account-and-browser-if-needed", effect: "authorization-if-needed", purpose: "Enable, renew, start and read device MCP. Without a stored login it first signs in through the browser (the page also registers new accounts; --no-browser only prints the sign-in URL and device code, which can be approved on any device signed in to Frely); that one approval also enables device MCP, so no second approval link is needed. Unconfigured: request browser approval for --workspace (default: the home directory), install and start the background service. Expired or --days given: renew with browser approval; the MCP URL stays the same. Otherwise start the service if it is not running. With FRELY_INSTALL_TOKEN (the one-time install command from list_devices or the Frely console), it signs in to that account (replacing any stored login) and preapproves device MCP with no browser or prompt. Prompts go to stderr; stdout holds only the URL, or JSON with HTTP transport and OAuth details." },
10
+ { id: "link.workspace.list", usage: "frely link workspace list [--json]", auth: "mcp", effect: "read", purpose: "List workspace directories for this device; the primary is marked." },
11
+ { id: "link.workspace.add", usage: "frely link workspace add [path]", auth: "mcp", effect: "local-write", purpose: "Add an additional workspace directory for this device (default: current directory); takes effect on the running service without restart." },
12
+ { id: "link.workspace.remove", usage: "frely link workspace remove <path>", auth: "mcp", effect: "local-write", purpose: "Remove an additional workspace directory (the primary cannot be removed)." },
13
+ { id: "link.local.list", usage: "frely link local list [--json]", auth: "none", effect: "read", purpose: "List MCP servers on this device that remote clients could use: loopback HTTP servers found automatically plus ones added by hand. Every server is off for remote clients until the owner turns it on in the web console." },
14
+ { id: "link.local.add", usage: "frely link local add <name> --url <http://127.0.0.1:port/path> [--header K=V] | frely link local add <name> [--env K=V] -- <command> [args...]", auth: "none", effect: "local-write", purpose: "Add a local MCP server by loopback URL or by the command that starts it (stdio). It is connected once to check it works; it stays off for remote clients until the owner turns it on in the web console." },
15
+ { id: "link.local.remove", usage: "frely link local remove <name>", auth: "none", effect: "local-write", purpose: "Remove a manually added local MCP server." },
16
+ { id: "link.status", usage: "frely link status [--json]", auth: "none", effect: "read", purpose: "Show the remote-control state (not enabled by default / on / off and locked here), its URL, workspace, authorization expiry and background service state. Makes no network request." },
17
+ { id: "link.stop", usage: "frely link stop", auth: "none", effect: "local-service", purpose: "Stop the local MCP background service without revoking authorization; frely link on resumes it. Supported updates restore running services without this command." },
18
+ { id: "link.auto-update", usage: "frely link auto-update [on|off]", auth: "none", effect: "local-write", purpose: "Show or set whether this device's background service installs new stable versions of its own installation while idle and restarts itself. Off by default; macOS and Linux only." },
19
+ { id: "link.off", usage: "frely link off", auth: "account", effect: "remote-write", purpose: "Turn remote control off and lock it on this computer: revoke the authorization for every connected client, uninstall the background service (kept running provider-only when local Providers exist) and write a local lock. The web page cannot turn it on again; only frely link on here can." },
20
20
  { id: "mcp.stdio", usage: "frely mcp stdio [--workspace <path>]", auth: "mcp", effect: "local-execution", purpose: "Serve authorized local tools over stdio for a local MCP client." },
21
21
  { id: "mcp.serve", usage: "frely mcp serve [--workspace <path>]", auth: "account-and-mcp", effect: "local-execution", purpose: "Foreground Device Relay client; the background service runs this. Not needed for normal use." },
22
22
  { id: "skill.install", usage: "frely skill install [--host chatgpt|codex|claude-code|pi|generic] [--scope global|project] [--dir <project>] [--json]", auth: "none", effect: "local-write", purpose: "Install the `frely` Skill into the host Skill folder. It teaches the agent to sign in, use `frely api`, install marketplace items and Agents, and offer FrelyMCP only when a request needs it. Running it again refreshes the Skill; an edited copy is left alone. Does not enable device MCP." },
@@ -48,20 +48,19 @@ export const COMMANDS = [
48
48
  { id: "service.manage", usage: "frely service list [--json] | stop <id|label> | remove <id|label>", auth: "account", effect: "remote-write", purpose: "List registered services, stop one on this computer (it stays registered), or remove it from Frely (products that pointed at it become unreachable)." },
49
49
  { id: "tunnel", usage: "frely tunnel <host>:<port> [--local-port N]", auth: "none", effect: "local-execution", purpose: "Run inside a sandboxed command (run_command): listen on 127.0.0.1:<local-port> (default: the same port) and forward each TCP connection to host:port through the command sandbox's proxy, so database and redis clients connect to 127.0.0.1 without turning the sandbox off. Start it in the same command as the client, for example `frely tunnel db.example.com:5432 & sleep 1; psql -h 127.0.0.1 ...`. Prints the local address and runs until killed." },
50
50
  { id: "sandbox.proxy", usage: "frely sandbox proxy [<http://host:port> [--no-proxy <list>] | --clear]", auth: "none", effect: "local-write", purpose: "Show, save or remove the HTTP(S) proxy that the command sandbox forwards its network traffic to (your own proxy, for example Clash). Without one saved it uses the HTTPS_PROXY / HTTP_PROXY / ALL_PROXY of the CLI process and, on macOS, the system proxy. Your proxy settings are never changed. Takes effect when the MCP service restarts." },
51
- { id: "devices", usage: "frely devices [--add] [--json]", auth: "controller", effect: "read", purpose: "List your Frely devices with online state and workspaces (list_devices). --add prints a one-time install command for a new computer." },
52
- { id: "run", usage: "frely run <device> [--cwd <dir>] [--timeout <s>] [--background] -- <command> [--json] [--out <file>]", auth: "controller", effect: "remote-execution", purpose: "Run a shell command on a device inside its sandbox and print its output; --background returns a process id. The command's own failure is exit code 2." },
53
- { id: "ps", usage: "frely ps <device>", auth: "controller", effect: "read", purpose: "List background commands on a device." },
54
- { id: "logs", usage: "frely logs <device> <id> [--follow]", auth: "controller", effect: "read", purpose: "Output of a background command; --follow shows it live until it ends." },
55
- { id: "kill", usage: "frely kill <device> <id>", auth: "controller", effect: "remote-execution", purpose: "Stop a background command on a device." },
56
- { id: "read", usage: "frely read <device>:<path> [--lines a:b] [--json] [--out <file>]", auth: "controller", effect: "read", purpose: "Print a file on a device (UTF-8, up to 1 MiB). A Windows drive path such as C:\\x is this computer, not a device." },
57
- { id: "ls", usage: "frely ls [<device>[:<path>]] [--json]", auth: "controller", effect: "read", purpose: "List a folder on a device; with only a device, its workspace roots." },
58
- { id: "grep", usage: "frely grep <device>:<path> <text> [--regex] [--case] [--max <n>]", auth: "controller", effect: "read", purpose: "Search file contents on a device." },
59
- { id: "edit", usage: "frely edit <device>:<path> (--from <local file> | --patch <json file>) [--overwrite]", auth: "controller", effect: "remote-write", purpose: "Write a device file from a local file, or apply line-range edits from a JSON file." },
60
- { id: "permission", usage: "frely permission request <device> --resource <name> --reason <text> --command <text> | confirm <code> [A|B|C] | wait <short code> [--then '<command>']", auth: "controller", effect: "authorization", purpose: "Ask the owner to open what the device sandbox blocks. Exit code 3 prints the approval link and the wait command: show the link to the user, then run `frely permission wait <short code> --then '<original command>'` in the background so the original command runs once they approve." },
61
- { id: "tools", usage: "frely tools [--json]", auth: "controller", effect: "read", purpose: "Print FrelyMCP's own instructions and every tool it offers." },
62
- { id: "call", usage: "frely call <tool> [--json '<object>' | --input <file>] [--out <file>]", auth: "controller", effect: "subcommand-dependent", purpose: "Call any FrelyMCP tool by name (browser, models, web_fetch, local_mcp_call, store, ...)." },
63
- { id: "controller", usage: "frely controller login|logout|status", auth: "browser", effect: "authorization-if-needed", purpose: "Authorize this computer to control your devices: shows a short code, you open the link, type the code and confirm with a passkey or authenticator code. The first controller command does this by itself in a terminal." },
64
- { id: "api", usage: "frely api list|describe|call [--wait] [--help]", auth: "controller", effect: "subcommand-dependent", purpose: "Discover and call your Frely account's business operations (the same tools FrelyMCP offers through frely_list/frely_call). Runs on this computer's controller authorization; the first call requests browser approval (frely controller login). `list` is grouped and compact (add --json for the full tool list); use describe before call; parameters and results are JSON; --input reads a file up to 512 KiB. When a call needs the owner's approval the error links to it; run the call with --wait (in the foreground, tool timeout of at least 10 minutes) to show the user the link first and then block until they approve on their phone or the web, so the call finishes by itself and you need not be told. Never background or kill it." },
51
+ { id: "devices", usage: "frely devices [--add] [--json]", auth: "login", effect: "read", purpose: "List your Frely devices with online state and workspaces (list_devices). --add prints a one-time install command for a new computer." },
52
+ { id: "run", usage: "frely run <device> [--cwd <dir>] [--timeout <s>] [--background] -- <command> [--json] [--out <file>]", auth: "login", effect: "remote-execution", purpose: "Run a shell command on a device inside its sandbox and print its output; --background returns a process id. The command's own failure is exit code 2." },
53
+ { id: "ps", usage: "frely ps <device>", auth: "login", effect: "read", purpose: "List background commands on a device." },
54
+ { id: "logs", usage: "frely logs <device> <id> [--follow]", auth: "login", effect: "read", purpose: "Output of a background command; --follow shows it live until it ends." },
55
+ { id: "kill", usage: "frely kill <device> <id>", auth: "login", effect: "remote-execution", purpose: "Stop a background command on a device." },
56
+ { id: "read", usage: "frely read <device>:<path> [--lines a:b] [--json] [--out <file>]", auth: "login", effect: "read", purpose: "Print a file on a device (UTF-8, up to 1 MiB). A Windows drive path such as C:\\x is this computer, not a device." },
57
+ { id: "ls", usage: "frely ls [<device>[:<path>]] [--json]", auth: "login", effect: "read", purpose: "List a folder on a device; with only a device, its workspace roots." },
58
+ { id: "grep", usage: "frely grep <device>:<path> <text> [--regex] [--case] [--max <n>]", auth: "login", effect: "read", purpose: "Search file contents on a device." },
59
+ { id: "edit", usage: "frely edit <device>:<path> (--from <local file> | --patch <json file>) [--overwrite]", auth: "login", effect: "remote-write", purpose: "Write a device file from a local file, or apply line-range edits from a JSON file." },
60
+ { id: "permission", usage: "frely permission request <device> --resource <name> --reason <text> --command <text> | confirm <code> [A|B|C] | wait <short code> [--then '<command>']", auth: "login", effect: "authorization", purpose: "Ask the owner to open what the device sandbox blocks. Exit code 3 prints the approval link and the wait command: show the link to the user, then run `frely permission wait <short code> --then '<original command>'` in the background so the original command runs once they approve." },
61
+ { id: "tools", usage: "frely tools [--json]", auth: "login", effect: "read", purpose: "Print FrelyMCP's own instructions and every tool it offers." },
62
+ { id: "call", usage: "frely call <tool> [--json '<object>' | --input <file>] [--out <file>]", auth: "login", effect: "subcommand-dependent", purpose: "Call any FrelyMCP tool by name (browser, models, web_fetch, local_mcp_call, store, ...)." },
63
+ { id: "api", usage: "frely api list|describe|call [--wait] [--help]", auth: "login", effect: "subcommand-dependent", purpose: "Discover and call your Frely account's business operations (the same tools FrelyMCP offers through frely_list/frely_call). Read-only discovery runs on the account's own login; the first write call asks you to approve this computer in a browser. `list` is grouped and compact (add --json for the full tool list); use describe before call; parameters and results are JSON; --input reads a file up to 512 KiB. When a call needs the owner's approval the error links to it; run the call with --wait (in the foreground, tool timeout of at least 10 minutes) to show the user the link first and then block until they approve on their phone or the web, so the call finishes by itself and you need not be told. Never background or kill it." },
65
64
  { id: "app.install", usage: "frely app install [--force] [--json]", auth: "local", effect: "local-write", purpose: "Install the Frely App: Homebrew cask when available, otherwise a verified download (SHA-256) from the FrelyHQ/frely-cli release mirror; quarantine is preserved." },
66
65
  { id: "app.open", usage: "frely app open [--window]", auth: "local", effect: "local-write", purpose: "Launch the Frely App in the background (menu bar) or with its main window via --window." },
67
66
  { id: "app.status", usage: "frely app status [--json]", auth: "local", effect: "read", purpose: "Show whether the Frely App is installed, its version, install path, running state and how it is managed." },
@@ -89,18 +88,18 @@ export function agentHelp() {
89
88
  "A Key amount limit is a spending cap. It reserves no funds and remains subject to its owner's available Plan allowance and Credit.",
90
89
  "Budget sources are independent constraints. Do not sum their remaining amounts or describe them as a Key balance.",
91
90
  "Installing a remote Agent Skill does not replace the host's current model provider.",
92
- "Device MCP exposes this computer to remote HTTP MCP clients with OAuth. Commands execute on the device, not on the calling computer.",
93
- "Use frely mcp start to enable device MCP, start it, or read its address; frely mcp status and frely doctor [-v] show status and diagnostics.",
94
- "If MCP is unconfigured or expired, frely mcp start requests browser approval; otherwise it only ensures the service is running and prints the URL. Existing workspaces stay unchanged.",
91
+ "Remote control lets other clients (HTTP MCP clients with OAuth, frely run from another computer, hosted Agents) use this computer. It is not enabled after install; the owner turns it on from the web page after two-step verification, or with frely link on. Commands execute on the device, not on the calling computer.",
92
+ "Use frely link on to enable remote control, start it, or read its MCP address; frely link off turns it off and locks it on this computer (only frely link on there lifts the lock); frely link status and frely doctor [-v] show status and diagnostics.",
93
+ "If MCP is unconfigured or expired, frely link on requests browser approval; otherwise it only ensures the service is running and prints the URL. Existing workspaces stay unchanged.",
95
94
  "Remote clients of one device share its workspace and managed processes. Shell uses the device OS account; it is not a workspace sandbox.",
96
95
  ],
97
96
  commands: COMMANDS,
98
97
  };
99
98
  }
100
99
  const GROUPS = [
101
- { title: "Control your devices", ids: ["devices", "run", "ps", "logs", "kill", "read", "ls", "grep", "edit", "permission", "tools", "call", "controller"] },
100
+ { title: "Control your devices", ids: ["devices", "run", "ps", "logs", "kill", "read", "ls", "grep", "edit", "permission", "tools", "call"] },
102
101
  { title: "Account", ids: ["login", "logout", "uninstall", "doctor", "update"] },
103
- { title: "Device MCP", ids: ["mcp.start", "mcp.workspace", "mcp.local", "mcp.lifecycle"] },
102
+ { title: "Let others control this computer", ids: ["link.on", "link.workspace", "link.local", "link.lifecycle"] },
104
103
  { title: "Agents", ids: ["agent.install", "agent.run", "agent.status", "agent.remove", "agent.local"] },
105
104
  { title: "Skills", ids: ["skill.install"] },
106
105
  { title: "Marketplace items", ids: ["item.install", "item.update", "item.run", "item.trust"] },
@@ -126,16 +125,15 @@ const SHORT_USAGE = {
126
125
  permission: "frely permission request|confirm|wait",
127
126
  tools: "frely tools",
128
127
  call: "frely call <tool> [--json '<object>']",
129
- controller: "frely controller login|logout|status",
130
128
  login: "frely login [--no-browser]",
131
129
  logout: "frely logout",
132
130
  uninstall: "frely uninstall [--yes]",
133
131
  doctor: "frely doctor [-v] [--json]",
134
132
  update: "frely update",
135
- "mcp.start": "frely mcp start [--workspace <path>] [--days 1..365] [--no-browser] [--json]",
136
- "mcp.workspace": "frely mcp workspace list|add <path>|remove <path>",
137
- "mcp.local": "frely mcp local list|add <name> (--url <address>|-- <command>)|remove <name>",
138
- "mcp.lifecycle": "frely mcp status|stop|remove",
133
+ "link.on": "frely link on [--workspace <path>] [--days 1..365] [--no-browser] [--json]",
134
+ "link.workspace": "frely link workspace list|add <path>|remove <path>",
135
+ "link.local": "frely link local list|add <name> (--url <address>|-- <command>)|remove <name>",
136
+ "link.lifecycle": "frely link status|stop|remove",
139
137
  "skill.install": "frely skill install [--host <host>]",
140
138
  "item.install": "frely item install <username/name[@version]> [--host <host>]",
141
139
  "item.update": "frely item update [<folder>]",
@@ -179,7 +177,7 @@ export function cliUsage() {
179
177
  return lines.join("");
180
178
  }
181
179
  /**
182
- * A command group without a direct action (`frely mcp workspace`, `frely agent`,
180
+ * A command group without a direct action (`frely link workspace`, `frely agent`,
183
181
  * ...) prints the subcommands under it instead of running one.
184
182
  */
185
183
  export function subcommandUsage(group) {
@@ -188,12 +186,12 @@ export function subcommandUsage(group) {
188
186
  .map((command) => ` ${SHORT_USAGE[command.id] ?? command.usage}\n`);
189
187
  return `Usage:\n${lines.join("")}`;
190
188
  }
191
- export function mcpUsage() {
192
- return "Device MCP — use this computer from a remote MCP client.\n\nUsage:\n"
193
- + ["mcp.start", "mcp.workspace", "mcp.local", "mcp.lifecycle"].map((id) => " " + SHORT_USAGE[id] + "\n").join("")
194
- + "\nStatus: frely mcp status [--json]; diagnostics: frely doctor [-v] [--json]\n\n"
195
- + "Run frely mcp start on the computer to control. It asks for browser approval the first time (the home directory, or --workspace) and when authorization has expired, installs and starts the background service, and prints the MCP URL. Add that URL to ChatGPT, Claude Code on another computer, or another HTTP MCP client, then authorize with OAuth.\n"
189
+ export function linkUsage() {
190
+ return "Remote control — let others control this computer (MCP clients, frely run from another computer, hosted Agents).\n\nUsage:\n"
191
+ + ["link.on", "link.workspace", "link.local", "link.lifecycle"].map((id) => " " + SHORT_USAGE[id] + "\n").join("")
192
+ + "\nStatus: frely link status [--json]; diagnostics: frely doctor [-v] [--json]\n\n"
193
+ + "Run frely link on on the computer to control. It asks for browser approval the first time (the home directory, or --workspace) and when authorization has expired, installs and starts the background service, and prints the MCP URL. Add that URL to ChatGPT, Claude Code on another computer, or another HTTP MCP client, then authorize with OAuth.\n"
196
194
  + "Prompts go to stderr; stdout contains only the URL or JSON. --days 1..365 renews now; the URL stays the same.\n"
197
- + "frely mcp stop only stops the service; frely mcp remove revokes access for every client. Clients share the device workspace and managed processes. Shell runs under the device OS account.\n";
195
+ + "frely link stop only stops the service; frely link off revokes access for every client. Clients share the device workspace and managed processes. Shell runs under the device OS account.\n";
198
196
  }
199
197
  //# sourceMappingURL=agent-help.js.map