@kimchi-dev/kimchictl 0.0.2

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 (231) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +105 -0
  3. package/bin/kimchictl.mjs +17 -0
  4. package/dist/api/http.d.ts +7 -0
  5. package/dist/api/http.d.ts.map +1 -0
  6. package/dist/api/http.js +60 -0
  7. package/dist/api/http.js.map +1 -0
  8. package/dist/api/keys.d.ts +7 -0
  9. package/dist/api/keys.d.ts.map +1 -0
  10. package/dist/api/keys.js +28 -0
  11. package/dist/api/keys.js.map +1 -0
  12. package/dist/api/me.d.ts +12 -0
  13. package/dist/api/me.d.ts.map +1 -0
  14. package/dist/api/me.js +28 -0
  15. package/dist/api/me.js.map +1 -0
  16. package/dist/api/resolver.d.ts +26 -0
  17. package/dist/api/resolver.d.ts.map +1 -0
  18. package/dist/api/resolver.js +62 -0
  19. package/dist/api/resolver.js.map +1 -0
  20. package/dist/api/resources.d.ts +16 -0
  21. package/dist/api/resources.d.ts.map +1 -0
  22. package/dist/api/resources.js +96 -0
  23. package/dist/api/resources.js.map +1 -0
  24. package/dist/api/templates.d.ts +19 -0
  25. package/dist/api/templates.d.ts.map +1 -0
  26. package/dist/api/templates.js +25 -0
  27. package/dist/api/templates.js.map +1 -0
  28. package/dist/api/tokens.d.ts +23 -0
  29. package/dist/api/tokens.d.ts.map +1 -0
  30. package/dist/api/tokens.js +51 -0
  31. package/dist/api/tokens.js.map +1 -0
  32. package/dist/api/types.d.ts +34 -0
  33. package/dist/api/types.d.ts.map +1 -0
  34. package/dist/api/types.js +32 -0
  35. package/dist/api/types.js.map +1 -0
  36. package/dist/api/wait.d.ts +17 -0
  37. package/dist/api/wait.d.ts.map +1 -0
  38. package/dist/api/wait.js +37 -0
  39. package/dist/api/wait.js.map +1 -0
  40. package/dist/api/workspaces.d.ts +33 -0
  41. package/dist/api/workspaces.d.ts.map +1 -0
  42. package/dist/api/workspaces.js +159 -0
  43. package/dist/api/workspaces.js.map +1 -0
  44. package/dist/auth/auth-file.d.ts +37 -0
  45. package/dist/auth/auth-file.d.ts.map +1 -0
  46. package/dist/auth/auth-file.js +100 -0
  47. package/dist/auth/auth-file.js.map +1 -0
  48. package/dist/auth/browser-login.d.ts +45 -0
  49. package/dist/auth/browser-login.d.ts.map +1 -0
  50. package/dist/auth/browser-login.js +195 -0
  51. package/dist/auth/browser-login.js.map +1 -0
  52. package/dist/auth/config-file.d.ts +4 -0
  53. package/dist/auth/config-file.d.ts.map +1 -0
  54. package/dist/auth/config-file.js +52 -0
  55. package/dist/auth/config-file.js.map +1 -0
  56. package/dist/auth/models-providers.d.ts +17 -0
  57. package/dist/auth/models-providers.d.ts.map +1 -0
  58. package/dist/auth/models-providers.js +63 -0
  59. package/dist/auth/models-providers.js.map +1 -0
  60. package/dist/auth/paths.d.ts +15 -0
  61. package/dist/auth/paths.d.ts.map +1 -0
  62. package/dist/auth/paths.js +25 -0
  63. package/dist/auth/paths.js.map +1 -0
  64. package/dist/auth/provider-ids.d.ts +4 -0
  65. package/dist/auth/provider-ids.d.ts.map +1 -0
  66. package/dist/auth/provider-ids.js +12 -0
  67. package/dist/auth/provider-ids.js.map +1 -0
  68. package/dist/auth/resolve.d.ts +19 -0
  69. package/dist/auth/resolve.d.ts.map +1 -0
  70. package/dist/auth/resolve.js +37 -0
  71. package/dist/auth/resolve.js.map +1 -0
  72. package/dist/cli.d.ts +2 -0
  73. package/dist/cli.d.ts.map +1 -0
  74. package/dist/cli.js +15 -0
  75. package/dist/cli.js.map +1 -0
  76. package/dist/commands/completion.d.ts +2 -0
  77. package/dist/commands/completion.d.ts.map +1 -0
  78. package/dist/commands/completion.js +71 -0
  79. package/dist/commands/completion.js.map +1 -0
  80. package/dist/commands/flags.d.ts +16 -0
  81. package/dist/commands/flags.d.ts.map +1 -0
  82. package/dist/commands/flags.js +23 -0
  83. package/dist/commands/flags.js.map +1 -0
  84. package/dist/commands/guard.d.ts +10 -0
  85. package/dist/commands/guard.d.ts.map +1 -0
  86. package/dist/commands/guard.js +41 -0
  87. package/dist/commands/guard.js.map +1 -0
  88. package/dist/commands/help.d.ts +4 -0
  89. package/dist/commands/help.d.ts.map +1 -0
  90. package/dist/commands/help.js +19 -0
  91. package/dist/commands/help.js.map +1 -0
  92. package/dist/commands/login.d.ts +18 -0
  93. package/dist/commands/login.d.ts.map +1 -0
  94. package/dist/commands/login.js +80 -0
  95. package/dist/commands/login.js.map +1 -0
  96. package/dist/commands/logout.d.ts +14 -0
  97. package/dist/commands/logout.d.ts.map +1 -0
  98. package/dist/commands/logout.js +41 -0
  99. package/dist/commands/logout.js.map +1 -0
  100. package/dist/commands/prompt.d.ts +9 -0
  101. package/dist/commands/prompt.d.ts.map +1 -0
  102. package/dist/commands/prompt.js +21 -0
  103. package/dist/commands/prompt.js.map +1 -0
  104. package/dist/commands/registry.d.ts +16 -0
  105. package/dist/commands/registry.d.ts.map +1 -0
  106. package/dist/commands/registry.js +35 -0
  107. package/dist/commands/registry.js.map +1 -0
  108. package/dist/commands/ssh.d.ts +15 -0
  109. package/dist/commands/ssh.d.ts.map +1 -0
  110. package/dist/commands/ssh.js +90 -0
  111. package/dist/commands/ssh.js.map +1 -0
  112. package/dist/commands/table.d.ts +3 -0
  113. package/dist/commands/table.d.ts.map +1 -0
  114. package/dist/commands/table.js +10 -0
  115. package/dist/commands/table.js.map +1 -0
  116. package/dist/commands/update.d.ts +16 -0
  117. package/dist/commands/update.d.ts.map +1 -0
  118. package/dist/commands/update.js +57 -0
  119. package/dist/commands/update.js.map +1 -0
  120. package/dist/commands/version.d.ts +2 -0
  121. package/dist/commands/version.d.ts.map +1 -0
  122. package/dist/commands/version.js +6 -0
  123. package/dist/commands/version.js.map +1 -0
  124. package/dist/commands/whoami.d.ts +7 -0
  125. package/dist/commands/whoami.d.ts.map +1 -0
  126. package/dist/commands/whoami.js +30 -0
  127. package/dist/commands/whoami.js.map +1 -0
  128. package/dist/commands/workspace.d.ts +15 -0
  129. package/dist/commands/workspace.d.ts.map +1 -0
  130. package/dist/commands/workspace.js +206 -0
  131. package/dist/commands/workspace.js.map +1 -0
  132. package/dist/run.d.ts +10 -0
  133. package/dist/run.d.ts.map +1 -0
  134. package/dist/run.js +30 -0
  135. package/dist/run.js.map +1 -0
  136. package/dist/ssh/bridge.d.ts +25 -0
  137. package/dist/ssh/bridge.d.ts.map +1 -0
  138. package/dist/ssh/bridge.js +95 -0
  139. package/dist/ssh/bridge.js.map +1 -0
  140. package/dist/ssh/config.d.ts +65 -0
  141. package/dist/ssh/config.d.ts.map +1 -0
  142. package/dist/ssh/config.js +198 -0
  143. package/dist/ssh/config.js.map +1 -0
  144. package/dist/ssh/connect.d.ts +27 -0
  145. package/dist/ssh/connect.d.ts.map +1 -0
  146. package/dist/ssh/connect.js +67 -0
  147. package/dist/ssh/connect.js.map +1 -0
  148. package/dist/ssh/tunnel.d.ts +29 -0
  149. package/dist/ssh/tunnel.d.ts.map +1 -0
  150. package/dist/ssh/tunnel.js +36 -0
  151. package/dist/ssh/tunnel.js.map +1 -0
  152. package/dist/test-support.d.ts +30 -0
  153. package/dist/test-support.d.ts.map +1 -0
  154. package/dist/test-support.js +67 -0
  155. package/dist/test-support.js.map +1 -0
  156. package/dist/updates/check.d.ts +18 -0
  157. package/dist/updates/check.d.ts.map +1 -0
  158. package/dist/updates/check.js +90 -0
  159. package/dist/updates/check.js.map +1 -0
  160. package/dist/updates/self.d.ts +36 -0
  161. package/dist/updates/self.d.ts.map +1 -0
  162. package/dist/updates/self.js +103 -0
  163. package/dist/updates/self.js.map +1 -0
  164. package/dist/version.d.ts +7 -0
  165. package/dist/version.d.ts.map +1 -0
  166. package/dist/version.js +7 -0
  167. package/dist/version.js.map +1 -0
  168. package/package.json +77 -0
  169. package/src/api/http.ts +70 -0
  170. package/src/api/keys.ts +40 -0
  171. package/src/api/me.ts +48 -0
  172. package/src/api/resolver.test.ts +109 -0
  173. package/src/api/resolver.ts +72 -0
  174. package/src/api/resources.test.ts +56 -0
  175. package/src/api/resources.ts +92 -0
  176. package/src/api/templates.ts +28 -0
  177. package/src/api/tokens.ts +80 -0
  178. package/src/api/types.ts +50 -0
  179. package/src/api/wait.ts +45 -0
  180. package/src/api/workspaces.ts +234 -0
  181. package/src/auth/auth-file.test.ts +176 -0
  182. package/src/auth/auth-file.ts +103 -0
  183. package/src/auth/browser-login.test.ts +93 -0
  184. package/src/auth/browser-login.ts +247 -0
  185. package/src/auth/config-file.test.ts +68 -0
  186. package/src/auth/config-file.ts +50 -0
  187. package/src/auth/models-providers.test.ts +63 -0
  188. package/src/auth/models-providers.ts +76 -0
  189. package/src/auth/paths.ts +28 -0
  190. package/src/auth/provider-ids.ts +15 -0
  191. package/src/auth/resolve.test.ts +72 -0
  192. package/src/auth/resolve.ts +46 -0
  193. package/src/cli.ts +16 -0
  194. package/src/commands/completion.test.ts +31 -0
  195. package/src/commands/completion.ts +77 -0
  196. package/src/commands/flags.ts +29 -0
  197. package/src/commands/guard.ts +44 -0
  198. package/src/commands/help.ts +20 -0
  199. package/src/commands/login.test.ts +159 -0
  200. package/src/commands/login.ts +94 -0
  201. package/src/commands/logout.test.ts +89 -0
  202. package/src/commands/logout.ts +53 -0
  203. package/src/commands/prompt.ts +21 -0
  204. package/src/commands/registry.ts +50 -0
  205. package/src/commands/ssh.test.ts +101 -0
  206. package/src/commands/ssh.ts +112 -0
  207. package/src/commands/table.test.ts +24 -0
  208. package/src/commands/table.ts +10 -0
  209. package/src/commands/update.test.ts +91 -0
  210. package/src/commands/update.ts +78 -0
  211. package/src/commands/version.ts +6 -0
  212. package/src/commands/whoami.test.ts +72 -0
  213. package/src/commands/whoami.ts +36 -0
  214. package/src/commands/workspace.test.ts +360 -0
  215. package/src/commands/workspace.ts +250 -0
  216. package/src/run.test.ts +53 -0
  217. package/src/run.ts +34 -0
  218. package/src/ssh/bridge.test.ts +70 -0
  219. package/src/ssh/bridge.ts +110 -0
  220. package/src/ssh/config.test.ts +213 -0
  221. package/src/ssh/config.ts +233 -0
  222. package/src/ssh/connect.test.ts +123 -0
  223. package/src/ssh/connect.ts +98 -0
  224. package/src/ssh/tunnel.test.ts +119 -0
  225. package/src/ssh/tunnel.ts +64 -0
  226. package/src/test-support.ts +77 -0
  227. package/src/updates/check.test.ts +99 -0
  228. package/src/updates/check.ts +117 -0
  229. package/src/updates/self.test.ts +117 -0
  230. package/src/updates/self.ts +131 -0
  231. package/src/version.ts +6 -0
