@miosa/cli 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/README.md +327 -0
  2. package/dist/bin/miosa.d.ts +3 -0
  3. package/dist/bin/miosa.d.ts.map +1 -0
  4. package/dist/bin/miosa.js +139 -0
  5. package/dist/bin/miosa.js.map +1 -0
  6. package/dist/client.d.ts +74 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +523 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/commands/agent.d.ts +18 -0
  11. package/dist/commands/agent.d.ts.map +1 -0
  12. package/dist/commands/agent.js +468 -0
  13. package/dist/commands/agent.js.map +1 -0
  14. package/dist/commands/alerts.d.ts +3 -0
  15. package/dist/commands/alerts.d.ts.map +1 -0
  16. package/dist/commands/alerts.js +41 -0
  17. package/dist/commands/alerts.js.map +1 -0
  18. package/dist/commands/api-keys.d.ts +3 -0
  19. package/dist/commands/api-keys.d.ts.map +1 -0
  20. package/dist/commands/api-keys.js +119 -0
  21. package/dist/commands/api-keys.js.map +1 -0
  22. package/dist/commands/api-resource.d.ts +20 -0
  23. package/dist/commands/api-resource.d.ts.map +1 -0
  24. package/dist/commands/api-resource.js +120 -0
  25. package/dist/commands/api-resource.js.map +1 -0
  26. package/dist/commands/apps.d.ts +3 -0
  27. package/dist/commands/apps.d.ts.map +1 -0
  28. package/dist/commands/apps.js +218 -0
  29. package/dist/commands/apps.js.map +1 -0
  30. package/dist/commands/audit.d.ts +3 -0
  31. package/dist/commands/audit.d.ts.map +1 -0
  32. package/dist/commands/audit.js +25 -0
  33. package/dist/commands/audit.js.map +1 -0
  34. package/dist/commands/auth.d.ts +3 -0
  35. package/dist/commands/auth.d.ts.map +1 -0
  36. package/dist/commands/auth.js +363 -0
  37. package/dist/commands/auth.js.map +1 -0
  38. package/dist/commands/backups.d.ts +3 -0
  39. package/dist/commands/backups.d.ts.map +1 -0
  40. package/dist/commands/backups.js +23 -0
  41. package/dist/commands/backups.js.map +1 -0
  42. package/dist/commands/checkpoints.d.ts +3 -0
  43. package/dist/commands/checkpoints.d.ts.map +1 -0
  44. package/dist/commands/checkpoints.js +33 -0
  45. package/dist/commands/checkpoints.js.map +1 -0
  46. package/dist/commands/computers.d.ts +3 -0
  47. package/dist/commands/computers.d.ts.map +1 -0
  48. package/dist/commands/computers.js +118 -0
  49. package/dist/commands/computers.js.map +1 -0
  50. package/dist/commands/config.d.ts +3 -0
  51. package/dist/commands/config.d.ts.map +1 -0
  52. package/dist/commands/config.js +114 -0
  53. package/dist/commands/config.js.map +1 -0
  54. package/dist/commands/connect.d.ts +3 -0
  55. package/dist/commands/connect.d.ts.map +1 -0
  56. package/dist/commands/connect.js +96 -0
  57. package/dist/commands/connect.js.map +1 -0
  58. package/dist/commands/containers.d.ts +3 -0
  59. package/dist/commands/containers.d.ts.map +1 -0
  60. package/dist/commands/containers.js +20 -0
  61. package/dist/commands/containers.js.map +1 -0
  62. package/dist/commands/cp.d.ts +3 -0
  63. package/dist/commands/cp.d.ts.map +1 -0
  64. package/dist/commands/cp.js +102 -0
  65. package/dist/commands/cp.js.map +1 -0
  66. package/dist/commands/cron.d.ts +3 -0
  67. package/dist/commands/cron.d.ts.map +1 -0
  68. package/dist/commands/cron.js +65 -0
  69. package/dist/commands/cron.js.map +1 -0
  70. package/dist/commands/databases.d.ts +3 -0
  71. package/dist/commands/databases.d.ts.map +1 -0
  72. package/dist/commands/databases.js +222 -0
  73. package/dist/commands/databases.js.map +1 -0
  74. package/dist/commands/db.d.ts +3 -0
  75. package/dist/commands/db.d.ts.map +1 -0
  76. package/dist/commands/db.js +174 -0
  77. package/dist/commands/db.js.map +1 -0
  78. package/dist/commands/deploy.d.ts +3 -0
  79. package/dist/commands/deploy.d.ts.map +1 -0
  80. package/dist/commands/deploy.js +579 -0
  81. package/dist/commands/deploy.js.map +1 -0
  82. package/dist/commands/desktop.d.ts +3 -0
  83. package/dist/commands/desktop.d.ts.map +1 -0
  84. package/dist/commands/desktop.js +276 -0
  85. package/dist/commands/desktop.js.map +1 -0
  86. package/dist/commands/dev.d.ts +3 -0
  87. package/dist/commands/dev.d.ts.map +1 -0
  88. package/dist/commands/dev.js +246 -0
  89. package/dist/commands/dev.js.map +1 -0
  90. package/dist/commands/doctor.d.ts +3 -0
  91. package/dist/commands/doctor.d.ts.map +1 -0
  92. package/dist/commands/doctor.js +241 -0
  93. package/dist/commands/doctor.js.map +1 -0
  94. package/dist/commands/domains.d.ts +3 -0
  95. package/dist/commands/domains.d.ts.map +1 -0
  96. package/dist/commands/domains.js +31 -0
  97. package/dist/commands/domains.js.map +1 -0
  98. package/dist/commands/enterprise-util.d.ts +37 -0
  99. package/dist/commands/enterprise-util.d.ts.map +1 -0
  100. package/dist/commands/enterprise-util.js +185 -0
  101. package/dist/commands/enterprise-util.js.map +1 -0
  102. package/dist/commands/exec.d.ts +3 -0
  103. package/dist/commands/exec.d.ts.map +1 -0
  104. package/dist/commands/exec.js +68 -0
  105. package/dist/commands/exec.js.map +1 -0
  106. package/dist/commands/functions.d.ts +3 -0
  107. package/dist/commands/functions.d.ts.map +1 -0
  108. package/dist/commands/functions.js +47 -0
  109. package/dist/commands/functions.js.map +1 -0
  110. package/dist/commands/gha-runners.d.ts +3 -0
  111. package/dist/commands/gha-runners.d.ts.map +1 -0
  112. package/dist/commands/gha-runners.js +33 -0
  113. package/dist/commands/gha-runners.js.map +1 -0
  114. package/dist/commands/groups.d.ts +3 -0
  115. package/dist/commands/groups.d.ts.map +1 -0
  116. package/dist/commands/groups.js +38 -0
  117. package/dist/commands/groups.js.map +1 -0
  118. package/dist/commands/host.d.ts +3 -0
  119. package/dist/commands/host.d.ts.map +1 -0
  120. package/dist/commands/host.js +74 -0
  121. package/dist/commands/host.js.map +1 -0
  122. package/dist/commands/hosts.d.ts +3 -0
  123. package/dist/commands/hosts.d.ts.map +1 -0
  124. package/dist/commands/hosts.js +90 -0
  125. package/dist/commands/hosts.js.map +1 -0
  126. package/dist/commands/link.d.ts +8 -0
  127. package/dist/commands/link.d.ts.map +1 -0
  128. package/dist/commands/link.js +124 -0
  129. package/dist/commands/link.js.map +1 -0
  130. package/dist/commands/login.d.ts +3 -0
  131. package/dist/commands/login.d.ts.map +1 -0
  132. package/dist/commands/login.js +172 -0
  133. package/dist/commands/login.js.map +1 -0
  134. package/dist/commands/logout.d.ts +3 -0
  135. package/dist/commands/logout.d.ts.map +1 -0
  136. package/dist/commands/logout.js +17 -0
  137. package/dist/commands/logout.js.map +1 -0
  138. package/dist/commands/logs.d.ts +3 -0
  139. package/dist/commands/logs.d.ts.map +1 -0
  140. package/dist/commands/logs.js +94 -0
  141. package/dist/commands/logs.js.map +1 -0
  142. package/dist/commands/ls.d.ts +3 -0
  143. package/dist/commands/ls.d.ts.map +1 -0
  144. package/dist/commands/ls.js +67 -0
  145. package/dist/commands/ls.js.map +1 -0
  146. package/dist/commands/machines.d.ts +3 -0
  147. package/dist/commands/machines.d.ts.map +1 -0
  148. package/dist/commands/machines.js +29 -0
  149. package/dist/commands/machines.js.map +1 -0
  150. package/dist/commands/mcp.d.ts +21 -0
  151. package/dist/commands/mcp.d.ts.map +1 -0
  152. package/dist/commands/mcp.js +1021 -0
  153. package/dist/commands/mcp.js.map +1 -0
  154. package/dist/commands/meshes.d.ts +3 -0
  155. package/dist/commands/meshes.d.ts.map +1 -0
  156. package/dist/commands/meshes.js +27 -0
  157. package/dist/commands/meshes.js.map +1 -0
  158. package/dist/commands/network-policy.d.ts +3 -0
  159. package/dist/commands/network-policy.d.ts.map +1 -0
  160. package/dist/commands/network-policy.js +40 -0
  161. package/dist/commands/network-policy.js.map +1 -0
  162. package/dist/commands/project.d.ts +4 -0
  163. package/dist/commands/project.d.ts.map +1 -0
  164. package/dist/commands/project.js +25 -0
  165. package/dist/commands/project.js.map +1 -0
  166. package/dist/commands/pull.d.ts +3 -0
  167. package/dist/commands/pull.d.ts.map +1 -0
  168. package/dist/commands/pull.js +155 -0
  169. package/dist/commands/pull.js.map +1 -0
  170. package/dist/commands/regions.d.ts +3 -0
  171. package/dist/commands/regions.d.ts.map +1 -0
  172. package/dist/commands/regions.js +67 -0
  173. package/dist/commands/regions.js.map +1 -0
  174. package/dist/commands/releases.d.ts +3 -0
  175. package/dist/commands/releases.d.ts.map +1 -0
  176. package/dist/commands/releases.js +176 -0
  177. package/dist/commands/releases.js.map +1 -0
  178. package/dist/commands/rm.d.ts +3 -0
  179. package/dist/commands/rm.d.ts.map +1 -0
  180. package/dist/commands/rm.js +42 -0
  181. package/dist/commands/rm.js.map +1 -0
  182. package/dist/commands/run.d.ts +3 -0
  183. package/dist/commands/run.d.ts.map +1 -0
  184. package/dist/commands/run.js +131 -0
  185. package/dist/commands/run.js.map +1 -0
  186. package/dist/commands/sandbox.d.ts +3 -0
  187. package/dist/commands/sandbox.d.ts.map +1 -0
  188. package/dist/commands/sandbox.js +352 -0
  189. package/dist/commands/sandbox.js.map +1 -0
  190. package/dist/commands/schedules.d.ts +3 -0
  191. package/dist/commands/schedules.d.ts.map +1 -0
  192. package/dist/commands/schedules.js +37 -0
  193. package/dist/commands/schedules.js.map +1 -0
  194. package/dist/commands/secrets.d.ts +3 -0
  195. package/dist/commands/secrets.d.ts.map +1 -0
  196. package/dist/commands/secrets.js +194 -0
  197. package/dist/commands/secrets.js.map +1 -0
  198. package/dist/commands/services.d.ts +3 -0
  199. package/dist/commands/services.d.ts.map +1 -0
  200. package/dist/commands/services.js +70 -0
  201. package/dist/commands/services.js.map +1 -0
  202. package/dist/commands/shell.d.ts +16 -0
  203. package/dist/commands/shell.d.ts.map +1 -0
  204. package/dist/commands/shell.js +527 -0
  205. package/dist/commands/shell.js.map +1 -0
  206. package/dist/commands/snapshot.d.ts +10 -0
  207. package/dist/commands/snapshot.d.ts.map +1 -0
  208. package/dist/commands/snapshot.js +181 -0
  209. package/dist/commands/snapshot.js.map +1 -0
  210. package/dist/commands/ssh.d.ts +3 -0
  211. package/dist/commands/ssh.d.ts.map +1 -0
  212. package/dist/commands/ssh.js +37 -0
  213. package/dist/commands/ssh.js.map +1 -0
  214. package/dist/commands/status.d.ts +3 -0
  215. package/dist/commands/status.d.ts.map +1 -0
  216. package/dist/commands/status.js +300 -0
  217. package/dist/commands/status.js.map +1 -0
  218. package/dist/commands/storage.d.ts +3 -0
  219. package/dist/commands/storage.d.ts.map +1 -0
  220. package/dist/commands/storage.js +180 -0
  221. package/dist/commands/storage.js.map +1 -0
  222. package/dist/commands/tenant.d.ts +3 -0
  223. package/dist/commands/tenant.d.ts.map +1 -0
  224. package/dist/commands/tenant.js +87 -0
  225. package/dist/commands/tenant.js.map +1 -0
  226. package/dist/commands/tunnel.d.ts +3 -0
  227. package/dist/commands/tunnel.d.ts.map +1 -0
  228. package/dist/commands/tunnel.js +418 -0
  229. package/dist/commands/tunnel.js.map +1 -0
  230. package/dist/commands/up.d.ts +14 -0
  231. package/dist/commands/up.d.ts.map +1 -0
  232. package/dist/commands/up.js +703 -0
  233. package/dist/commands/up.js.map +1 -0
  234. package/dist/commands/util.d.ts +19 -0
  235. package/dist/commands/util.d.ts.map +1 -0
  236. package/dist/commands/util.js +116 -0
  237. package/dist/commands/util.js.map +1 -0
  238. package/dist/commands/volumes.d.ts +3 -0
  239. package/dist/commands/volumes.d.ts.map +1 -0
  240. package/dist/commands/volumes.js +196 -0
  241. package/dist/commands/volumes.js.map +1 -0
  242. package/dist/commands/watch.d.ts +3 -0
  243. package/dist/commands/watch.d.ts.map +1 -0
  244. package/dist/commands/watch.js +398 -0
  245. package/dist/commands/watch.js.map +1 -0
  246. package/dist/commands/webhooks.d.ts +3 -0
  247. package/dist/commands/webhooks.d.ts.map +1 -0
  248. package/dist/commands/webhooks.js +23 -0
  249. package/dist/commands/webhooks.js.map +1 -0
  250. package/dist/commands/whoami.d.ts +3 -0
  251. package/dist/commands/whoami.d.ts.map +1 -0
  252. package/dist/commands/whoami.js +84 -0
  253. package/dist/commands/whoami.js.map +1 -0
  254. package/dist/commands/workspaces.d.ts +3 -0
  255. package/dist/commands/workspaces.d.ts.map +1 -0
  256. package/dist/commands/workspaces.js +87 -0
  257. package/dist/commands/workspaces.js.map +1 -0
  258. package/dist/config.d.ts +28 -0
  259. package/dist/config.d.ts.map +1 -0
  260. package/dist/config.js +129 -0
  261. package/dist/config.js.map +1 -0
  262. package/dist/errors.d.ts +22 -0
  263. package/dist/errors.d.ts.map +1 -0
  264. package/dist/errors.js +62 -0
  265. package/dist/errors.js.map +1 -0
  266. package/dist/framework-detector.d.ts +22 -0
  267. package/dist/framework-detector.d.ts.map +1 -0
  268. package/dist/framework-detector.js +373 -0
  269. package/dist/framework-detector.js.map +1 -0
  270. package/dist/pty/raw-mode.d.ts +7 -0
  271. package/dist/pty/raw-mode.d.ts.map +1 -0
  272. package/dist/pty/raw-mode.js +22 -0
  273. package/dist/pty/raw-mode.js.map +1 -0
  274. package/dist/pty/ws-pty-client.d.ts +12 -0
  275. package/dist/pty/ws-pty-client.d.ts.map +1 -0
  276. package/dist/pty/ws-pty-client.js +69 -0
  277. package/dist/pty/ws-pty-client.js.map +1 -0
  278. package/dist/types.d.ts +326 -0
  279. package/dist/types.d.ts.map +1 -0
  280. package/dist/types.js +16 -0
  281. package/dist/types.js.map +1 -0
  282. package/dist/ui/progress.d.ts +10 -0
  283. package/dist/ui/progress.d.ts.map +1 -0
  284. package/dist/ui/progress.js +36 -0
  285. package/dist/ui/progress.js.map +1 -0
  286. package/dist/ui/spinner.d.ts +4 -0
  287. package/dist/ui/spinner.d.ts.map +1 -0
  288. package/dist/ui/spinner.js +7 -0
  289. package/dist/ui/spinner.js.map +1 -0
  290. package/dist/ui/table.d.ts +8 -0
  291. package/dist/ui/table.d.ts.map +1 -0
  292. package/dist/ui/table.js +46 -0
  293. package/dist/ui/table.js.map +1 -0
  294. package/package.json +53 -0
