Sno Station
Sno Station은 AI 에이전트를 하나의 팀으로 묶는 오픈소스 워크스테이션으로, 로컬 머신에서 에이전트 협업을 가능하게 함
Stream Deck plugin that runs FiveM and RedM console commands at the press of a button.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Stream Deck plugin for sending commands to the FiveM or RedM client console.
Works with a physical Stream Deck, Stream Deck + or Stream Deck Mobile connected to the same PC
running the game.
1. Download the latest .streamDeckPlugin from the Releases page
2. Double-click the file and accept the Stream Deck installation prompt
Drag the FXCommands Action onto your Stream Deck and enter the command to execute. You can run a command on press, on release, or both.README 전문 보기 ↗Stream Deck plugin for sending commands to the FiveM or RedM client console.
Works with a physical Stream Deck, Stream Deck + or Stream Deck Mobile connected to the same PC running the game.
josh.tf/fxcommands | Wiki & Docs
| Feature | Description |
|---|---|
| Single commands | Send any FiveM/RedM console command with one button press |
| Chained commands | Run multiple commands sequentially with ; separator |
| Delayed commands | Add timed pauses between commands with ;; or {NNNms} |
| Staged buttons | Cycle through up to 5 different commands per button |
| Press and release | Separate commands for key down and key up events |
| Dials (Stream Deck +) | Separate commands for push, rotate left/right, and screen tap |
| Command responses | Show a value returned by your server on the button or dial |
| FiveM and RedM | Works with both games out of the box |
FXCommands on the Stream Deck Store
.streamDeckPlugin from the Releases pageDrag the FXCommands Action onto your Stream Deck and enter the command to execute. You can run a command on press, on release, or both.
# Single command
e wave
# Chained commands (no delay)
e sit;me relaxes on the ground
# Delayed commands
e think;me thinking;{2000ms};e c
For a toggle button, set Stages to 2 and fill in each stage separately rather than writing
one command, for example e sit on stage 0 and e c on stage 1. The button advances a stage on each
press.
Drop the action onto the dial row of a Stream Deck + and the Property Inspector gains a Dial section with three extra commands. Pushing the dial uses the same Command / On Release fields as a key, so a dial can also cycle through stages.
| Trigger | Field | Runs when |
|---|---|---|
| Push | Command / On Release | The dial is pressed and released |
| Rotate left | Rotate Left | The dial turns anticlockwise |
| Rotate right | Rotate Right | The dial turns clockwise |
| Touch | Touch | The touch strip above the dial is tapped |
Rotation commands support placeholders that are substituted before the command is sent:
| Placeholder | Value |
|---|---|
{ticks} | Detents moved this event, negative left, positive right |
{rotationPercent} | Running position as 0 to 100 |
{rotationAbsolute} | Running position as 0 to 255 |
# Send the raw detent delta, letting the server apply it
radio_volume_adjust {ticks}
# Send an absolute target the server can set directly
radio_volume_set {rotationPercent}
[!NOTE]
{rotationPercent}and{rotationAbsolute}track a counter held by the plugin, not the game's real value. It starts at0, is clamped to0-255, and will drift if something changes the value in-game. Prefer{ticks}unless your server echoes its state back.
A button can display a value your server sends back: current radio volume, fuel level, on-duty
count, anything you can print. It needs a change on the server, so it stays out of the way until
you ask for it: tick Enable command responses in Advanced Settings, and the per-command
Show response checkboxes appear.
When Show response is ticked, FXCommands appends a short correlation token such as
@fxid:ab12cd34 to the command, then watches the console for a line containing that token and
shows the rest of the line on the button title or dial. Your command handler has to strip the token
and print it back on the same line as the value. Client-side Lua:
RegisterCommand('radio_voldown', function(source, args)
local sdToken = nil
if args[#args] and args[#args]:match("^@fxid:") then
sdToken = table.remove(args)
end
-- Regular command logic here
if sdToken then
print(("%s %s"):format(sdToken, "60.0"))
end
end)
[!CAUTION] Only tick Show response for commands whose handler strips the token, as shown above. Any other command will receive
@fxid:...as an unexpected extra argument.
Response labels, the dial progress bar, the Get Value init command and the response timeout are covered on the Command Responses wiki page.
For full syntax reference, examples, and advanced setups see the Wiki.
npm install
npm run build
Output:
dist/tf.josh.fxcommands.sdPlugin/ unpacked plugindist/tf.josh.fxcommands.streamDeckPlugin installable packagenpm run watch
npm run check # version check + typecheck + lint + format + spell + circular deps + unused code
scripts/fivem-emulator.cjs stands in for the game so the plugin can be exercised without FiveM
running. It decodes the commands the plugin sends, answers the handshake, and replies to any
command carrying an @fxid: token so command responses can be tested end to end.
node scripts/fivem-emulator.cjs # echo commands, reply with a simulated value
node scripts/fivem-emulator.cjs --percent # reply as "60%" to exercise the dial bar layout
node scripts/fivem-emulator.cjs --drop # never reply, to exercise the capture timeout
node scripts/fivem-emulator.cjs --garbage # prefix replies with junk, to exercise frame resync
node scripts/fivem-emulator.cjs --split # split replies across TCP chunks
node scripts/fivem-emulator.cjs --delay=2000 --value=75
To exercise the Server IP and Server Port overrides, move the emulator off the default
127.0.0.1:29200 and point a button at it.
node scripts/fivem-emulator.cjs --cl2 # listen on 29300, the port a -cl2 client uses
node scripts/fivem-emulator.cjs --port=29300 # the same thing, spelled out
node scripts/fivem-emulator.cjs --host=0.0.0.0 # accept connections from another machine
Two emulators on different ports can run side by side, which is the quickest way to check that each button keeps its own address.
See the Contributing guide for full development setup.