[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-deepgram-core-mcp":3,"mdc-j0ng7n-key":32,"related-org-deepgram-core-mcp":2418,"related-repo-deepgram-core-mcp":2577},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":30,"mdContent":31},"core-mcp","bootstrap MCP terminal sessions","REQUIRED before any wsh terminal operation. Contains the complete MCP tool reference and bootstrap sequence for wsh_create_session, wsh_send_input, wsh_get_screen, wsh_send_and_read, wsh_send_keys, and all wsh_* tools. Do NOT guess wsh CLI commands or HTTP endpoints — use MCP tools or load this skill first.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"deepgram","Deepgram","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdeepgram.png",[12,16,19],{"name":13,"slug":14,"type":15},"Automation","automation","tag",{"name":17,"slug":18,"type":15},"CLI","cli",{"name":20,"slug":21,"type":15},"MCP","mcp",5,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fwsh","2026-07-12T08:29:45.869993",null,2,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":25},[],"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fwsh\u002Ftree\u002FHEAD\u002Fskills\u002Fcore-mcp","---\nname: core-mcp\ndescription: >\n  REQUIRED before any wsh terminal operation. Contains the complete MCP\n  tool reference and bootstrap sequence for wsh_create_session,\n  wsh_send_input, wsh_get_screen, wsh_send_and_read, wsh_send_keys, and all wsh_* tools.\n  Do NOT guess wsh CLI commands or HTTP endpoints — use MCP tools or load\n  this skill first.\nuser-invocable: false\n---\n\n# wsh: Terminal as a Service (MCP)\n\nYou have access to `wsh` via MCP tools that give you direct control over\nterminal sessions. You can see exactly what's on screen, send\nkeystrokes, wait for commands to finish, and create visual elements —\nall through MCP tool calls.\n\nThink of it this way: wsh gives you **eyes** (read the screen),\n**hands** (send input), **patience** (wait for output to settle),\nand **a voice** (overlays and panels to communicate with the human).\n\n## How It Works\n\nwsh manages terminal sessions via a server daemon that listens on a\nUnix domain socket (by default at `${XDG_RUNTIME_DIR}\u002Fwsh\u002Fdefault.http.sock`).\nMCP tools connect to this socket automatically. The human sees their\nnormal terminal. You interact through tool calls to the same session.\nEverything is synchronized — input you send appears on their screen,\noutput they generate appears in your tool responses. All tools take a\n`session` parameter to specify which session to operate on (e.g.,\n`\"default\"`).\n\n## Getting Started\n\n**Step 1: Verify you have MCP tools.** Check your toolkit for tools\nstarting with `wsh_` (e.g., `wsh_send_input`, `wsh_get_screen`,\n`wsh_create_session`). If you have them, proceed to step 2.\n\n**If you do NOT have `wsh_*` tools**, the MCP bridge is not running.\nDo NOT try to start a server manually — that won't give you MCP tools.\nInstead, fall back to the HTTP API: search your workspace for\n`skills\u002Fcore\u002F` and read `SKILL.md`. It has every endpoint with working\ncurl examples and a bootstrap sequence.\n\n**Step 2: Create a session.** Sessions are where commands run:\n\n    wsh_create_session(name=\"work\")\n\nReturns the session name and terminal dimensions on success.\n\n**Step 3: Use the send\u002Fwait\u002Fread loop.** The primary tool:\n\n    wsh_send_and_read(session=\"work\", keys=[{\"text\": \"ls -la\"}, {\"key\": \"enter\"}], format=\"plain\")\n\nThis sends keystrokes, waits for idle, and returns the screen in one call.\nFor more control, use `wsh_send_input`, `wsh_await_idle`, and\n`wsh_get_screen` separately.\n\n## Authentication\n\nMCP tools connect locally via Unix domain socket, so no authentication\nis needed for local use. Authentication only matters when wsh is\nconfigured with TCP HTTP (via `--bind`) for remote access across the\nnetwork. For remote TCP access, a Bearer token is required on all\nrequests. The token is auto-generated on startup or set via `--token`\n\u002F `WSH_TOKEN`.\n\n## The Fundamental Loop\n\nAlmost everything you do with wsh follows this pattern:\n\n1. **Send** — inject input into the terminal\n2. **Wait** — let the command run until output settles\n3. **Read** — see what's on screen now\n4. **Decide** — based on what you see, choose what to do next\n\nThis is your heartbeat. Learn it. A `drive-process` interaction is\njust this loop repeated until the task is done.\n\n## MCP Tools\n\nThese are the building blocks. Every specialized skill builds on these.\n\n### Send and Read (Send + Wait + Read)\nThe primary tool for the send\u002Fwait\u002Fread loop. Sends keystrokes, waits\nfor idle, then returns the screen contents.\n\nUse `wsh_send_and_read` with:\n- `session` — target session name (e.g., `\"default\"`)\n- `keys` — array of key actions (see Send Keys below)\n- `timeout_ms` — idle timeout (default 2000)\n- `max_wait_ms` — maximum wall-clock wait (default 30000)\n- `format` — `\"plain\"` or `\"styled\"` (default `\"styled\"`)\n\nExample: run `ls -la` and read the result:\n\n    wsh_send_and_read(session=\"default\", keys=[{\"text\": \"ls -la\"}, {\"key\": \"enter\"}], format=\"plain\")\n\nReturns the screen contents plus a `generation` counter. If the\nterminal doesn't settle within `max_wait_ms`, the screen is still\nreturned but flagged as an error.\n\n### Send Keys\nInject keystrokes into the terminal using named keys. No encoding\nto get wrong — use key names instead of escape sequences.\n\nUse `wsh_send_keys` with:\n- `session` — target session name\n- `keys` — array of key actions\n\nEach element in `keys` is either:\n- `{\"text\": \"...\"}` — literal characters to type\n- `{\"key\": \"...\"}` — a named special key\n\n**Named keys:** `enter`, `tab`, `escape`, `backspace`, `delete`,\n`up`, `down`, `left`, `right`, `home`, `end`, `pageup`, `pagedown`,\n`ctrl+a` through `ctrl+z`, `f1`-`f12`. Case-insensitive.\n\nExamples:\n\n    wsh_send_keys(session=\"default\", keys=[{\"text\": \"ls -la\"}, {\"key\": \"enter\"}])\n    wsh_send_keys(session=\"default\", keys=[{\"key\": \"ctrl+c\"}])\n    wsh_send_keys(session=\"default\", keys=[{\"key\": \"escape\"}, {\"text\": \":wq\"}, {\"key\": \"enter\"}])\n\nReturns `{\"status\": \"sent\", \"bytes\": N, \"generation\": G}` on success.\nThe `generation` counter is the activity state before input was\nsubmitted — pass it to `wsh_await_idle` for correct sequencing.\n\n### Send Input (Low-Level)\nRaw byte injection for advanced use. Prefer `wsh_send_keys` for\nmost input — it handles encoding automatically.\n\nUse `wsh_send_input` with:\n- `session` — target session name\n- `input` — the text or data to send (JSON string encoding)\n- `encoding` — `\"utf8\"` (default) or `\"base64\"`\n\nReturns `{\"status\": \"sent\", \"bytes\": N, \"preview\": \"...\", \"generation\": G}`.\nThe `generation` counter is the activity state before input was\nsubmitted — pass it to `wsh_await_idle` for correct sequencing.\nIncludes a `warning` field if the input looks empty or\ndouble-escaped.\n\n**Base64 encoding** bypasses any MCP transport issues with control\ncharacters:\n- `wsh_send_input(session=\"default\", input=\"Aw==\", encoding=\"base64\")` — Ctrl+C\n- `wsh_send_input(session=\"default\", input=\"Cg==\", encoding=\"base64\")` — Enter\n\n\u003Cdetails>\n\u003Csummary>JSON escape reference (for utf8 encoding)\u003C\u002Fsummary>\n\n| Key         | JSON escape  | Example                                    |\n|-------------|--------------|--------------------------------------------|\n| Enter       | `\\n`         | `input=\"ls -la\\n\"`                         |\n| Tab         | `\\t`         | `input=\"\\t\"`                               |\n| Ctrl+C      | `\\u0003`     | `input=\"\\u0003\"`                           |\n| Ctrl+D      | `\\u0004`     | `input=\"\\u0004\"`                           |\n| Escape      | `\\u001b`     | `input=\"\\u001b\"`                           |\n\nAny Ctrl+key = `\\u00XX` where XX is the ASCII code (A=01, B=02, ..., Z=1a).\n\u003C\u002Fdetails>\n\n### Wait for Idle\nBlock until the terminal has been idle for `timeout_ms` milliseconds.\nThis is a hint that the program may be idle — it could also just be\nworking without producing output.\n\nUse `wsh_await_idle` with:\n- `session` — target session name\n- `timeout_ms` — idle duration to wait for (default 2000)\n- `max_wait_ms` — maximum wall-clock wait (default 30000)\n\nReturns `{\"status\": \"idle\", \"generation\": N}` once idle.\nReturns an error result if the terminal doesn't settle within\n`max_wait_ms`.\n\n### Read the Screen\nGet the current visible screen contents.\n\nUse `wsh_get_screen` with:\n- `session` — target session name\n- `format` — `\"plain\"` for simple text or `\"styled\"` for spans with color\u002Fformatting (default `\"styled\"`)\n\n### Read Scrollback\nGet historical output that has scrolled off screen.\n\nUse `wsh_get_scrollback` with:\n- `session` — target session name\n- `offset` — line offset into scrollback (default 0)\n- `limit` — max lines to return (default 100)\n- `format` — `\"plain\"` or `\"styled\"` (default `\"styled\"`)\n\n## Visual Elements\n\n### Overlays\nFloating text positioned on top of terminal content. They don't\naffect the terminal — they're a layer on top.\n\nUse `wsh_overlay` to create, update, or list overlays:\n\n**Create an overlay:**\n\n    wsh_overlay(\n      session=\"default\",\n      x=0, y=0, width=20, height=1,\n      spans=[{\"text\": \"Hello!\", \"bold\": true}]\n    )\n\nReturns `{\"status\": \"created\", \"id\": \"uuid\"}` — use this ID to update or delete.\n\n**Update an overlay** (provide `id`):\n\n    wsh_overlay(\n      session=\"default\",\n      id=\"\u003Coverlay-id>\",\n      spans=[{\"text\": \"Updated!\", \"fg\": \"green\"}]\n    )\n\n**List overlays:**\n\n    wsh_overlay(session=\"default\", list=true)\n\n**Opaque overlays:** Add `background` to fill the rectangle with a\nsolid color, making it a window-like element:\n\n    wsh_overlay(\n      session=\"default\",\n      x=10, y=5, width=40, height=10,\n      background={\"bg\": \"black\"},\n      spans=[{\"text\": \"Window content\"}]\n    )\n\nBackground accepts named colors (`\"blue\"`) or RGB\n(`{\"r\": 30, \"g\": 30, \"b\": 30}`).\n\n**Focusable:** Add `focusable=true` to allow focus routing during\ninput capture (see Input Capture below).\n\nUse `wsh_remove_overlay` to remove overlays:\n- With `id` — remove a specific overlay\n- Without `id` — clear all overlays\n\nUse overlays for: tooltips, status indicators, annotations,\nnotifications — anything that should appear *on top of* the\nterminal without disrupting it. With explicit dimensions: windows,\ndialogs, cards.\n\n### Panels\nAgent-owned screen regions at the top or bottom of the terminal.\nUnlike overlays, panels **shrink the PTY** — they carve out\ndedicated space.\n\nUse `wsh_panel` to create, update, or list panels:\n\n**Create a panel:**\n\n    wsh_panel(\n      session=\"default\",\n      position=\"bottom\", height=3,\n      spans=[{\"text\": \"Status: running\"}]\n    )\n\n**Update a panel** (provide `id`):\n\n    wsh_panel(\n      session=\"default\",\n      id=\"\u003Cpanel-id>\",\n      spans=[{\"text\": \"Status: done\", \"fg\": \"green\"}]\n    )\n\n**List panels:**\n\n    wsh_panel(session=\"default\", list=true)\n\n**Background:** Add `background` to fill the panel with a solid color:\n\n    wsh_panel(\n      session=\"default\",\n      position=\"bottom\", height=2,\n      background={\"bg\": \"blue\"},\n      spans=[{\"text\": \"Status: ok\"}]\n    )\n\n**Focusable:** Add `focusable=true` to allow focus routing during\ninput capture.\n\nUse `wsh_remove_panel` to remove panels:\n- With `id` — remove a specific panel\n- Without `id` — clear all panels\n\nUse panels for: persistent status bars, progress displays,\ncontext summaries — anything that deserves its own screen\nreal estate.\n\n### Input Capture\nIntercept keyboard input so it comes to you instead of the shell.\n\nUse `wsh_input_mode` to query or change input mode and focus:\n- `mode=\"capture\"` — grab input (keystrokes go to API only)\n- `mode=\"release\"` — release back (keystrokes go to PTY)\n- `focus=\"\u003Celement-id>\"` — direct captured input to a specific focusable overlay or panel\n- `unfocus=true` — clear focus\n- No mode\u002Ffocus params — query current state\n\nThe human can press Ctrl+\\ to toggle capture mode (it switches\nbetween passthrough and capture).\n\nFocus is automatically cleared when input is released or when the\nfocused element is deleted.\n\nUse input capture for: approval prompts, custom menus, interactive\ndialogs between you and the human.\n\n### Alternate Screen Mode\nEnter a separate screen mode where you can create a completely\nindependent set of overlays and panels. Exiting cleans up everything\nautomatically.\n\nUse `wsh_screen_mode` to query or change screen mode:\n- `action=\"enter_alt\"` — enter alternate screen mode\n- `action=\"exit_alt\"` — exit alternate screen mode\n- No action — query current mode (`\"normal\"` or `\"alt\"`)\n\nOverlays and panels are automatically tagged with the screen mode\nactive at the time of creation. When you exit alt screen, all elements\ncreated in alt mode are deleted and the original screen's elements\nare restored.\n\nUse alt screen mode for: temporary full-screen agent UIs, setup\nwizards, immersive dashboards — anything that needs a clean canvas\nand should leave no trace when done.\n\n## Session Management\n\nwsh always runs as a server daemon managing sessions. Use these tools\nto manage session lifecycle:\n\n### List Sessions\n\n    wsh_list_sessions()                          # list all\n    wsh_list_sessions(session=\"build\")           # get details for one\n    wsh_list_sessions(tag=[\"build\", \"ci\"])        # filter by tags\n\n### Create Sessions\n\n    wsh_create_session(name=\"build\", command=\"cargo build\", tags=[\"build\", \"ci\"])\n\nOptional parameters: `rows`, `cols`, `cwd`, `env`, `tags`.\nReturns `{\"name\": \"build\", \"rows\": 24, \"cols\": 80, \"tags\": [\"build\", \"ci\"]}`.\n\n**Session name rules:** Names must be 1-64 characters and contain only\nletters, digits, dots, hyphens, and underscores (`[a-zA-Z0-9._-]`).\nInvalid names return an `invalid_session_name` error. If omitted, the\nserver auto-generates a valid name.\n\n**Terminal dimensions:** `rows` and `cols` are clamped to 1-1000.\n\nTags are optional string labels (1-64 chars, alphanumeric plus\nhyphens, underscores, and dots). Use them to group and filter\nsessions by purpose.\n\n### Manage Sessions\n\n    wsh_manage_session(session=\"build\", action=\"kill\")            # destroy\n    wsh_manage_session(session=\"build\", action=\"rename\", new_name=\"build-v2\")  # rename (same name rules apply)\n    wsh_manage_session(session=\"build\", action=\"detach\")          # disconnect clients\n    wsh_manage_session(session=\"build\", action=\"add_tags\", tags=[\"production\"])  # add tags\n    wsh_manage_session(session=\"build\", action=\"remove_tags\", tags=[\"draft\"])    # remove tags\n\n### Default Session\nWhen wsh is started with `wsh` (no arguments), it auto-spawns an\nephemeral server daemon (listening on Unix domain socket only) and\ncreates a session named `default`. Use `session=\"default\"` for all\ntool calls. If started with `--name`, the session has that name instead.\n\n## Federation (Multi-Server)\n\nWhen wsh is configured with federated backends, all session tools accept an\noptional `server` parameter to target a specific backend by hostname. When\nomitted, operations target the local server (or aggregate across all servers\nfor listings).\n\n### Server Parameter on Session Tools\n\nAdd `server=\"\u003Chostname>\"` to any session tool to route it to a specific backend:\n\n    wsh_create_session(name=\"build\", server=\"prod-1\", command=\"cargo build\")\n    wsh_get_screen(session=\"build\", server=\"prod-1\")\n    wsh_list_sessions(server=\"prod-1\")       # list sessions on one backend\n    wsh_list_sessions()                       # aggregate across all servers\n\nSession responses include a `server` field indicating which server owns\nthe session. Once a session exists, all operations are automatically routed\nto the correct server.\n\n### Server Management Tools\n\nUse these tools to discover and manage the cluster:\n\n**List all servers:**\n\n    wsh_list_servers()\n\nReturns all servers (hub + backends) with hostname, address, health\n(`healthy`, `connecting`, `unavailable`), and role.\n\n**Add a backend:**\n\n    wsh_add_server(address=\"http:\u002F\u002F10.0.1.10:8080\")\n    wsh_add_server(address=\"https:\u002F\u002F10.0.1.11:8443\", token=\"secret\")\n\nAddresses require `http:\u002F\u002F` or `https:\u002F\u002F` scheme. The backend starts\nin `connecting` state and transitions to `healthy` once reachable.\n\n**Check a specific server:**\n\n    wsh_server_status(hostname=\"prod-1\")\n\n**Remove a backend:**\n\n    wsh_remove_server(hostname=\"prod-1\")\n\nFor detailed federation patterns (cross-server workflows, failure\nhandling, distributed quiescence), invoke `wsh:cluster-orchestration`.\n\n## Specialized Skills\n\nWhen your task matches one of these patterns, invoke the\ncorresponding skill for detailed guidance.\n\n**wsh:drive-process** — You need to run a CLI command and interact\nwith it. Sending input, reading output, handling prompts, navigating\nsequential command-and-response workflows.\n\n**wsh:tui** — You need to operate a full-screen terminal application\nlike vim, htop, lazygit, or k9s. Reading a 2D grid, sending\nnavigation keys, understanding menus and panes.\n\n**wsh:multi-session** — You need to run multiple things in parallel.\nSpawning sessions, monitoring them, collecting results across\nsessions.\n\n**wsh:agent-orchestration** — You need to drive another AI agent\n(Claude Code, Aider, etc.) through its terminal interface. Feeding\ntasks, handling approval prompts, reviewing agent output.\n\n**wsh:monitor** — You need to watch what a human is doing and react.\nSubscribing to terminal events, detecting patterns, providing\ncontextual assistance or auditing.\n\n**wsh:visual-feedback** — You need to communicate with the human\nvisually. Building overlay notifications, status panels, progress\ndisplays, contextual annotations.\n\n**wsh:input-capture** — You need to take over keyboard input\ntemporarily. Building approval workflows, custom menus, interactive\ndialogs.\n\n**wsh:generative-ui** — You need to build a dynamic interactive\nexperience in the terminal. Combining overlays, panels, input\ncapture, direct drawing, and alternate screen mode to create\nbespoke interfaces on the fly.\n",{"data":33,"body":35},{"name":4,"description":6,"user-invocable":34},false,{"type":36,"children":37},"root",[38,47,62,96,103,132,138,180,214,224,236,241,251,260,286,292,321,327,332,377,390,396,401,408,413,426,513,526,535,555,561,566,577,600,612,637,769,774,783,810,816,828,838,885,918,928,953,1139,1145,1157,1167,1198,1216,1222,1227,1237,1278,1284,1289,1300,1361,1367,1373,1378,1390,1398,1407,1419,1437,1446,1454,1463,1481,1490,1510,1527,1539,1566,1579,1585,1597,1609,1617,1626,1641,1650,1658,1667,1683,1692,1707,1719,1744,1749,1755,1760,1772,1824,1829,1834,1839,1845,1850,1862,1906,1911,1916,1922,1927,1933,1942,1948,1957,2005,2031,2054,2059,2065,2074,2080,2116,2122,2135,2141,2154,2163,2175,2181,2186,2194,2203,2230,2238,2247,2281,2289,2298,2306,2315,2327,2333,2338,2348,2358,2368,2378,2388,2398,2408],{"type":39,"tag":40,"props":41,"children":43},"element","h1",{"id":42},"wsh-terminal-as-a-service-mcp",[44],{"type":45,"value":46},"text","wsh: Terminal as a Service (MCP)",{"type":39,"tag":48,"props":49,"children":50},"p",{},[51,53,60],{"type":45,"value":52},"You have access to ",{"type":39,"tag":54,"props":55,"children":57},"code",{"className":56},[],[58],{"type":45,"value":59},"wsh",{"type":45,"value":61}," via MCP tools that give you direct control over\nterminal sessions. You can see exactly what's on screen, send\nkeystrokes, wait for commands to finish, and create visual elements —\nall through MCP tool calls.",{"type":39,"tag":48,"props":63,"children":64},{},[65,67,73,75,80,82,87,89,94],{"type":45,"value":66},"Think of it this way: wsh gives you ",{"type":39,"tag":68,"props":69,"children":70},"strong",{},[71],{"type":45,"value":72},"eyes",{"type":45,"value":74}," (read the screen),\n",{"type":39,"tag":68,"props":76,"children":77},{},[78],{"type":45,"value":79},"hands",{"type":45,"value":81}," (send input), ",{"type":39,"tag":68,"props":83,"children":84},{},[85],{"type":45,"value":86},"patience",{"type":45,"value":88}," (wait for output to settle),\nand ",{"type":39,"tag":68,"props":90,"children":91},{},[92],{"type":45,"value":93},"a voice",{"type":45,"value":95}," (overlays and panels to communicate with the human).",{"type":39,"tag":97,"props":98,"children":100},"h2",{"id":99},"how-it-works",[101],{"type":45,"value":102},"How It Works",{"type":39,"tag":48,"props":104,"children":105},{},[106,108,114,116,122,124,130],{"type":45,"value":107},"wsh manages terminal sessions via a server daemon that listens on a\nUnix domain socket (by default at ",{"type":39,"tag":54,"props":109,"children":111},{"className":110},[],[112],{"type":45,"value":113},"${XDG_RUNTIME_DIR}\u002Fwsh\u002Fdefault.http.sock",{"type":45,"value":115},").\nMCP tools connect to this socket automatically. The human sees their\nnormal terminal. You interact through tool calls to the same session.\nEverything is synchronized — input you send appears on their screen,\noutput they generate appears in your tool responses. All tools take a\n",{"type":39,"tag":54,"props":117,"children":119},{"className":118},[],[120],{"type":45,"value":121},"session",{"type":45,"value":123}," parameter to specify which session to operate on (e.g.,\n",{"type":39,"tag":54,"props":125,"children":127},{"className":126},[],[128],{"type":45,"value":129},"\"default\"",{"type":45,"value":131},").",{"type":39,"tag":97,"props":133,"children":135},{"id":134},"getting-started",[136],{"type":45,"value":137},"Getting Started",{"type":39,"tag":48,"props":139,"children":140},{},[141,146,148,154,156,162,164,170,172,178],{"type":39,"tag":68,"props":142,"children":143},{},[144],{"type":45,"value":145},"Step 1: Verify you have MCP tools.",{"type":45,"value":147}," Check your toolkit for tools\nstarting with ",{"type":39,"tag":54,"props":149,"children":151},{"className":150},[],[152],{"type":45,"value":153},"wsh_",{"type":45,"value":155}," (e.g., ",{"type":39,"tag":54,"props":157,"children":159},{"className":158},[],[160],{"type":45,"value":161},"wsh_send_input",{"type":45,"value":163},", ",{"type":39,"tag":54,"props":165,"children":167},{"className":166},[],[168],{"type":45,"value":169},"wsh_get_screen",{"type":45,"value":171},",\n",{"type":39,"tag":54,"props":173,"children":175},{"className":174},[],[176],{"type":45,"value":177},"wsh_create_session",{"type":45,"value":179},"). If you have them, proceed to step 2.",{"type":39,"tag":48,"props":181,"children":182},{},[183,196,198,204,206,212],{"type":39,"tag":68,"props":184,"children":185},{},[186,188,194],{"type":45,"value":187},"If you do NOT have ",{"type":39,"tag":54,"props":189,"children":191},{"className":190},[],[192],{"type":45,"value":193},"wsh_*",{"type":45,"value":195}," tools",{"type":45,"value":197},", the MCP bridge is not running.\nDo NOT try to start a server manually — that won't give you MCP tools.\nInstead, fall back to the HTTP API: search your workspace for\n",{"type":39,"tag":54,"props":199,"children":201},{"className":200},[],[202],{"type":45,"value":203},"skills\u002Fcore\u002F",{"type":45,"value":205}," and read ",{"type":39,"tag":54,"props":207,"children":209},{"className":208},[],[210],{"type":45,"value":211},"SKILL.md",{"type":45,"value":213},". It has every endpoint with working\ncurl examples and a bootstrap sequence.",{"type":39,"tag":48,"props":215,"children":216},{},[217,222],{"type":39,"tag":68,"props":218,"children":219},{},[220],{"type":45,"value":221},"Step 2: Create a session.",{"type":45,"value":223}," Sessions are where commands run:",{"type":39,"tag":225,"props":226,"children":230},"pre",{"className":227,"code":229,"language":45},[228],"language-text","wsh_create_session(name=\"work\")\n",[231],{"type":39,"tag":54,"props":232,"children":234},{"__ignoreMap":233},"",[235],{"type":45,"value":229},{"type":39,"tag":48,"props":237,"children":238},{},[239],{"type":45,"value":240},"Returns the session name and terminal dimensions on success.",{"type":39,"tag":48,"props":242,"children":243},{},[244,249],{"type":39,"tag":68,"props":245,"children":246},{},[247],{"type":45,"value":248},"Step 3: Use the send\u002Fwait\u002Fread loop.",{"type":45,"value":250}," The primary tool:",{"type":39,"tag":225,"props":252,"children":255},{"className":253,"code":254,"language":45},[228],"wsh_send_and_read(session=\"work\", keys=[{\"text\": \"ls -la\"}, {\"key\": \"enter\"}], format=\"plain\")\n",[256],{"type":39,"tag":54,"props":257,"children":258},{"__ignoreMap":233},[259],{"type":45,"value":254},{"type":39,"tag":48,"props":261,"children":262},{},[263,265,270,271,277,279,284],{"type":45,"value":264},"This sends keystrokes, waits for idle, and returns the screen in one call.\nFor more control, use ",{"type":39,"tag":54,"props":266,"children":268},{"className":267},[],[269],{"type":45,"value":161},{"type":45,"value":163},{"type":39,"tag":54,"props":272,"children":274},{"className":273},[],[275],{"type":45,"value":276},"wsh_await_idle",{"type":45,"value":278},", and\n",{"type":39,"tag":54,"props":280,"children":282},{"className":281},[],[283],{"type":45,"value":169},{"type":45,"value":285}," separately.",{"type":39,"tag":97,"props":287,"children":289},{"id":288},"authentication",[290],{"type":45,"value":291},"Authentication",{"type":39,"tag":48,"props":293,"children":294},{},[295,297,303,305,311,313,319],{"type":45,"value":296},"MCP tools connect locally via Unix domain socket, so no authentication\nis needed for local use. Authentication only matters when wsh is\nconfigured with TCP HTTP (via ",{"type":39,"tag":54,"props":298,"children":300},{"className":299},[],[301],{"type":45,"value":302},"--bind",{"type":45,"value":304},") for remote access across the\nnetwork. For remote TCP access, a Bearer token is required on all\nrequests. The token is auto-generated on startup or set via ",{"type":39,"tag":54,"props":306,"children":308},{"className":307},[],[309],{"type":45,"value":310},"--token",{"type":45,"value":312},"\n\u002F ",{"type":39,"tag":54,"props":314,"children":316},{"className":315},[],[317],{"type":45,"value":318},"WSH_TOKEN",{"type":45,"value":320},".",{"type":39,"tag":97,"props":322,"children":324},{"id":323},"the-fundamental-loop",[325],{"type":45,"value":326},"The Fundamental Loop",{"type":39,"tag":48,"props":328,"children":329},{},[330],{"type":45,"value":331},"Almost everything you do with wsh follows this pattern:",{"type":39,"tag":333,"props":334,"children":335},"ol",{},[336,347,357,367],{"type":39,"tag":337,"props":338,"children":339},"li",{},[340,345],{"type":39,"tag":68,"props":341,"children":342},{},[343],{"type":45,"value":344},"Send",{"type":45,"value":346}," — inject input into the terminal",{"type":39,"tag":337,"props":348,"children":349},{},[350,355],{"type":39,"tag":68,"props":351,"children":352},{},[353],{"type":45,"value":354},"Wait",{"type":45,"value":356}," — let the command run until output settles",{"type":39,"tag":337,"props":358,"children":359},{},[360,365],{"type":39,"tag":68,"props":361,"children":362},{},[363],{"type":45,"value":364},"Read",{"type":45,"value":366}," — see what's on screen now",{"type":39,"tag":337,"props":368,"children":369},{},[370,375],{"type":39,"tag":68,"props":371,"children":372},{},[373],{"type":45,"value":374},"Decide",{"type":45,"value":376}," — based on what you see, choose what to do next",{"type":39,"tag":48,"props":378,"children":379},{},[380,382,388],{"type":45,"value":381},"This is your heartbeat. Learn it. A ",{"type":39,"tag":54,"props":383,"children":385},{"className":384},[],[386],{"type":45,"value":387},"drive-process",{"type":45,"value":389}," interaction is\njust this loop repeated until the task is done.",{"type":39,"tag":97,"props":391,"children":393},{"id":392},"mcp-tools",[394],{"type":45,"value":395},"MCP Tools",{"type":39,"tag":48,"props":397,"children":398},{},[399],{"type":45,"value":400},"These are the building blocks. Every specialized skill builds on these.",{"type":39,"tag":402,"props":403,"children":405},"h3",{"id":404},"send-and-read-send-wait-read",[406],{"type":45,"value":407},"Send and Read (Send + Wait + Read)",{"type":39,"tag":48,"props":409,"children":410},{},[411],{"type":45,"value":412},"The primary tool for the send\u002Fwait\u002Fread loop. Sends keystrokes, waits\nfor idle, then returns the screen contents.",{"type":39,"tag":48,"props":414,"children":415},{},[416,418,424],{"type":45,"value":417},"Use ",{"type":39,"tag":54,"props":419,"children":421},{"className":420},[],[422],{"type":45,"value":423},"wsh_send_and_read",{"type":45,"value":425}," with:",{"type":39,"tag":427,"props":428,"children":429},"ul",{},[430,447,458,469,480],{"type":39,"tag":337,"props":431,"children":432},{},[433,438,440,445],{"type":39,"tag":54,"props":434,"children":436},{"className":435},[],[437],{"type":45,"value":121},{"type":45,"value":439}," — target session name (e.g., ",{"type":39,"tag":54,"props":441,"children":443},{"className":442},[],[444],{"type":45,"value":129},{"type":45,"value":446},")",{"type":39,"tag":337,"props":448,"children":449},{},[450,456],{"type":39,"tag":54,"props":451,"children":453},{"className":452},[],[454],{"type":45,"value":455},"keys",{"type":45,"value":457}," — array of key actions (see Send Keys below)",{"type":39,"tag":337,"props":459,"children":460},{},[461,467],{"type":39,"tag":54,"props":462,"children":464},{"className":463},[],[465],{"type":45,"value":466},"timeout_ms",{"type":45,"value":468}," — idle timeout (default 2000)",{"type":39,"tag":337,"props":470,"children":471},{},[472,478],{"type":39,"tag":54,"props":473,"children":475},{"className":474},[],[476],{"type":45,"value":477},"max_wait_ms",{"type":45,"value":479}," — maximum wall-clock wait (default 30000)",{"type":39,"tag":337,"props":481,"children":482},{},[483,489,491,497,499,505,507,512],{"type":39,"tag":54,"props":484,"children":486},{"className":485},[],[487],{"type":45,"value":488},"format",{"type":45,"value":490}," — ",{"type":39,"tag":54,"props":492,"children":494},{"className":493},[],[495],{"type":45,"value":496},"\"plain\"",{"type":45,"value":498}," or ",{"type":39,"tag":54,"props":500,"children":502},{"className":501},[],[503],{"type":45,"value":504},"\"styled\"",{"type":45,"value":506}," (default ",{"type":39,"tag":54,"props":508,"children":510},{"className":509},[],[511],{"type":45,"value":504},{"type":45,"value":446},{"type":39,"tag":48,"props":514,"children":515},{},[516,518,524],{"type":45,"value":517},"Example: run ",{"type":39,"tag":54,"props":519,"children":521},{"className":520},[],[522],{"type":45,"value":523},"ls -la",{"type":45,"value":525}," and read the result:",{"type":39,"tag":225,"props":527,"children":530},{"className":528,"code":529,"language":45},[228],"wsh_send_and_read(session=\"default\", keys=[{\"text\": \"ls -la\"}, {\"key\": \"enter\"}], format=\"plain\")\n",[531],{"type":39,"tag":54,"props":532,"children":533},{"__ignoreMap":233},[534],{"type":45,"value":529},{"type":39,"tag":48,"props":536,"children":537},{},[538,540,546,548,553],{"type":45,"value":539},"Returns the screen contents plus a ",{"type":39,"tag":54,"props":541,"children":543},{"className":542},[],[544],{"type":45,"value":545},"generation",{"type":45,"value":547}," counter. If the\nterminal doesn't settle within ",{"type":39,"tag":54,"props":549,"children":551},{"className":550},[],[552],{"type":45,"value":477},{"type":45,"value":554},", the screen is still\nreturned but flagged as an error.",{"type":39,"tag":402,"props":556,"children":558},{"id":557},"send-keys",[559],{"type":45,"value":560},"Send Keys",{"type":39,"tag":48,"props":562,"children":563},{},[564],{"type":45,"value":565},"Inject keystrokes into the terminal using named keys. No encoding\nto get wrong — use key names instead of escape sequences.",{"type":39,"tag":48,"props":567,"children":568},{},[569,570,576],{"type":45,"value":417},{"type":39,"tag":54,"props":571,"children":573},{"className":572},[],[574],{"type":45,"value":575},"wsh_send_keys",{"type":45,"value":425},{"type":39,"tag":427,"props":578,"children":579},{},[580,590],{"type":39,"tag":337,"props":581,"children":582},{},[583,588],{"type":39,"tag":54,"props":584,"children":586},{"className":585},[],[587],{"type":45,"value":121},{"type":45,"value":589}," — target session name",{"type":39,"tag":337,"props":591,"children":592},{},[593,598],{"type":39,"tag":54,"props":594,"children":596},{"className":595},[],[597],{"type":45,"value":455},{"type":45,"value":599}," — array of key actions",{"type":39,"tag":48,"props":601,"children":602},{},[603,605,610],{"type":45,"value":604},"Each element in ",{"type":39,"tag":54,"props":606,"children":608},{"className":607},[],[609],{"type":45,"value":455},{"type":45,"value":611}," is either:",{"type":39,"tag":427,"props":613,"children":614},{},[615,626],{"type":39,"tag":337,"props":616,"children":617},{},[618,624],{"type":39,"tag":54,"props":619,"children":621},{"className":620},[],[622],{"type":45,"value":623},"{\"text\": \"...\"}",{"type":45,"value":625}," — literal characters to type",{"type":39,"tag":337,"props":627,"children":628},{},[629,635],{"type":39,"tag":54,"props":630,"children":632},{"className":631},[],[633],{"type":45,"value":634},"{\"key\": \"...\"}",{"type":45,"value":636}," — a named special key",{"type":39,"tag":48,"props":638,"children":639},{},[640,645,647,653,654,660,661,667,668,674,675,681,682,688,689,695,696,702,703,709,710,716,717,723,724,730,731,737,738,744,746,752,753,759,761,767],{"type":39,"tag":68,"props":641,"children":642},{},[643],{"type":45,"value":644},"Named keys:",{"type":45,"value":646}," ",{"type":39,"tag":54,"props":648,"children":650},{"className":649},[],[651],{"type":45,"value":652},"enter",{"type":45,"value":163},{"type":39,"tag":54,"props":655,"children":657},{"className":656},[],[658],{"type":45,"value":659},"tab",{"type":45,"value":163},{"type":39,"tag":54,"props":662,"children":664},{"className":663},[],[665],{"type":45,"value":666},"escape",{"type":45,"value":163},{"type":39,"tag":54,"props":669,"children":671},{"className":670},[],[672],{"type":45,"value":673},"backspace",{"type":45,"value":163},{"type":39,"tag":54,"props":676,"children":678},{"className":677},[],[679],{"type":45,"value":680},"delete",{"type":45,"value":171},{"type":39,"tag":54,"props":683,"children":685},{"className":684},[],[686],{"type":45,"value":687},"up",{"type":45,"value":163},{"type":39,"tag":54,"props":690,"children":692},{"className":691},[],[693],{"type":45,"value":694},"down",{"type":45,"value":163},{"type":39,"tag":54,"props":697,"children":699},{"className":698},[],[700],{"type":45,"value":701},"left",{"type":45,"value":163},{"type":39,"tag":54,"props":704,"children":706},{"className":705},[],[707],{"type":45,"value":708},"right",{"type":45,"value":163},{"type":39,"tag":54,"props":711,"children":713},{"className":712},[],[714],{"type":45,"value":715},"home",{"type":45,"value":163},{"type":39,"tag":54,"props":718,"children":720},{"className":719},[],[721],{"type":45,"value":722},"end",{"type":45,"value":163},{"type":39,"tag":54,"props":725,"children":727},{"className":726},[],[728],{"type":45,"value":729},"pageup",{"type":45,"value":163},{"type":39,"tag":54,"props":732,"children":734},{"className":733},[],[735],{"type":45,"value":736},"pagedown",{"type":45,"value":171},{"type":39,"tag":54,"props":739,"children":741},{"className":740},[],[742],{"type":45,"value":743},"ctrl+a",{"type":45,"value":745}," through ",{"type":39,"tag":54,"props":747,"children":749},{"className":748},[],[750],{"type":45,"value":751},"ctrl+z",{"type":45,"value":163},{"type":39,"tag":54,"props":754,"children":756},{"className":755},[],[757],{"type":45,"value":758},"f1",{"type":45,"value":760},"-",{"type":39,"tag":54,"props":762,"children":764},{"className":763},[],[765],{"type":45,"value":766},"f12",{"type":45,"value":768},". Case-insensitive.",{"type":39,"tag":48,"props":770,"children":771},{},[772],{"type":45,"value":773},"Examples:",{"type":39,"tag":225,"props":775,"children":778},{"className":776,"code":777,"language":45},[228],"wsh_send_keys(session=\"default\", keys=[{\"text\": \"ls -la\"}, {\"key\": \"enter\"}])\nwsh_send_keys(session=\"default\", keys=[{\"key\": \"ctrl+c\"}])\nwsh_send_keys(session=\"default\", keys=[{\"key\": \"escape\"}, {\"text\": \":wq\"}, {\"key\": \"enter\"}])\n",[779],{"type":39,"tag":54,"props":780,"children":781},{"__ignoreMap":233},[782],{"type":45,"value":777},{"type":39,"tag":48,"props":784,"children":785},{},[786,788,794,796,801,803,808],{"type":45,"value":787},"Returns ",{"type":39,"tag":54,"props":789,"children":791},{"className":790},[],[792],{"type":45,"value":793},"{\"status\": \"sent\", \"bytes\": N, \"generation\": G}",{"type":45,"value":795}," on success.\nThe ",{"type":39,"tag":54,"props":797,"children":799},{"className":798},[],[800],{"type":45,"value":545},{"type":45,"value":802}," counter is the activity state before input was\nsubmitted — pass it to ",{"type":39,"tag":54,"props":804,"children":806},{"className":805},[],[807],{"type":45,"value":276},{"type":45,"value":809}," for correct sequencing.",{"type":39,"tag":402,"props":811,"children":813},{"id":812},"send-input-low-level",[814],{"type":45,"value":815},"Send Input (Low-Level)",{"type":39,"tag":48,"props":817,"children":818},{},[819,821,826],{"type":45,"value":820},"Raw byte injection for advanced use. Prefer ",{"type":39,"tag":54,"props":822,"children":824},{"className":823},[],[825],{"type":45,"value":575},{"type":45,"value":827}," for\nmost input — it handles encoding automatically.",{"type":39,"tag":48,"props":829,"children":830},{},[831,832,837],{"type":45,"value":417},{"type":39,"tag":54,"props":833,"children":835},{"className":834},[],[836],{"type":45,"value":161},{"type":45,"value":425},{"type":39,"tag":427,"props":839,"children":840},{},[841,850,861],{"type":39,"tag":337,"props":842,"children":843},{},[844,849],{"type":39,"tag":54,"props":845,"children":847},{"className":846},[],[848],{"type":45,"value":121},{"type":45,"value":589},{"type":39,"tag":337,"props":851,"children":852},{},[853,859],{"type":39,"tag":54,"props":854,"children":856},{"className":855},[],[857],{"type":45,"value":858},"input",{"type":45,"value":860}," — the text or data to send (JSON string encoding)",{"type":39,"tag":337,"props":862,"children":863},{},[864,870,871,877,879],{"type":39,"tag":54,"props":865,"children":867},{"className":866},[],[868],{"type":45,"value":869},"encoding",{"type":45,"value":490},{"type":39,"tag":54,"props":872,"children":874},{"className":873},[],[875],{"type":45,"value":876},"\"utf8\"",{"type":45,"value":878}," (default) or ",{"type":39,"tag":54,"props":880,"children":882},{"className":881},[],[883],{"type":45,"value":884},"\"base64\"",{"type":39,"tag":48,"props":886,"children":887},{},[888,889,895,897,902,903,908,910,916],{"type":45,"value":787},{"type":39,"tag":54,"props":890,"children":892},{"className":891},[],[893],{"type":45,"value":894},"{\"status\": \"sent\", \"bytes\": N, \"preview\": \"...\", \"generation\": G}",{"type":45,"value":896},".\nThe ",{"type":39,"tag":54,"props":898,"children":900},{"className":899},[],[901],{"type":45,"value":545},{"type":45,"value":802},{"type":39,"tag":54,"props":904,"children":906},{"className":905},[],[907],{"type":45,"value":276},{"type":45,"value":909}," for correct sequencing.\nIncludes a ",{"type":39,"tag":54,"props":911,"children":913},{"className":912},[],[914],{"type":45,"value":915},"warning",{"type":45,"value":917}," field if the input looks empty or\ndouble-escaped.",{"type":39,"tag":48,"props":919,"children":920},{},[921,926],{"type":39,"tag":68,"props":922,"children":923},{},[924],{"type":45,"value":925},"Base64 encoding",{"type":45,"value":927}," bypasses any MCP transport issues with control\ncharacters:",{"type":39,"tag":427,"props":929,"children":930},{},[931,942],{"type":39,"tag":337,"props":932,"children":933},{},[934,940],{"type":39,"tag":54,"props":935,"children":937},{"className":936},[],[938],{"type":45,"value":939},"wsh_send_input(session=\"default\", input=\"Aw==\", encoding=\"base64\")",{"type":45,"value":941}," — Ctrl+C",{"type":39,"tag":337,"props":943,"children":944},{},[945,951],{"type":39,"tag":54,"props":946,"children":948},{"className":947},[],[949],{"type":45,"value":950},"wsh_send_input(session=\"default\", input=\"Cg==\", encoding=\"base64\")",{"type":45,"value":952}," — Enter",{"type":39,"tag":954,"props":955,"children":956},"details",{},[957,963,1126],{"type":39,"tag":958,"props":959,"children":960},"summary",{},[961],{"type":45,"value":962},"JSON escape reference (for utf8 encoding)",{"type":39,"tag":964,"props":965,"children":966},"table",{},[967,991],{"type":39,"tag":968,"props":969,"children":970},"thead",{},[971],{"type":39,"tag":972,"props":973,"children":974},"tr",{},[975,981,986],{"type":39,"tag":976,"props":977,"children":978},"th",{},[979],{"type":45,"value":980},"Key",{"type":39,"tag":976,"props":982,"children":983},{},[984],{"type":45,"value":985},"JSON escape",{"type":39,"tag":976,"props":987,"children":988},{},[989],{"type":45,"value":990},"Example",{"type":39,"tag":992,"props":993,"children":994},"tbody",{},[995,1022,1048,1074,1100],{"type":39,"tag":972,"props":996,"children":997},{},[998,1004,1013],{"type":39,"tag":999,"props":1000,"children":1001},"td",{},[1002],{"type":45,"value":1003},"Enter",{"type":39,"tag":999,"props":1005,"children":1006},{},[1007],{"type":39,"tag":54,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":45,"value":1012},"\\n",{"type":39,"tag":999,"props":1014,"children":1015},{},[1016],{"type":39,"tag":54,"props":1017,"children":1019},{"className":1018},[],[1020],{"type":45,"value":1021},"input=\"ls -la\\n\"",{"type":39,"tag":972,"props":1023,"children":1024},{},[1025,1030,1039],{"type":39,"tag":999,"props":1026,"children":1027},{},[1028],{"type":45,"value":1029},"Tab",{"type":39,"tag":999,"props":1031,"children":1032},{},[1033],{"type":39,"tag":54,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":45,"value":1038},"\\t",{"type":39,"tag":999,"props":1040,"children":1041},{},[1042],{"type":39,"tag":54,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":45,"value":1047},"input=\"\\t\"",{"type":39,"tag":972,"props":1049,"children":1050},{},[1051,1056,1065],{"type":39,"tag":999,"props":1052,"children":1053},{},[1054],{"type":45,"value":1055},"Ctrl+C",{"type":39,"tag":999,"props":1057,"children":1058},{},[1059],{"type":39,"tag":54,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":45,"value":1064},"\\u0003",{"type":39,"tag":999,"props":1066,"children":1067},{},[1068],{"type":39,"tag":54,"props":1069,"children":1071},{"className":1070},[],[1072],{"type":45,"value":1073},"input=\"\\u0003\"",{"type":39,"tag":972,"props":1075,"children":1076},{},[1077,1082,1091],{"type":39,"tag":999,"props":1078,"children":1079},{},[1080],{"type":45,"value":1081},"Ctrl+D",{"type":39,"tag":999,"props":1083,"children":1084},{},[1085],{"type":39,"tag":54,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":45,"value":1090},"\\u0004",{"type":39,"tag":999,"props":1092,"children":1093},{},[1094],{"type":39,"tag":54,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":45,"value":1099},"input=\"\\u0004\"",{"type":39,"tag":972,"props":1101,"children":1102},{},[1103,1108,1117],{"type":39,"tag":999,"props":1104,"children":1105},{},[1106],{"type":45,"value":1107},"Escape",{"type":39,"tag":999,"props":1109,"children":1110},{},[1111],{"type":39,"tag":54,"props":1112,"children":1114},{"className":1113},[],[1115],{"type":45,"value":1116},"\\u001b",{"type":39,"tag":999,"props":1118,"children":1119},{},[1120],{"type":39,"tag":54,"props":1121,"children":1123},{"className":1122},[],[1124],{"type":45,"value":1125},"input=\"\\u001b\"",{"type":39,"tag":48,"props":1127,"children":1128},{},[1129,1131,1137],{"type":45,"value":1130},"Any Ctrl+key = ",{"type":39,"tag":54,"props":1132,"children":1134},{"className":1133},[],[1135],{"type":45,"value":1136},"\\u00XX",{"type":45,"value":1138}," where XX is the ASCII code (A=01, B=02, ..., Z=1a).",{"type":39,"tag":402,"props":1140,"children":1142},{"id":1141},"wait-for-idle",[1143],{"type":45,"value":1144},"Wait for Idle",{"type":39,"tag":48,"props":1146,"children":1147},{},[1148,1150,1155],{"type":45,"value":1149},"Block until the terminal has been idle for ",{"type":39,"tag":54,"props":1151,"children":1153},{"className":1152},[],[1154],{"type":45,"value":466},{"type":45,"value":1156}," milliseconds.\nThis is a hint that the program may be idle — it could also just be\nworking without producing output.",{"type":39,"tag":48,"props":1158,"children":1159},{},[1160,1161,1166],{"type":45,"value":417},{"type":39,"tag":54,"props":1162,"children":1164},{"className":1163},[],[1165],{"type":45,"value":276},{"type":45,"value":425},{"type":39,"tag":427,"props":1168,"children":1169},{},[1170,1179,1189],{"type":39,"tag":337,"props":1171,"children":1172},{},[1173,1178],{"type":39,"tag":54,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":45,"value":121},{"type":45,"value":589},{"type":39,"tag":337,"props":1180,"children":1181},{},[1182,1187],{"type":39,"tag":54,"props":1183,"children":1185},{"className":1184},[],[1186],{"type":45,"value":466},{"type":45,"value":1188}," — idle duration to wait for (default 2000)",{"type":39,"tag":337,"props":1190,"children":1191},{},[1192,1197],{"type":39,"tag":54,"props":1193,"children":1195},{"className":1194},[],[1196],{"type":45,"value":477},{"type":45,"value":479},{"type":39,"tag":48,"props":1199,"children":1200},{},[1201,1202,1208,1210,1215],{"type":45,"value":787},{"type":39,"tag":54,"props":1203,"children":1205},{"className":1204},[],[1206],{"type":45,"value":1207},"{\"status\": \"idle\", \"generation\": N}",{"type":45,"value":1209}," once idle.\nReturns an error result if the terminal doesn't settle within\n",{"type":39,"tag":54,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":45,"value":477},{"type":45,"value":320},{"type":39,"tag":402,"props":1217,"children":1219},{"id":1218},"read-the-screen",[1220],{"type":45,"value":1221},"Read the Screen",{"type":39,"tag":48,"props":1223,"children":1224},{},[1225],{"type":45,"value":1226},"Get the current visible screen contents.",{"type":39,"tag":48,"props":1228,"children":1229},{},[1230,1231,1236],{"type":45,"value":417},{"type":39,"tag":54,"props":1232,"children":1234},{"className":1233},[],[1235],{"type":45,"value":169},{"type":45,"value":425},{"type":39,"tag":427,"props":1238,"children":1239},{},[1240,1249],{"type":39,"tag":337,"props":1241,"children":1242},{},[1243,1248],{"type":39,"tag":54,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":45,"value":121},{"type":45,"value":589},{"type":39,"tag":337,"props":1250,"children":1251},{},[1252,1257,1258,1263,1265,1270,1272,1277],{"type":39,"tag":54,"props":1253,"children":1255},{"className":1254},[],[1256],{"type":45,"value":488},{"type":45,"value":490},{"type":39,"tag":54,"props":1259,"children":1261},{"className":1260},[],[1262],{"type":45,"value":496},{"type":45,"value":1264}," for simple text or ",{"type":39,"tag":54,"props":1266,"children":1268},{"className":1267},[],[1269],{"type":45,"value":504},{"type":45,"value":1271}," for spans with color\u002Fformatting (default ",{"type":39,"tag":54,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":45,"value":504},{"type":45,"value":446},{"type":39,"tag":402,"props":1279,"children":1281},{"id":1280},"read-scrollback",[1282],{"type":45,"value":1283},"Read Scrollback",{"type":39,"tag":48,"props":1285,"children":1286},{},[1287],{"type":45,"value":1288},"Get historical output that has scrolled off screen.",{"type":39,"tag":48,"props":1290,"children":1291},{},[1292,1293,1299],{"type":45,"value":417},{"type":39,"tag":54,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":45,"value":1298},"wsh_get_scrollback",{"type":45,"value":425},{"type":39,"tag":427,"props":1301,"children":1302},{},[1303,1312,1323,1334],{"type":39,"tag":337,"props":1304,"children":1305},{},[1306,1311],{"type":39,"tag":54,"props":1307,"children":1309},{"className":1308},[],[1310],{"type":45,"value":121},{"type":45,"value":589},{"type":39,"tag":337,"props":1313,"children":1314},{},[1315,1321],{"type":39,"tag":54,"props":1316,"children":1318},{"className":1317},[],[1319],{"type":45,"value":1320},"offset",{"type":45,"value":1322}," — line offset into scrollback (default 0)",{"type":39,"tag":337,"props":1324,"children":1325},{},[1326,1332],{"type":39,"tag":54,"props":1327,"children":1329},{"className":1328},[],[1330],{"type":45,"value":1331},"limit",{"type":45,"value":1333}," — max lines to return (default 100)",{"type":39,"tag":337,"props":1335,"children":1336},{},[1337,1342,1343,1348,1349,1354,1355,1360],{"type":39,"tag":54,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":45,"value":488},{"type":45,"value":490},{"type":39,"tag":54,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":45,"value":496},{"type":45,"value":498},{"type":39,"tag":54,"props":1350,"children":1352},{"className":1351},[],[1353],{"type":45,"value":504},{"type":45,"value":506},{"type":39,"tag":54,"props":1356,"children":1358},{"className":1357},[],[1359],{"type":45,"value":504},{"type":45,"value":446},{"type":39,"tag":97,"props":1362,"children":1364},{"id":1363},"visual-elements",[1365],{"type":45,"value":1366},"Visual Elements",{"type":39,"tag":402,"props":1368,"children":1370},{"id":1369},"overlays",[1371],{"type":45,"value":1372},"Overlays",{"type":39,"tag":48,"props":1374,"children":1375},{},[1376],{"type":45,"value":1377},"Floating text positioned on top of terminal content. They don't\naffect the terminal — they're a layer on top.",{"type":39,"tag":48,"props":1379,"children":1380},{},[1381,1382,1388],{"type":45,"value":417},{"type":39,"tag":54,"props":1383,"children":1385},{"className":1384},[],[1386],{"type":45,"value":1387},"wsh_overlay",{"type":45,"value":1389}," to create, update, or list overlays:",{"type":39,"tag":48,"props":1391,"children":1392},{},[1393],{"type":39,"tag":68,"props":1394,"children":1395},{},[1396],{"type":45,"value":1397},"Create an overlay:",{"type":39,"tag":225,"props":1399,"children":1402},{"className":1400,"code":1401,"language":45},[228],"wsh_overlay(\n  session=\"default\",\n  x=0, y=0, width=20, height=1,\n  spans=[{\"text\": \"Hello!\", \"bold\": true}]\n)\n",[1403],{"type":39,"tag":54,"props":1404,"children":1405},{"__ignoreMap":233},[1406],{"type":45,"value":1401},{"type":39,"tag":48,"props":1408,"children":1409},{},[1410,1411,1417],{"type":45,"value":787},{"type":39,"tag":54,"props":1412,"children":1414},{"className":1413},[],[1415],{"type":45,"value":1416},"{\"status\": \"created\", \"id\": \"uuid\"}",{"type":45,"value":1418}," — use this ID to update or delete.",{"type":39,"tag":48,"props":1420,"children":1421},{},[1422,1427,1429,1435],{"type":39,"tag":68,"props":1423,"children":1424},{},[1425],{"type":45,"value":1426},"Update an overlay",{"type":45,"value":1428}," (provide ",{"type":39,"tag":54,"props":1430,"children":1432},{"className":1431},[],[1433],{"type":45,"value":1434},"id",{"type":45,"value":1436},"):",{"type":39,"tag":225,"props":1438,"children":1441},{"className":1439,"code":1440,"language":45},[228],"wsh_overlay(\n  session=\"default\",\n  id=\"\u003Coverlay-id>\",\n  spans=[{\"text\": \"Updated!\", \"fg\": \"green\"}]\n)\n",[1442],{"type":39,"tag":54,"props":1443,"children":1444},{"__ignoreMap":233},[1445],{"type":45,"value":1440},{"type":39,"tag":48,"props":1447,"children":1448},{},[1449],{"type":39,"tag":68,"props":1450,"children":1451},{},[1452],{"type":45,"value":1453},"List overlays:",{"type":39,"tag":225,"props":1455,"children":1458},{"className":1456,"code":1457,"language":45},[228],"wsh_overlay(session=\"default\", list=true)\n",[1459],{"type":39,"tag":54,"props":1460,"children":1461},{"__ignoreMap":233},[1462],{"type":45,"value":1457},{"type":39,"tag":48,"props":1464,"children":1465},{},[1466,1471,1473,1479],{"type":39,"tag":68,"props":1467,"children":1468},{},[1469],{"type":45,"value":1470},"Opaque overlays:",{"type":45,"value":1472}," Add ",{"type":39,"tag":54,"props":1474,"children":1476},{"className":1475},[],[1477],{"type":45,"value":1478},"background",{"type":45,"value":1480}," to fill the rectangle with a\nsolid color, making it a window-like element:",{"type":39,"tag":225,"props":1482,"children":1485},{"className":1483,"code":1484,"language":45},[228],"wsh_overlay(\n  session=\"default\",\n  x=10, y=5, width=40, height=10,\n  background={\"bg\": \"black\"},\n  spans=[{\"text\": \"Window content\"}]\n)\n",[1486],{"type":39,"tag":54,"props":1487,"children":1488},{"__ignoreMap":233},[1489],{"type":45,"value":1484},{"type":39,"tag":48,"props":1491,"children":1492},{},[1493,1495,1501,1503,1509],{"type":45,"value":1494},"Background accepts named colors (",{"type":39,"tag":54,"props":1496,"children":1498},{"className":1497},[],[1499],{"type":45,"value":1500},"\"blue\"",{"type":45,"value":1502},") or RGB\n(",{"type":39,"tag":54,"props":1504,"children":1506},{"className":1505},[],[1507],{"type":45,"value":1508},"{\"r\": 30, \"g\": 30, \"b\": 30}",{"type":45,"value":131},{"type":39,"tag":48,"props":1511,"children":1512},{},[1513,1518,1519,1525],{"type":39,"tag":68,"props":1514,"children":1515},{},[1516],{"type":45,"value":1517},"Focusable:",{"type":45,"value":1472},{"type":39,"tag":54,"props":1520,"children":1522},{"className":1521},[],[1523],{"type":45,"value":1524},"focusable=true",{"type":45,"value":1526}," to allow focus routing during\ninput capture (see Input Capture below).",{"type":39,"tag":48,"props":1528,"children":1529},{},[1530,1531,1537],{"type":45,"value":417},{"type":39,"tag":54,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":45,"value":1536},"wsh_remove_overlay",{"type":45,"value":1538}," to remove overlays:",{"type":39,"tag":427,"props":1540,"children":1541},{},[1542,1554],{"type":39,"tag":337,"props":1543,"children":1544},{},[1545,1547,1552],{"type":45,"value":1546},"With ",{"type":39,"tag":54,"props":1548,"children":1550},{"className":1549},[],[1551],{"type":45,"value":1434},{"type":45,"value":1553}," — remove a specific overlay",{"type":39,"tag":337,"props":1555,"children":1556},{},[1557,1559,1564],{"type":45,"value":1558},"Without ",{"type":39,"tag":54,"props":1560,"children":1562},{"className":1561},[],[1563],{"type":45,"value":1434},{"type":45,"value":1565}," — clear all overlays",{"type":39,"tag":48,"props":1567,"children":1568},{},[1569,1571,1577],{"type":45,"value":1570},"Use overlays for: tooltips, status indicators, annotations,\nnotifications — anything that should appear ",{"type":39,"tag":1572,"props":1573,"children":1574},"em",{},[1575],{"type":45,"value":1576},"on top of",{"type":45,"value":1578}," the\nterminal without disrupting it. With explicit dimensions: windows,\ndialogs, cards.",{"type":39,"tag":402,"props":1580,"children":1582},{"id":1581},"panels",[1583],{"type":45,"value":1584},"Panels",{"type":39,"tag":48,"props":1586,"children":1587},{},[1588,1590,1595],{"type":45,"value":1589},"Agent-owned screen regions at the top or bottom of the terminal.\nUnlike overlays, panels ",{"type":39,"tag":68,"props":1591,"children":1592},{},[1593],{"type":45,"value":1594},"shrink the PTY",{"type":45,"value":1596}," — they carve out\ndedicated space.",{"type":39,"tag":48,"props":1598,"children":1599},{},[1600,1601,1607],{"type":45,"value":417},{"type":39,"tag":54,"props":1602,"children":1604},{"className":1603},[],[1605],{"type":45,"value":1606},"wsh_panel",{"type":45,"value":1608}," to create, update, or list panels:",{"type":39,"tag":48,"props":1610,"children":1611},{},[1612],{"type":39,"tag":68,"props":1613,"children":1614},{},[1615],{"type":45,"value":1616},"Create a panel:",{"type":39,"tag":225,"props":1618,"children":1621},{"className":1619,"code":1620,"language":45},[228],"wsh_panel(\n  session=\"default\",\n  position=\"bottom\", height=3,\n  spans=[{\"text\": \"Status: running\"}]\n)\n",[1622],{"type":39,"tag":54,"props":1623,"children":1624},{"__ignoreMap":233},[1625],{"type":45,"value":1620},{"type":39,"tag":48,"props":1627,"children":1628},{},[1629,1634,1635,1640],{"type":39,"tag":68,"props":1630,"children":1631},{},[1632],{"type":45,"value":1633},"Update a panel",{"type":45,"value":1428},{"type":39,"tag":54,"props":1636,"children":1638},{"className":1637},[],[1639],{"type":45,"value":1434},{"type":45,"value":1436},{"type":39,"tag":225,"props":1642,"children":1645},{"className":1643,"code":1644,"language":45},[228],"wsh_panel(\n  session=\"default\",\n  id=\"\u003Cpanel-id>\",\n  spans=[{\"text\": \"Status: done\", \"fg\": \"green\"}]\n)\n",[1646],{"type":39,"tag":54,"props":1647,"children":1648},{"__ignoreMap":233},[1649],{"type":45,"value":1644},{"type":39,"tag":48,"props":1651,"children":1652},{},[1653],{"type":39,"tag":68,"props":1654,"children":1655},{},[1656],{"type":45,"value":1657},"List panels:",{"type":39,"tag":225,"props":1659,"children":1662},{"className":1660,"code":1661,"language":45},[228],"wsh_panel(session=\"default\", list=true)\n",[1663],{"type":39,"tag":54,"props":1664,"children":1665},{"__ignoreMap":233},[1666],{"type":45,"value":1661},{"type":39,"tag":48,"props":1668,"children":1669},{},[1670,1675,1676,1681],{"type":39,"tag":68,"props":1671,"children":1672},{},[1673],{"type":45,"value":1674},"Background:",{"type":45,"value":1472},{"type":39,"tag":54,"props":1677,"children":1679},{"className":1678},[],[1680],{"type":45,"value":1478},{"type":45,"value":1682}," to fill the panel with a solid color:",{"type":39,"tag":225,"props":1684,"children":1687},{"className":1685,"code":1686,"language":45},[228],"wsh_panel(\n  session=\"default\",\n  position=\"bottom\", height=2,\n  background={\"bg\": \"blue\"},\n  spans=[{\"text\": \"Status: ok\"}]\n)\n",[1688],{"type":39,"tag":54,"props":1689,"children":1690},{"__ignoreMap":233},[1691],{"type":45,"value":1686},{"type":39,"tag":48,"props":1693,"children":1694},{},[1695,1699,1700,1705],{"type":39,"tag":68,"props":1696,"children":1697},{},[1698],{"type":45,"value":1517},{"type":45,"value":1472},{"type":39,"tag":54,"props":1701,"children":1703},{"className":1702},[],[1704],{"type":45,"value":1524},{"type":45,"value":1706}," to allow focus routing during\ninput capture.",{"type":39,"tag":48,"props":1708,"children":1709},{},[1710,1711,1717],{"type":45,"value":417},{"type":39,"tag":54,"props":1712,"children":1714},{"className":1713},[],[1715],{"type":45,"value":1716},"wsh_remove_panel",{"type":45,"value":1718}," to remove panels:",{"type":39,"tag":427,"props":1720,"children":1721},{},[1722,1733],{"type":39,"tag":337,"props":1723,"children":1724},{},[1725,1726,1731],{"type":45,"value":1546},{"type":39,"tag":54,"props":1727,"children":1729},{"className":1728},[],[1730],{"type":45,"value":1434},{"type":45,"value":1732}," — remove a specific panel",{"type":39,"tag":337,"props":1734,"children":1735},{},[1736,1737,1742],{"type":45,"value":1558},{"type":39,"tag":54,"props":1738,"children":1740},{"className":1739},[],[1741],{"type":45,"value":1434},{"type":45,"value":1743}," — clear all panels",{"type":39,"tag":48,"props":1745,"children":1746},{},[1747],{"type":45,"value":1748},"Use panels for: persistent status bars, progress displays,\ncontext summaries — anything that deserves its own screen\nreal estate.",{"type":39,"tag":402,"props":1750,"children":1752},{"id":1751},"input-capture",[1753],{"type":45,"value":1754},"Input Capture",{"type":39,"tag":48,"props":1756,"children":1757},{},[1758],{"type":45,"value":1759},"Intercept keyboard input so it comes to you instead of the shell.",{"type":39,"tag":48,"props":1761,"children":1762},{},[1763,1764,1770],{"type":45,"value":417},{"type":39,"tag":54,"props":1765,"children":1767},{"className":1766},[],[1768],{"type":45,"value":1769},"wsh_input_mode",{"type":45,"value":1771}," to query or change input mode and focus:",{"type":39,"tag":427,"props":1773,"children":1774},{},[1775,1786,1797,1808,1819],{"type":39,"tag":337,"props":1776,"children":1777},{},[1778,1784],{"type":39,"tag":54,"props":1779,"children":1781},{"className":1780},[],[1782],{"type":45,"value":1783},"mode=\"capture\"",{"type":45,"value":1785}," — grab input (keystrokes go to API only)",{"type":39,"tag":337,"props":1787,"children":1788},{},[1789,1795],{"type":39,"tag":54,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":45,"value":1794},"mode=\"release\"",{"type":45,"value":1796}," — release back (keystrokes go to PTY)",{"type":39,"tag":337,"props":1798,"children":1799},{},[1800,1806],{"type":39,"tag":54,"props":1801,"children":1803},{"className":1802},[],[1804],{"type":45,"value":1805},"focus=\"\u003Celement-id>\"",{"type":45,"value":1807}," — direct captured input to a specific focusable overlay or panel",{"type":39,"tag":337,"props":1809,"children":1810},{},[1811,1817],{"type":39,"tag":54,"props":1812,"children":1814},{"className":1813},[],[1815],{"type":45,"value":1816},"unfocus=true",{"type":45,"value":1818}," — clear focus",{"type":39,"tag":337,"props":1820,"children":1821},{},[1822],{"type":45,"value":1823},"No mode\u002Ffocus params — query current state",{"type":39,"tag":48,"props":1825,"children":1826},{},[1827],{"type":45,"value":1828},"The human can press Ctrl+\\ to toggle capture mode (it switches\nbetween passthrough and capture).",{"type":39,"tag":48,"props":1830,"children":1831},{},[1832],{"type":45,"value":1833},"Focus is automatically cleared when input is released or when the\nfocused element is deleted.",{"type":39,"tag":48,"props":1835,"children":1836},{},[1837],{"type":45,"value":1838},"Use input capture for: approval prompts, custom menus, interactive\ndialogs between you and the human.",{"type":39,"tag":402,"props":1840,"children":1842},{"id":1841},"alternate-screen-mode",[1843],{"type":45,"value":1844},"Alternate Screen Mode",{"type":39,"tag":48,"props":1846,"children":1847},{},[1848],{"type":45,"value":1849},"Enter a separate screen mode where you can create a completely\nindependent set of overlays and panels. Exiting cleans up everything\nautomatically.",{"type":39,"tag":48,"props":1851,"children":1852},{},[1853,1854,1860],{"type":45,"value":417},{"type":39,"tag":54,"props":1855,"children":1857},{"className":1856},[],[1858],{"type":45,"value":1859},"wsh_screen_mode",{"type":45,"value":1861}," to query or change screen mode:",{"type":39,"tag":427,"props":1863,"children":1864},{},[1865,1876,1887],{"type":39,"tag":337,"props":1866,"children":1867},{},[1868,1874],{"type":39,"tag":54,"props":1869,"children":1871},{"className":1870},[],[1872],{"type":45,"value":1873},"action=\"enter_alt\"",{"type":45,"value":1875}," — enter alternate screen mode",{"type":39,"tag":337,"props":1877,"children":1878},{},[1879,1885],{"type":39,"tag":54,"props":1880,"children":1882},{"className":1881},[],[1883],{"type":45,"value":1884},"action=\"exit_alt\"",{"type":45,"value":1886}," — exit alternate screen mode",{"type":39,"tag":337,"props":1888,"children":1889},{},[1890,1892,1898,1899,1905],{"type":45,"value":1891},"No action — query current mode (",{"type":39,"tag":54,"props":1893,"children":1895},{"className":1894},[],[1896],{"type":45,"value":1897},"\"normal\"",{"type":45,"value":498},{"type":39,"tag":54,"props":1900,"children":1902},{"className":1901},[],[1903],{"type":45,"value":1904},"\"alt\"",{"type":45,"value":446},{"type":39,"tag":48,"props":1907,"children":1908},{},[1909],{"type":45,"value":1910},"Overlays and panels are automatically tagged with the screen mode\nactive at the time of creation. When you exit alt screen, all elements\ncreated in alt mode are deleted and the original screen's elements\nare restored.",{"type":39,"tag":48,"props":1912,"children":1913},{},[1914],{"type":45,"value":1915},"Use alt screen mode for: temporary full-screen agent UIs, setup\nwizards, immersive dashboards — anything that needs a clean canvas\nand should leave no trace when done.",{"type":39,"tag":97,"props":1917,"children":1919},{"id":1918},"session-management",[1920],{"type":45,"value":1921},"Session Management",{"type":39,"tag":48,"props":1923,"children":1924},{},[1925],{"type":45,"value":1926},"wsh always runs as a server daemon managing sessions. Use these tools\nto manage session lifecycle:",{"type":39,"tag":402,"props":1928,"children":1930},{"id":1929},"list-sessions",[1931],{"type":45,"value":1932},"List Sessions",{"type":39,"tag":225,"props":1934,"children":1937},{"className":1935,"code":1936,"language":45},[228],"wsh_list_sessions()                          # list all\nwsh_list_sessions(session=\"build\")           # get details for one\nwsh_list_sessions(tag=[\"build\", \"ci\"])        # filter by tags\n",[1938],{"type":39,"tag":54,"props":1939,"children":1940},{"__ignoreMap":233},[1941],{"type":45,"value":1936},{"type":39,"tag":402,"props":1943,"children":1945},{"id":1944},"create-sessions",[1946],{"type":45,"value":1947},"Create Sessions",{"type":39,"tag":225,"props":1949,"children":1952},{"className":1950,"code":1951,"language":45},[228],"wsh_create_session(name=\"build\", command=\"cargo build\", tags=[\"build\", \"ci\"])\n",[1953],{"type":39,"tag":54,"props":1954,"children":1955},{"__ignoreMap":233},[1956],{"type":45,"value":1951},{"type":39,"tag":48,"props":1958,"children":1959},{},[1960,1962,1968,1969,1975,1976,1982,1983,1989,1990,1996,1998,2004],{"type":45,"value":1961},"Optional parameters: ",{"type":39,"tag":54,"props":1963,"children":1965},{"className":1964},[],[1966],{"type":45,"value":1967},"rows",{"type":45,"value":163},{"type":39,"tag":54,"props":1970,"children":1972},{"className":1971},[],[1973],{"type":45,"value":1974},"cols",{"type":45,"value":163},{"type":39,"tag":54,"props":1977,"children":1979},{"className":1978},[],[1980],{"type":45,"value":1981},"cwd",{"type":45,"value":163},{"type":39,"tag":54,"props":1984,"children":1986},{"className":1985},[],[1987],{"type":45,"value":1988},"env",{"type":45,"value":163},{"type":39,"tag":54,"props":1991,"children":1993},{"className":1992},[],[1994],{"type":45,"value":1995},"tags",{"type":45,"value":1997},".\nReturns ",{"type":39,"tag":54,"props":1999,"children":2001},{"className":2000},[],[2002],{"type":45,"value":2003},"{\"name\": \"build\", \"rows\": 24, \"cols\": 80, \"tags\": [\"build\", \"ci\"]}",{"type":45,"value":320},{"type":39,"tag":48,"props":2006,"children":2007},{},[2008,2013,2015,2021,2023,2029],{"type":39,"tag":68,"props":2009,"children":2010},{},[2011],{"type":45,"value":2012},"Session name rules:",{"type":45,"value":2014}," Names must be 1-64 characters and contain only\nletters, digits, dots, hyphens, and underscores (",{"type":39,"tag":54,"props":2016,"children":2018},{"className":2017},[],[2019],{"type":45,"value":2020},"[a-zA-Z0-9._-]",{"type":45,"value":2022},").\nInvalid names return an ",{"type":39,"tag":54,"props":2024,"children":2026},{"className":2025},[],[2027],{"type":45,"value":2028},"invalid_session_name",{"type":45,"value":2030}," error. If omitted, the\nserver auto-generates a valid name.",{"type":39,"tag":48,"props":2032,"children":2033},{},[2034,2039,2040,2045,2047,2052],{"type":39,"tag":68,"props":2035,"children":2036},{},[2037],{"type":45,"value":2038},"Terminal dimensions:",{"type":45,"value":646},{"type":39,"tag":54,"props":2041,"children":2043},{"className":2042},[],[2044],{"type":45,"value":1967},{"type":45,"value":2046}," and ",{"type":39,"tag":54,"props":2048,"children":2050},{"className":2049},[],[2051],{"type":45,"value":1974},{"type":45,"value":2053}," are clamped to 1-1000.",{"type":39,"tag":48,"props":2055,"children":2056},{},[2057],{"type":45,"value":2058},"Tags are optional string labels (1-64 chars, alphanumeric plus\nhyphens, underscores, and dots). Use them to group and filter\nsessions by purpose.",{"type":39,"tag":402,"props":2060,"children":2062},{"id":2061},"manage-sessions",[2063],{"type":45,"value":2064},"Manage Sessions",{"type":39,"tag":225,"props":2066,"children":2069},{"className":2067,"code":2068,"language":45},[228],"wsh_manage_session(session=\"build\", action=\"kill\")            # destroy\nwsh_manage_session(session=\"build\", action=\"rename\", new_name=\"build-v2\")  # rename (same name rules apply)\nwsh_manage_session(session=\"build\", action=\"detach\")          # disconnect clients\nwsh_manage_session(session=\"build\", action=\"add_tags\", tags=[\"production\"])  # add tags\nwsh_manage_session(session=\"build\", action=\"remove_tags\", tags=[\"draft\"])    # remove tags\n",[2070],{"type":39,"tag":54,"props":2071,"children":2072},{"__ignoreMap":233},[2073],{"type":45,"value":2068},{"type":39,"tag":402,"props":2075,"children":2077},{"id":2076},"default-session",[2078],{"type":45,"value":2079},"Default Session",{"type":39,"tag":48,"props":2081,"children":2082},{},[2083,2085,2090,2092,2098,2100,2106,2108,2114],{"type":45,"value":2084},"When wsh is started with ",{"type":39,"tag":54,"props":2086,"children":2088},{"className":2087},[],[2089],{"type":45,"value":59},{"type":45,"value":2091}," (no arguments), it auto-spawns an\nephemeral server daemon (listening on Unix domain socket only) and\ncreates a session named ",{"type":39,"tag":54,"props":2093,"children":2095},{"className":2094},[],[2096],{"type":45,"value":2097},"default",{"type":45,"value":2099},". Use ",{"type":39,"tag":54,"props":2101,"children":2103},{"className":2102},[],[2104],{"type":45,"value":2105},"session=\"default\"",{"type":45,"value":2107}," for all\ntool calls. If started with ",{"type":39,"tag":54,"props":2109,"children":2111},{"className":2110},[],[2112],{"type":45,"value":2113},"--name",{"type":45,"value":2115},", the session has that name instead.",{"type":39,"tag":97,"props":2117,"children":2119},{"id":2118},"federation-multi-server",[2120],{"type":45,"value":2121},"Federation (Multi-Server)",{"type":39,"tag":48,"props":2123,"children":2124},{},[2125,2127,2133],{"type":45,"value":2126},"When wsh is configured with federated backends, all session tools accept an\noptional ",{"type":39,"tag":54,"props":2128,"children":2130},{"className":2129},[],[2131],{"type":45,"value":2132},"server",{"type":45,"value":2134}," parameter to target a specific backend by hostname. When\nomitted, operations target the local server (or aggregate across all servers\nfor listings).",{"type":39,"tag":402,"props":2136,"children":2138},{"id":2137},"server-parameter-on-session-tools",[2139],{"type":45,"value":2140},"Server Parameter on Session Tools",{"type":39,"tag":48,"props":2142,"children":2143},{},[2144,2146,2152],{"type":45,"value":2145},"Add ",{"type":39,"tag":54,"props":2147,"children":2149},{"className":2148},[],[2150],{"type":45,"value":2151},"server=\"\u003Chostname>\"",{"type":45,"value":2153}," to any session tool to route it to a specific backend:",{"type":39,"tag":225,"props":2155,"children":2158},{"className":2156,"code":2157,"language":45},[228],"wsh_create_session(name=\"build\", server=\"prod-1\", command=\"cargo build\")\nwsh_get_screen(session=\"build\", server=\"prod-1\")\nwsh_list_sessions(server=\"prod-1\")       # list sessions on one backend\nwsh_list_sessions()                       # aggregate across all servers\n",[2159],{"type":39,"tag":54,"props":2160,"children":2161},{"__ignoreMap":233},[2162],{"type":45,"value":2157},{"type":39,"tag":48,"props":2164,"children":2165},{},[2166,2168,2173],{"type":45,"value":2167},"Session responses include a ",{"type":39,"tag":54,"props":2169,"children":2171},{"className":2170},[],[2172],{"type":45,"value":2132},{"type":45,"value":2174}," field indicating which server owns\nthe session. Once a session exists, all operations are automatically routed\nto the correct server.",{"type":39,"tag":402,"props":2176,"children":2178},{"id":2177},"server-management-tools",[2179],{"type":45,"value":2180},"Server Management Tools",{"type":39,"tag":48,"props":2182,"children":2183},{},[2184],{"type":45,"value":2185},"Use these tools to discover and manage the cluster:",{"type":39,"tag":48,"props":2187,"children":2188},{},[2189],{"type":39,"tag":68,"props":2190,"children":2191},{},[2192],{"type":45,"value":2193},"List all servers:",{"type":39,"tag":225,"props":2195,"children":2198},{"className":2196,"code":2197,"language":45},[228],"wsh_list_servers()\n",[2199],{"type":39,"tag":54,"props":2200,"children":2201},{"__ignoreMap":233},[2202],{"type":45,"value":2197},{"type":39,"tag":48,"props":2204,"children":2205},{},[2206,2208,2214,2215,2221,2222,2228],{"type":45,"value":2207},"Returns all servers (hub + backends) with hostname, address, health\n(",{"type":39,"tag":54,"props":2209,"children":2211},{"className":2210},[],[2212],{"type":45,"value":2213},"healthy",{"type":45,"value":163},{"type":39,"tag":54,"props":2216,"children":2218},{"className":2217},[],[2219],{"type":45,"value":2220},"connecting",{"type":45,"value":163},{"type":39,"tag":54,"props":2223,"children":2225},{"className":2224},[],[2226],{"type":45,"value":2227},"unavailable",{"type":45,"value":2229},"), and role.",{"type":39,"tag":48,"props":2231,"children":2232},{},[2233],{"type":39,"tag":68,"props":2234,"children":2235},{},[2236],{"type":45,"value":2237},"Add a backend:",{"type":39,"tag":225,"props":2239,"children":2242},{"className":2240,"code":2241,"language":45},[228],"wsh_add_server(address=\"http:\u002F\u002F10.0.1.10:8080\")\nwsh_add_server(address=\"https:\u002F\u002F10.0.1.11:8443\", token=\"secret\")\n",[2243],{"type":39,"tag":54,"props":2244,"children":2245},{"__ignoreMap":233},[2246],{"type":45,"value":2241},{"type":39,"tag":48,"props":2248,"children":2249},{},[2250,2252,2258,2259,2265,2267,2272,2274,2279],{"type":45,"value":2251},"Addresses require ",{"type":39,"tag":54,"props":2253,"children":2255},{"className":2254},[],[2256],{"type":45,"value":2257},"http:\u002F\u002F",{"type":45,"value":498},{"type":39,"tag":54,"props":2260,"children":2262},{"className":2261},[],[2263],{"type":45,"value":2264},"https:\u002F\u002F",{"type":45,"value":2266}," scheme. The backend starts\nin ",{"type":39,"tag":54,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":45,"value":2220},{"type":45,"value":2273}," state and transitions to ",{"type":39,"tag":54,"props":2275,"children":2277},{"className":2276},[],[2278],{"type":45,"value":2213},{"type":45,"value":2280}," once reachable.",{"type":39,"tag":48,"props":2282,"children":2283},{},[2284],{"type":39,"tag":68,"props":2285,"children":2286},{},[2287],{"type":45,"value":2288},"Check a specific server:",{"type":39,"tag":225,"props":2290,"children":2293},{"className":2291,"code":2292,"language":45},[228],"wsh_server_status(hostname=\"prod-1\")\n",[2294],{"type":39,"tag":54,"props":2295,"children":2296},{"__ignoreMap":233},[2297],{"type":45,"value":2292},{"type":39,"tag":48,"props":2299,"children":2300},{},[2301],{"type":39,"tag":68,"props":2302,"children":2303},{},[2304],{"type":45,"value":2305},"Remove a backend:",{"type":39,"tag":225,"props":2307,"children":2310},{"className":2308,"code":2309,"language":45},[228],"wsh_remove_server(hostname=\"prod-1\")\n",[2311],{"type":39,"tag":54,"props":2312,"children":2313},{"__ignoreMap":233},[2314],{"type":45,"value":2309},{"type":39,"tag":48,"props":2316,"children":2317},{},[2318,2320,2326],{"type":45,"value":2319},"For detailed federation patterns (cross-server workflows, failure\nhandling, distributed quiescence), invoke ",{"type":39,"tag":54,"props":2321,"children":2323},{"className":2322},[],[2324],{"type":45,"value":2325},"wsh:cluster-orchestration",{"type":45,"value":320},{"type":39,"tag":97,"props":2328,"children":2330},{"id":2329},"specialized-skills",[2331],{"type":45,"value":2332},"Specialized Skills",{"type":39,"tag":48,"props":2334,"children":2335},{},[2336],{"type":45,"value":2337},"When your task matches one of these patterns, invoke the\ncorresponding skill for detailed guidance.",{"type":39,"tag":48,"props":2339,"children":2340},{},[2341,2346],{"type":39,"tag":68,"props":2342,"children":2343},{},[2344],{"type":45,"value":2345},"wsh:drive-process",{"type":45,"value":2347}," — You need to run a CLI command and interact\nwith it. Sending input, reading output, handling prompts, navigating\nsequential command-and-response workflows.",{"type":39,"tag":48,"props":2349,"children":2350},{},[2351,2356],{"type":39,"tag":68,"props":2352,"children":2353},{},[2354],{"type":45,"value":2355},"wsh:tui",{"type":45,"value":2357}," — You need to operate a full-screen terminal application\nlike vim, htop, lazygit, or k9s. Reading a 2D grid, sending\nnavigation keys, understanding menus and panes.",{"type":39,"tag":48,"props":2359,"children":2360},{},[2361,2366],{"type":39,"tag":68,"props":2362,"children":2363},{},[2364],{"type":45,"value":2365},"wsh:multi-session",{"type":45,"value":2367}," — You need to run multiple things in parallel.\nSpawning sessions, monitoring them, collecting results across\nsessions.",{"type":39,"tag":48,"props":2369,"children":2370},{},[2371,2376],{"type":39,"tag":68,"props":2372,"children":2373},{},[2374],{"type":45,"value":2375},"wsh:agent-orchestration",{"type":45,"value":2377}," — You need to drive another AI agent\n(Claude Code, Aider, etc.) through its terminal interface. Feeding\ntasks, handling approval prompts, reviewing agent output.",{"type":39,"tag":48,"props":2379,"children":2380},{},[2381,2386],{"type":39,"tag":68,"props":2382,"children":2383},{},[2384],{"type":45,"value":2385},"wsh:monitor",{"type":45,"value":2387}," — You need to watch what a human is doing and react.\nSubscribing to terminal events, detecting patterns, providing\ncontextual assistance or auditing.",{"type":39,"tag":48,"props":2389,"children":2390},{},[2391,2396],{"type":39,"tag":68,"props":2392,"children":2393},{},[2394],{"type":45,"value":2395},"wsh:visual-feedback",{"type":45,"value":2397}," — You need to communicate with the human\nvisually. Building overlay notifications, status panels, progress\ndisplays, contextual annotations.",{"type":39,"tag":48,"props":2399,"children":2400},{},[2401,2406],{"type":39,"tag":68,"props":2402,"children":2403},{},[2404],{"type":45,"value":2405},"wsh:input-capture",{"type":45,"value":2407}," — You need to take over keyboard input\ntemporarily. Building approval workflows, custom menus, interactive\ndialogs.",{"type":39,"tag":48,"props":2409,"children":2410},{},[2411,2416],{"type":39,"tag":68,"props":2412,"children":2413},{},[2414],{"type":45,"value":2415},"wsh:generative-ui",{"type":45,"value":2417}," — You need to build a dynamic interactive\nexperience in the terminal. Combining overlays, panels, input\ncapture, direct drawing, and alternate screen mode to create\nbespoke interfaces on the fly.",{"items":2419,"total":2576},[2420,2436,2450,2464,2476,2488,2500,2511,2527,2541,2553,2565],{"slug":2421,"name":2421,"fn":2422,"description":2423,"org":2424,"tags":2425,"stars":2433,"repoUrl":2434,"updatedAt":2435},"deepclaw-voice","configure phone calls with Deepgram Voice","Set up phone calling to OpenClaw using Deepgram Voice Agent API",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2426,2429,2430],{"name":2427,"slug":2428,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},{"name":2431,"slug":2432,"type":15},"Voice","voice",78,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdeepclaw","2026-07-12T08:29:25.371332",{"slug":2437,"name":2437,"fn":2438,"description":2439,"org":2440,"tags":2441,"stars":2447,"repoUrl":2448,"updatedAt":2449},"1password","manage secrets with 1Password CLI","Set up and use 1Password CLI (op). Use when installing the CLI, enabling desktop app integration, signing in (single or multi-account), or reading\u002Finjecting\u002Frunning secrets via op.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2442,2443,2444],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":2445,"slug":2446,"type":15},"Security","security",23,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdglabs-deepclaw","2026-07-12T08:28:49.991939",{"slug":2451,"name":2451,"fn":2452,"description":2453,"org":2454,"tags":2455,"stars":2447,"repoUrl":2448,"updatedAt":2463},"apple-notes","manage Apple Notes on macOS","Manage Apple Notes via the `memo` CLI on macOS (create, view, edit, delete, search, move, and export notes). Use when a user asks OpenClaw to add a note, list notes, search notes, or manage note folders.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2456,2457,2460],{"name":17,"slug":18,"type":15},{"name":2458,"slug":2459,"type":15},"Knowledge Management","knowledge-management",{"name":2461,"slug":2462,"type":15},"macOS","macos","2026-07-12T08:29:01.538106",{"slug":2465,"name":2465,"fn":2466,"description":2467,"org":2468,"tags":2469,"stars":2447,"repoUrl":2448,"updatedAt":2475},"apple-reminders","manage Apple Reminders via CLI","Manage Apple Reminders via the `remindctl` CLI on macOS (list, add, edit, complete, delete). Supports lists, date filters, and JSON\u002Fplain output.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2470,2471,2472],{"name":17,"slug":18,"type":15},{"name":2461,"slug":2462,"type":15},{"name":2473,"slug":2474,"type":15},"Task Management","task-management","2026-07-12T08:29:14.035414",{"slug":2477,"name":2477,"fn":2478,"description":2479,"org":2480,"tags":2481,"stars":2447,"repoUrl":2448,"updatedAt":2487},"bear-notes","manage Bear notes via CLI","Create, search, and manage Bear notes via grizzly CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2482,2483,2484],{"name":17,"slug":18,"type":15},{"name":2458,"slug":2459,"type":15},{"name":2485,"slug":2486,"type":15},"Notes","notes","2026-07-12T08:28:51.246011",{"slug":2489,"name":2489,"fn":2490,"description":2491,"org":2492,"tags":2493,"stars":2447,"repoUrl":2448,"updatedAt":2499},"blogwatcher","monitor blogs and RSS feeds","Monitor blogs and RSS\u002FAtom feeds for updates using the blogwatcher CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2494,2495,2496],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":2497,"slug":2498,"type":15},"Monitoring","monitoring","2026-07-12T08:29:02.762321",{"slug":2501,"name":2501,"fn":2502,"description":2503,"org":2504,"tags":2505,"stars":2447,"repoUrl":2448,"updatedAt":2510},"blucli","control BluOS audio playback","BluOS CLI (blu) for discovery, playback, grouping, and volume.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2506,2509],{"name":2507,"slug":2508,"type":15},"Audio","audio",{"name":17,"slug":18,"type":15},"2026-07-12T08:28:21.009637",{"slug":2512,"name":2512,"fn":2513,"description":2514,"org":2515,"tags":2516,"stars":2447,"repoUrl":2448,"updatedAt":2526},"bluebubbles","send and manage iMessages","Use when you need to send or manage iMessages via BlueBubbles (recommended iMessage integration). Calls go through the generic message tool with channel=\"bluebubbles\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2517,2520,2523],{"name":2518,"slug":2519,"type":15},"Communications","communications",{"name":2521,"slug":2522,"type":15},"iMessage","imessage",{"name":2524,"slug":2525,"type":15},"Messaging","messaging","2026-07-12T08:28:57.517914",{"slug":2528,"name":2528,"fn":2529,"description":2530,"org":2531,"tags":2532,"stars":2447,"repoUrl":2448,"updatedAt":2540},"camsnap","capture frames and clips from cameras","Capture frames or clips from RTSP\u002FONVIF cameras.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2533,2534,2537],{"name":13,"slug":14,"type":15},{"name":2535,"slug":2536,"type":15},"Camera","camera",{"name":2538,"slug":2539,"type":15},"Media","media","2026-07-12T08:28:28.096134",{"slug":2542,"name":2542,"fn":2543,"description":2544,"org":2545,"tags":2546,"stars":2447,"repoUrl":2448,"updatedAt":2552},"clawhub","manage agent skills with ClawHub","Use the ClawHub CLI to search, install, update, and publish agent skills from clawhub.com. Use when you need to fetch new skills on the fly, sync installed skills to latest or a specific version, or publish new\u002Fupdated skill folders with the npm-installed clawhub CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2547,2550,2551],{"name":2548,"slug":2549,"type":15},"Agents","agents",{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},"2026-07-12T08:28:30.589001",{"slug":2554,"name":2554,"fn":2555,"description":2556,"org":2557,"tags":2558,"stars":2447,"repoUrl":2448,"updatedAt":2564},"coding-agent","run coding agents for programmatic control","Run Codex CLI, Claude Code, OpenCode, or Pi Coding Agent via background process for programmatic control.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2559,2560,2561],{"name":2548,"slug":2549,"type":15},{"name":13,"slug":14,"type":15},{"name":2562,"slug":2563,"type":15},"Coding","coding","2026-07-12T08:29:08.6658",{"slug":2566,"name":2566,"fn":2567,"description":2568,"org":2569,"tags":2570,"stars":2447,"repoUrl":2448,"updatedAt":2575},"eightctl","control Eight Sleep pod settings","Control Eight Sleep pods (status, temperature, alarms, schedules).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2571,2572],{"name":13,"slug":14,"type":15},{"name":2573,"slug":2574,"type":15},"Hardware","hardware","2026-07-12T08:28:39.322181",73,{"items":2578,"total":2653},[2579,2592,2606,2615,2621,2630,2642],{"slug":2580,"name":2580,"fn":2581,"description":2582,"org":2583,"tags":2584,"stars":22,"repoUrl":23,"updatedAt":2591},"agent-orchestration","orchestrate multiple AI agents","Use when you need to launch and drive other AI agents (Claude Code, Aider, Codex, etc.) through their terminal interfaces via wsh. Examples: \"run multiple Claude Code sessions in parallel on different tasks\", \"feed a task to an AI agent and handle its approval prompts\", \"coordinate several AI agents working on subtasks of a larger project\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2585,2586,2587,2588],{"name":2548,"slug":2549,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":2589,"slug":2590,"type":15},"Multi-Agent","multi-agent","2026-07-12T08:29:40.028618",{"slug":2593,"name":2593,"fn":2594,"description":2595,"org":2596,"tags":2597,"stars":22,"repoUrl":23,"updatedAt":2605},"cluster-orchestration","orchestrate sessions across federated clusters","Use when you need to manage sessions across multiple wsh servers in a federated cluster. Examples: \"distribute builds across several machines\", \"create sessions on a specific backend\", \"monitor health across a cluster of servers\", \"coordinate work across server boundaries\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2598,2601,2602],{"name":2599,"slug":2600,"type":15},"Architecture","architecture",{"name":13,"slug":14,"type":15},{"name":2603,"slug":2604,"type":15},"Engineering","engineering","2026-07-12T08:29:38.810244",{"slug":2607,"name":2607,"fn":2608,"description":2609,"org":2610,"tags":2611,"stars":22,"repoUrl":23,"updatedAt":2614},"core","authenticate and bootstrap wsh terminal operations","REQUIRED before any wsh terminal operation when you do NOT have wsh_* MCP tools. Contains the complete HTTP API reference with working curl examples, bootstrap sequence, and authentication guide. wsh has no CLI subcommands for programmatic use — do NOT run 'wsh \u003Cverb>' commands or guess endpoints. Load this skill first.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2612,2613],{"name":291,"slug":288,"type":15},{"name":17,"slug":18,"type":15},"2026-07-12T08:29:32.614733",{"slug":4,"name":4,"fn":5,"description":6,"org":2616,"tags":2617,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2618,2619,2620],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"slug":387,"name":387,"fn":2622,"description":2623,"org":2624,"tags":2625,"stars":22,"repoUrl":23,"updatedAt":2629},"interact with CLI programs via wsh","Use when you need to drive a CLI program through command-and-response interaction via wsh. Examples: \"run a build command and check the output\", \"interact with an installer that asks questions\", \"execute a sequence of shell commands and handle errors\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2626,2627,2628],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":2603,"slug":2604,"type":15},"2026-07-12T08:29:51.485222",{"slug":2631,"name":2631,"fn":2632,"description":2633,"org":2634,"tags":2635,"stars":22,"repoUrl":23,"updatedAt":2641},"generative-ui","build interactive terminal user interfaces","Use when you need to build dynamic, interactive terminal experiences on the fly. Examples: \"create a live dashboard in the terminal\", \"build an interactive file browser\", \"generate a custom TUI for this workflow\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2636,2637,2638],{"name":17,"slug":18,"type":15},{"name":2603,"slug":2604,"type":15},{"name":2639,"slug":2640,"type":15},"Frontend","frontend","2026-07-12T08:29:41.286933",{"slug":2643,"name":2643,"fn":2644,"description":2645,"org":2646,"tags":2647,"stars":22,"repoUrl":23,"updatedAt":2652},"infrastructure-ops","manage infrastructure across multiple servers","Use when you need to manage infrastructure across multiple servers interactively via wsh — deploying applications, configuring services, managing packages, performing rolling updates, and handling the prompts and judgment calls that declarative tools cannot. Examples: \"deploy this application across 10 servers with health checks between each\", \"upgrade packages across the fleet and handle diverse prompts\", \"inspect and modify configuration across servers\", \"roll back a failed deployment\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2648,2649],{"name":17,"slug":18,"type":15},{"name":2650,"slug":2651,"type":15},"Infrastructure","infrastructure","2026-07-12T08:29:57.659886",12]