"""linkagent SDK — run on any honeycomb machine. from linkagent import la; la.run("pro","uname -a") Key: LA_KEY env or ~/.config/linkagent.key. machines: axis · tower · pro · air (la.machines())""" import json, os, urllib.request class LinkAgent: def __init__(self, url=None, key=None): self.url = url or os.environ.get("LA_URL", "https://linkagent.marcusx.fun") p = os.path.expanduser("~/.config/linkagent.key") self.key = key or os.environ.get("LA_KEY") or (open(p).read().strip() if os.path.exists(p) else "") def _post(self, path, body): r = urllib.request.Request(self.url + path, json.dumps(body).encode(), {"content-type": "application/json", "x-key": self.key}) return json.load(urllib.request.urlopen(r, timeout=200)) def machines(self): return json.load(urllib.request.urlopen(self.url + "/machines", timeout=60)) def run(self, machine, code): return self._post("/run", {"machine": machine, "code": code}) def sh(self, machine, code): return self.run(machine, code).get("output", "") def link(self, machine, code): return self._post("/link", {"machine": machine, "code": code})["url"] def tool(self, name, **args): r = self._post("/mcp", {"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": name, "arguments": args}}) return r["result"]["content"][0]["text"] def key_run(self, machine, name, *args): return self.tool("key_run", machine=machine, name=name, args=list(args)) def mint_key(self, name, template, description="", overwrite=False): return self.tool("mint_key", name=name, template=template, description=description, overwrite=overwrite) la = LinkAgent() if __name__ == "__main__": import sys print(la.sh(sys.argv[1], " ".join(sys.argv[2:])) if len(sys.argv) > 2 else json.dumps(la.machines(), indent=1))