@@ -0,0 +1,276 @@
1
+ import { writeFileSync } from "node:fs";
2
+ import { request } from "undici";
3
+ import { loadConfig } from "../config.js";
4
+ import { AuthError, NetworkError, mapHttpError } from "../errors.js";
5
+ import { enc, getAndPrint, postAndPrint, runAction, } from "./enterprise-util.js";
6
+ // ---------------------------------------------------------------------------
7
+ // Internal helpers
8
+ // ---------------------------------------------------------------------------
9
+ function desktopPath(id, sub) {
10
+ return `/api/v1/computers/${enc(id)}/desktop/${sub}`;
11
+ }
12
+ function authHeaders(apiKey) {
13
+ return {
14
+ Authorization: `Bearer ${apiKey}`,
15
+ "User-Agent": "@miosa/cli/0.1.0",
16
+ };
17
+ }
18
+ /** Fetch raw binary from the screenshot endpoint; returns Buffer. */
19
+ async function fetchScreenshot(id) {
20
+ const config = loadConfig();
21
+ if (!config.api_key) {
22
+ throw new AuthError("You are not logged in. Run: miosa auth login", "Run `miosa auth login` to authenticate.");
23
+ }
24
+ const endpoint = (config.endpoint || "https://api.miosa.ai").replace(/\/$/, "");
25
+ const url = `${endpoint}${desktopPath(id, "screenshot")}`;
26
+ let res;
27
+ try {
28
+ res = await request(url, {
29
+ method: "GET",
30
+ headers: authHeaders(config.api_key),
31
+ });
32
+ }
33
+ catch (err) {
34
+ throw new NetworkError(`Network error: ${err instanceof Error ? err.message : String(err)}`, "Check your connection and endpoint: miosa status");
35
+ }
36
+ if (res.statusCode >= 400) {
37
+ const rawBody = await res.body.text();
38
+ let body = {};
39
+ try {
40
+ body = JSON.parse(rawBody);
41
+ }
42
+ catch {
43
+ body = { message: rawBody || `HTTP ${res.statusCode}` };
44
+ }
45
+ throw mapHttpError(res.statusCode, body, rawBody);
46
+ }
47
+ const chunks = [];
48
+ for await (const chunk of res.body) {
49
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
50
+ }
51
+ return Buffer.concat(chunks);
52
+ }
53
+ // ---------------------------------------------------------------------------
54
+ // Register desktop subcommands onto the `computers` command group
55
+ // ---------------------------------------------------------------------------
56
+ export function registerDesktopCommands(computers) {
57
+ // -------------------------------------------------------------------------
58
+ // screenshot <id> [--output file.png]
59
+ // -------------------------------------------------------------------------
60
+ computers
61
+ .command("screenshot <id>")
62
+ .description("Capture a screenshot of the Computer desktop")
63
+ .option("--output <file>", "Save PNG to file (default: print base64 to stdout)")
64
+ .option("--json", "Output as JSON (wraps base64 in {data})")
65
+ .action((id, opts) => runAction(async () => {
66
+ const png = await fetchScreenshot(id);
67
+ if (opts.output) {
68
+ writeFileSync(opts.output, png);
69
+ console.log(`Screenshot saved to ${opts.output} (${png.length} bytes)`);
70
+ return;
71
+ }
72
+ if (opts.json) {
73
+ console.log(JSON.stringify({ data: png.toString("base64"), format: "png" }, null, 2));
74
+ return;
75
+ }
76
+ // Default: emit raw base64 so callers can pipe it
77
+ process.stdout.write(png.toString("base64") + "\n");
78
+ }));
79
+ // -------------------------------------------------------------------------
80
+ // click <id> <x> <y> [--button left|right|middle]
81
+ // -------------------------------------------------------------------------
82
+ computers
83
+ .command("click <id> <x> <y>")
84
+ .description("Click at coordinates on the Computer desktop")
85
+ .option("--button <button>", "Mouse button: left, right, middle", "left")
86
+ .option("--json", "Output as JSON")
87
+ .action((id, x, y, opts) => runAction(() => postAndPrint(desktopPath(id, "click"), opts, {
88
+ x: Number(x),
89
+ y: Number(y),
90
+ button: opts.button,
91
+ })));
92
+ // -------------------------------------------------------------------------
93
+ // double-click <id> <x> <y>
94
+ // -------------------------------------------------------------------------
95
+ computers
96
+ .command("double-click <id> <x> <y>")
97
+ .description("Double-click at coordinates on the Computer desktop")
98
+ .option("--json", "Output as JSON")
99
+ .action((id, x, y, opts) => runAction(() => postAndPrint(desktopPath(id, "double-click"), opts, {
100
+ x: Number(x),
101
+ y: Number(y),
102
+ })));
103
+ // -------------------------------------------------------------------------
104
+ // right-click <id> <x> <y>
105
+ // -------------------------------------------------------------------------
106
+ computers
107
+ .command("right-click <id> <x> <y>")
108
+ .description("Right-click at coordinates on the Computer desktop")
109
+ .option("--json", "Output as JSON")
110
+ .action((id, x, y, opts) => runAction(() => postAndPrint(desktopPath(id, "click"), opts, {
111
+ x: Number(x),
112
+ y: Number(y),
113
+ button: "right",
114
+ })));
115
+ // -------------------------------------------------------------------------
116
+ // type <id> <text>
117
+ // -------------------------------------------------------------------------
118
+ computers
119
+ .command("type <id> <text>")
120
+ .description("Type text on the Computer desktop")
121
+ .option("--json", "Output as JSON")
122
+ .action((id, text, opts) => runAction(() => postAndPrint(desktopPath(id, "type"), opts, { text })));
123
+ // -------------------------------------------------------------------------
124
+ // key <id> <key>
125
+ // -------------------------------------------------------------------------
126
+ computers
127
+ .command("key <id> <key>")
128
+ .description("Press a single key on the Computer desktop (e.g. Return, Escape)")
129
+ .option("--json", "Output as JSON")
130
+ .action((id, key, opts) => runAction(() => postAndPrint(desktopPath(id, "key"), opts, { key })));
131
+ // -------------------------------------------------------------------------
132
+ // hotkey <id> <keys...> e.g. miosa computers hotkey abc123 ctrl shift t
133
+ // -------------------------------------------------------------------------
134
+ computers
135
+ .command("hotkey <id> <keys...>")
136
+ .description("Press a key combination on the Computer desktop (e.g. ctrl shift t)")
137
+ .option("--json", "Output as JSON")
138
+ .action((id, keys, opts) => runAction(() => postAndPrint(desktopPath(id, "hotkey"), opts, { keys })));
139
+ // -------------------------------------------------------------------------
140
+ // scroll <id> [--direction down] [--clicks 3]
141
+ // -------------------------------------------------------------------------
142
+ computers
143
+ .command("scroll <id>")
144
+ .description("Scroll on the Computer desktop")
145
+ .option("--direction <direction>", "Scroll direction: up, down, left, right", "down")
146
+ .option("--clicks <n>", "Number of scroll clicks", "3")
147
+ .option("--x <x>", "X coordinate for scroll position")
148
+ .option("--y <y>", "Y coordinate for scroll position")
149
+ .option("--json", "Output as JSON")
150
+ .action((id, opts) => runAction(() => {
151
+ const body = {
152
+ direction: opts.direction,
153
+ clicks: Number(opts.clicks),
154
+ };
155
+ if (opts.x !== undefined)
156
+ body["x"] = Number(opts.x);
157
+ if (opts.y !== undefined)
158
+ body["y"] = Number(opts.y);
159
+ return postAndPrint(desktopPath(id, "scroll"), opts, body);
160
+ }));
161
+ // -------------------------------------------------------------------------
162
+ // drag <id> <fromX> <fromY> <toX> <toY>
163
+ // -------------------------------------------------------------------------
164
+ computers
165
+ .command("drag <id> <fromX> <fromY> <toX> <toY>")
166
+ .description("Drag from one coordinate to another on the Computer desktop")
167
+ .option("--json", "Output as JSON")
168
+ .action((id, fromX, fromY, toX, toY, opts) => runAction(() => postAndPrint(desktopPath(id, "drag"), opts, {
169
+ from_x: Number(fromX),
170
+ from_y: Number(fromY),
171
+ to_x: Number(toX),
172
+ to_y: Number(toY),
173
+ })));
174
+ // -------------------------------------------------------------------------
175
+ // move-cursor <id> <x> <y>
176
+ // -------------------------------------------------------------------------
177
+ computers
178
+ .command("move-cursor <id> <x> <y>")
179
+ .description("Move the mouse cursor to coordinates on the Computer desktop")
180
+ .option("--json", "Output as JSON")
181
+ .action((id, x, y, opts) => runAction(() => postAndPrint(desktopPath(id, "move"), opts, {
182
+ x: Number(x),
183
+ y: Number(y),
184
+ })));
185
+ // -------------------------------------------------------------------------
186
+ // mouse-down <id> <x> <y>
187
+ // -------------------------------------------------------------------------
188
+ computers
189
+ .command("mouse-down <id> <x> <y>")
190
+ .description("Press and hold a mouse button at coordinates")
191
+ .option("--button <button>", "Mouse button: left, right, middle", "left")
192
+ .option("--json", "Output as JSON")
193
+ .action((id, x, y, opts) => runAction(() => postAndPrint(desktopPath(id, "mouse-down"), opts, {
194
+ x: Number(x),
195
+ y: Number(y),
196
+ button: opts.button,
197
+ })));
198
+ // -------------------------------------------------------------------------
199
+ // mouse-up <id> <x> <y>
200
+ // -------------------------------------------------------------------------
201
+ computers
202
+ .command("mouse-up <id> <x> <y>")
203
+ .description("Release a mouse button at coordinates")
204
+ .option("--button <button>", "Mouse button: left, right, middle", "left")
205
+ .option("--json", "Output as JSON")
206
+ .action((id, x, y, opts) => runAction(() => postAndPrint(desktopPath(id, "mouse-up"), opts, {
207
+ x: Number(x),
208
+ y: Number(y),
209
+ button: opts.button,
210
+ })));
211
+ // -------------------------------------------------------------------------
212
+ // cursor <id> — GET current cursor position and type
213
+ // -------------------------------------------------------------------------
214
+ computers
215
+ .command("cursor <id>")
216
+ .description("Get the current cursor position and type on the Computer desktop")
217
+ .option("--json", "Output as JSON")
218
+ .action((id, opts) => runAction(() => getAndPrint(desktopPath(id, "cursor"), opts)));
219
+ // -------------------------------------------------------------------------
220
+ // screen-size <id>
221
+ // -------------------------------------------------------------------------
222
+ computers
223
+ .command("screen-size <id>")
224
+ .description("Get the screen dimensions of the Computer desktop")
225
+ .option("--json", "Output as JSON")
226
+ .action((id, opts) => runAction(() => getAndPrint(desktopPath(id, "screen-size"), opts)));
227
+ // -------------------------------------------------------------------------
228
+ // clipboard <id> [--set "text"]
229
+ // -------------------------------------------------------------------------
230
+ computers
231
+ .command("clipboard <id>")
232
+ .description("Get or set clipboard content on the Computer desktop")
233
+ .option("--set <text>", "Write this text to the clipboard (omit to read)")
234
+ .option("--json", "Output as JSON")
235
+ .action((id, opts) => runAction(() => {
236
+ if (opts.set !== undefined) {
237
+ return postAndPrint(desktopPath(id, "clipboard"), opts, {
238
+ text: opts.set,
239
+ });
240
+ }
241
+ return getAndPrint(desktopPath(id, "clipboard"), opts);
242
+ }));
243
+ // -------------------------------------------------------------------------
244
+ // windows <id>
245
+ // -------------------------------------------------------------------------
246
+ computers
247
+ .command("windows <id>")
248
+ .description("List open windows on the Computer desktop")
249
+ .option("--json", "Output as JSON")
250
+ .action((id, opts) => runAction(() => getAndPrint(desktopPath(id, "windows"), opts)));
251
+ // -------------------------------------------------------------------------
252
+ // launch <id> <app>
253
+ // -------------------------------------------------------------------------
254
+ computers
255
+ .command("launch <id> <app>")
256
+ .description("Launch an application on the Computer desktop")
257
+ .option("--json", "Output as JSON")
258
+ .action((id, app, opts) => runAction(() => postAndPrint(desktopPath(id, "launch"), opts, { app })));
259
+ // -------------------------------------------------------------------------
260
+ // desktop-env <id>
261
+ // -------------------------------------------------------------------------
262
+ computers
263
+ .command("desktop-env <id>")
264
+ .description("Get desktop environment information for the Computer")
265
+ .option("--json", "Output as JSON")
266
+ .action((id, opts) => runAction(() => getAndPrint(desktopPath(id, "environment"), opts)));
267
+ // -------------------------------------------------------------------------
268
+ // a11y-tree <id>
269
+ // -------------------------------------------------------------------------
270
+ computers
271
+ .command("a11y-tree <id>")
272
+ .description("Get the accessibility tree for the Computer desktop")
273
+ .option("--json", "Output as JSON")
274
+ .action((id, opts) => runAction(() => getAndPrint(desktopPath(id, "accessibility-tree"), opts)));
275
+ }
276
+ //# sourceMappingURL=desktop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop.js","sourceRoot":"","sources":["../../src/commands/desktop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function register(program: Command): void;
3
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6GzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4J/C"}
@@ -0,0 +1,246 @@
1
+ import { spawn } from "node:child_process";
2
+ import chalk from "chalk";
3
+ import { loadConfig } from "../config.js";
4
+ import { MiosaClient } from "../client.js";
5
+ import { UserError } from "../errors.js";
6
+ import { handleError } from "./util.js";
7
+ import { loadLocalLink } from "./link.js";
8
+ import { detectFramework, FRAMEWORK_LABELS, } from "../framework-detector.js";
9
+ // ── dev command defaults per framework ───────────────────────────────────────
10
+ const DEV_COMMANDS = {
11
+ nextjs: "next dev",
12
+ sveltekit: "vite dev",
13
+ "vite-react": "vite",
14
+ phoenix: "mix phx.server",
15
+ django: "python manage.py runserver",
16
+ flask: "flask run",
17
+ rails: "bin/rails server",
18
+ go: "go run .",
19
+ rust: "cargo run",
20
+ static: "npx serve .",
21
+ };
22
+ const DEV_PORTS = {
23
+ nextjs: 4000,
24
+ sveltekit: 5173,
25
+ "vite-react": 5173,
26
+ phoenix: 4000,
27
+ django: 8000,
28
+ flask: 5000,
29
+ rails: 3000,
30
+ go: 8080,
31
+ rust: 8080,
32
+ static: 3000,
33
+ };
34
+ // ── secret fetching ───────────────────────────────────────────────────────────
35
+ async function fetchEnvVars(client, deploymentId) {
36
+ const response = await client.apiGet(`/api/v1/deployments/${encodeURIComponent(deploymentId)}/env`);
37
+ const previews = response.data;
38
+ if (previews.length === 0)
39
+ return {};
40
+ // Fetch tenant secrets — the list response includes host_id, which is
41
+ // required to build the reveal path: POST /opencomputers/hosts/:host_id/secrets/:secret_id/reveal
42
+ const tenantSecrets = await client
43
+ .apiGet("/api/v1/opencomputers/secrets")
44
+ .catch(() => ({
45
+ data: [],
46
+ }));
47
+ const secretByName = new Map(tenantSecrets.data.map((s) => [s.name, s]));
48
+ const env = {};
49
+ for (const preview of previews) {
50
+ const secret = secretByName.get(preview.name);
51
+ // Only host-scoped secrets have a reveal path (host_id is non-null)
52
+ if (secret?.host_id) {
53
+ try {
54
+ const revealed = await client.apiPost(`/api/v1/opencomputers/hosts/${encodeURIComponent(secret.host_id)}/secrets/${encodeURIComponent(secret.id)}/reveal`);
55
+ env[preview.name] = revealed.value ?? preview.preview;
56
+ continue;
57
+ }
58
+ catch {
59
+ // Fall through to preview
60
+ }
61
+ }
62
+ env[preview.name] = preview.preview;
63
+ }
64
+ return env;
65
+ }
66
+ // ── spawn helpers ─────────────────────────────────────────────────────────────
67
+ /**
68
+ * Inject PORT into the command string when the framework accepts it as an
69
+ * argument (Next.js uses `--port`, most others read the PORT env var).
70
+ */
71
+ function buildDevCommand(baseCommand, framework, port) {
72
+ if (framework === "nextjs") {
73
+ return `${baseCommand} --port ${port}`;
74
+ }
75
+ // All others pick up PORT via env — no arg injection needed
76
+ return baseCommand;
77
+ }
78
+ // ── register ──────────────────────────────────────────────────────────────────
79
+ export function register(program) {
80
+ program
81
+ .command("dev")
82
+ .description("Start local dev server with MIOSA secrets injected as env vars")
83
+ .option("--port <port>", "Override default dev server port", (v) => parseInt(v, 10))
84
+ .option("--command <cmd>", "Override the auto-detected dev command")
85
+ .option("--app <id>", "Deployment ID (overrides .miosa.json)")
86
+ .addHelpText("after", `
87
+ Examples:
88
+ miosa dev Auto-detect framework, inject secrets, start
89
+ miosa dev --port 3000 Override the port
90
+ miosa dev --command "node server.js" Use a custom dev command
91
+ miosa dev --app <id> Use secrets from a specific deployment
92
+ `)
93
+ .action(async (opts) => {
94
+ try {
95
+ const cwd = process.cwd();
96
+ // ── Resolve deployment ─────────────────────────────────────────
97
+ let deploymentId = null;
98
+ let projectName = "project";
99
+ if (opts.app) {
100
+ deploymentId = opts.app;
101
+ projectName = opts.app.slice(0, 8);
102
+ }
103
+ else {
104
+ const link = loadLocalLink(cwd);
105
+ if (link) {
106
+ deploymentId = link.deploymentId;
107
+ projectName = link.name;
108
+ }
109
+ }
110
+ // ── Detect framework ───────────────────────────────────────────
111
+ const detection = detectFramework(cwd);
112
+ const framework = detection?.framework ?? null;
113
+ const frameworkLabel = framework
114
+ ? (FRAMEWORK_LABELS[framework] ?? framework)
115
+ : null;
116
+ if (frameworkLabel) {
117
+ console.log(chalk.dim(`Detected: ${chalk.white(frameworkLabel)}`));
118
+ }
119
+ // ── Resolve port ───────────────────────────────────────────────
120
+ const port = opts.port ?? (framework ? DEV_PORTS[framework] : null) ?? 3000;
121
+ // ── Fetch secrets ──────────────────────────────────────────────
122
+ let injectedEnv = {};
123
+ let secretCount = 0;
124
+ if (deploymentId) {
125
+ const config = loadConfig();
126
+ const client = new MiosaClient(config);
127
+ process.stdout.write(chalk.dim(`Injecting secrets from ${chalk.white(projectName)}...`));
128
+ try {
129
+ injectedEnv = await fetchEnvVars(client, deploymentId);
130
+ secretCount = Object.keys(injectedEnv).length;
131
+ process.stdout.write(` ${chalk.green(String(secretCount))} injected\n`);
132
+ }
133
+ catch {
134
+ process.stdout.write(chalk.yellow(" (could not fetch secrets)\n"));
135
+ }
136
+ }
137
+ else {
138
+ console.log(chalk.dim("No .miosa.json found — starting without injected secrets. Run `miosa link` to connect."));
139
+ }
140
+ // ── Resolve dev command ────────────────────────────────────────
141
+ let devCommand;
142
+ if (opts.command) {
143
+ devCommand = opts.command;
144
+ }
145
+ else if (framework) {
146
+ devCommand = buildDevCommand(DEV_COMMANDS[framework], framework, port);
147
+ }
148
+ else {
149
+ throw new UserError("Could not detect a framework. Pass --command to specify the dev command.", "Example: miosa dev --command 'npm run dev'");
150
+ }
151
+ console.log(chalk.dim(`Starting dev server: ${chalk.white(devCommand)}`));
152
+ console.log();
153
+ console.log(chalk.bold("Ready:"));
154
+ console.log(` ${chalk.bold("Local:")} ${chalk.cyan(`http://localhost:${port}`)}`);
155
+ if (secretCount > 0) {
156
+ console.log(` ${chalk.bold("Secrets:")} ${secretCount} injected from ${projectName}`);
157
+ }
158
+ console.log();
159
+ // ── Spawn child process ────────────────────────────────────────
160
+ const mergedEnv = {
161
+ ...process.env,
162
+ ...injectedEnv,
163
+ PORT: String(port),
164
+ };
165
+ // Split the command string into argv — honour quoted segments
166
+ const [cmd, ...args] = shellSplit(devCommand);
167
+ if (!cmd) {
168
+ throw new UserError("Dev command resolved to an empty string.");
169
+ }
170
+ const child = spawn(cmd, args, {
171
+ cwd,
172
+ env: mergedEnv,
173
+ stdio: "inherit",
174
+ shell: true,
175
+ });
176
+ // Graceful shutdown
177
+ const shutdown = () => {
178
+ child.kill("SIGTERM");
179
+ };
180
+ process.on("SIGINT", shutdown);
181
+ process.on("SIGTERM", shutdown);
182
+ await new Promise((resolve) => {
183
+ child.on("close", (code) => {
184
+ process.off("SIGINT", shutdown);
185
+ process.off("SIGTERM", shutdown);
186
+ resolve();
187
+ process.exit(code ?? 0);
188
+ });
189
+ });
190
+ }
191
+ catch (err) {
192
+ handleError(err);
193
+ }
194
+ });
195
+ }
196
+ // ── shell tokeniser ───────────────────────────────────────────────────────────
197
+ /**
198
+ * Minimal POSIX-style shell word splitter.
199
+ * Handles single-quoted, double-quoted, and unquoted segments.
200
+ * Sufficient for the controlled command strings this command generates.
201
+ */
202
+ function shellSplit(input) {
203
+ const tokens = [];
204
+ let current = "";
205
+ let i = 0;
206
+ while (i < input.length) {
207
+ const ch = input[i];
208
+ if (ch === "'") {
209
+ // Single-quoted: take everything literally until closing '
210
+ i++;
211
+ while (i < input.length && input[i] !== "'") {
212
+ current += input[i++];
213
+ }
214
+ i++; // skip closing '
215
+ }
216
+ else if (ch === '"') {
217
+ // Double-quoted: honour backslash escapes for " and \
218
+ i++;
219
+ while (i < input.length && input[i] !== '"') {
220
+ if (input[i] === "\\" && i + 1 < input.length) {
221
+ i++;
222
+ current += input[i++];
223
+ }
224
+ else {
225
+ current += input[i++];
226
+ }
227
+ }
228
+ i++; // skip closing "
229
+ }
230
+ else if (ch === " " || ch === "\t") {
231
+ if (current.length > 0) {
232
+ tokens.push(current);
233
+ current = "";
234
+ }
235
+ i++;
236
+ }
237
+ else {
238
+ current += ch;
239
+ i++;
240
+ }
241
+ }
242
+ if (current.length > 0)
243
+ tokens.push(current);
244
+ return tokens;
245
+ }
246
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function register(program: Command): void;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4FzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgM/C"}