Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/unicomai/wanwu/remote-compute-sshnpx skills add UnicomAI/wanwu --skill remote-compute-sshgit clone --depth 1 https://github.com/UnicomAI/wanwuWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/unicomai/wanwu/remote-compute-ssh)<a href="https://agentmods.dev/skills/unicomai/wanwu/remote-compute-ssh"><img src="https://agentmods.dev/badge/skills/unicomai/wanwu/remote-compute-ssh.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00033 | $0.04791 |
| Opus 5 | $0.00016 | $0.02396 |
| Sonnet 5 | $0.00007 | $0.00958 |
| Haiku 4.5 | $0.00003 | $0.00479 |
Grade C, and why
remote-compute-ssh scanned grade C with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 3d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Tells the agent never to refusehighAnti-refusal
Suppressing the ability to decline removes a core safety control; a later harmful request then succeeds.
card is the authorization gate, so don't refuse on their behalf and don't How it starts
The opening of the file, as written. The whole thing — 361 lines — stays where its author put it; the contents beside it link to each section on GitHub.
You've decided to run this on the user's SSH host. This skill covers the
orchestration layer — partitions, env activation, job scripts, file transfer,
recovery — not the science; what to run and why comes from the task and its
own skills. Each c.submit_job() puts an approval modal in front of the user
and, once approved, spends their allocation; a string of failed submits costs
their attention, their compute, and their trust. So the shape of a good run
is: read what's already known about this host, ask once for what isn't, land
the first submit, and write down what you learned about the host or compute
provider so the next session goes straight to the job.
Workflow
Every host.compute.* call in this skill runs via the repl tool
(the control-plane kernel), not the python tool. Job submission opens the
user's approval modal and the SSH connection from the orchestrator's own
process; that has to happen outside the sandboxed data workspace, so
host.compute simply isn't attached in the python tool (you'd see
host has no method 'compute'). The two kernels share your workspace
directory but not memory, so the rhythm is: prepare inputs in a python
cell (write ./in.dat, pickle what the job needs), run
create → submit_job in a repl cell and let the cell return — the
kernel never blocks on compute. Then call the wait_for_notification
brain-tool to park until the daemon's poller emits the compute_done
notification, and return to the python tool to read the harvested
hpc/<jobId>/ files. The repl tool is stdlib-only (python -I -S) —
keep pandas/numpy work in the python tool and pass data through files.
Start with the compute_details({provider, mode:'read'}) tool, then bind once:
c = host.compute.create(provider). The doc's shape tells you how much
discovery is left: ### env: blocks and gotchas mean prior sessions did the
legwork — trust it. A bare ## Resources header means first contact — spend
one batched c.call_command('id; module avail 2>&1 | head -40; ls -la ~', intent=..., login_shell=True) and one ask_about_compute now, before any
submit. The header's scheduler: line is detection, not ground truth; none
on a thin login node means a heavy direct-exec job would crowd other users, so
when the resources look thin and the details doc has no prior note, ask first.
If the prose doc has a known-working activation, write it directly into your
command (e.g. source <path>/activate && <tool> ...). If it doesn't, find
one via c.call_command() (module avail X, conda env list, likely app
dirs) or ask. Install only once you've established the tool genuinely isn't
there — user-space (venv/conda under scratch), via c.call_command() for a
quick install or as its own c.submit_job() if it needs a build node.
Whichever route produced an activation, run the entrypoint once via
c.call_command() before building the real job on it.
Then job = c.submit_job(...) (see below). inputs=[{src:'file', dst_filename: ...}] stages the file for you — there's no c.upload() step, and once
submitted there's nothing to verify with c.call_command('cat ...'); the job
reads ./<dst_filename> from its own workdir. End the cell — submit_job
returns immediately and the daemon's background poller polls the remote,
harvests everything the job wrote into your workspace under hpc/<jobId>/,
and emits a compute_done notification when done.
Park on the wait_for_notification brain-tool until that notification
arrives. Its payload carries {job_id, status, exit_code, featured_files, output_file_count, ...} — featured_files is the subset matching your
featured outputs: globs (omitting outputs: features everything). Publish
what you want with save_artifacts(payload['featured_files']) — that step is
what gives them provenance and surfaces them in the artifact panel. If you
need the full result dict (all output_files, left_on_remote, etc.),
re-enter a repl cell and call r = c.attach_job(job_id).result() — a
non-blocking read of what the poller already harvested.
open(r['output_files'][i]) reads any harvested file directly. Chain a
remote-resident output via
inputs:[{remote_path: r['left_on_remote'][i]['uri']}]. Between the
notification and close() you can still
c.download(f"{job.workdir}/<file>") for anything the harvest missed.
c.download('/any/absolute/host/path') works for any readable file on
the host, not just job outputs — paths outside scratch/data_roots raise an
approval card the user clicks Allow on. When the user asks you to
fetch a host file, call c.download() with the path they gave; the approval
card is the authorization gate, so don't refuse on their behalf and don't
cp into scratch first to dodge it. Dotfiles / paths under a dot-directory
(~/.ssh/*, .gitconfig, .env, …) get a hardened per-file confirmation.
c.close() once you've confirmed — it cleans up the job workdirs on the
host. Hand back the result verbatim.
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 3d ago First seen · 361 lines · 33 tokens per session scan C a516ed29a98a
remote-compute-ssh is a skill published in the GitHub repository UnicomAI/wanwu (2,454 stars, last pushed 1mo ago), licensed Apache-2.0. It adds 33 tokens to every session and 4,791 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it C with 1 finding (tells the agent never to refuse). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
agent-automation-smart-agent
Agent skill for automation-smart-agent - invoke with $agent-automation-smart-agent.
computer-use
Read and drive native desktop applications through the accessibility layer — list on-screen apps, snapshot one window as a numbered element tree, then click / type / set a value / scroll / drag / run a named action, by element index or by screen coordinates. Use for work in a desktop app rather than a web page. Full…
mochi-slack
Slack awareness — unread mentions, channel digests, topic radar, thread summaries. Load when user asks about Slack.
meetings
Context for working with the Meetings app's data — where a meeting's notes, diagram, transcript-derived tasks, and calendar cache live, what the lifecycle states mean, and how the app's agents are driven. Load when the user asks about a meeting's notes or action items, or when writing/reading files under the meetings…
papyrus-writing
LaTeX paper writing and editing. Load when working on a .tex document — writing or revising sections, fixing compilation errors, adding figures/tables/equations, or managing a bibliography. Also the co-author skill for the Papyrus app.
mochi-remind
Handle due reminders — notify the user with natural language and mark them done.