@centient/secrets 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/dist/cli/secrets-cli.d.ts +8 -4
- package/dist/cli/secrets-cli.d.ts.map +1 -1
- package/dist/cli/secrets-cli.js +153 -23
- package/dist/cli/secrets-cli.js.map +1 -1
- package/dist/crypto/vault-common.d.ts +21 -0
- package/dist/crypto/vault-common.d.ts.map +1 -1
- package/dist/crypto/vault-common.js +57 -0
- package/dist/crypto/vault-common.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/key-providers/index.d.ts +5 -0
- package/dist/key-providers/index.d.ts.map +1 -0
- package/dist/key-providers/index.js +4 -0
- package/dist/key-providers/index.js.map +1 -0
- package/dist/key-providers/keychain-provider.d.ts +19 -0
- package/dist/key-providers/keychain-provider.d.ts.map +1 -0
- package/dist/key-providers/keychain-provider.js +35 -0
- package/dist/key-providers/keychain-provider.js.map +1 -0
- package/dist/key-providers/onepassword-provider.d.ts +38 -0
- package/dist/key-providers/onepassword-provider.d.ts.map +1 -0
- package/dist/key-providers/onepassword-provider.js +146 -0
- package/dist/key-providers/onepassword-provider.js.map +1 -0
- package/dist/key-providers/resolve.d.ts +46 -0
- package/dist/key-providers/resolve.d.ts.map +1 -0
- package/dist/key-providers/resolve.js +172 -0
- package/dist/key-providers/resolve.js.map +1 -0
- package/dist/key-providers/types.d.ts +62 -0
- package/dist/key-providers/types.d.ts.map +1 -0
- package/dist/key-providers/types.js +12 -0
- package/dist/key-providers/types.js.map +1 -0
- package/dist/vault/types.d.ts +20 -1
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/vault-env.d.ts +11 -0
- package/dist/vault/vault-env.d.ts.map +1 -1
- package/dist/vault/vault-env.js +17 -0
- package/dist/vault/vault-env.js.map +1 -1
- package/dist/vault/vault-gpg.d.ts +9 -0
- package/dist/vault/vault-gpg.d.ts.map +1 -1
- package/dist/vault/vault-gpg.js +35 -1
- package/dist/vault/vault-gpg.js.map +1 -1
- package/dist/vault/vault-libsecret.d.ts +20 -0
- package/dist/vault/vault-libsecret.d.ts.map +1 -1
- package/dist/vault/vault-libsecret.js +48 -0
- package/dist/vault/vault-libsecret.js.map +1 -1
- package/dist/vault/vault-windows.d.ts +14 -0
- package/dist/vault/vault-windows.d.ts.map +1 -1
- package/dist/vault/vault-windows.js +41 -0
- package/dist/vault/vault-windows.js.map +1 -1
- package/dist/vault/vault.d.ts +24 -0
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +33 -1
- package/dist/vault/vault.js.map +1 -1
- package/package.json +31 -12
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
export { encrypt, decrypt, encryptObject, decryptObject } from "./crypto/vault-common.js";
|
|
3
3
|
export { ALGORITHM, IV_LENGTH, AUTH_TAG_LENGTH, KEY_LENGTH } from "./crypto/vault-common.js";
|
|
4
4
|
// Credential vault
|
|
5
|
-
export { storeCredential, getCredential, deleteCredential, getActiveVaultType, isSessionValid } from "./vault/vault.js";
|
|
5
|
+
export { storeCredential, getCredential, deleteCredential, listCredentials, getActiveVaultType, isSessionValid } from "./vault/vault.js";
|
|
6
6
|
// Platform detection
|
|
7
7
|
export { isTTY, canUnicode, isHeadless, canLaunchBrowser, isCIEnvironment, isDockerContainer, isSSHSession } from "./platform/platform.js";
|
|
8
8
|
export { isAgentEnvironment } from "./platform/agent-detect.js";
|
|
@@ -10,8 +10,11 @@ export { isAgentEnvironment } from "./platform/agent-detect.js";
|
|
|
10
10
|
export { getEnvironmentManager, EnvironmentManager } from "./environment/EnvironmentManager.js";
|
|
11
11
|
// CLI
|
|
12
12
|
export { runSecrets } from "./cli/secrets-cli.js";
|
|
13
|
-
// Key storage helpers
|
|
13
|
+
// Key storage helpers (legacy — prefer key-providers for vault key access)
|
|
14
14
|
export { getKeyFromKeychain, storeKeyInKeychain, storeStringInKeychain, getStringFromKeychain, deleteFromKeychain } from "./crypto/vault-common.js";
|
|
15
|
+
export { KeychainProvider } from "./key-providers/keychain-provider.js";
|
|
16
|
+
export { OnePasswordProvider } from "./key-providers/onepassword-provider.js";
|
|
17
|
+
export { resolveKeyProvider, getProviderByType, loadConfig, saveSecretsConfig } from "./key-providers/resolve.js";
|
|
15
18
|
// Validation
|
|
16
19
|
export { isValidKey } from "./vault/vault-utils.js";
|
|
17
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE7F,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE7F,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGzI,qBAAqB;AACrB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3I,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,yBAAyB;AACzB,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEhG,MAAM;AACN,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,2EAA2E;AAC3E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAIpJ,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAElH,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { KeyProvider, KeyProviderType, OnePasswordConfig, SecretsConfig, CentientConfig } from "./types.js";
|
|
2
|
+
export { KeychainProvider } from "./keychain-provider.js";
|
|
3
|
+
export { OnePasswordProvider } from "./onepassword-provider.js";
|
|
4
|
+
export { resolveKeyProvider, getProviderByType, loadConfig, saveSecretsConfig } from "./resolve.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/key-providers/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/key-providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key Provider — macOS Keychain
|
|
3
|
+
*
|
|
4
|
+
* Wraps the existing getKeyFromKeychain / storeKeyInKeychain functions
|
|
5
|
+
* from vault-common.ts as a KeyProvider implementation.
|
|
6
|
+
*
|
|
7
|
+
* Only available on macOS (darwin). Uses the `security` CLI to interact
|
|
8
|
+
* with the system Keychain, which prompts for Touch ID or system password.
|
|
9
|
+
*/
|
|
10
|
+
import type { KeyProvider, KeyProviderType } from "./types.js";
|
|
11
|
+
export declare class KeychainProvider implements KeyProvider {
|
|
12
|
+
readonly name: KeyProviderType;
|
|
13
|
+
/** Returns true if running on macOS. */
|
|
14
|
+
static detect(): boolean;
|
|
15
|
+
getKey(): Buffer | null;
|
|
16
|
+
storeKey(key: Buffer): boolean;
|
|
17
|
+
deleteKey(): boolean;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=keychain-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain-provider.d.ts","sourceRoot":"","sources":["../../src/key-providers/keychain-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAa/D,qBAAa,gBAAiB,YAAW,WAAW;IAClD,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAc;IAE5C,wCAAwC;IACxC,MAAM,CAAC,MAAM,IAAI,OAAO;IAIxB,MAAM,IAAI,MAAM,GAAG,IAAI;IAIvB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI9B,SAAS,IAAI,OAAO;CAGrB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key Provider — macOS Keychain
|
|
3
|
+
*
|
|
4
|
+
* Wraps the existing getKeyFromKeychain / storeKeyInKeychain functions
|
|
5
|
+
* from vault-common.ts as a KeyProvider implementation.
|
|
6
|
+
*
|
|
7
|
+
* Only available on macOS (darwin). Uses the `security` CLI to interact
|
|
8
|
+
* with the system Keychain, which prompts for Touch ID or system password.
|
|
9
|
+
*/
|
|
10
|
+
import { getKeyFromKeychain, storeKeyInKeychain, deleteFromKeychain, } from "../crypto/vault-common.js";
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// Constants
|
|
13
|
+
// =============================================================================
|
|
14
|
+
const KEYCHAIN_SERVICE = "centient-vault";
|
|
15
|
+
const KEYCHAIN_ACCOUNT = "vault-key";
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Implementation
|
|
18
|
+
// =============================================================================
|
|
19
|
+
export class KeychainProvider {
|
|
20
|
+
name = "keychain";
|
|
21
|
+
/** Returns true if running on macOS. */
|
|
22
|
+
static detect() {
|
|
23
|
+
return process.platform === "darwin";
|
|
24
|
+
}
|
|
25
|
+
getKey() {
|
|
26
|
+
return getKeyFromKeychain(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
|
|
27
|
+
}
|
|
28
|
+
storeKey(key) {
|
|
29
|
+
return storeKeyInKeychain(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT, key);
|
|
30
|
+
}
|
|
31
|
+
deleteKey() {
|
|
32
|
+
return deleteFromKeychain(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=keychain-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain-provider.js","sourceRoot":"","sources":["../../src/key-providers/keychain-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAGnC,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAC1C,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAErC,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAoB,UAAU,CAAC;IAE5C,wCAAwC;IACxC,MAAM,CAAC,MAAM;QACX,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACvC,CAAC;IAED,MAAM;QACJ,OAAO,kBAAkB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAChE,CAAC;IAED,QAAQ,CAAC,GAAW;QAClB,OAAO,kBAAkB,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,SAAS;QACP,OAAO,kBAAkB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IAChE,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key Provider — 1Password
|
|
3
|
+
*
|
|
4
|
+
* Stores and retrieves the vault encryption key via the 1Password `op` CLI.
|
|
5
|
+
* Supports three auth modes transparently:
|
|
6
|
+
*
|
|
7
|
+
* 1. Desktop app integration — user has 1Password running with CLI enabled
|
|
8
|
+
* 2. Service account — OP_SERVICE_ACCOUNT_TOKEN env var (headless/CI)
|
|
9
|
+
* 3. CLI session — user ran `op signin` (OP_SESSION_* env var)
|
|
10
|
+
*
|
|
11
|
+
* The `op` CLI handles auth selection internally; this provider just
|
|
12
|
+
* shells out to `op read` / `op item create` / `op item edit`.
|
|
13
|
+
*
|
|
14
|
+
* No dependency on @1password/sdk — uses execFileSync only.
|
|
15
|
+
*/
|
|
16
|
+
import type { KeyProvider, KeyProviderType, OnePasswordConfig } from "./types.js";
|
|
17
|
+
export declare class OnePasswordProvider implements KeyProvider {
|
|
18
|
+
readonly name: KeyProviderType;
|
|
19
|
+
private readonly vault;
|
|
20
|
+
private readonly item;
|
|
21
|
+
constructor(config?: OnePasswordConfig);
|
|
22
|
+
/**
|
|
23
|
+
* Detect whether 1Password CLI is available and authenticated.
|
|
24
|
+
*
|
|
25
|
+
* Returns true if:
|
|
26
|
+
* - `op` binary is in PATH, AND
|
|
27
|
+
* - Either OP_SERVICE_ACCOUNT_TOKEN is set, or at least one account
|
|
28
|
+
* is configured (desktop app / prior sign-in).
|
|
29
|
+
*/
|
|
30
|
+
static detect(): boolean;
|
|
31
|
+
getKey(): Buffer | null;
|
|
32
|
+
storeKey(key: Buffer): boolean;
|
|
33
|
+
deleteKey(): boolean;
|
|
34
|
+
private itemExists;
|
|
35
|
+
private createItem;
|
|
36
|
+
private updateItem;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=onepassword-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onepassword-provider.d.ts","sourceRoot":"","sources":["../../src/key-providers/onepassword-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAclF,qBAAa,mBAAoB,YAAW,WAAW;IACrD,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,MAAM,CAAC,EAAE,iBAAiB;IAKtC;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,IAAI,OAAO;IA8BxB,MAAM,IAAI,MAAM,GAAG,IAAI;IAkBvB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAU9B,SAAS,IAAI,OAAO;IAkBpB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,UAAU;IAmBlB,OAAO,CAAC,UAAU;CAgBnB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key Provider — 1Password
|
|
3
|
+
*
|
|
4
|
+
* Stores and retrieves the vault encryption key via the 1Password `op` CLI.
|
|
5
|
+
* Supports three auth modes transparently:
|
|
6
|
+
*
|
|
7
|
+
* 1. Desktop app integration — user has 1Password running with CLI enabled
|
|
8
|
+
* 2. Service account — OP_SERVICE_ACCOUNT_TOKEN env var (headless/CI)
|
|
9
|
+
* 3. CLI session — user ran `op signin` (OP_SESSION_* env var)
|
|
10
|
+
*
|
|
11
|
+
* The `op` CLI handles auth selection internally; this provider just
|
|
12
|
+
* shells out to `op read` / `op item create` / `op item edit`.
|
|
13
|
+
*
|
|
14
|
+
* No dependency on @1password/sdk — uses execFileSync only.
|
|
15
|
+
*/
|
|
16
|
+
import { execFileSync } from "child_process";
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Defaults
|
|
19
|
+
// =============================================================================
|
|
20
|
+
const DEFAULT_VAULT = "Private";
|
|
21
|
+
const DEFAULT_ITEM = "centient-vault-key";
|
|
22
|
+
const FIELD_NAME = "password";
|
|
23
|
+
// =============================================================================
|
|
24
|
+
// Implementation
|
|
25
|
+
// =============================================================================
|
|
26
|
+
export class OnePasswordProvider {
|
|
27
|
+
name = "1password";
|
|
28
|
+
vault;
|
|
29
|
+
item;
|
|
30
|
+
constructor(config) {
|
|
31
|
+
this.vault = config?.vault || DEFAULT_VAULT;
|
|
32
|
+
this.item = config?.item || DEFAULT_ITEM;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Detect whether 1Password CLI is available and authenticated.
|
|
36
|
+
*
|
|
37
|
+
* Returns true if:
|
|
38
|
+
* - `op` binary is in PATH, AND
|
|
39
|
+
* - Either OP_SERVICE_ACCOUNT_TOKEN is set, or at least one account
|
|
40
|
+
* is configured (desktop app / prior sign-in).
|
|
41
|
+
*/
|
|
42
|
+
static detect() {
|
|
43
|
+
// Check op binary exists
|
|
44
|
+
try {
|
|
45
|
+
execFileSync("op", ["--version"], {
|
|
46
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
47
|
+
timeout: 5000,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
// Service account mode — no further checks needed
|
|
54
|
+
if (process.env.OP_SERVICE_ACCOUNT_TOKEN) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
// Interactive mode — check for configured accounts
|
|
58
|
+
try {
|
|
59
|
+
const output = execFileSync("op", ["account", "list", "--format=json"], { encoding: "utf8", stdio: ["pipe", "pipe", "pipe"], timeout: 5000 }).trim();
|
|
60
|
+
// Returns "[]" when no accounts are configured
|
|
61
|
+
return output !== "[]" && output.length > 2;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
getKey() {
|
|
68
|
+
try {
|
|
69
|
+
const ref = `op://${this.vault}/${this.item}/${FIELD_NAME}`;
|
|
70
|
+
const result = execFileSync("op", ["read", ref], {
|
|
71
|
+
encoding: "utf8",
|
|
72
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
73
|
+
timeout: 30000,
|
|
74
|
+
}).trim();
|
|
75
|
+
if (!result)
|
|
76
|
+
return null;
|
|
77
|
+
const buf = Buffer.from(result, "hex");
|
|
78
|
+
// Sanity check: vault key must be exactly 32 bytes
|
|
79
|
+
if (buf.length !== 32)
|
|
80
|
+
return null;
|
|
81
|
+
return buf;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
storeKey(key) {
|
|
88
|
+
const keyHex = key.toString("hex");
|
|
89
|
+
// Check if item already exists
|
|
90
|
+
if (this.itemExists()) {
|
|
91
|
+
return this.updateItem(keyHex);
|
|
92
|
+
}
|
|
93
|
+
return this.createItem(keyHex);
|
|
94
|
+
}
|
|
95
|
+
deleteKey() {
|
|
96
|
+
try {
|
|
97
|
+
execFileSync("op", ["item", "delete", this.item, "--vault", this.vault], { stdio: ["pipe", "pipe", "pipe"], timeout: 30000 });
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Item may not exist — treat as success
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// Private helpers
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
itemExists() {
|
|
109
|
+
try {
|
|
110
|
+
execFileSync("op", ["item", "get", this.item, "--vault", this.vault, "--format=json"], { stdio: ["pipe", "pipe", "pipe"], timeout: 15000 });
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
createItem(keyHex) {
|
|
118
|
+
try {
|
|
119
|
+
execFileSync("op", [
|
|
120
|
+
"item", "create",
|
|
121
|
+
"--category", "Password",
|
|
122
|
+
"--title", this.item,
|
|
123
|
+
"--vault", this.vault,
|
|
124
|
+
`${FIELD_NAME}=${keyHex}`,
|
|
125
|
+
], { stdio: ["pipe", "pipe", "pipe"], timeout: 30000 });
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
updateItem(keyHex) {
|
|
133
|
+
try {
|
|
134
|
+
execFileSync("op", [
|
|
135
|
+
"item", "edit", this.item,
|
|
136
|
+
"--vault", this.vault,
|
|
137
|
+
`${FIELD_NAME}=${keyHex}`,
|
|
138
|
+
], { stdio: ["pipe", "pipe", "pipe"], timeout: 30000 });
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=onepassword-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onepassword-provider.js","sourceRoot":"","sources":["../../src/key-providers/onepassword-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key Provider — Resolution & Configuration
|
|
3
|
+
*
|
|
4
|
+
* Loads provider configuration from ~/.centient/config.json and resolves
|
|
5
|
+
* the appropriate KeyProvider implementation. Supports explicit config
|
|
6
|
+
* and auto-detection fallback.
|
|
7
|
+
*
|
|
8
|
+
* Resolution order:
|
|
9
|
+
* 1. Explicit config (secrets.provider field) — use it; fail if unavailable
|
|
10
|
+
* 2. Auto-detection — 1Password if `op` is available, else Keychain on macOS
|
|
11
|
+
*/
|
|
12
|
+
import type { KeyProvider, KeyProviderType, CentientConfig, SecretsConfig } from "./types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Load the global centient config file.
|
|
15
|
+
* Returns an empty object if the file doesn't exist or is malformed.
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadConfig(): CentientConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Write the global centient config file.
|
|
20
|
+
* Merges the secrets section into any existing config.
|
|
21
|
+
* Returns true on success.
|
|
22
|
+
*/
|
|
23
|
+
export declare function saveSecretsConfig(secrets: SecretsConfig): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the active KeyProvider based on config and environment.
|
|
26
|
+
*
|
|
27
|
+
* @returns An object with the resolved provider, or an error message
|
|
28
|
+
* if the explicitly configured provider is unavailable.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveKeyProvider(): {
|
|
31
|
+
ok: true;
|
|
32
|
+
provider: KeyProvider;
|
|
33
|
+
method: "config" | "auto";
|
|
34
|
+
} | {
|
|
35
|
+
ok: false;
|
|
36
|
+
error: {
|
|
37
|
+
code: string;
|
|
38
|
+
message: string;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Get a specific provider by type, regardless of config.
|
|
43
|
+
* Used by the migrate command to construct source/target providers.
|
|
44
|
+
*/
|
|
45
|
+
export declare function getProviderByType(type: KeyProviderType, config?: SecretsConfig): KeyProvider | null;
|
|
46
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/key-providers/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAYpB;;;GAGG;AACH,wBAAgB,UAAU,IAAI,cAAc,CAY3C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAWjE;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,EAAE,EAAE,IAAI,CAAC;IACT,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC3B,GAAG;IACF,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C,CAWA;AAyFD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,MAAM,CAAC,EAAE,aAAa,GACrB,WAAW,GAAG,IAAI,CAWpB"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key Provider — Resolution & Configuration
|
|
3
|
+
*
|
|
4
|
+
* Loads provider configuration from ~/.centient/config.json and resolves
|
|
5
|
+
* the appropriate KeyProvider implementation. Supports explicit config
|
|
6
|
+
* and auto-detection fallback.
|
|
7
|
+
*
|
|
8
|
+
* Resolution order:
|
|
9
|
+
* 1. Explicit config (secrets.provider field) — use it; fail if unavailable
|
|
10
|
+
* 2. Auto-detection — 1Password if `op` is available, else Keychain on macOS
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
13
|
+
import { join } from "path";
|
|
14
|
+
import { homedir } from "os";
|
|
15
|
+
import { KeychainProvider } from "./keychain-provider.js";
|
|
16
|
+
import { OnePasswordProvider } from "./onepassword-provider.js";
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Constants
|
|
19
|
+
// =============================================================================
|
|
20
|
+
const CONFIG_PATH = join(homedir(), ".centient", "config.json");
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Config I/O
|
|
23
|
+
// =============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* Load the global centient config file.
|
|
26
|
+
* Returns an empty object if the file doesn't exist or is malformed.
|
|
27
|
+
*/
|
|
28
|
+
export function loadConfig() {
|
|
29
|
+
try {
|
|
30
|
+
if (!existsSync(CONFIG_PATH))
|
|
31
|
+
return {};
|
|
32
|
+
const raw = readFileSync(CONFIG_PATH, "utf8");
|
|
33
|
+
const parsed = JSON.parse(raw);
|
|
34
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
return parsed;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Write the global centient config file.
|
|
45
|
+
* Merges the secrets section into any existing config.
|
|
46
|
+
* Returns true on success.
|
|
47
|
+
*/
|
|
48
|
+
export function saveSecretsConfig(secrets) {
|
|
49
|
+
try {
|
|
50
|
+
const existing = loadConfig();
|
|
51
|
+
const merged = { ...existing, secrets };
|
|
52
|
+
const dir = join(homedir(), ".centient");
|
|
53
|
+
mkdirSync(dir, { recursive: true });
|
|
54
|
+
writeFileSync(CONFIG_PATH, JSON.stringify(merged, null, 2) + "\n", "utf8");
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// =============================================================================
|
|
62
|
+
// Provider Resolution
|
|
63
|
+
// =============================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Resolve the active KeyProvider based on config and environment.
|
|
66
|
+
*
|
|
67
|
+
* @returns An object with the resolved provider, or an error message
|
|
68
|
+
* if the explicitly configured provider is unavailable.
|
|
69
|
+
*/
|
|
70
|
+
export function resolveKeyProvider() {
|
|
71
|
+
const config = loadConfig();
|
|
72
|
+
const secretsConfig = config.secrets;
|
|
73
|
+
// Explicit config — honor it strictly
|
|
74
|
+
if (secretsConfig?.provider) {
|
|
75
|
+
return resolveExplicit(secretsConfig.provider, secretsConfig);
|
|
76
|
+
}
|
|
77
|
+
// Auto-detection fallback
|
|
78
|
+
return resolveAuto(secretsConfig);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Resolve an explicitly configured provider.
|
|
82
|
+
* Fails if the provider is not available on this system.
|
|
83
|
+
*/
|
|
84
|
+
function resolveExplicit(type, config) {
|
|
85
|
+
switch (type) {
|
|
86
|
+
case "keychain": {
|
|
87
|
+
if (!KeychainProvider.detect()) {
|
|
88
|
+
return {
|
|
89
|
+
ok: false,
|
|
90
|
+
error: {
|
|
91
|
+
code: "PROVIDER_UNAVAILABLE",
|
|
92
|
+
message: 'Key provider "keychain" is configured but macOS Keychain is not available on this platform.',
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return { ok: true, provider: new KeychainProvider(), method: "config" };
|
|
97
|
+
}
|
|
98
|
+
case "1password": {
|
|
99
|
+
if (!OnePasswordProvider.detect()) {
|
|
100
|
+
const hasToken = !!process.env.OP_SERVICE_ACCOUNT_TOKEN;
|
|
101
|
+
const hint = hasToken
|
|
102
|
+
? "OP_SERVICE_ACCOUNT_TOKEN is set but the `op` CLI binary was not found in PATH."
|
|
103
|
+
: "Install the 1Password CLI (`op`) and either enable desktop app integration or set OP_SERVICE_ACCOUNT_TOKEN.";
|
|
104
|
+
return {
|
|
105
|
+
ok: false,
|
|
106
|
+
error: {
|
|
107
|
+
code: "PROVIDER_UNAVAILABLE",
|
|
108
|
+
message: `Key provider "1password" is configured but not available. ${hint}`,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
ok: true,
|
|
114
|
+
provider: new OnePasswordProvider(config?.onePassword),
|
|
115
|
+
method: "config",
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
default: {
|
|
119
|
+
return {
|
|
120
|
+
ok: false,
|
|
121
|
+
error: {
|
|
122
|
+
code: "UNKNOWN_PROVIDER",
|
|
123
|
+
message: `Unknown key provider "${type}". Supported: keychain, 1password.`,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Auto-detect the best available provider.
|
|
131
|
+
* Prefers 1Password (enables headless), falls back to Keychain on macOS.
|
|
132
|
+
*/
|
|
133
|
+
function resolveAuto(config) {
|
|
134
|
+
// Prefer 1Password if available (enables headless use case)
|
|
135
|
+
if (OnePasswordProvider.detect()) {
|
|
136
|
+
return {
|
|
137
|
+
ok: true,
|
|
138
|
+
provider: new OnePasswordProvider(config?.onePassword),
|
|
139
|
+
method: "auto",
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// Fall back to Keychain on macOS
|
|
143
|
+
if (KeychainProvider.detect()) {
|
|
144
|
+
return { ok: true, provider: new KeychainProvider(), method: "auto" };
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
ok: false,
|
|
148
|
+
error: {
|
|
149
|
+
code: "NO_PROVIDER",
|
|
150
|
+
message: "No key provider available. " +
|
|
151
|
+
"Install the 1Password CLI (`op`) for headless support, " +
|
|
152
|
+
"or run on macOS for Keychain support.",
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get a specific provider by type, regardless of config.
|
|
158
|
+
* Used by the migrate command to construct source/target providers.
|
|
159
|
+
*/
|
|
160
|
+
export function getProviderByType(type, config) {
|
|
161
|
+
switch (type) {
|
|
162
|
+
case "keychain":
|
|
163
|
+
return KeychainProvider.detect() ? new KeychainProvider() : null;
|
|
164
|
+
case "1password":
|
|
165
|
+
return OnePasswordProvider.detect()
|
|
166
|
+
? new OnePasswordProvider(config?.onePassword)
|
|
167
|
+
: null;
|
|
168
|
+
default:
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/key-providers/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key Provider — Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Abstracts vault encryption key storage behind a provider interface.
|
|
5
|
+
* Implementations retrieve/store the 32-byte AES-256-GCM key from
|
|
6
|
+
* different backends (macOS Keychain, 1Password, etc.).
|
|
7
|
+
*
|
|
8
|
+
* All methods return null/false on failure — never throw (consistent
|
|
9
|
+
* with vault-common.ts conventions).
|
|
10
|
+
*/
|
|
11
|
+
/** Supported key provider backends. */
|
|
12
|
+
export type KeyProviderType = "keychain" | "1password";
|
|
13
|
+
/**
|
|
14
|
+
* Interface for vault encryption key storage providers.
|
|
15
|
+
*
|
|
16
|
+
* Each provider encapsulates its own storage details (keychain service names,
|
|
17
|
+
* 1Password vault/item paths, etc.). Callers interact only through getKey/storeKey.
|
|
18
|
+
*/
|
|
19
|
+
export interface KeyProvider {
|
|
20
|
+
/** Provider identifier for display and config. */
|
|
21
|
+
readonly name: KeyProviderType;
|
|
22
|
+
/**
|
|
23
|
+
* Retrieve the vault encryption key.
|
|
24
|
+
*
|
|
25
|
+
* @returns 32-byte key as Buffer, or null if not found / auth fails.
|
|
26
|
+
*/
|
|
27
|
+
getKey(): Buffer | null;
|
|
28
|
+
/**
|
|
29
|
+
* Store the vault encryption key.
|
|
30
|
+
*
|
|
31
|
+
* Overwrites any existing key in the provider's storage.
|
|
32
|
+
*
|
|
33
|
+
* @param key - 32-byte encryption key
|
|
34
|
+
* @returns true on success, false on failure.
|
|
35
|
+
*/
|
|
36
|
+
storeKey(key: Buffer): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Delete the stored vault encryption key.
|
|
39
|
+
*
|
|
40
|
+
* @returns true if deleted (or did not exist), false on unexpected failure.
|
|
41
|
+
*/
|
|
42
|
+
deleteKey(): boolean;
|
|
43
|
+
}
|
|
44
|
+
/** 1Password-specific configuration. */
|
|
45
|
+
export interface OnePasswordConfig {
|
|
46
|
+
/** 1Password vault name (default: "Private"). */
|
|
47
|
+
vault?: string;
|
|
48
|
+
/** 1Password item name (default: "centient-vault-key"). */
|
|
49
|
+
item?: string;
|
|
50
|
+
}
|
|
51
|
+
/** Global secrets configuration from ~/.centient/config.json. */
|
|
52
|
+
export interface SecretsConfig {
|
|
53
|
+
/** Explicit provider choice. Omit for auto-detection. */
|
|
54
|
+
provider?: KeyProviderType;
|
|
55
|
+
/** 1Password-specific settings. */
|
|
56
|
+
onePassword?: OnePasswordConfig;
|
|
57
|
+
}
|
|
58
|
+
/** Top-level structure of ~/.centient/config.json. */
|
|
59
|
+
export interface CentientConfig {
|
|
60
|
+
secrets?: SecretsConfig;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/key-providers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,uCAAuC;AACvC,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,WAAW,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAE/B;;;;OAIG;IACH,MAAM,IAAI,MAAM,GAAG,IAAI,CAAC;IAExB;;;;;;;OAOG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE/B;;;;OAIG;IACH,SAAS,IAAI,OAAO,CAAC;CACtB;AAMD,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,mCAAmC;IACnC,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAED,sDAAsD;AACtD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key Provider — Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Abstracts vault encryption key storage behind a provider interface.
|
|
5
|
+
* Implementations retrieve/store the 32-byte AES-256-GCM key from
|
|
6
|
+
* different backends (macOS Keychain, 1Password, etc.).
|
|
7
|
+
*
|
|
8
|
+
* All methods return null/false on failure — never throw (consistent
|
|
9
|
+
* with vault-common.ts conventions).
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/key-providers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|