@skrr-ai/cli 0.1.47 → 0.1.49

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 (286) hide show
  1. package/README.md +1 -1
  2. package/dist/base-command.d.ts +18 -0
  3. package/dist/base-command.js +61 -1
  4. package/dist/commands/agent-worker.d.ts +12 -0
  5. package/dist/commands/agent-worker.js +140 -0
  6. package/dist/commands/agents/chat.d.ts +21 -0
  7. package/dist/commands/agents/chat.js +26 -9
  8. package/dist/commands/balance/usage/breakdown.d.ts +14 -0
  9. package/dist/commands/balance/usage/breakdown.js +68 -0
  10. package/dist/commands/balance/usage.js +24 -0
  11. package/dist/commands/commerce/entitlements/explain.d.ts +22 -0
  12. package/dist/commands/commerce/entitlements/explain.js +40 -0
  13. package/dist/commands/commerce/incidents/audit.d.ts +20 -0
  14. package/dist/commands/commerce/incidents/audit.js +37 -0
  15. package/dist/commands/commerce/incidents/list.d.ts +22 -0
  16. package/dist/commands/commerce/incidents/list.js +49 -0
  17. package/dist/commands/commerce/incidents/resolve.d.ts +23 -0
  18. package/dist/commands/commerce/incidents/resolve.js +45 -0
  19. package/dist/commands/commerce/incidents/retry.d.ts +22 -0
  20. package/dist/commands/commerce/incidents/retry.js +45 -0
  21. package/dist/commands/commerce/incidents/show.d.ts +13 -0
  22. package/dist/commands/commerce/incidents/show.js +30 -0
  23. package/dist/commands/commerce/offers/approve.d.ts +17 -0
  24. package/dist/commands/commerce/offers/approve.js +33 -0
  25. package/dist/commands/commerce/offers/create.d.ts +18 -0
  26. package/dist/commands/commerce/offers/create.js +34 -0
  27. package/dist/commands/commerce/offers/publish.d.ts +13 -0
  28. package/dist/commands/commerce/offers/publish.js +28 -0
  29. package/dist/commands/commerce/offers/retire.d.ts +17 -0
  30. package/dist/commands/commerce/offers/retire.js +32 -0
  31. package/dist/commands/commerce/offers/validate.d.ts +18 -0
  32. package/dist/commands/commerce/offers/validate.js +33 -0
  33. package/dist/commands/commerce/products/create.d.ts +10 -0
  34. package/dist/commands/commerce/products/create.js +25 -0
  35. package/dist/commands/commerce/promotions/redeem.d.ts +13 -0
  36. package/dist/commands/commerce/promotions/redeem.js +32 -0
  37. package/dist/commands/commerce/terms/accept.d.ts +18 -0
  38. package/dist/commands/commerce/terms/accept.js +39 -0
  39. package/dist/commands/commerce/terms/show.d.ts +10 -0
  40. package/dist/commands/commerce/terms/show.js +34 -0
  41. package/dist/commands/commerce/trials/conversion-preview.d.ts +18 -0
  42. package/dist/commands/commerce/trials/conversion-preview.js +39 -0
  43. package/dist/commands/commerce/trials/start.d.ts +23 -0
  44. package/dist/commands/commerce/trials/start.js +58 -0
  45. package/dist/commands/commitments/accounting.d.ts +39 -0
  46. package/dist/commands/commitments/accounting.js +116 -0
  47. package/dist/commands/commitments/action-history.d.ts +1 -0
  48. package/dist/commands/commitments/action-history.js +8 -1
  49. package/dist/commands/commitments/case.d.ts +1 -0
  50. package/dist/commands/commitments/case.js +19 -3
  51. package/dist/commands/commitments/cases.d.ts +1 -0
  52. package/dist/commands/commitments/cases.js +11 -1
  53. package/dist/commands/commitments/checks.d.ts +1 -0
  54. package/dist/commands/commitments/checks.js +5 -1
  55. package/dist/commands/commitments/cost.d.ts +62 -0
  56. package/dist/commands/commitments/cost.js +130 -0
  57. package/dist/commands/commitments/create.js +1 -1
  58. package/dist/commands/commitments/delete.d.ts +1 -0
  59. package/dist/commands/commitments/delete.js +56 -6
  60. package/dist/commands/commitments/feedback.js +9 -1
  61. package/dist/commands/commitments/handover.js +16 -0
  62. package/dist/commands/commitments/hypotheses.d.ts +1 -0
  63. package/dist/commands/commitments/hypotheses.js +17 -2
  64. package/dist/commands/commitments/links/list.js +4 -1
  65. package/dist/commands/commitments/liveness.d.ts +18 -0
  66. package/dist/commands/commitments/liveness.js +80 -0
  67. package/dist/commands/commitments/metrics.d.ts +1 -0
  68. package/dist/commands/commitments/metrics.js +8 -1
  69. package/dist/commands/commitments/next-tick.d.ts +39 -0
  70. package/dist/commands/commitments/next-tick.js +122 -0
  71. package/dist/commands/commitments/observations.d.ts +1 -0
  72. package/dist/commands/commitments/observations.js +19 -2
  73. package/dist/commands/commitments/pause.js +12 -0
  74. package/dist/commands/commitments/receipt.d.ts +2 -0
  75. package/dist/commands/commitments/receipt.js +16 -2
  76. package/dist/commands/commitments/remediation-proposal.js +6 -2
  77. package/dist/commands/commitments/remediation-proposals.js +5 -1
  78. package/dist/commands/commitments/restore.d.ts +25 -0
  79. package/dist/commands/commitments/restore.js +46 -0
  80. package/dist/commands/commitments/show.js +32 -0
  81. package/dist/commands/commitments/trigger-status.js +33 -0
  82. package/dist/commands/commitments/update.d.ts +1 -0
  83. package/dist/commands/commitments/update.js +31 -5
  84. package/dist/commands/commitments/wake-capabilities.d.ts +0 -1
  85. package/dist/commands/commitments/wake-capabilities.js +8 -4
  86. package/dist/commands/enterprise/budgets/create.d.ts +11 -0
  87. package/dist/commands/enterprise/budgets/create.js +27 -0
  88. package/dist/commands/enterprise/budgets/evaluate.d.ts +17 -0
  89. package/dist/commands/enterprise/budgets/evaluate.js +32 -0
  90. package/dist/commands/enterprise/budgets/publish.d.ts +14 -0
  91. package/dist/commands/enterprise/budgets/publish.js +30 -0
  92. package/dist/commands/enterprise/contracts/activate.d.ts +14 -0
  93. package/dist/commands/enterprise/contracts/activate.js +30 -0
  94. package/dist/commands/enterprise/contracts/create.d.ts +14 -0
  95. package/dist/commands/enterprise/contracts/create.js +32 -0
  96. package/dist/commands/enterprise/contracts/issue.d.ts +18 -0
  97. package/dist/commands/enterprise/contracts/issue.js +34 -0
  98. package/dist/commands/enterprise/domains/begin.d.ts +20 -0
  99. package/dist/commands/enterprise/domains/begin.js +39 -0
  100. package/dist/commands/enterprise/domains/verify.d.ts +14 -0
  101. package/dist/commands/enterprise/domains/verify.js +32 -0
  102. package/dist/commands/enterprise/external-config/activate.d.ts +22 -0
  103. package/dist/commands/enterprise/external-config/activate.js +49 -0
  104. package/dist/commands/enterprise/external-config/set.d.ts +25 -0
  105. package/dist/commands/enterprise/external-config/set.js +123 -0
  106. package/dist/commands/enterprise/external-config/show.d.ts +12 -0
  107. package/dist/commands/enterprise/external-config/show.js +39 -0
  108. package/dist/commands/enterprise/external-config/suspend.d.ts +13 -0
  109. package/dist/commands/enterprise/external-config/suspend.js +41 -0
  110. package/dist/commands/enterprise/finance/close-snapshot.d.ts +11 -0
  111. package/dist/commands/enterprise/finance/close-snapshot.js +28 -0
  112. package/dist/commands/enterprise/finance/record-document.d.ts +18 -0
  113. package/dist/commands/enterprise/finance/record-document.js +35 -0
  114. package/dist/commands/enterprise/profile.d.ts +20 -0
  115. package/dist/commands/enterprise/profile.js +38 -0
  116. package/dist/commands/login.d.ts +13 -0
  117. package/dist/commands/login.js +77 -0
  118. package/dist/commands/machines/dedicated/index.js +3 -0
  119. package/dist/commands/machines/dedicated/service/apply.d.ts +23 -0
  120. package/dist/commands/machines/dedicated/service/apply.js +99 -0
  121. package/dist/commands/machines/dedicated/service/approve.d.ts +23 -0
  122. package/dist/commands/machines/dedicated/service/approve.js +52 -0
  123. package/dist/commands/machines/dedicated/service/create.d.ts +55 -0
  124. package/dist/commands/machines/dedicated/service/create.js +222 -0
  125. package/dist/commands/machines/dedicated/service/edit.d.ts +30 -0
  126. package/dist/commands/machines/dedicated/service/edit.js +146 -0
  127. package/dist/commands/machines/dedicated/service/exec.d.ts +26 -0
  128. package/dist/commands/machines/dedicated/service/exec.js +92 -0
  129. package/dist/commands/machines/dedicated/service/export.d.ts +29 -0
  130. package/dist/commands/machines/dedicated/service/export.js +106 -0
  131. package/dist/commands/machines/dedicated/service/index.d.ts +14 -0
  132. package/dist/commands/machines/dedicated/service/index.js +49 -0
  133. package/dist/commands/machines/dedicated/service/logs.d.ts +33 -0
  134. package/dist/commands/machines/dedicated/service/logs.js +148 -0
  135. package/dist/commands/machines/dedicated/service/ls.d.ts +20 -0
  136. package/dist/commands/machines/dedicated/service/ls.js +80 -0
  137. package/dist/commands/machines/dedicated/service/restart.d.ts +14 -0
  138. package/dist/commands/machines/dedicated/service/restart.js +29 -0
  139. package/dist/commands/machines/dedicated/service/rm.d.ts +20 -0
  140. package/dist/commands/machines/dedicated/service/rm.js +33 -0
  141. package/dist/commands/machines/dedicated/service/secret/index.d.ts +14 -0
  142. package/dist/commands/machines/dedicated/service/secret/index.js +25 -0
  143. package/dist/commands/machines/dedicated/service/secret/rm.d.ts +22 -0
  144. package/dist/commands/machines/dedicated/service/secret/rm.js +54 -0
  145. package/dist/commands/machines/dedicated/service/secret/set.d.ts +22 -0
  146. package/dist/commands/machines/dedicated/service/secret/set.js +93 -0
  147. package/dist/commands/machines/dedicated/service/start.d.ts +14 -0
  148. package/dist/commands/machines/dedicated/service/start.js +29 -0
  149. package/dist/commands/machines/dedicated/service/status.d.ts +21 -0
  150. package/dist/commands/machines/dedicated/service/status.js +85 -0
  151. package/dist/commands/machines/dedicated/service/stop.d.ts +20 -0
  152. package/dist/commands/machines/dedicated/service/stop.js +35 -0
  153. package/dist/commands/machines/dedicated/service/top.d.ts +22 -0
  154. package/dist/commands/machines/dedicated/service/top.js +120 -0
  155. package/dist/commands/machines/dedicated/sign-in-status.d.ts +22 -0
  156. package/dist/commands/machines/dedicated/sign-in-status.js +79 -0
  157. package/dist/commands/machines/dedicated/ssh-config.d.ts +28 -0
  158. package/dist/commands/machines/dedicated/ssh-config.js +66 -0
  159. package/dist/commands/machines/dedicated/ssh-proxy.d.ts +22 -0
  160. package/dist/commands/machines/dedicated/ssh-proxy.js +62 -0
  161. package/dist/commands/machines/dedicated/ssh.d.ts +29 -0
  162. package/dist/commands/machines/dedicated/ssh.js +121 -0
  163. package/dist/commands/native/allow-all.d.ts +14 -0
  164. package/dist/commands/native/allow-all.js +25 -0
  165. package/dist/commands/native/allow.d.ts +24 -0
  166. package/dist/commands/native/allow.js +45 -0
  167. package/dist/commands/native/deny.d.ts +24 -0
  168. package/dist/commands/native/deny.js +43 -0
  169. package/dist/commands/native/disable.d.ts +17 -0
  170. package/dist/commands/native/disable.js +28 -0
  171. package/dist/commands/native/enable.d.ts +12 -0
  172. package/dist/commands/native/enable.js +29 -0
  173. package/dist/commands/native/list-apps.d.ts +19 -0
  174. package/dist/commands/native/list-apps.js +30 -0
  175. package/dist/commands/native/restrict-to.d.ts +22 -0
  176. package/dist/commands/native/restrict-to.js +41 -0
  177. package/dist/commands/native/status.d.ts +19 -0
  178. package/dist/commands/native/status.js +33 -0
  179. package/dist/commands/native.d.ts +39 -0
  180. package/dist/commands/native.js +76 -0
  181. package/dist/commands/service/index.d.ts +14 -0
  182. package/dist/commands/service/index.js +31 -0
  183. package/dist/commands/service/logs.d.ts +18 -0
  184. package/dist/commands/service/logs.js +53 -0
  185. package/dist/commands/service/ls.d.ts +13 -0
  186. package/dist/commands/service/ls.js +48 -0
  187. package/dist/commands/service/propose.d.ts +34 -0
  188. package/dist/commands/service/propose.js +113 -0
  189. package/dist/commands/service/status.d.ts +17 -0
  190. package/dist/commands/service/status.js +56 -0
  191. package/dist/commands/spaces/auto-executor/runs.d.ts +13 -0
  192. package/dist/commands/spaces/auto-executor/runs.js +56 -0
  193. package/dist/commands/store/governance/artifacts.d.ts +25 -0
  194. package/dist/commands/store/governance/artifacts.js +55 -0
  195. package/dist/commands/store/governance/assign.d.ts +16 -0
  196. package/dist/commands/store/governance/assign.js +54 -0
  197. package/dist/commands/store/governance/create-license.d.ts +18 -0
  198. package/dist/commands/store/governance/create-license.js +35 -0
  199. package/dist/commands/store/governance/install-plan.d.ts +25 -0
  200. package/dist/commands/store/governance/install-plan.js +56 -0
  201. package/dist/commands/store/governance/license-policy.d.ts +30 -0
  202. package/dist/commands/store/governance/license-policy.js +69 -0
  203. package/dist/commands/store/governance/policy.d.ts +25 -0
  204. package/dist/commands/store/governance/policy.js +65 -0
  205. package/dist/commands/store/governance/publish-release.d.ts +17 -0
  206. package/dist/commands/store/governance/publish-release.js +34 -0
  207. package/dist/commands/tasks/deliverable/add.d.ts +15 -0
  208. package/dist/commands/tasks/deliverable/add.js +174 -0
  209. package/dist/commands/tasks/deliverable/archive.d.ts +35 -0
  210. package/dist/commands/tasks/deliverable/archive.js +205 -0
  211. package/dist/commands/tasks/labels/detach.js +3 -0
  212. package/dist/commands/tasks/labels/suggest.d.ts +24 -0
  213. package/dist/commands/tasks/labels/suggest.js +69 -0
  214. package/dist/commands/tasks/list.d.ts +16 -2
  215. package/dist/commands/tasks/list.js +100 -24
  216. package/dist/commands/tasks/show.d.ts +23 -0
  217. package/dist/commands/tasks/show.js +51 -1
  218. package/dist/commands/wiki/rm.d.ts +22 -1
  219. package/dist/commands/wiki/rm.js +52 -3
  220. package/dist/lib/agentic-stream.js +10 -2
  221. package/dist/lib/balance.d.ts +6 -1
  222. package/dist/lib/balance.js +15 -0
  223. package/dist/lib/commerce-command.d.ts +48 -0
  224. package/dist/lib/commerce-command.js +70 -0
  225. package/dist/lib/commerce.d.ts +93 -0
  226. package/dist/lib/commerce.js +129 -0
  227. package/dist/lib/commitment-product.js +1 -1
  228. package/dist/lib/commitments.d.ts +202 -29
  229. package/dist/lib/commitments.js +300 -33
  230. package/dist/lib/daemon-installer.d.ts +6 -5
  231. package/dist/lib/daemon-installer.js +4 -17
  232. package/dist/lib/dedicated-lease-command.js +10 -0
  233. package/dist/lib/dedicated-machines.d.ts +37 -0
  234. package/dist/lib/dedicated-machines.js +47 -0
  235. package/dist/lib/dedicated-service-command.d.ts +60 -0
  236. package/dist/lib/dedicated-service-command.js +182 -0
  237. package/dist/lib/dedicated-service.d.ts +342 -0
  238. package/dist/lib/dedicated-service.js +741 -0
  239. package/dist/lib/dedicated-ssh.d.ts +136 -0
  240. package/dist/lib/dedicated-ssh.js +387 -0
  241. package/dist/lib/delegated-cli.js +51 -13
  242. package/dist/lib/enterprise-commerce.d.ts +67 -0
  243. package/dist/lib/enterprise-commerce.js +112 -0
  244. package/dist/lib/enterprise-external-configuration.d.ts +60 -0
  245. package/dist/lib/enterprise-external-configuration.js +58 -0
  246. package/dist/lib/first-party-harness.js +17 -3
  247. package/dist/lib/governed-store.d.ts +110 -0
  248. package/dist/lib/governed-store.js +79 -0
  249. package/dist/lib/guest-service-command.d.ts +16 -0
  250. package/dist/lib/guest-service-command.js +32 -0
  251. package/dist/lib/guest-service.d.ts +67 -0
  252. package/dist/lib/guest-service.js +112 -0
  253. package/dist/lib/prompt.d.ts +1 -0
  254. package/dist/lib/prompt.js +1 -0
  255. package/dist/lib/task-asset-upload.d.ts +20 -0
  256. package/dist/lib/task-asset-upload.js +30 -8
  257. package/dist/lib/task-extras.d.ts +23 -0
  258. package/dist/lib/task-extras.js +6 -0
  259. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonScopes.d.ts +9 -3
  260. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonScopes.js +10 -3
  261. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarness.d.ts +1 -1
  262. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarness.js +1 -1
  263. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.d.ts +2 -2
  264. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +8 -5
  265. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/messages.d.ts +16 -0
  266. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/messages.js +21 -4
  267. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releaseManifest.d.ts +38 -0
  268. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releaseManifest.js +66 -1
  269. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/spawnEnv.d.ts +1 -1
  270. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/spawnEnv.js +24 -2
  271. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonScopes.d.ts +9 -3
  272. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonScopes.js +10 -3
  273. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarness.d.ts +1 -1
  274. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarness.js +1 -1
  275. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.d.ts +2 -2
  276. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +2 -2
  277. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/messages.d.ts +16 -0
  278. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/messages.js +20 -4
  279. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releaseManifest.d.ts +38 -0
  280. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releaseManifest.js +64 -0
  281. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/spawnEnv.d.ts +1 -1
  282. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/spawnEnv.js +24 -2
  283. package/dist/node_modules/@skrr-ai/auth-core/package.json +1 -1
  284. package/dist/node_modules/@skrr-ai/data-provider/index.js +5060 -4827
  285. package/oclif.manifest.json +35194 -29157
  286. package/package.json +43 -1
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const dedicated_service_command_1 = require("../../../../lib/dedicated-service-command");
5
+ const format_1 = require("../../../../lib/format");
6
+ const dedicated_service_1 = require("../../../../lib/dedicated-service");
7
+ /**
8
+ * `skrr machines dedicated service status` — one service, as the machine
9
+ * computes it right now: the spec it reconciles, the state it derived, and
10
+ * the exits it has seen.
11
+ *
12
+ * Status is computed from `spec + live children`, never stored — so what
13
+ * prints here is what the reconciler believes, not a record that can drift.
14
+ */
15
+ class DedicatedServiceStatus extends dedicated_service_command_1.DedicatedServiceCommand {
16
+ static summary = 'Show one service: spec, computed status and recent exits';
17
+ static examples = [
18
+ '<%= config.bin %> machines dedicated service status <lease-id> <name>',
19
+ '<%= config.bin %> machines dedicated service status <lease-id> <name> --json',
20
+ ];
21
+ static args = {
22
+ lease: core_1.Args.string({
23
+ description: dedicated_service_command_1.SERVICE_LEASE_ARG_DESCRIPTION,
24
+ required: true,
25
+ ignoreStdin: true,
26
+ }),
27
+ name: core_1.Args.string({ description: 'Service name', required: true, ignoreStdin: true }),
28
+ };
29
+ static flags = {
30
+ json: core_1.Flags.boolean({ description: 'Output as JSON' }),
31
+ };
32
+ async run() {
33
+ this.requireAuth();
34
+ const { args, flags } = await this.parse(DedicatedServiceStatus);
35
+ const leaseId = await this.resolveLeaseArg(args.lease);
36
+ const result = await this.callService('get', {
37
+ leaseId,
38
+ name: args.name,
39
+ ...this.scopeFrom(flags),
40
+ });
41
+ this.closeServiceChannel();
42
+ if (flags.json) {
43
+ this.log(JSON.stringify(result ?? {}, null, 2));
44
+ return;
45
+ }
46
+ const spec = result?.spec ?? {};
47
+ this.log(`service ${args.name} on ${leaseId}`);
48
+ const row = (label, value) => {
49
+ const cell = (0, format_1.formatCell)(value);
50
+ if (cell !== '-')
51
+ this.log(` ${label.padEnd(13)}${cell}`);
52
+ };
53
+ // The wire's detail is an object (reason/exitCode/signal/restarts/…),
54
+ // not a string — serviceDetailText renders its fields or the row prints
55
+ // "[object Object]".
56
+ const detailText = (0, dedicated_service_1.serviceDetailText)(result?.detail);
57
+ row('status', [result?.status, detailText].filter(Boolean).join(' — ') || undefined);
58
+ row('restart', spec.restart);
59
+ row('command', Array.isArray(spec.command) ? spec.command.join(' ') : spec.shell);
60
+ row('cwd', spec.cwd);
61
+ row('created by', spec.createdBy);
62
+ row('revision', spec.revision);
63
+ row('notify', spec.notify === undefined ? undefined : String(spec.notify));
64
+ row('disabled', spec.disabled === undefined ? undefined : String(spec.disabled));
65
+ row('updated', spec.updatedAt ? (0, format_1.localStamp)(spec.updatedAt) : undefined);
66
+ const exits = result?.exits ?? [];
67
+ if (exits.length > 0) {
68
+ this.log('');
69
+ this.log('recent exits:');
70
+ (0, format_1.renderTable)(exits.slice(-10).map((exit) => ({
71
+ at: (0, format_1.formatCell)(exit.at ? (0, format_1.localStamp)(exit.at) : undefined),
72
+ code: (0, format_1.formatCell)(exit.exitCode ?? '-'),
73
+ signal: (0, format_1.formatCell)(exit.signal ?? '-'),
74
+ })), [
75
+ { key: 'at', header: 'AT' },
76
+ { key: 'code', header: 'EXIT' },
77
+ { key: 'signal', header: 'SIGNAL' },
78
+ ], (line) => this.log(line));
79
+ }
80
+ this.log('');
81
+ this.log('spec:');
82
+ this.log(JSON.stringify(spec, null, 2));
83
+ }
84
+ }
85
+ exports.default = DedicatedServiceStatus;
@@ -0,0 +1,20 @@
1
+ import { DedicatedServiceCommand } from '../../../../lib/dedicated-service-command';
2
+ /**
3
+ * `skrr machines dedicated service stop` — desired state to stopped.
4
+ *
5
+ * This is the ONLY durable stop: it changes declared intent, so it survives
6
+ * the same restarts, checkpoints and replacements the service itself does.
7
+ * Killing the process is a symptom; stopping the declaration is the act.
8
+ */
9
+ export default class DedicatedServiceStop extends DedicatedServiceCommand {
10
+ static summary: string;
11
+ static examples: string[];
12
+ static args: {
13
+ lease: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
14
+ name: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
15
+ };
16
+ static flags: {
17
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
18
+ };
19
+ run(): Promise<void>;
20
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const dedicated_service_command_1 = require("../../../../lib/dedicated-service-command");
5
+ /**
6
+ * `skrr machines dedicated service stop` — desired state to stopped.
7
+ *
8
+ * This is the ONLY durable stop: it changes declared intent, so it survives
9
+ * the same restarts, checkpoints and replacements the service itself does.
10
+ * Killing the process is a symptom; stopping the declaration is the act.
11
+ */
12
+ class DedicatedServiceStop extends dedicated_service_command_1.DedicatedServiceCommand {
13
+ static summary = 'Set a service’s desired state to stopped (survives machine restarts)';
14
+ static examples = [
15
+ '<%= config.bin %> machines dedicated service stop <lease-id> <name>',
16
+ ];
17
+ static args = {
18
+ lease: core_1.Args.string({
19
+ description: dedicated_service_command_1.SERVICE_LEASE_ARG_DESCRIPTION,
20
+ required: true,
21
+ ignoreStdin: true,
22
+ }),
23
+ name: core_1.Args.string({ description: 'Service name', required: true, ignoreStdin: true }),
24
+ };
25
+ static flags = {
26
+ json: core_1.Flags.boolean({ description: 'Output the result as JSON' }),
27
+ };
28
+ async run() {
29
+ this.requireAuth();
30
+ const { args, flags } = await this.parse(DedicatedServiceStop);
31
+ const leaseId = await this.resolveLeaseArg(args.lease);
32
+ await this.runServiceAction(leaseId, args.name, 'stop', flags);
33
+ }
34
+ }
35
+ exports.default = DedicatedServiceStop;
@@ -0,0 +1,22 @@
1
+ import { DedicatedServiceCommand } from '../../../../lib/dedicated-service-command';
2
+ /**
3
+ * `skrr machines dedicated service top` — per-service cpu, memory and pids
4
+ * read off the service scopes (phase 2).
5
+ *
6
+ * Every service lives in its own `skrr-svc-<name>.scope` cgroup, so its
7
+ * `cpu.stat`, `memory.current` and `pids.current` are reads, not
8
+ * instrumentation. A daemon that does not report stats yet gets the honest
9
+ * answer: the table prints `-`, not invented numbers.
10
+ */
11
+ export default class DedicatedServiceTop extends DedicatedServiceCommand {
12
+ static summary: string;
13
+ static examples: string[];
14
+ static args: {
15
+ lease: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
16
+ name: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
17
+ };
18
+ static flags: {
19
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
20
+ };
21
+ run(): Promise<void>;
22
+ }
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const dedicated_service_command_1 = require("../../../../lib/dedicated-service-command");
5
+ const format_1 = require("../../../../lib/format");
6
+ function formatBytes(bytes) {
7
+ if (typeof bytes !== 'number' || !Number.isFinite(bytes))
8
+ return '-';
9
+ if (bytes >= 1 << 30)
10
+ return `${(bytes / (1 << 30)).toFixed(1)}G`;
11
+ if (bytes >= 1 << 20)
12
+ return `${(bytes / (1 << 20)).toFixed(1)}M`;
13
+ if (bytes >= 1 << 10)
14
+ return `${Math.round(bytes / (1 << 10))}K`;
15
+ return `${bytes}B`;
16
+ }
17
+ function statsCells(stats) {
18
+ if (!stats)
19
+ return { cpu: '-', mem: '-', pids: '-' };
20
+ const cpu = typeof stats.cpuPercent === 'number' ? `${Math.round(stats.cpuPercent)}%` : '-';
21
+ const mem = typeof stats.memoryBytes === 'number'
22
+ ? `${formatBytes(stats.memoryBytes)}${typeof stats.memoryMaxBytes === 'number' ? `/${formatBytes(stats.memoryMaxBytes)}` : ''}`
23
+ : '-';
24
+ const pids = typeof stats.pidsCurrent === 'number'
25
+ ? `${stats.pidsCurrent}${typeof stats.pidsMax === 'number' ? `/${stats.pidsMax}` : ''}`
26
+ : '-';
27
+ return { cpu, mem, pids };
28
+ }
29
+ /**
30
+ * `skrr machines dedicated service top` — per-service cpu, memory and pids
31
+ * read off the service scopes (phase 2).
32
+ *
33
+ * Every service lives in its own `skrr-svc-<name>.scope` cgroup, so its
34
+ * `cpu.stat`, `memory.current` and `pids.current` are reads, not
35
+ * instrumentation. A daemon that does not report stats yet gets the honest
36
+ * answer: the table prints `-`, not invented numbers.
37
+ */
38
+ class DedicatedServiceTop extends dedicated_service_command_1.DedicatedServiceCommand {
39
+ static summary = 'Per-service cpu/mem/pids from the service scopes (phase 2)';
40
+ static examples = [
41
+ '<%= config.bin %> machines dedicated service top <lease-id>',
42
+ '<%= config.bin %> machines dedicated service top <lease-id> <name>',
43
+ ];
44
+ static args = {
45
+ lease: core_1.Args.string({
46
+ description: dedicated_service_command_1.SERVICE_LEASE_ARG_DESCRIPTION,
47
+ required: true,
48
+ ignoreStdin: true,
49
+ }),
50
+ name: core_1.Args.string({
51
+ description: 'Service name (omit for all services)',
52
+ required: false,
53
+ ignoreStdin: true,
54
+ }),
55
+ };
56
+ static flags = {
57
+ json: core_1.Flags.boolean({ description: 'Output as JSON' }),
58
+ };
59
+ async run() {
60
+ this.requireAuth();
61
+ const { args, flags } = await this.parse(DedicatedServiceTop);
62
+ const leaseId = await this.resolveLeaseArg(args.lease);
63
+ let rows = [];
64
+ let statsMissing = false;
65
+ if (args.name) {
66
+ const result = await this.callService('get', {
67
+ leaseId,
68
+ name: args.name,
69
+ ...this.scopeFrom(flags),
70
+ });
71
+ if (flags.json) {
72
+ this.log(JSON.stringify(result ?? {}, null, 2));
73
+ this.closeServiceChannel();
74
+ return;
75
+ }
76
+ statsMissing = !result?.stats;
77
+ rows = [
78
+ {
79
+ name: args.name,
80
+ status: (0, format_1.formatCell)(result?.status ?? 'unknown'),
81
+ ...statsCells(result?.stats),
82
+ },
83
+ ];
84
+ }
85
+ else {
86
+ const result = await this.callService('list', {
87
+ leaseId,
88
+ ...this.scopeFrom(flags),
89
+ });
90
+ if (flags.json) {
91
+ this.log(JSON.stringify(result ?? { services: [] }, null, 2));
92
+ this.closeServiceChannel();
93
+ return;
94
+ }
95
+ const services = result?.services ?? [];
96
+ statsMissing = services.some((svc) => !svc.stats);
97
+ rows = services.map((svc) => ({
98
+ name: (0, format_1.formatCell)(svc.name ?? svc.spec?.name),
99
+ status: (0, format_1.formatCell)(svc.status ?? 'unknown'),
100
+ ...statsCells(svc.stats),
101
+ }));
102
+ }
103
+ this.closeServiceChannel();
104
+ if (rows.length === 0) {
105
+ this.log(`No declared services on ${leaseId}.`);
106
+ return;
107
+ }
108
+ (0, format_1.renderTable)(rows, [
109
+ { key: 'name', header: 'NAME', verbatim: true },
110
+ { key: 'status', header: 'STATUS' },
111
+ { key: 'cpu', header: 'CPU' },
112
+ { key: 'mem', header: 'MEM' },
113
+ { key: 'pids', header: 'PIDS' },
114
+ ], (line) => this.log(line));
115
+ if (statsMissing) {
116
+ this.log('No stats reported — this machine’s daemon does not expose per-service metrics yet (services_v1 stats).');
117
+ }
118
+ }
119
+ }
120
+ exports.default = DedicatedServiceTop;
@@ -0,0 +1,22 @@
1
+ import type { DedicatedRuntimeSignInStatus } from '@skrr-ai/data-provider';
2
+ import { DedicatedLeaseCommand } from '../../../lib/dedicated-lease-command';
3
+ /**
4
+ * `skrr machines dedicated sign-in-status` — the read half of `sign-in`.
5
+ *
6
+ * Deliberately a separate command, not a flag on `sign-in`: the whole reason
7
+ * the endpoint exists is to answer the question WITHOUT starting a sign-in,
8
+ * and folding it into the verb that signs in would make the distinction a
9
+ * matter of remembering a flag.
10
+ */
11
+ export default class DedicatedMachinesSignInStatus extends DedicatedLeaseCommand {
12
+ static description: string;
13
+ static examples: string[];
14
+ static args: {
15
+ lease: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
16
+ };
17
+ static flags: {
18
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
19
+ };
20
+ run(): Promise<void>;
21
+ }
22
+ export declare function describeSignInStatus(status: DedicatedRuntimeSignInStatus): string;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.describeSignInStatus = describeSignInStatus;
4
+ const core_1 = require("@oclif/core");
5
+ const data_provider_1 = require("@skrr-ai/data-provider");
6
+ const dedicated_lease_command_1 = require("../../../lib/dedicated-lease-command");
7
+ const dedicated_machines_1 = require("../../../lib/dedicated-machines");
8
+ const LABELS = new Map(data_provider_1.DEDICATED_RUNTIME_SIGN_IN_PRESETS.map((preset) => [preset.tool, preset.label]));
9
+ /**
10
+ * `skrr machines dedicated sign-in-status` — the read half of `sign-in`.
11
+ *
12
+ * Deliberately a separate command, not a flag on `sign-in`: the whole reason
13
+ * the endpoint exists is to answer the question WITHOUT starting a sign-in,
14
+ * and folding it into the verb that signs in would make the distinction a
15
+ * matter of remembering a flag.
16
+ */
17
+ class DedicatedMachinesSignInStatus extends dedicated_lease_command_1.DedicatedLeaseCommand {
18
+ static description = 'Report whether a Dedicated Runtime is signed in to GitHub CLI, Claude Code and Codex, without starting a sign-in. Read-only on the machine.';
19
+ static examples = [
20
+ '<%= config.bin %> machines dedicated sign-in-status <lease-id>',
21
+ '<%= config.bin %> machines dedicated sign-in-status <lease-id> --json',
22
+ ];
23
+ static args = {
24
+ lease: core_1.Args.string({
25
+ description: dedicated_lease_command_1.DEDICATED_LEASE_ARG_DESCRIPTION,
26
+ required: true,
27
+ ignoreStdin: true,
28
+ }),
29
+ };
30
+ static flags = {
31
+ json: core_1.Flags.boolean({ description: 'Output as JSON' }),
32
+ };
33
+ async run() {
34
+ this.requireAuth();
35
+ const { args, flags } = await this.parse(DedicatedMachinesSignInStatus);
36
+ const leaseId = await this.resolveLeaseArg(args.lease);
37
+ const response = await this.callDedicated(() => (0, dedicated_machines_1.getDedicatedRuntimeSignInStatus)(leaseId, this.scopeFrom(flags)));
38
+ if (flags.json) {
39
+ this.log(JSON.stringify(response, null, 2));
40
+ return;
41
+ }
42
+ const statuses = response?.statuses ?? [];
43
+ if (!statuses.length) {
44
+ this.log('The machine reported no sign-in status.');
45
+ return;
46
+ }
47
+ for (const status of statuses)
48
+ this.log(describeSignInStatus(status));
49
+ // `unknown` is not `signed_out`, and the difference decides whether anyone
50
+ // should go and re-authenticate. Saying it once, at the end, rather than
51
+ // on every row, keeps the common all-signed-in case one line per tool.
52
+ if (statuses.every((status) => status.state === 'unknown')) {
53
+ this.log('\nNothing could be read. The probe may have timed out or the machine may be unreachable — ' +
54
+ 'that is not evidence the credentials are gone. Check again shortly.');
55
+ }
56
+ else if (statuses.some((status) => status.state === 'unknown')) {
57
+ this.log('\n`unknown` means the check could not answer, not that the tool is signed out — ' +
58
+ 'it may not be installed on this image.');
59
+ }
60
+ if (response.checkedAt)
61
+ this.log(`\nChecked ${response.checkedAt}.`);
62
+ // No state-derived exit code, on purpose. The one a script would reach for
63
+ // — non-zero when "not signed in" — has no honest definition here, because
64
+ // it would have to put `unknown` on one side or the other and both are
65
+ // wrong. `--json` carries the three states; let the caller decide which of
66
+ // them it cares about.
67
+ }
68
+ }
69
+ exports.default = DedicatedMachinesSignInStatus;
70
+ const STATE_LABEL = {
71
+ signed_in: 'signed in',
72
+ signed_out: 'signed out',
73
+ unknown: 'unknown',
74
+ };
75
+ function describeSignInStatus(status) {
76
+ const label = LABELS.get(status.tool) ?? status.tool;
77
+ const account = status.account ? ` (${status.account})` : '';
78
+ return `${label.padEnd(12)} ${STATE_LABEL[status.state] ?? status.state}${account}`;
79
+ }
@@ -0,0 +1,28 @@
1
+ import { DedicatedLeaseCommand } from '../../../lib/dedicated-lease-command';
2
+ /**
3
+ * `skrr machines dedicated ssh-config` — the OpenSSH stanza for every lease.
4
+ *
5
+ * The block is a wildcard `Host rtl_*.skrr`: installing it once makes
6
+ * `ssh rtl_<id>.skrr` (and therefore `scp`, `rsync`, `git`, VS Code
7
+ * Remote-SSH, JetBrains Gateway) work for every Dedicated Runtime the user
8
+ * ever leases — one device identity and one pin file under ~/.skrr/ssh/,
9
+ * nothing of the user's own ~/.ssh shared with it.
10
+ *
11
+ * By default the block is installed into ~/.ssh/config as a managed region
12
+ * between the skrr markers, and refuses — rather than edits — a config whose
13
+ * markers cannot bound a region. `--print` writes the block to stdout for
14
+ * people who keep their ssh config by hand.
15
+ */
16
+ export default class DedicatedMachinesSshConfig extends DedicatedLeaseCommand {
17
+ static description: string;
18
+ static examples: string[];
19
+ static args: {
20
+ lease: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
21
+ };
22
+ static flags: {
23
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
24
+ print: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
25
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
26
+ };
27
+ run(): Promise<void>;
28
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const dedicated_lease_command_1 = require("../../../lib/dedicated-lease-command");
5
+ const dedicated_ssh_1 = require("../../../lib/dedicated-ssh");
6
+ /**
7
+ * `skrr machines dedicated ssh-config` — the OpenSSH stanza for every lease.
8
+ *
9
+ * The block is a wildcard `Host rtl_*.skrr`: installing it once makes
10
+ * `ssh rtl_<id>.skrr` (and therefore `scp`, `rsync`, `git`, VS Code
11
+ * Remote-SSH, JetBrains Gateway) work for every Dedicated Runtime the user
12
+ * ever leases — one device identity and one pin file under ~/.skrr/ssh/,
13
+ * nothing of the user's own ~/.ssh shared with it.
14
+ *
15
+ * By default the block is installed into ~/.ssh/config as a managed region
16
+ * between the skrr markers, and refuses — rather than edits — a config whose
17
+ * markers cannot bound a region. `--print` writes the block to stdout for
18
+ * people who keep their ssh config by hand.
19
+ */
20
+ class DedicatedMachinesSshConfig extends dedicated_lease_command_1.DedicatedLeaseCommand {
21
+ static description = 'Install (or --print) the ~/.ssh/config block that lets plain ssh/scp/rsync/Remote-SSH reach any Dedicated Runtime.';
22
+ static examples = [
23
+ '<%= config.bin %> machines dedicated ssh-config <lease-id>',
24
+ '<%= config.bin %> machines dedicated ssh-config <lease-id> --print',
25
+ '<%= config.bin %> machines dedicated ssh-config <lease-id> --json',
26
+ ];
27
+ static args = {
28
+ lease: core_1.Args.string({
29
+ description: 'Dedicated Runtime lease id, or `self`',
30
+ required: true,
31
+ ignoreStdin: true,
32
+ }),
33
+ };
34
+ static flags = {
35
+ workspace: core_1.Flags.string({ description: 'Workspace scope' }),
36
+ print: core_1.Flags.boolean({ description: 'Print the block instead of installing it' }),
37
+ json: core_1.Flags.boolean({ description: 'Output the block as JSON' }),
38
+ };
39
+ async run() {
40
+ const { args, flags } = await this.parse(DedicatedMachinesSshConfig);
41
+ const leaseId = await this.resolveLeaseArg(args.lease);
42
+ // First use creates the device identity so the block names a file that
43
+ // exists; its admission still happens per-connection, by the daemon.
44
+ (0, dedicated_ssh_1.ensureSshIdentity)();
45
+ const block = (0, dedicated_ssh_1.sshConfigBlock)();
46
+ if (flags.json) {
47
+ this.log(JSON.stringify({ leaseId, config: block }, null, 2));
48
+ return;
49
+ }
50
+ if (flags.print) {
51
+ this.log(`${block}\n`);
52
+ return;
53
+ }
54
+ try {
55
+ const { configPath } = (0, dedicated_ssh_1.installSshConfigBlock)();
56
+ process.stderr.write(`Installed the skrr block in ${configPath}. \`ssh ${leaseId}.skrr\` (and scp, rsync, Remote-SSH) just work.\n`);
57
+ }
58
+ catch (error) {
59
+ if (error instanceof dedicated_ssh_1.DedicatedSshError) {
60
+ this.error(error.message, { exit: 1 });
61
+ }
62
+ throw error;
63
+ }
64
+ }
65
+ }
66
+ exports.default = DedicatedMachinesSshConfig;
@@ -0,0 +1,22 @@
1
+ import { DedicatedLeaseCommand } from '../../../lib/dedicated-lease-command';
2
+ /**
3
+ * `skrr machines dedicated ssh-proxy` — the ProxyCommand half of owner SSH.
4
+ *
5
+ * OpenSSH runs this with stdin/stdout wired to the SSH protocol: whatever the
6
+ * client writes arrives on the machine's sshd, whatever sshd writes is read
7
+ * back here. Everything else — admission, generation fencing, the ephemeral
8
+ * key's admission, host-key delivery — is carried by the channel, so this
9
+ * command's only job is to move bytes honestly and say why it cannot.
10
+ *
11
+ * Not for typing into: it writes protocol bytes to stdout and diagnostics to
12
+ * stderr, exactly like `ssh -W`. Humans want `ssh` (the next command) or the
13
+ * `ssh-config` block it can print.
14
+ */
15
+ export default class DedicatedMachinesSshProxy extends DedicatedLeaseCommand {
16
+ static description: string;
17
+ static examples: string[];
18
+ static args: {
19
+ host: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
20
+ };
21
+ run(): Promise<void>;
22
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const dedicated_lease_command_1 = require("../../../lib/dedicated-lease-command");
5
+ const dedicated_ssh_1 = require("../../../lib/dedicated-ssh");
6
+ /**
7
+ * `skrr machines dedicated ssh-proxy` — the ProxyCommand half of owner SSH.
8
+ *
9
+ * OpenSSH runs this with stdin/stdout wired to the SSH protocol: whatever the
10
+ * client writes arrives on the machine's sshd, whatever sshd writes is read
11
+ * back here. Everything else — admission, generation fencing, the ephemeral
12
+ * key's admission, host-key delivery — is carried by the channel, so this
13
+ * command's only job is to move bytes honestly and say why it cannot.
14
+ *
15
+ * Not for typing into: it writes protocol bytes to stdout and diagnostics to
16
+ * stderr, exactly like `ssh -W`. Humans want `ssh` (the next command) or the
17
+ * `ssh-config` block it can print.
18
+ */
19
+ class DedicatedMachinesSshProxy extends dedicated_lease_command_1.DedicatedLeaseCommand {
20
+ static description = 'Bridge stdio to a Dedicated Runtime’s SSH server — the ProxyCommand ssh/scp/rsync/Remote-SSH use. Not an interactive command.';
21
+ static examples = [
22
+ "ssh -o ProxyCommand='skrr machines dedicated ssh-proxy %h' rtl_abc123.skrr",
23
+ '<%= config.bin %> machines dedicated ssh-proxy rtl_abc123.skrr',
24
+ ];
25
+ static args = {
26
+ host: core_1.Args.string({
27
+ description: 'The ssh host alias (rtl_<id>.skrr) or a bare lease id',
28
+ required: true,
29
+ ignoreStdin: true,
30
+ }),
31
+ };
32
+ async run() {
33
+ this.requireAuth();
34
+ const { args } = await this.parse(DedicatedMachinesSshProxy);
35
+ // `%h` arrives as the Host alias (`rtl_<id>.skrr`); a bare id or `self`
36
+ // work too, so the command is callable by hand.
37
+ const lease = (0, dedicated_ssh_1.leaseIdForSshHost)(args.host) ??
38
+ (args.host === 'self' ? await this.resolveLeaseArg('self') : null);
39
+ if (!lease) {
40
+ this.error(`Cannot read a lease id from '${args.host}'. Expected rtl_<id> or rtl_<id>.skrr.`, { exit: 2 });
41
+ }
42
+ let code;
43
+ try {
44
+ code = await (0, dedicated_ssh_1.runSshProxy)({
45
+ baseURL: this.cliConfig.baseURL,
46
+ token: this.resolvedCredential.token,
47
+ leaseId: lease,
48
+ input: process.stdin,
49
+ output: process.stdout,
50
+ errorOutput: process.stderr,
51
+ });
52
+ }
53
+ catch (err) {
54
+ if (err instanceof dedicated_ssh_1.DedicatedSshError)
55
+ this.error(err.message, { exit: 1 });
56
+ throw err;
57
+ }
58
+ if (code !== 0)
59
+ this.exit(code);
60
+ }
61
+ }
62
+ exports.default = DedicatedMachinesSshProxy;
@@ -0,0 +1,29 @@
1
+ import { DedicatedLeaseCommand } from '../../../lib/dedicated-lease-command';
2
+ /**
3
+ * `skrr machines dedicated ssh` — a real OpenSSH session on a Dedicated
4
+ * Runtime, as skrr-workload.
5
+ *
6
+ * The client on this machine is ordinary `ssh`: this command builds the
7
+ * options (`-o ProxyCommand=… ssh-proxy %h`, the lease's identity file and
8
+ * known_hosts) and execs it, so tab-completion, `-L`, agent forwarding and
9
+ * every other OpenSSH feature behave the way `man ssh` says they do.
10
+ * `ssh-proxy` carries the protocol over the admitted relay; there is no port
11
+ * on the machine for the session to have arrived on.
12
+ *
13
+ * `scp`, `rsync`, `git` over SSH, VS Code Remote-SSH and JetBrains Gateway
14
+ * take the same path — they just need the Host block, which `ssh-config`
15
+ * prints.
16
+ */
17
+ export default class DedicatedMachinesSsh extends DedicatedLeaseCommand {
18
+ static description: string;
19
+ static examples: string[];
20
+ static usage: string;
21
+ static strict: boolean;
22
+ static args: {
23
+ lease: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
24
+ };
25
+ static flags: {
26
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
27
+ };
28
+ run(): Promise<void>;
29
+ }