@@ -0,0 +1,90 @@
1
+ import { verifyApiKey } from "../api/keys.js";
2
+ import { requireApiKey } from "../auth/resolve.js";
3
+ import { bridgeStdioToWebSocket } from "../ssh/bridge.js";
4
+ import { isSshIntegrationConfigured, resolveSshDomain, resolveSshPaths, setupSshIntegration, uninstallSshIntegration, } from "../ssh/config.js";
5
+ import { connectToWorkspace } from "../ssh/connect.js";
6
+ import { resolveTunnel } from "../ssh/tunnel.js";
7
+ import { parseFlags, UsageError } from "./flags.js";
8
+ const GROUP_USAGE = `Usage:
9
+ kimchictl ssh <name> [command...] Connect to a workspace (auto-configures SSH on first use)
10
+ kimchictl ssh setup [--uninstall] Manage the native SSH integration`;
11
+ /**
12
+ * `kimchictl ssh …` — connect, or manage the SSH integration. The hidden
13
+ * `proxy` subcommand is the ProxyCommand target in the generated ssh_config
14
+ * and is deliberately absent from help (internal plumbing, not user-facing).
15
+ */
16
+ export async function runSsh(args, deps = {}) {
17
+ const [head, ...rest] = args;
18
+ switch (head) {
19
+ case "setup":
20
+ return runSetup(rest, deps);
21
+ case "proxy":
22
+ return runProxy(rest, deps);
23
+ case "help":
24
+ case "--help":
25
+ case "-h":
26
+ console.log(GROUP_USAGE);
27
+ return 0;
28
+ case undefined:
29
+ console.error(GROUP_USAGE);
30
+ return 2;
31
+ default:
32
+ return connectToWorkspace(head, rest, deps);
33
+ }
34
+ }
35
+ // ---------------------------------------------------------------- setup
36
+ async function runSetup(args, deps) {
37
+ const { values, positionals } = parseFlags("ssh setup", args, {
38
+ uninstall: { type: "boolean" },
39
+ domain: { type: "string" },
40
+ });
41
+ if (positionals.length > 0) {
42
+ throw new UsageError("kimchictl ssh setup: unexpected positional argument");
43
+ }
44
+ const env = deps.env ?? process.env;
45
+ const paths = resolveSshPaths(env);
46
+ if (values.uninstall) {
47
+ const { notes } = await uninstallSshIntegration({ paths });
48
+ if (notes.length === 0) {
49
+ console.log("Nothing to remove — SSH integration was not configured.");
50
+ return 0;
51
+ }
52
+ console.log("✓ SSH integration removed");
53
+ for (const note of notes)
54
+ console.log(` ${note}`);
55
+ return 0;
56
+ }
57
+ const domain = resolveSshDomain(typeof values.domain === "string" && values.domain ? values.domain : undefined, env);
58
+ if (await isSshIntegrationConfigured(paths, domain)) {
59
+ console.log(`SSH integration already configured for *.${domain} (undo: kimchictl ssh setup --uninstall)`);
60
+ return 0;
61
+ }
62
+ const { notes } = await setupSshIntegration({ paths, domain });
63
+ console.log("✓ SSH integration configured");
64
+ for (const note of notes)
65
+ console.log(` ${note}`);
66
+ console.log(""); // blank line before the usage hint
67
+ console.log(`You can now run: ssh <workspace-name>.${domain} (scp, VS Code Remote-SSH, …)`);
68
+ return 0;
69
+ }
70
+ // ---------------------------------------------------------------- proxy (hidden)
71
+ async function runProxy(args, deps) {
72
+ const { values, positionals } = parseFlags("ssh proxy", args, {
73
+ port: { type: "string", default: "443" },
74
+ });
75
+ const host = positionals[0];
76
+ if (!host || positionals.length > 1) {
77
+ throw new UsageError("kimchictl ssh proxy: expected one host");
78
+ }
79
+ const port = Number(values.port);
80
+ if (!Number.isInteger(port) || port <= 0 || port > 65535) {
81
+ throw new UsageError("kimchictl ssh proxy: --port must be an integer 1-65535");
82
+ }
83
+ const env = deps.env ?? process.env;
84
+ const { key } = requireApiKey(env);
85
+ await verifyApiKey(key, { fetch: deps.fetch });
86
+ const creds = await resolveTunnel(key, host, { port, fetch: deps.fetch });
87
+ await bridgeStdioToWebSocket({ wsUrl: creds.wsUrl, token: creds.token });
88
+ return 0;
89
+ }
90
+ //# sourceMappingURL=ssh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.js","sourceRoot":"../src/","sources":["commands/ssh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Minimal kubectl-style table renderer: pad columns to the widest cell, two-space gutter. */
2
+ export declare function formatTable(headers: readonly string[], rows: readonly (readonly string[])[]): string;
3
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"../src/","sources":["commands/table.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,CAQpG"}
@@ -0,0 +1,10 @@
1
+ /** Minimal kubectl-style table renderer: pad columns to the widest cell, two-space gutter. */
2
+ export function formatTable(headers, rows) {
3
+ const widths = headers.map((header, i) => Math.max(header.length, ...rows.map((row) => row[i]?.length ?? 0)));
4
+ const line = (cells) => cells
5
+ .map((cell, i) => cell.padEnd(widths[i] ?? 0))
6
+ .join(" ")
7
+ .trimEnd();
8
+ return [line(headers), ...rows.map(line)].join("\n");
9
+ }
10
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"../src/","sources":["commands/table.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,MAAM,UAAU,WAAW,CAAC,OAA0B,EAAE,IAAoC;IAC3F,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7G,MAAM,IAAI,GAAG,CAAC,KAAwB,EAAE,EAAE,CACzC,KAAK;SACH,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SAC7C,IAAI,CAAC,IAAI,CAAC;SACV,OAAO,EAAE,CAAA;IACZ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACrD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type InstallMethod } from "../updates/self.js";
2
+ export interface UpdateDeps {
3
+ fetch?: typeof globalThis.fetch;
4
+ env?: NodeJS.ProcessEnv;
5
+ /** Injection seams (tests). */
6
+ installMethod?: InstallMethod;
7
+ download?: (url: string, destPath: string) => Promise<void>;
8
+ targetPath?: string;
9
+ currentVersion?: string;
10
+ }
11
+ /**
12
+ * `kimchictl update` — self-updates binary installs in place, tells brew/npm
13
+ * users the command their package manager owns.
14
+ */
15
+ export declare function runUpdate(args: string[], deps?: UpdateDeps): Promise<number>;
16
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"../src/","sources":["commands/update.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,aAAa,EAA0C,MAAM,oBAAoB,CAAA;AAIrH,MAAM,WAAW,UAAU;IAC1B,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACvB;AAgBD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CtF"}
@@ -0,0 +1,57 @@
1
+ import { fetchWithTimeout } from "../api/http.js";
2
+ import { defaultInstallMethod, platformAssetName, selfUpdateToVersion } from "../updates/self.js";
3
+ import { VERSION } from "../version.js";
4
+ import { parseFlags, UsageError } from "./flags.js";
5
+ const LATEST_RELEASE_URL = "https://api.github.com/repos/getkimchi/kimchictl/releases/latest";
6
+ async function fetchLatestVersion(fetchImpl) {
7
+ const resp = await fetchWithTimeout(LATEST_RELEASE_URL, { headers: { "User-Agent": `kimchictl/${VERSION}` } }, fetchImpl, 15_000);
8
+ if (!resp.ok)
9
+ return undefined;
10
+ const data = (await resp.json());
11
+ return typeof data.tag_name === "string" ? data.tag_name.replace(/^v/, "") : undefined;
12
+ }
13
+ /**
14
+ * `kimchictl update` — self-updates binary installs in place, tells brew/npm
15
+ * users the command their package manager owns.
16
+ */
17
+ export async function runUpdate(args, deps = {}) {
18
+ const { positionals } = parseFlags("update", args, {});
19
+ if (positionals.length > 0) {
20
+ throw new UsageError("kimchictl update: unexpected positional argument");
21
+ }
22
+ const method = deps.installMethod ?? defaultInstallMethod();
23
+ if (method === "homebrew") {
24
+ console.log("kimchictl was installed via Homebrew — update with:");
25
+ console.log("");
26
+ console.log(" brew upgrade kimchictl");
27
+ return 0;
28
+ }
29
+ if (method === "runtime") {
30
+ console.log("This kimchictl runs under a JS runtime (npm install or dev checkout) — update with:");
31
+ console.log("");
32
+ console.log(" npm update -g kimchictl # npm users");
33
+ console.log(" git pull && pnpm install # source checkouts");
34
+ return 0;
35
+ }
36
+ const current = deps.currentVersion ?? VERSION;
37
+ if (current.endsWith("-dev")) {
38
+ console.log("Dev build — self-update only works for released binaries.");
39
+ return 0;
40
+ }
41
+ const fetchImpl = deps.fetch ?? globalThis.fetch;
42
+ const latest = await fetchLatestVersion(fetchImpl);
43
+ if (latest === undefined) {
44
+ console.error("✗ could not determine the latest release (GitHub API unavailable)");
45
+ return 1;
46
+ }
47
+ if (latest === current) {
48
+ console.log(`kimchictl ${current} — already up to date.`);
49
+ return 0;
50
+ }
51
+ const targetPath = deps.targetPath ?? process.execPath;
52
+ console.log(`updating kimchictl ${current} → ${latest} (${platformAssetName()})…`);
53
+ await selfUpdateToVersion({ targetPath, version: latest, fetch: fetchImpl, download: deps.download });
54
+ console.log(`✓ kimchictl ${latest} installed at ${targetPath}`);
55
+ return 0;
56
+ }
57
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"../src/","sources":["commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runVersion(): number;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"../src/","sources":["commands/version.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,IAAI,MAAM,CAGnC"}
@@ -0,0 +1,6 @@
1
+ import { VERSION } from "../version.js";
2
+ export function runVersion() {
3
+ console.log(`kimchictl ${VERSION}`);
4
+ return 0;
5
+ }
6
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"../src/","sources":["commands/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,MAAM,UAAU,UAAU;IACzB,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAA;IACnC,OAAO,CAAC,CAAA;AACT,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface WhoamiDeps {
2
+ fetch?: typeof globalThis.fetch;
3
+ env?: NodeJS.ProcessEnv;
4
+ }
5
+ /** `kimchictl whoami` — show the authenticated user (GET /v1/me). */
6
+ export declare function runWhoami(args: string[], deps?: WhoamiDeps): Promise<number>;
7
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"../src/","sources":["commands/whoami.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IAC1B,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CACvB;AAED,qEAAqE;AACrE,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBtF"}
@@ -0,0 +1,30 @@
1
+ import { getMe } from "../api/me.js";
2
+ import { requireApiKey } from "../auth/resolve.js";
3
+ import { parseFlags } from "./flags.js";
4
+ /** `kimchictl whoami` — show the authenticated user (GET /v1/me). */
5
+ export async function runWhoami(args, deps = {}) {
6
+ const { values } = parseFlags("whoami", args, {
7
+ output: { type: "string", short: "o", default: "text" },
8
+ });
9
+ const env = deps.env ?? process.env;
10
+ const { key, source } = requireApiKey(env);
11
+ if (values.output !== "json" && values.output !== "text") {
12
+ console.error(`kimchictl whoami: unsupported --output "${values.output}" (expected text|json)`);
13
+ return 2;
14
+ }
15
+ const me = await getMe(key, { fetch: deps.fetch });
16
+ if (values.output === "json") {
17
+ console.log(JSON.stringify(me));
18
+ }
19
+ else {
20
+ console.log(`id: ${me.id}`);
21
+ if (me.username)
22
+ console.log(`username: ${me.username}`);
23
+ if (me.email)
24
+ console.log(`email: ${me.email}`);
25
+ // Key source goes to stderr so stdout stays machine-parseable.
26
+ console.error(`(authenticated via ${source === "environment" ? "KIMCHI_API_KEY" : source === "config" ? "config.json" : "auth.json"})`);
27
+ }
28
+ return 0;
29
+ }
30
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"../src/","sources":["commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAOvC,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc,EAAE,OAAmB,EAAE;IACpE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE;QAC7C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE;KACvD,CAAC,CAAA;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IAEnC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,2CAA2C,MAAM,CAAC,MAAM,wBAAwB,CAAC,CAAA;QAC/F,OAAO,CAAC,CAAA;IACT,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IAElD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;IAChC,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACjC,IAAI,EAAE,CAAC,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;QACxD,IAAI,EAAE,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;QAClD,+DAA+D;QAC/D,OAAO,CAAC,KAAK,CACZ,sBAAsB,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,GAAG,CACxH,CAAA;IACF,CAAC;IACD,OAAO,CAAC,CAAA;AACT,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface WorkspaceDeps {
2
+ fetch?: typeof globalThis.fetch;
3
+ env?: NodeJS.ProcessEnv;
4
+ /** Override TTY interactivity detection (tests). */
5
+ interactive?: boolean;
6
+ /** Confirmation override (tests). */
7
+ confirm?: (question: string) => Promise<boolean>;
8
+ /** Clock override for deterministic AGE columns (tests). */
9
+ now?: () => Date;
10
+ /** Sleep override for the create wait loop (tests). */
11
+ sleep?: (ms: number) => Promise<void>;
12
+ }
13
+ /** `kimchictl workspace <verb> …` — group command; also mounted as hidden alias `ws`. */
14
+ export declare function runWorkspace(args: string[], deps?: WorkspaceDeps): Promise<number>;
15
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"../src/","sources":["commands/workspace.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,aAAa;IAC7B,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,qCAAqC;IACrC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAChD,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;IAChB,uDAAuD;IACvD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC;AAcD,yFAAyF;AACzF,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB5F"}
@@ -0,0 +1,206 @@
1
+ import { resolveWorkspace } from "../api/resolver.js";
2
+ import { formatAge, formatBytes, formatMillicores } from "../api/resources.js";
3
+ import { resolveTemplate } from "../api/templates.js";
4
+ import { waitForWorkspaceActive } from "../api/wait.js";
5
+ import { createWorkspace, deleteWorkspace, listWorkspaces } from "../api/workspaces.js";
6
+ import { requireApiKey } from "../auth/resolve.js";
7
+ import { parseFlags, UsageError } from "./flags.js";
8
+ import { confirm, isInteractive } from "./prompt.js";
9
+ import { formatTable } from "./table.js";
10
+ const GROUP_USAGE = `Usage:
11
+ kimchictl workspace <verb> [options]
12
+
13
+ Verbs:
14
+ create Create a workspace (server generates the alias)
15
+ list List workspaces (alias: ls)
16
+ get Show workspace details
17
+ delete Delete a workspace (alias: rm)
18
+
19
+ Options:
20
+ --help Show this help`;
21
+ /** `kimchictl workspace <verb> …` — group command; also mounted as hidden alias `ws`. */
22
+ export async function runWorkspace(args, deps = {}) {
23
+ const [verb, ...rest] = args;
24
+ switch (verb) {
25
+ case "create":
26
+ return runCreate(rest, deps);
27
+ case "list":
28
+ case "ls":
29
+ return runList(rest, deps);
30
+ case "get":
31
+ return runGet(rest, deps);
32
+ case "delete":
33
+ case "rm":
34
+ return runDelete(rest, deps);
35
+ case "help":
36
+ case "--help":
37
+ case "-h":
38
+ case undefined:
39
+ console.log(GROUP_USAGE);
40
+ return verb === undefined ? 2 : 0;
41
+ default:
42
+ console.error(`kimchictl workspace: unknown verb "${verb}"`);
43
+ console.error(GROUP_USAGE);
44
+ return 2;
45
+ }
46
+ }
47
+ // ---------------------------------------------------------------- create
48
+ async function runCreate(args, deps) {
49
+ const { values, positionals } = parseFlags("workspace create", args, {
50
+ desc: { type: "string" },
51
+ template: { type: "string", short: "t" },
52
+ "no-wait": { type: "boolean" },
53
+ timeout: { type: "string", default: "60" },
54
+ });
55
+ if (positionals.length > 0) {
56
+ throw new UsageError("kimchictl workspace create: unexpected positional argument (workspaces are named by the server)");
57
+ }
58
+ const template = values.template;
59
+ if (typeof template === "string" && template.length > 0) {
60
+ // Placeholder: errors gracefully until the templates API contract lands.
61
+ resolveTemplate(template);
62
+ }
63
+ if (values.template !== undefined && (typeof values.template !== "string" || values.template.length === 0)) {
64
+ throw new UsageError("kimchictl workspace create: --template must not be empty");
65
+ }
66
+ const timeoutSeconds = parseTimeoutSeconds(values.timeout, "workspace create");
67
+ const desc = typeof values.desc === "string" && values.desc.length > 0 ? values.desc : undefined;
68
+ const { key } = requireApiKey(deps.env);
69
+ const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
70
+ const created = await createWorkspace(key, { description: desc, fetch: deps.fetch });
71
+ console.error(`✓ created ${created.alias} (${created.status})`);
72
+ let current = created;
73
+ if (!values["no-wait"]) {
74
+ // kap's create poll: 2s cadence, deadline, progress on stderr.
75
+ current = await waitForWorkspaceActive(key, created.id, {
76
+ fetch: deps.fetch,
77
+ timeoutMs: timeoutSeconds * 1000,
78
+ sleep,
79
+ onTick: (elapsedSeconds) => process.stderr.write(`\r waiting… ${elapsedSeconds}s`),
80
+ });
81
+ process.stderr.write("\n");
82
+ if (current.status !== "active") {
83
+ console.error(` ⚠ workspace still initializing — check with: kimchictl workspace get ${created.alias}`);
84
+ }
85
+ }
86
+ if (current.uri)
87
+ console.error(` uri ${current.uri}`);
88
+ // The alias goes to stdout last so scripts can capture it: ALIAS=$(kimchictl workspace create)
89
+ console.log(current.alias);
90
+ return 0;
91
+ }
92
+ function parseTimeoutSeconds(raw, command) {
93
+ const seconds = typeof raw === "string" ? Number(raw) : Number.NaN;
94
+ if (!Number.isInteger(seconds) || seconds <= 0) {
95
+ throw new UsageError(`kimchictl ${command}: --timeout must be a positive number of seconds`);
96
+ }
97
+ return seconds;
98
+ }
99
+ // ---------------------------------------------------------------- list
100
+ async function runList(args, deps) {
101
+ const { values, positionals } = parseFlags("workspace list", args, {
102
+ output: { type: "string", short: "o", default: "table" },
103
+ });
104
+ if (positionals.length > 0) {
105
+ throw new UsageError("kimchictl workspace list: unexpected positional argument");
106
+ }
107
+ if (values.output !== "json" && values.output !== "table") {
108
+ // Validate before touching the network — usage errors fail fast and offline.
109
+ throw new UsageError(`kimchictl workspace list: unsupported --output "${String(values.output)}" (expected table|json)`);
110
+ }
111
+ const { key } = requireApiKey(deps.env);
112
+ const workspaces = await listWorkspaces(key, { fetch: deps.fetch });
113
+ if (values.output === "json") {
114
+ console.log(JSON.stringify(workspaces.map(serializeWorkspace), null, 2));
115
+ return 0;
116
+ }
117
+ const now = deps.now?.() ?? new Date();
118
+ const rows = workspaces.map((w) => [
119
+ w.alias,
120
+ w.status,
121
+ formatMillicores(w.cpuMillicores),
122
+ formatBytes(w.ramBytes),
123
+ formatAge(w.createdAt, now),
124
+ ]);
125
+ console.log(formatTable(["NAME", "STATUS", "CPU", "MEMORY", "AGE"], rows));
126
+ return 0;
127
+ }
128
+ // ---------------------------------------------------------------- get
129
+ async function runGet(args, deps) {
130
+ const { values, positionals } = parseFlags("workspace get", args, {
131
+ output: { type: "string", short: "o", default: "text" },
132
+ });
133
+ if (positionals.length !== 1) {
134
+ throw new UsageError("kimchictl workspace get: expected exactly one workspace name");
135
+ }
136
+ if (values.output !== "json" && values.output !== "text") {
137
+ throw new UsageError(`kimchictl workspace get: unsupported --output "${String(values.output)}" (expected text|json)`);
138
+ }
139
+ const { key } = requireApiKey(deps.env);
140
+ // Accepts a UUID, full alias, or alias prefix (see api/resolver.ts).
141
+ const workspace = await resolveWorkspace(key, positionals[0] ?? "", { fetch: deps.fetch });
142
+ if (values.output === "json") {
143
+ console.log(JSON.stringify(serializeWorkspace(workspace), null, 2));
144
+ return 0;
145
+ }
146
+ const lines = [
147
+ `name: ${workspace.alias}`,
148
+ workspace.description ? `description: ${workspace.description}` : undefined,
149
+ `status: ${workspace.status}`,
150
+ workspace.uri ? `uri: ${workspace.uri}` : undefined,
151
+ `created: ${workspace.createdAt.toISOString()}`,
152
+ `cpu: ${formatMillicores(workspace.cpuMillicores)}`,
153
+ `memory: ${formatBytes(workspace.ramBytes)}`,
154
+ `storage: ${formatBytes(workspace.pvcSizeBytes)}`,
155
+ ].filter((line) => line !== undefined);
156
+ for (const line of lines)
157
+ console.log(line);
158
+ return 0;
159
+ }
160
+ // ---------------------------------------------------------------- delete
161
+ async function runDelete(args, deps) {
162
+ const { values, positionals } = parseFlags("workspace delete", args, {
163
+ force: { type: "boolean", short: "f" },
164
+ });
165
+ if (positionals.length !== 1) {
166
+ throw new UsageError("kimchictl workspace delete: expected exactly one workspace name");
167
+ }
168
+ const ref = positionals[0] ?? "";
169
+ const { key } = requireApiKey(deps.env);
170
+ // Resolve before prompting so the confirmation names the real target and
171
+ // typos fail fast instead of after the user answered the prompt.
172
+ const workspace = await resolveWorkspace(key, ref, { fetch: deps.fetch });
173
+ if (!values.force) {
174
+ const interactive = deps.interactive ?? isInteractive();
175
+ const question = `Delete workspace "${workspace.alias}"? [y/N] `;
176
+ const ok = await (deps.confirm ? deps.confirm(question) : interactive ? confirm(question) : false);
177
+ if (!ok) {
178
+ if (!deps.confirm && !interactive) {
179
+ console.error(`kimchictl workspace delete: not interactive — re-run with --force to delete ${workspace.alias}`);
180
+ return 1;
181
+ }
182
+ console.log("Aborted.");
183
+ return 0;
184
+ }
185
+ }
186
+ await deleteWorkspace(key, workspace.id, { fetch: deps.fetch });
187
+ console.log(`✓ deleted ${workspace.alias}`);
188
+ return 0;
189
+ }
190
+ // ---------------------------------------------------------------- shared
191
+ function serializeWorkspace(w) {
192
+ return {
193
+ id: w.id,
194
+ alias: w.alias,
195
+ ...(w.description ? { description: w.description } : {}),
196
+ status: w.status,
197
+ ...(w.uri ? { uri: w.uri } : {}),
198
+ createdAt: w.createdAt.getTime() > 0 ? w.createdAt.toISOString() : undefined,
199
+ resources: {
200
+ cpuMillicores: w.cpuMillicores,
201
+ ramBytes: w.ramBytes,
202
+ pvcSizeBytes: w.pvcSizeBytes,
203
+ },
204
+ };
205
+ }
206
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"../src/","sources":["commands/workspace.ts"],"names":[],"mappings":"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"}
package/dist/run.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ /** Usage errors (unknown command, bad flags) exit with this code. */
2
+ export declare const EXIT_USAGE = 2;
3
+ /**
4
+ * Shared CLI dispatcher — the single entry behind the standalone `kimchictl`
5
+ * binary, the npm bin shim, and the kimchi harness bridge (`kimchi workspace`).
6
+ * Returns the exit code instead of calling process.exit so hosts can run it
7
+ * in-process.
8
+ */
9
+ export declare function run(argv: readonly string[]): Promise<number>;
10
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"../src/","sources":["run.ts"],"names":[],"mappings":"AAIA,qEAAqE;AACrE,eAAO,MAAM,UAAU,IAAI,CAAA;AAE3B;;;;;GAKG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBlE"}
package/dist/run.js ADDED
@@ -0,0 +1,30 @@
1
+ import { printHelp } from "./commands/help.js";
2
+ import { COMMANDS, findCommand } from "./commands/registry.js";
3
+ import { VERSION } from "./version.js";
4
+ /** Usage errors (unknown command, bad flags) exit with this code. */
5
+ export const EXIT_USAGE = 2;
6
+ /**
7
+ * Shared CLI dispatcher — the single entry behind the standalone `kimchictl`
8
+ * binary, the npm bin shim, and the kimchi harness bridge (`kimchi workspace`).
9
+ * Returns the exit code instead of calling process.exit so hosts can run it
10
+ * in-process.
11
+ */
12
+ export async function run(argv) {
13
+ const [head, ...rest] = argv;
14
+ if (head === undefined || head === "help" || head === "--help" || head === "-h") {
15
+ printHelp(COMMANDS);
16
+ return 0;
17
+ }
18
+ if (head === "--version" || head === "-v") {
19
+ console.log(`kimchictl ${VERSION}`);
20
+ return 0;
21
+ }
22
+ const command = findCommand(head);
23
+ if (!command) {
24
+ console.error(`kimchictl: unknown command "${head}"`);
25
+ printHelp(COMMANDS, (line) => console.error(line));
26
+ return EXIT_USAGE;
27
+ }
28
+ return (await command.run(rest)) ?? 0;
29
+ }
30
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"../src/","sources":["run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,qEAAqE;AACrE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAA;AAE3B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAuB;IAChD,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;IAE5B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACjF,SAAS,CAAC,QAAQ,CAAC,CAAA;QACnB,OAAO,CAAC,CAAA;IACT,CAAC;IACD,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAA;QACnC,OAAO,CAAC,CAAA;IACT,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,+BAA+B,IAAI,GAAG,CAAC,CAAA;QACrD,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAClD,OAAO,UAAU,CAAA;IAClB,CAAC;IAED,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAA;AACtC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { Readable, Writable } from "node:stream";
2
+ import { WebSocket } from "ws";
3
+ /**
4
+ * Binary WebSocket↔stdio bridge — the runtime behind the hidden
5
+ * `kimchictl ssh proxy` command that the generated ssh_config references via
6
+ * ProxyCommand. TS port of kap's internal/ssh/bridge.go.
7
+ *
8
+ * Exit semantics (mirroring kap): stdin EOF or a normal WS close end the
9
+ * bridge without error; any other failure rejects with a descriptive error.
10
+ * The proxy process is short-lived — it exits when the bridge resolves, so
11
+ * dangling listeners cannot outlive it.
12
+ */
13
+ export declare class BridgeError extends Error {
14
+ constructor(message: string);
15
+ }
16
+ export interface BridgeOptions {
17
+ wsUrl: string;
18
+ token: string;
19
+ input?: Readable;
20
+ output?: Writable;
21
+ /** Injected WebSocket constructor (tests may pass a wrapped client). */
22
+ _WebSocket?: typeof WebSocket;
23
+ }
24
+ export declare function bridgeStdioToWebSocket(options: BridgeOptions): Promise<void>;
25
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"../src/","sources":["ssh/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAgB,SAAS,EAAE,MAAM,IAAI,CAAA;AAE5C;;;;;;;;;GASG;AAEH,qBAAa,WAAY,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI3B;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,MAAM,CAAC,EAAE,QAAQ,CAAA;IACjB,wEAAwE;IACxE,UAAU,CAAC,EAAE,OAAO,SAAS,CAAA;CAC7B;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ElF"}