@tyvm/knowhow 0.0.151 → 0.0.153

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tyvm/knowhow",
3
- "version": "0.0.151",
3
+ "version": "0.0.153",
4
4
  "description": "ai cli with plugins and agents",
5
5
  "main": "ts_build/src/index.js",
6
6
  "bin": {
@@ -6,6 +6,13 @@ import path from "path";
6
6
  const ED25519_KEY_TYPE = "ssh-ed25519";
7
7
  const ED25519_RAW_KEY_LENGTH = 32;
8
8
  const ED25519_SPKI_PREFIX = Buffer.from("302a300506032b6570032100", "hex");
9
+ const ED25519_PKCS8_PREFIX = Buffer.from("302e020100300506032b657004220420", "hex");
10
+
11
+ interface OpenSshMetadata {
12
+ encrypted: boolean;
13
+ algorithm?: string;
14
+ seed?: Buffer;
15
+ }
9
16
 
10
17
  export interface KeyPair {
11
18
  privateKeyPath: string;
@@ -90,6 +97,14 @@ export function getOrCreatePublicKey(privateKeyPath?: string): KeyPair {
90
97
  : generateKeyPair(privateKeyPath);
91
98
  }
92
99
 
100
+ export function ensureIdentityKeyPair(privateKeyPath?: string): {
101
+ keyPair: KeyPair;
102
+ created: boolean;
103
+ } {
104
+ if (keyPairExists(privateKeyPath)) return { keyPair: loadKeyPair(privateKeyPath), created: false };
105
+ return { keyPair: generateKeyPair(privateKeyPath), created: true };
106
+ }
107
+
93
108
  export function signMessage(message: string, privateKeyPath?: string): string {
94
109
  const privatePath = privateKeyPath ?? getDefaultPrivateKeyPath();
95
110
  if (!fs.existsSync(privatePath)) throw new Error(`Private key not found at: ${privatePath}`);
@@ -98,14 +113,50 @@ export function signMessage(message: string, privateKeyPath?: string): string {
98
113
 
99
114
  function readEd25519PrivateKey(privatePath: string): crypto.KeyObject {
100
115
  let key: crypto.KeyObject;
116
+ const privateKeyContents = fs.readFileSync(privatePath, "utf8");
117
+ const openSshMetadata = parseOpenSshMetadata(privateKeyContents);
118
+
119
+ if (openSshMetadata?.encrypted) {
120
+ throw new Error(
121
+ `Identity at ${privatePath} is an encrypted OpenSSH key. Use an unencrypted Ed25519 key for CLI auth (example: ssh-keygen -t ed25519 -N '' -f ${privatePath})`
122
+ );
123
+ }
124
+
101
125
  try {
102
- key = crypto.createPrivateKey(fs.readFileSync(privatePath));
126
+ key = crypto.createPrivateKey({ key: privateKeyContents, format: "pem" });
103
127
  } catch {
104
- throw new Error(`Identity at ${privatePath} is not a supported PEM Ed25519 private key`);
128
+ if (openSshMetadata) {
129
+ if (openSshMetadata.algorithm && openSshMetadata.algorithm !== ED25519_KEY_TYPE) {
130
+ throw new Error(
131
+ `Identity at ${privatePath} must be an OpenSSH Ed25519 key (found ${openSshMetadata.algorithm})`
132
+ );
133
+ }
134
+
135
+ if (openSshMetadata.seed) {
136
+ key = createEd25519PrivateKeyFromSeed(openSshMetadata.seed, privatePath);
137
+ } else {
138
+ throw new Error(
139
+ `Identity at ${privatePath} must be a PKCS#8 Ed25519 private key or an unencrypted OpenSSH Ed25519 private key`
140
+ );
141
+ }
142
+ return key;
143
+ }
144
+
145
+ throw new Error(`Identity at ${privatePath} must be a PKCS#8 Ed25519 private key or an unencrypted OpenSSH Ed25519 private key`);
105
146
  }
147
+
148
+ const detectedAlgorithm = key.asymmetricKeyType === "ed25519" ? openSshMetadata?.algorithm ?? "ed25519" : key.asymmetricKeyType;
149
+
106
150
  if (key.asymmetricKeyType !== "ed25519") {
107
- throw new Error(`Identity at ${privatePath} must be an Ed25519 private key`);
151
+ throw new Error(
152
+ `Identity at ${privatePath} must be an Ed25519 private key (found ${detectedAlgorithm ?? "unknown"})`
153
+ );
154
+ }
155
+
156
+ if (openSshMetadata?.algorithm && openSshMetadata.algorithm !== ED25519_KEY_TYPE) {
157
+ throw new Error(`Identity at ${privatePath} must be an OpenSSH Ed25519 key (found ${openSshMetadata.algorithm})`);
108
158
  }
159
+
109
160
  return key;
110
161
  }
111
162
 
@@ -164,3 +215,117 @@ function keyPairMetadata(privatePath: string, rawPublicKey: Buffer): KeyPair {
164
215
  fingerprint: `SHA256:${hash}`,
165
216
  };
166
217
  }
218
+
219
+ function createEd25519PrivateKeyFromSeed(seed: Buffer, privatePath: string): crypto.KeyObject {
220
+ if (seed.length !== ED25519_RAW_KEY_LENGTH) {
221
+ throw new Error(`Identity at ${privatePath} has an invalid OpenSSH Ed25519 private key payload`);
222
+ }
223
+
224
+ try {
225
+ const der = Buffer.concat([ED25519_PKCS8_PREFIX, seed]);
226
+ return crypto.createPrivateKey({ key: der, format: "der", type: "pkcs8" });
227
+ } catch {
228
+ throw new Error(
229
+ `Identity at ${privatePath} must be a PKCS#8 Ed25519 private key or an unencrypted OpenSSH Ed25519 private key`
230
+ );
231
+ }
232
+ }
233
+
234
+ function parseOpenSshMetadata(privateKeyContents: string): OpenSshMetadata | undefined {
235
+ const trimmed = privateKeyContents.trim();
236
+ if (!trimmed.startsWith("-----BEGIN OPENSSH PRIVATE KEY-----")) {
237
+ return undefined;
238
+ }
239
+
240
+ const body = trimmed
241
+ .replace("-----BEGIN OPENSSH PRIVATE KEY-----", "")
242
+ .replace("-----END OPENSSH PRIVATE KEY-----", "")
243
+ .replace(/\s+/g, "");
244
+
245
+ let buffer: Buffer;
246
+ try {
247
+ buffer = Buffer.from(body, "base64");
248
+ } catch {
249
+ return undefined;
250
+ }
251
+
252
+ let offset = 0;
253
+
254
+ const magic = Buffer.from("openssh-key-v1\0", "utf8");
255
+ if (buffer.length < magic.length || !buffer.subarray(0, magic.length).equals(magic)) {
256
+ return undefined;
257
+ }
258
+ offset += magic.length;
259
+
260
+ const readString = (): string | undefined => {
261
+ if (offset + 4 > buffer.length) return undefined;
262
+ const length = buffer.readUInt32BE(offset);
263
+ offset += 4;
264
+ if (offset + length > buffer.length) return undefined;
265
+ const value = buffer.subarray(offset, offset + length).toString("utf8");
266
+ offset += length;
267
+ return value;
268
+ };
269
+
270
+ const readBuffer = (): Buffer | undefined => {
271
+ if (offset + 4 > buffer.length) return undefined;
272
+ const length = buffer.readUInt32BE(offset);
273
+ offset += 4;
274
+ if (offset + length > buffer.length) return undefined;
275
+ const value = buffer.subarray(offset, offset + length);
276
+ offset += length;
277
+ return value;
278
+ };
279
+
280
+ const ciphername = readString();
281
+ const kdfname = readString();
282
+ const kdfoptions = readBuffer();
283
+ if (!ciphername || !kdfname || !kdfoptions) {
284
+ return undefined;
285
+ }
286
+
287
+ if (offset + 4 > buffer.length) return { encrypted: ciphername !== "none" || kdfname !== "none" };
288
+ const keyCount = buffer.readUInt32BE(offset);
289
+ offset += 4;
290
+
291
+ for (let i = 0; i < keyCount; i++) {
292
+ const skippedPublic = readBuffer();
293
+ if (!skippedPublic) return { encrypted: ciphername !== "none" || kdfname !== "none" };
294
+ }
295
+
296
+ const privateBlock = readBuffer();
297
+ if (!privateBlock) return { encrypted: ciphername !== "none" || kdfname !== "none" };
298
+
299
+ let privateOffset = 0;
300
+ const readPrivateString = (): string | undefined => {
301
+ if (privateOffset + 4 > privateBlock.length) return undefined;
302
+ const length = privateBlock.readUInt32BE(privateOffset);
303
+ privateOffset += 4;
304
+ if (privateOffset + length > privateBlock.length) return undefined;
305
+ const value = privateBlock.subarray(privateOffset, privateOffset + length).toString("utf8");
306
+ privateOffset += length;
307
+ return value;
308
+ };
309
+
310
+ const readPrivateBuffer = (): Buffer | undefined => {
311
+ if (privateOffset + 4 > privateBlock.length) return undefined;
312
+ const length = privateBlock.readUInt32BE(privateOffset);
313
+ privateOffset += 4;
314
+ if (privateOffset + length > privateBlock.length) return undefined;
315
+ const value = privateBlock.subarray(privateOffset, privateOffset + length);
316
+ privateOffset += length;
317
+ return value;
318
+ };
319
+
320
+ privateOffset += 8; // checkints
321
+
322
+ const algorithm = readPrivateString();
323
+ let seed: Buffer | undefined;
324
+ if (algorithm === ED25519_KEY_TYPE) {
325
+ readPrivateBuffer(); // public key (32 bytes)
326
+ const privateConcat = readPrivateBuffer(); // private seed (32) + public key (32)
327
+ seed = privateConcat?.subarray(0, ED25519_RAW_KEY_LENGTH);
328
+ }
329
+
330
+ return { encrypted: ciphername !== "none" || kdfname !== "none", algorithm, seed };
331
+ }
@@ -28,7 +28,7 @@ export function decodeJwtPayload(jwt: string): Record<string, unknown> {
28
28
 
29
29
  export function extractOrgIdFromJwt(jwt: string): string {
30
30
  const payload = decodeJwtPayload(jwt);
31
- const orgId = payload["org"] ?? payload["orgId"] ?? payload["org_id"] ?? payload["organizationId"];
31
+ const orgId = payload.org ?? payload.orgId ?? payload.org_id ?? payload.organizationId;
32
32
  if (typeof orgId !== "string" || !orgId) {
33
33
  throw new Error("JWT does not contain an organization claim (expected org, orgId, org_id, or organizationId)");
34
34
  }
@@ -7,6 +7,7 @@ import { generate, buildWaves, normalizeInputPattern, GenerateOptions } from "..
7
7
  import { init } from "../config";
8
8
  import { login } from "../login";
9
9
  import { registerIdentity } from "../auth/registerIdentity";
10
+ import { ensureIdentityKeyPair } from "../auth/keyManager";
10
11
  import { KnowhowSimpleClient } from "../services/KnowhowClient";
11
12
  import { startChat } from "../chat";
12
13
 
@@ -26,21 +27,43 @@ export function addLoginCommand(program: Command): void {
26
27
  .option("--jwt", "Use manual JWT input instead of browser login")
27
28
  .option("-i, --identity <path>", "Ed25519 private key to use for public-key login")
28
29
  .option("--register-identity", "Register an Ed25519 identity using the JWT in .knowhow/.jwt")
30
+ .option("--key-gen", "Generate or validate the CLI Ed25519 identity keypair and exit")
29
31
  .option("--api-url <url>", "API base URL override (falls back to KNOWHOW_API_URL env)")
30
32
  .action(async (options: {
31
33
  jwt?: boolean;
32
34
  identity?: string;
33
35
  registerIdentity?: boolean;
36
+ keyGen?: boolean;
34
37
  apiUrl?: string;
35
38
  }) => {
39
+ if (options.keyGen) {
40
+ if (options.jwt || options.registerIdentity) {
41
+ throw new Error("--key-gen cannot be used with --jwt or --register-identity");
42
+ }
43
+
44
+ const { keyPair, created } = ensureIdentityKeyPair(options.identity);
45
+ if (created) {
46
+ console.log(`✅ Generated CLI identity keypair: ${keyPair.fingerprint}`);
47
+ console.log(`Private key: ${keyPair.privateKeyPath}`);
48
+ console.log(`Public key: ${keyPair.publicKeyPath}`);
49
+ } else {
50
+ console.log(`✅ CLI identity keypair already exists: ${keyPair.fingerprint}`);
51
+ console.log(`Private key: ${keyPair.privateKeyPath}`);
52
+ console.log(`Public key: ${keyPair.publicKeyPath}`);
53
+ }
54
+
55
+ return;
56
+ }
57
+
36
58
  if (options.registerIdentity) {
37
59
  await registerIdentity({
38
60
  identityPath: options.identity,
39
61
  apiUrl: options.apiUrl,
40
62
  });
41
- } else {
42
- await login(options.jwt, options.identity);
63
+ return;
43
64
  }
65
+
66
+ await login(options.jwt, options.identity);
44
67
  });
45
68
  }
46
69
 
@@ -3,11 +3,34 @@ import fs from "fs";
3
3
  import os from "os";
4
4
  import path from "path";
5
5
  import {
6
+ ensureIdentityKeyPair,
6
7
  generateKeyPair,
7
8
  loadKeyPair,
8
9
  signMessage,
9
10
  } from "../../../src/auth/keyManager";
10
11
 
12
+ const OPENSSH_ED25519_PRIVATE_KEY = `-----BEGIN OPENSSH PRIVATE KEY-----
13
+ b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
14
+ QyNTUxOQAAACD/E7YSDZcV7usL3Ej3SSvGNVuNMu1hYFOpHjQaCodvIgAAAIgKqccyCqnH
15
+ MgAAAAtzc2gtZWQyNTUxOQAAACD/E7YSDZcV7usL3Ej3SSvGNVuNMu1hYFOpHjQaCodvIg
16
+ AAAECC40JKj3sb9Q3KsA9wAKeLbUwazUi7cuBiDfuJHDybtf8TthINlxXu6wvcSPdJK8Y1
17
+ W40y7WFgU6keNBoKh28iAAAABHRlc3QB
18
+ -----END OPENSSH PRIVATE KEY-----
19
+ `;
20
+
21
+ const OPENSSH_ED25519_PUBLIC_KEY =
22
+ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP8TthINlxXu6wvcSPdJK8Y1W40y7WFgU6keNBoKh28i test\n";
23
+
24
+ const OPENSSH_ENCRYPTED_ED25519_PRIVATE_KEY = `-----BEGIN OPENSSH PRIVATE KEY-----
25
+ b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABAiFkZE2t
26
+ 9UBWLQLB8sAuG7AAAAGAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAID2OnkCi/hq0EH9E
27
+ yBf1n4FXRDw16RYyDAL0pbbRWh1JAAAAkHNPoqbcZcef7FZY+dFTRTODyAMPL4gyzOxGLE
28
+ JffXux9KUTPBrCy+xfScoAHq9JFKrspli5h5Z6PyJ7Dp2NNJPOzEaF92fv6989AETm3X3X
29
+ 2pOUvtPMJz29C1MO7hXHlReIWqF6nkaDGGcNEZMZ3xHI4ypB/lfceH6A1IjxZEa2BXJfJe
30
+ y6h8co4T89tJdubQ==
31
+ -----END OPENSSH PRIVATE KEY-----
32
+ `;
33
+
11
34
  describe("keyManager", () => {
12
35
  let directory: string;
13
36
  let identity: string;
@@ -42,6 +65,27 @@ describe("keyManager", () => {
42
65
  ).toBe(true);
43
66
  });
44
67
 
68
+ it("accepts default unencrypted OpenSSH Ed25519 private keys", () => {
69
+ fs.writeFileSync(identity, OPENSSH_ED25519_PRIVATE_KEY);
70
+ fs.writeFileSync(`${identity}.pub`, OPENSSH_ED25519_PUBLIC_KEY);
71
+
72
+ const loaded = loadKeyPair(identity);
73
+ expect(loaded.publicKeyBase64).toBe("/xO2Eg2XFe7rC9xI90krxjVbjTLtYWB TqR40GgqHbyI=".replace(/\s+/g, ""));
74
+
75
+ const signature = signMessage("challenge", identity);
76
+ const spkiPrefix = Buffer.from("302a300506032b6570032100", "hex");
77
+ const publicKeyDer = Buffer.concat([spkiPrefix, Buffer.from(loaded.publicKeyBase64, "base64")]);
78
+ const publicKey = crypto.createPublicKey({ key: publicKeyDer, format: "der", type: "spki" });
79
+ expect(
80
+ crypto.verify(
81
+ null,
82
+ Buffer.from("challenge"),
83
+ publicKey,
84
+ Buffer.from(signature, "base64")
85
+ )
86
+ ).toBe(true);
87
+ });
88
+
45
89
  it("loads legacy raw-base64 public keys but rejects non-Ed25519 identities", () => {
46
90
  const generated = generateKeyPair(identity);
47
91
  fs.writeFileSync(`${identity}.pub`, generated.publicKeyBase64);
@@ -59,9 +103,28 @@ describe("keyManager", () => {
59
103
  expect(() => loadKeyPair(rsaIdentity)).toThrow("must be an Ed25519 private key");
60
104
  });
61
105
 
106
+ it("rejects encrypted OpenSSH keys with a clear error", () => {
107
+ fs.writeFileSync(identity, OPENSSH_ENCRYPTED_ED25519_PRIVATE_KEY);
108
+ fs.writeFileSync(`${identity}.pub`, OPENSSH_ED25519_PUBLIC_KEY);
109
+
110
+ expect(() => loadKeyPair(identity)).toThrow("encrypted OpenSSH key");
111
+ });
112
+
62
113
  it("does not overwrite a partial identity", () => {
63
114
  fs.writeFileSync(identity, "existing key");
64
115
  expect(() => generateKeyPair(identity)).toThrow("a key file already exists");
65
116
  expect(fs.readFileSync(identity, "utf8")).toBe("existing key");
66
117
  });
118
+
119
+ it("ensureIdentityKeyPair is safe for existing keys (no overwrite)", () => {
120
+ const generated = generateKeyPair(identity);
121
+ const beforePrivate = fs.readFileSync(identity, "utf8");
122
+ const beforePublic = fs.readFileSync(`${identity}.pub`, "utf8");
123
+
124
+ const result = ensureIdentityKeyPair(identity);
125
+ expect(result.created).toBe(false);
126
+ expect(result.keyPair).toEqual(generated);
127
+ expect(fs.readFileSync(identity, "utf8")).toBe(beforePrivate);
128
+ expect(fs.readFileSync(`${identity}.pub`, "utf8")).toBe(beforePublic);
129
+ });
67
130
  });
@@ -0,0 +1,85 @@
1
+ import { Command } from "commander";
2
+
3
+ const login = jest.fn().mockResolvedValue(undefined);
4
+ const registerIdentity = jest.fn().mockResolvedValue(undefined);
5
+ const ensureIdentityKeyPair = jest.fn();
6
+
7
+ jest.mock("../../../src/login", () => ({ login }));
8
+ jest.mock("../../../src/index", () => ({
9
+ embed: jest.fn(),
10
+ upload: jest.fn(),
11
+ download: jest.fn(),
12
+ purge: jest.fn(),
13
+ }));
14
+ jest.mock("../../../src/auth/registerIdentity", () => ({ registerIdentity }));
15
+ jest.mock("../../../src/auth/keyManager", () => ({ ensureIdentityKeyPair }));
16
+
17
+ import { addLoginCommand } from "../../../src/commands/misc";
18
+
19
+ describe("login command", () => {
20
+ let program: Command;
21
+ let logSpy: jest.SpyInstance;
22
+
23
+ beforeEach(() => {
24
+ jest.clearAllMocks();
25
+ program = new Command();
26
+ program.exitOverride();
27
+ addLoginCommand(program);
28
+ logSpy = jest.spyOn(console, "log").mockImplementation(() => undefined);
29
+ });
30
+
31
+ afterEach(() => {
32
+ logSpy.mockRestore();
33
+ });
34
+
35
+ it("supports --key-gen non-interactively and exits without login", async () => {
36
+ ensureIdentityKeyPair.mockReturnValue({
37
+ created: true,
38
+ keyPair: {
39
+ fingerprint: "SHA256:test",
40
+ privateKeyPath: "/keys/id_ed25519",
41
+ publicKeyPath: "/keys/id_ed25519.pub",
42
+ },
43
+ });
44
+
45
+ await program.parseAsync(["node", "knowhow", "login", "--key-gen"]);
46
+
47
+ expect(ensureIdentityKeyPair).toHaveBeenCalledWith(undefined);
48
+ expect(login).not.toHaveBeenCalled();
49
+ expect(registerIdentity).not.toHaveBeenCalled();
50
+
51
+ const output = logSpy.mock.calls.map((call) => call.join(" ")).join("\n");
52
+ expect(output).toContain("Generated CLI identity keypair");
53
+ expect(output).toContain("/keys/id_ed25519");
54
+ expect(output).toContain("/keys/id_ed25519.pub");
55
+ });
56
+
57
+ it("does not overwrite existing key when using --key-gen", async () => {
58
+ ensureIdentityKeyPair.mockReturnValue({
59
+ created: false,
60
+ keyPair: {
61
+ fingerprint: "SHA256:existing",
62
+ privateKeyPath: "/keys/id_ed25519",
63
+ publicKeyPath: "/keys/id_ed25519.pub",
64
+ },
65
+ });
66
+
67
+ await program.parseAsync(["node", "knowhow", "login", "--key-gen", "--identity", "/keys/id_ed25519"]);
68
+
69
+ expect(ensureIdentityKeyPair).toHaveBeenCalledWith("/keys/id_ed25519");
70
+ expect(login).not.toHaveBeenCalled();
71
+ expect(registerIdentity).not.toHaveBeenCalled();
72
+
73
+ const output = logSpy.mock.calls.map((call) => call.join(" ")).join("\n");
74
+ expect(output).toContain("CLI identity keypair already exists");
75
+ });
76
+
77
+ it("rejects incompatible flag combinations with --key-gen", async () => {
78
+ await expect(
79
+ program.parseAsync(["node", "knowhow", "login", "--key-gen", "--jwt"])
80
+ ).rejects.toThrow("--key-gen cannot be used with --jwt or --register-identity");
81
+
82
+ expect(login).not.toHaveBeenCalled();
83
+ expect(registerIdentity).not.toHaveBeenCalled();
84
+ });
85
+ });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tyvm/knowhow",
3
- "version": "0.0.151",
3
+ "version": "0.0.153",
4
4
  "description": "ai cli with plugins and agents",
5
5
  "main": "ts_build/src/index.js",
6
6
  "bin": {
@@ -11,4 +11,8 @@ export declare function keyPairExists(privateKeyPath?: string): boolean;
11
11
  export declare function generateKeyPair(privateKeyPath?: string): KeyPair;
12
12
  export declare function loadKeyPair(privateKeyPath?: string): KeyPair;
13
13
  export declare function getOrCreatePublicKey(privateKeyPath?: string): KeyPair;
14
+ export declare function ensureIdentityKeyPair(privateKeyPath?: string): {
15
+ keyPair: KeyPair;
16
+ created: boolean;
17
+ };
14
18
  export declare function signMessage(message: string, privateKeyPath?: string): string;
@@ -10,6 +10,7 @@ exports.keyPairExists = keyPairExists;
10
10
  exports.generateKeyPair = generateKeyPair;
11
11
  exports.loadKeyPair = loadKeyPair;
12
12
  exports.getOrCreatePublicKey = getOrCreatePublicKey;
13
+ exports.ensureIdentityKeyPair = ensureIdentityKeyPair;
13
14
  exports.signMessage = signMessage;
14
15
  const crypto_1 = __importDefault(require("crypto"));
15
16
  const fs_1 = __importDefault(require("fs"));
@@ -18,6 +19,7 @@ const path_1 = __importDefault(require("path"));
18
19
  const ED25519_KEY_TYPE = "ssh-ed25519";
19
20
  const ED25519_RAW_KEY_LENGTH = 32;
20
21
  const ED25519_SPKI_PREFIX = Buffer.from("302a300506032b6570032100", "hex");
22
+ const ED25519_PKCS8_PREFIX = Buffer.from("302e020100300506032b657004220420", "hex");
21
23
  function getKeyDir() {
22
24
  return path_1.default.join(os_1.default.homedir(), ".knowhow", "keys");
23
25
  }
@@ -76,6 +78,11 @@ function getOrCreatePublicKey(privateKeyPath) {
76
78
  ? loadKeyPair(privateKeyPath)
77
79
  : generateKeyPair(privateKeyPath);
78
80
  }
81
+ function ensureIdentityKeyPair(privateKeyPath) {
82
+ if (keyPairExists(privateKeyPath))
83
+ return { keyPair: loadKeyPair(privateKeyPath), created: false };
84
+ return { keyPair: generateKeyPair(privateKeyPath), created: true };
85
+ }
79
86
  function signMessage(message, privateKeyPath) {
80
87
  const privatePath = privateKeyPath ?? getDefaultPrivateKeyPath();
81
88
  if (!fs_1.default.existsSync(privatePath))
@@ -84,14 +91,35 @@ function signMessage(message, privateKeyPath) {
84
91
  }
85
92
  function readEd25519PrivateKey(privatePath) {
86
93
  let key;
94
+ const privateKeyContents = fs_1.default.readFileSync(privatePath, "utf8");
95
+ const openSshMetadata = parseOpenSshMetadata(privateKeyContents);
96
+ if (openSshMetadata?.encrypted) {
97
+ throw new Error(`Identity at ${privatePath} is an encrypted OpenSSH key. Use an unencrypted Ed25519 key for CLI auth (example: ssh-keygen -t ed25519 -N '' -f ${privatePath})`);
98
+ }
87
99
  try {
88
- key = crypto_1.default.createPrivateKey(fs_1.default.readFileSync(privatePath));
100
+ key = crypto_1.default.createPrivateKey({ key: privateKeyContents, format: "pem" });
89
101
  }
90
102
  catch {
91
- throw new Error(`Identity at ${privatePath} is not a supported PEM Ed25519 private key`);
103
+ if (openSshMetadata) {
104
+ if (openSshMetadata.algorithm && openSshMetadata.algorithm !== ED25519_KEY_TYPE) {
105
+ throw new Error(`Identity at ${privatePath} must be an OpenSSH Ed25519 key (found ${openSshMetadata.algorithm})`);
106
+ }
107
+ if (openSshMetadata.seed) {
108
+ key = createEd25519PrivateKeyFromSeed(openSshMetadata.seed, privatePath);
109
+ }
110
+ else {
111
+ throw new Error(`Identity at ${privatePath} must be a PKCS#8 Ed25519 private key or an unencrypted OpenSSH Ed25519 private key`);
112
+ }
113
+ return key;
114
+ }
115
+ throw new Error(`Identity at ${privatePath} must be a PKCS#8 Ed25519 private key or an unencrypted OpenSSH Ed25519 private key`);
92
116
  }
117
+ const detectedAlgorithm = key.asymmetricKeyType === "ed25519" ? openSshMetadata?.algorithm ?? "ed25519" : key.asymmetricKeyType;
93
118
  if (key.asymmetricKeyType !== "ed25519") {
94
- throw new Error(`Identity at ${privatePath} must be an Ed25519 private key`);
119
+ throw new Error(`Identity at ${privatePath} must be an Ed25519 private key (found ${detectedAlgorithm ?? "unknown"})`);
120
+ }
121
+ if (openSshMetadata?.algorithm && openSshMetadata.algorithm !== ED25519_KEY_TYPE) {
122
+ throw new Error(`Identity at ${privatePath} must be an OpenSSH Ed25519 key (found ${openSshMetadata.algorithm})`);
95
123
  }
96
124
  return key;
97
125
  }
@@ -142,4 +170,111 @@ function keyPairMetadata(privatePath, rawPublicKey) {
142
170
  fingerprint: `SHA256:${hash}`,
143
171
  };
144
172
  }
173
+ function createEd25519PrivateKeyFromSeed(seed, privatePath) {
174
+ if (seed.length !== ED25519_RAW_KEY_LENGTH) {
175
+ throw new Error(`Identity at ${privatePath} has an invalid OpenSSH Ed25519 private key payload`);
176
+ }
177
+ try {
178
+ const der = Buffer.concat([ED25519_PKCS8_PREFIX, seed]);
179
+ return crypto_1.default.createPrivateKey({ key: der, format: "der", type: "pkcs8" });
180
+ }
181
+ catch {
182
+ throw new Error(`Identity at ${privatePath} must be a PKCS#8 Ed25519 private key or an unencrypted OpenSSH Ed25519 private key`);
183
+ }
184
+ }
185
+ function parseOpenSshMetadata(privateKeyContents) {
186
+ const trimmed = privateKeyContents.trim();
187
+ if (!trimmed.startsWith("-----BEGIN OPENSSH PRIVATE KEY-----")) {
188
+ return undefined;
189
+ }
190
+ const body = trimmed
191
+ .replace("-----BEGIN OPENSSH PRIVATE KEY-----", "")
192
+ .replace("-----END OPENSSH PRIVATE KEY-----", "")
193
+ .replace(/\s+/g, "");
194
+ let buffer;
195
+ try {
196
+ buffer = Buffer.from(body, "base64");
197
+ }
198
+ catch {
199
+ return undefined;
200
+ }
201
+ let offset = 0;
202
+ const magic = Buffer.from("openssh-key-v1\0", "utf8");
203
+ if (buffer.length < magic.length || !buffer.subarray(0, magic.length).equals(magic)) {
204
+ return undefined;
205
+ }
206
+ offset += magic.length;
207
+ const readString = () => {
208
+ if (offset + 4 > buffer.length)
209
+ return undefined;
210
+ const length = buffer.readUInt32BE(offset);
211
+ offset += 4;
212
+ if (offset + length > buffer.length)
213
+ return undefined;
214
+ const value = buffer.subarray(offset, offset + length).toString("utf8");
215
+ offset += length;
216
+ return value;
217
+ };
218
+ const readBuffer = () => {
219
+ if (offset + 4 > buffer.length)
220
+ return undefined;
221
+ const length = buffer.readUInt32BE(offset);
222
+ offset += 4;
223
+ if (offset + length > buffer.length)
224
+ return undefined;
225
+ const value = buffer.subarray(offset, offset + length);
226
+ offset += length;
227
+ return value;
228
+ };
229
+ const ciphername = readString();
230
+ const kdfname = readString();
231
+ const kdfoptions = readBuffer();
232
+ if (!ciphername || !kdfname || !kdfoptions) {
233
+ return undefined;
234
+ }
235
+ if (offset + 4 > buffer.length)
236
+ return { encrypted: ciphername !== "none" || kdfname !== "none" };
237
+ const keyCount = buffer.readUInt32BE(offset);
238
+ offset += 4;
239
+ for (let i = 0; i < keyCount; i++) {
240
+ const skippedPublic = readBuffer();
241
+ if (!skippedPublic)
242
+ return { encrypted: ciphername !== "none" || kdfname !== "none" };
243
+ }
244
+ const privateBlock = readBuffer();
245
+ if (!privateBlock)
246
+ return { encrypted: ciphername !== "none" || kdfname !== "none" };
247
+ let privateOffset = 0;
248
+ const readPrivateString = () => {
249
+ if (privateOffset + 4 > privateBlock.length)
250
+ return undefined;
251
+ const length = privateBlock.readUInt32BE(privateOffset);
252
+ privateOffset += 4;
253
+ if (privateOffset + length > privateBlock.length)
254
+ return undefined;
255
+ const value = privateBlock.subarray(privateOffset, privateOffset + length).toString("utf8");
256
+ privateOffset += length;
257
+ return value;
258
+ };
259
+ const readPrivateBuffer = () => {
260
+ if (privateOffset + 4 > privateBlock.length)
261
+ return undefined;
262
+ const length = privateBlock.readUInt32BE(privateOffset);
263
+ privateOffset += 4;
264
+ if (privateOffset + length > privateBlock.length)
265
+ return undefined;
266
+ const value = privateBlock.subarray(privateOffset, privateOffset + length);
267
+ privateOffset += length;
268
+ return value;
269
+ };
270
+ privateOffset += 8;
271
+ const algorithm = readPrivateString();
272
+ let seed;
273
+ if (algorithm === ED25519_KEY_TYPE) {
274
+ readPrivateBuffer();
275
+ const privateConcat = readPrivateBuffer();
276
+ seed = privateConcat?.subarray(0, ED25519_RAW_KEY_LENGTH);
277
+ }
278
+ return { encrypted: ciphername !== "none" || kdfname !== "none", algorithm, seed };
279
+ }
145
280
  //# sourceMappingURL=keyManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"keyManager.js","sourceRoot":"","sources":["../../../src/auth/keyManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyManager.js","sourceRoot":"","sources":["../../../src/auth/keyManager.ts"],"names":[],"mappings":"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"}
@@ -29,7 +29,7 @@ function decodeJwtPayload(jwt) {
29
29
  }
30
30
  function extractOrgIdFromJwt(jwt) {
31
31
  const payload = decodeJwtPayload(jwt);
32
- const orgId = payload["org"] ?? payload["orgId"] ?? payload["org_id"] ?? payload["organizationId"];
32
+ const orgId = payload.org ?? payload.orgId ?? payload.org_id ?? payload.organizationId;
33
33
  if (typeof orgId !== "string" || !orgId) {
34
34
  throw new Error("JWT does not contain an organization claim (expected org, orgId, org_id, or organizationId)");
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registerIdentity.js","sourceRoot":"","sources":["../../../src/auth/registerIdentity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registerIdentity.js","sourceRoot":"","sources":["../../../src/auth/registerIdentity.ts"],"names":[],"mappings":"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"}
@@ -50,6 +50,7 @@ const generate_1 = require("../generate");
50
50
  const config_1 = require("../config");
51
51
  const login_1 = require("../login");
52
52
  const registerIdentity_1 = require("../auth/registerIdentity");
53
+ const keyManager_1 = require("../auth/keyManager");
53
54
  const KnowhowClient_1 = require("../services/KnowhowClient");
54
55
  const chat_1 = require("../chat");
55
56
  function addInitCommand(program) {
@@ -67,17 +68,34 @@ function addLoginCommand(program) {
67
68
  .option("--jwt", "Use manual JWT input instead of browser login")
68
69
  .option("-i, --identity <path>", "Ed25519 private key to use for public-key login")
69
70
  .option("--register-identity", "Register an Ed25519 identity using the JWT in .knowhow/.jwt")
71
+ .option("--key-gen", "Generate or validate the CLI Ed25519 identity keypair and exit")
70
72
  .option("--api-url <url>", "API base URL override (falls back to KNOWHOW_API_URL env)")
71
73
  .action(async (options) => {
74
+ if (options.keyGen) {
75
+ if (options.jwt || options.registerIdentity) {
76
+ throw new Error("--key-gen cannot be used with --jwt or --register-identity");
77
+ }
78
+ const { keyPair, created } = (0, keyManager_1.ensureIdentityKeyPair)(options.identity);
79
+ if (created) {
80
+ console.log(`✅ Generated CLI identity keypair: ${keyPair.fingerprint}`);
81
+ console.log(`Private key: ${keyPair.privateKeyPath}`);
82
+ console.log(`Public key: ${keyPair.publicKeyPath}`);
83
+ }
84
+ else {
85
+ console.log(`✅ CLI identity keypair already exists: ${keyPair.fingerprint}`);
86
+ console.log(`Private key: ${keyPair.privateKeyPath}`);
87
+ console.log(`Public key: ${keyPair.publicKeyPath}`);
88
+ }
89
+ return;
90
+ }
72
91
  if (options.registerIdentity) {
73
92
  await (0, registerIdentity_1.registerIdentity)({
74
93
  identityPath: options.identity,
75
94
  apiUrl: options.apiUrl,
76
95
  });
96
+ return;
77
97
  }
78
- else {
79
- await (0, login_1.login)(options.jwt, options.identity);
80
- }
98
+ await (0, login_1.login)(options.jwt, options.identity);
81
99
  });
82
100
  }
83
101
  function addUpdateCommand(program) {
@@ -1 +1 @@
1
- {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../../src/commands/misc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../../src/commands/misc.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,wCAOC;AAED,0CA6CC;AAED,4CAoBC;AAED,gDA2DC;AA+GD,4CAiBC;AAED,4CAOC;AAED,gDAOC;AAED,wCASC;AAED,kEA+DC;AAnXD,iDAAyC;AACzC,qDAA6C;AAC7C,sCAAmC;AACnC,oCAA0D;AAC1D,0CAA2F;AAC3F,sCAAiC;AACjC,oCAAiC;AACjC,+DAA4D;AAC5D,mDAA2D;AAC3D,6DAAgE;AAChE,kCAAoC;AAEpC,SAAgB,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAA,aAAI,GAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,OAAO,EAAE,+CAA+C,CAAC;SAChE,MAAM,CAAC,uBAAuB,EAAE,iDAAiD,CAAC;SAClF,MAAM,CAAC,qBAAqB,EAAE,6DAA6D,CAAC;SAC5F,MAAM,CAAC,WAAW,EAAE,gEAAgE,CAAC;SACrF,MAAM,CAAC,iBAAiB,EAAE,2DAA2D,CAAC;SACtF,MAAM,CAAC,KAAK,EAAE,OAMd,EAAE,EAAE;QACH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAChF,CAAC;YAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAA,kCAAqB,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrE,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;gBACxE,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,0CAA0C,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC7E,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;YACtD,CAAC;YAED,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,MAAM,IAAA,mCAAgB,EAAC;gBACrB,YAAY,EAAE,OAAO,CAAC,QAAQ;gBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,IAAA,aAAK,EAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,oBAAoB,sBAAO,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,IAAA,wBAAQ,EAAC,qCAAqC,EAAE;gBAC9C,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CACL,eAAe,EACf,uDAAuD,CACxD;SACA,MAAM,CACL,sBAAsB,EACtB,6EAA6E,CAC9E;SACA,MAAM,CACL,WAAW,EACX,wIAAwI,CACzI;SACA,MAAM,CACL,eAAe,EACf,8FAA8F,CAC/F;SACA,MAAM,CACL,SAAS,EACT,wGAAwG,CACzG;SACA,MAAM,CACL,mBAAmB,EACnB,oFAAoF,EACpF,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CACvB;SACA,MAAM,CACL,QAAQ,EACR,kGAAkG,CACnG;SACA,MAAM,CAAC,KAAK,EAAE,OAQd,EAAE,EAAE;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,wDAAa,YAAY,GAAC,CAAC;QACrD,MAAM,aAAa,EAAE,CAAC;QAEtB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,IAAA,mBAAQ,EAAC;YACb,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAK/B;IACC,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,WAAW,GAAC,CAAC;IAChD,MAAM,EAAE,SAAS,EAAE,mBAAmB,EAAE,GAAG,wDAAa,WAAW,GAAC,CAAC;IACrE,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,MAAM,GAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,wDAAa,QAAQ,GAAC,CAAC;IACtC,MAAM,EAAE,UAAU,EAAE,GAAG,wDAAa,WAAW,GAAC,CAAC;IAEjD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAGxC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACtC,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;QACjD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACpG,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAA,qBAAU,EAAC,OAAO,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,uCAAuC,WAAW,KAAK,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,MAAM,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QAErH,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;YAE1B,IAAI,MAAM,GAAG,SAAS,CAAC;YACvB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC/E,IAAI,YAAsB,CAAC;oBAE3B,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAGhC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAA,gCAAqB,EAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;wBAClE,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAChF,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAA,gCAAqB,EAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;wBAClE,YAAY,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;oBAC3C,CAAC;oBAED,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;oBAC9E,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,GAAG,SAAS,CAAC;wBACnB,MAAM,GAAG,eAAe,CAAC;oBAC3B,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;gBAET,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,YAAY,CAAC;YACxB,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YAC1D,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CACjC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAChC,IAAI,OAAO,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/E,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAA,gCAAqB,EAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;YAClE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAC9C,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;YAC9B,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;YAC9E,OAAO,CAAC,SAAS,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CACH,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAE1B,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,MAAM,GAAG,QAAQ,UAAU,OAAO,CAAC,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;AAC1F,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,aAAa,EAAE,GAAG,wDAAa,YAAY,GAAC,CAAC;QACrD,MAAM,aAAa,EAAE,CAAC;QACtB,MAAM,IAAA,aAAK,GAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,0CAA0C,CAAC;SACvD,QAAQ,CAAC,WAAW,EAAE,yCAAyC,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAA,aAAK,EAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAA,cAAM,GAAE,CAAC;IACjB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAA,gBAAQ,GAAE,CAAC;IACnB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,aAAa,EAAE,GAAG,wDAAa,YAAY,GAAC,CAAC;QACrD,MAAM,aAAa,EAAE,CAAC;QACtB,MAAM,IAAA,gBAAS,GAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,2BAA2B,CAAC,OAAgB;IAC1D,OAAO;SACJ,OAAO,CAAC,6BAA6B,CAAC;SACtC,WAAW,CACV,qGAAqG,CACtG;SACA,MAAM,CACL,eAAe,EACf,qDAAqD,CACtD;SACA,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,OAA0B,EAAE,EAAE;QAGvE,eAAM,CAAC,OAAO,EAAE,CAAC;QAEjB,MAAM,MAAM,GAAG,IAAI,mCAAmB,EAAE,CAAC;QAEzC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAExB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,wDAAa,UAAU,GAAC,CAAC;YAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;gBAClC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBACrB,IAAI,IAAI,CAAC,IAAI,EAAE;wBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC3C,CAAC,CAAC,CAAC;gBACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAA,wBAAQ,EAAC,2BAA2B,EAAE;oBACtD,QAAQ,EAAE,OAAO;oBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;iBAChC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,KAAK,GACT,SAAS,CAAC,KAAK,CAAC,2CAA2C,CAAC;oBAC5D,SAAS,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACjD,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;YAET,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,UAAU,CAAC,QAAQ,UAAU,UAAU,CAAC,IAAI,cAAc,UAAU,CAAC,QAAQ,cAAc,UAAU,CAAC,QAAQ,IAAI,CAC/H,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -8,6 +8,24 @@ const fs_1 = __importDefault(require("fs"));
8
8
  const os_1 = __importDefault(require("os"));
9
9
  const path_1 = __importDefault(require("path"));
10
10
  const keyManager_1 = require("../../../src/auth/keyManager");
11
+ const OPENSSH_ED25519_PRIVATE_KEY = `-----BEGIN OPENSSH PRIVATE KEY-----
12
+ b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
13
+ QyNTUxOQAAACD/E7YSDZcV7usL3Ej3SSvGNVuNMu1hYFOpHjQaCodvIgAAAIgKqccyCqnH
14
+ MgAAAAtzc2gtZWQyNTUxOQAAACD/E7YSDZcV7usL3Ej3SSvGNVuNMu1hYFOpHjQaCodvIg
15
+ AAAECC40JKj3sb9Q3KsA9wAKeLbUwazUi7cuBiDfuJHDybtf8TthINlxXu6wvcSPdJK8Y1
16
+ W40y7WFgU6keNBoKh28iAAAABHRlc3QB
17
+ -----END OPENSSH PRIVATE KEY-----
18
+ `;
19
+ const OPENSSH_ED25519_PUBLIC_KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP8TthINlxXu6wvcSPdJK8Y1W40y7WFgU6keNBoKh28i test\n";
20
+ const OPENSSH_ENCRYPTED_ED25519_PRIVATE_KEY = `-----BEGIN OPENSSH PRIVATE KEY-----
21
+ b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABAiFkZE2t
22
+ 9UBWLQLB8sAuG7AAAAGAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAID2OnkCi/hq0EH9E
23
+ yBf1n4FXRDw16RYyDAL0pbbRWh1JAAAAkHNPoqbcZcef7FZY+dFTRTODyAMPL4gyzOxGLE
24
+ JffXux9KUTPBrCy+xfScoAHq9JFKrspli5h5Z6PyJ7Dp2NNJPOzEaF92fv6989AETm3X3X
25
+ 2pOUvtPMJz29C1MO7hXHlReIWqF6nkaDGGcNEZMZ3xHI4ypB/lfceH6A1IjxZEa2BXJfJe
26
+ y6h8co4T89tJdubQ==
27
+ -----END OPENSSH PRIVATE KEY-----
28
+ `;
11
29
  describe("keyManager", () => {
12
30
  let directory;
13
31
  let identity;
@@ -29,6 +47,17 @@ describe("keyManager", () => {
29
47
  const publicKey = crypto_1.default.createPublicKey(fs_1.default.readFileSync(identity));
30
48
  expect(crypto_1.default.verify(null, Buffer.from(challengeMessage), publicKey, Buffer.from(signature, "base64"))).toBe(true);
31
49
  });
50
+ it("accepts default unencrypted OpenSSH Ed25519 private keys", () => {
51
+ fs_1.default.writeFileSync(identity, OPENSSH_ED25519_PRIVATE_KEY);
52
+ fs_1.default.writeFileSync(`${identity}.pub`, OPENSSH_ED25519_PUBLIC_KEY);
53
+ const loaded = (0, keyManager_1.loadKeyPair)(identity);
54
+ expect(loaded.publicKeyBase64).toBe("/xO2Eg2XFe7rC9xI90krxjVbjTLtYWB TqR40GgqHbyI=".replace(/\s+/g, ""));
55
+ const signature = (0, keyManager_1.signMessage)("challenge", identity);
56
+ const spkiPrefix = Buffer.from("302a300506032b6570032100", "hex");
57
+ const publicKeyDer = Buffer.concat([spkiPrefix, Buffer.from(loaded.publicKeyBase64, "base64")]);
58
+ const publicKey = crypto_1.default.createPublicKey({ key: publicKeyDer, format: "der", type: "spki" });
59
+ expect(crypto_1.default.verify(null, Buffer.from("challenge"), publicKey, Buffer.from(signature, "base64"))).toBe(true);
60
+ });
32
61
  it("loads legacy raw-base64 public keys but rejects non-Ed25519 identities", () => {
33
62
  const generated = (0, keyManager_1.generateKeyPair)(identity);
34
63
  fs_1.default.writeFileSync(`${identity}.pub`, generated.publicKeyBase64);
@@ -43,10 +72,25 @@ describe("keyManager", () => {
43
72
  fs_1.default.writeFileSync(`${rsaIdentity}.pub`, generated.publicKeyBase64);
44
73
  expect(() => (0, keyManager_1.loadKeyPair)(rsaIdentity)).toThrow("must be an Ed25519 private key");
45
74
  });
75
+ it("rejects encrypted OpenSSH keys with a clear error", () => {
76
+ fs_1.default.writeFileSync(identity, OPENSSH_ENCRYPTED_ED25519_PRIVATE_KEY);
77
+ fs_1.default.writeFileSync(`${identity}.pub`, OPENSSH_ED25519_PUBLIC_KEY);
78
+ expect(() => (0, keyManager_1.loadKeyPair)(identity)).toThrow("encrypted OpenSSH key");
79
+ });
46
80
  it("does not overwrite a partial identity", () => {
47
81
  fs_1.default.writeFileSync(identity, "existing key");
48
82
  expect(() => (0, keyManager_1.generateKeyPair)(identity)).toThrow("a key file already exists");
49
83
  expect(fs_1.default.readFileSync(identity, "utf8")).toBe("existing key");
50
84
  });
85
+ it("ensureIdentityKeyPair is safe for existing keys (no overwrite)", () => {
86
+ const generated = (0, keyManager_1.generateKeyPair)(identity);
87
+ const beforePrivate = fs_1.default.readFileSync(identity, "utf8");
88
+ const beforePublic = fs_1.default.readFileSync(`${identity}.pub`, "utf8");
89
+ const result = (0, keyManager_1.ensureIdentityKeyPair)(identity);
90
+ expect(result.created).toBe(false);
91
+ expect(result.keyPair).toEqual(generated);
92
+ expect(fs_1.default.readFileSync(identity, "utf8")).toBe(beforePrivate);
93
+ expect(fs_1.default.readFileSync(`${identity}.pub`, "utf8")).toBe(beforePublic);
94
+ });
51
95
  });
52
96
  //# sourceMappingURL=keyManager.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"keyManager.test.js","sourceRoot":"","sources":["../../../../tests/unit/auth/keyManager.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyManager.test.js","sourceRoot":"","sources":["../../../../tests/unit/auth/keyManager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const commander_1 = require("commander");
4
+ const login = jest.fn().mockResolvedValue(undefined);
5
+ const registerIdentity = jest.fn().mockResolvedValue(undefined);
6
+ const ensureIdentityKeyPair = jest.fn();
7
+ jest.mock("../../../src/login", () => ({ login }));
8
+ jest.mock("../../../src/index", () => ({
9
+ embed: jest.fn(),
10
+ upload: jest.fn(),
11
+ download: jest.fn(),
12
+ purge: jest.fn(),
13
+ }));
14
+ jest.mock("../../../src/auth/registerIdentity", () => ({ registerIdentity }));
15
+ jest.mock("../../../src/auth/keyManager", () => ({ ensureIdentityKeyPair }));
16
+ const misc_1 = require("../../../src/commands/misc");
17
+ describe("login command", () => {
18
+ let program;
19
+ let logSpy;
20
+ beforeEach(() => {
21
+ jest.clearAllMocks();
22
+ program = new commander_1.Command();
23
+ program.exitOverride();
24
+ (0, misc_1.addLoginCommand)(program);
25
+ logSpy = jest.spyOn(console, "log").mockImplementation(() => undefined);
26
+ });
27
+ afterEach(() => {
28
+ logSpy.mockRestore();
29
+ });
30
+ it("supports --key-gen non-interactively and exits without login", async () => {
31
+ ensureIdentityKeyPair.mockReturnValue({
32
+ created: true,
33
+ keyPair: {
34
+ fingerprint: "SHA256:test",
35
+ privateKeyPath: "/keys/id_ed25519",
36
+ publicKeyPath: "/keys/id_ed25519.pub",
37
+ },
38
+ });
39
+ await program.parseAsync(["node", "knowhow", "login", "--key-gen"]);
40
+ expect(ensureIdentityKeyPair).toHaveBeenCalledWith(undefined);
41
+ expect(login).not.toHaveBeenCalled();
42
+ expect(registerIdentity).not.toHaveBeenCalled();
43
+ const output = logSpy.mock.calls.map((call) => call.join(" ")).join("\n");
44
+ expect(output).toContain("Generated CLI identity keypair");
45
+ expect(output).toContain("/keys/id_ed25519");
46
+ expect(output).toContain("/keys/id_ed25519.pub");
47
+ });
48
+ it("does not overwrite existing key when using --key-gen", async () => {
49
+ ensureIdentityKeyPair.mockReturnValue({
50
+ created: false,
51
+ keyPair: {
52
+ fingerprint: "SHA256:existing",
53
+ privateKeyPath: "/keys/id_ed25519",
54
+ publicKeyPath: "/keys/id_ed25519.pub",
55
+ },
56
+ });
57
+ await program.parseAsync(["node", "knowhow", "login", "--key-gen", "--identity", "/keys/id_ed25519"]);
58
+ expect(ensureIdentityKeyPair).toHaveBeenCalledWith("/keys/id_ed25519");
59
+ expect(login).not.toHaveBeenCalled();
60
+ expect(registerIdentity).not.toHaveBeenCalled();
61
+ const output = logSpy.mock.calls.map((call) => call.join(" ")).join("\n");
62
+ expect(output).toContain("CLI identity keypair already exists");
63
+ });
64
+ it("rejects incompatible flag combinations with --key-gen", async () => {
65
+ await expect(program.parseAsync(["node", "knowhow", "login", "--key-gen", "--jwt"])).rejects.toThrow("--key-gen cannot be used with --jwt or --register-identity");
66
+ expect(login).not.toHaveBeenCalled();
67
+ expect(registerIdentity).not.toHaveBeenCalled();
68
+ });
69
+ });
70
+ //# sourceMappingURL=misc.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misc.test.js","sourceRoot":"","sources":["../../../../tests/unit/commands/misc.test.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AAEpC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAChE,MAAM,qBAAqB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAExC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACnD,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;IACnB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;CACjB,CAAC,CAAC,CAAC;AACJ,IAAI,CAAC,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAC9E,IAAI,CAAC,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;AAE7E,qDAA6D;AAE7D,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,OAAgB,CAAC;IACrB,IAAI,MAAwB,CAAC;IAE7B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;QACxB,OAAO,CAAC,YAAY,EAAE,CAAC;QACvB,IAAA,sBAAe,EAAC,OAAO,CAAC,CAAC;QACzB,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,qBAAqB,CAAC,eAAe,CAAC;YACpC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACP,WAAW,EAAE,aAAa;gBAC1B,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,sBAAsB;aACtC;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;QAEpE,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACrC,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,qBAAqB,CAAC,eAAe,CAAC;YACpC,OAAO,EAAE,KAAK;YACd,OAAO,EAAE;gBACP,WAAW,EAAE,iBAAiB;gBAC9B,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,sBAAsB;aACtC;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAEtG,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACrC,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,CACV,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CACvE,CAAC,OAAO,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;QAEhF,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACrC,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}