@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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/cli/secrets-cli.d.ts +8 -4
  4. package/dist/cli/secrets-cli.d.ts.map +1 -1
  5. package/dist/cli/secrets-cli.js +153 -23
  6. package/dist/cli/secrets-cli.js.map +1 -1
  7. package/dist/crypto/vault-common.d.ts +21 -0
  8. package/dist/crypto/vault-common.d.ts.map +1 -1
  9. package/dist/crypto/vault-common.js +57 -0
  10. package/dist/crypto/vault-common.js.map +1 -1
  11. package/dist/index.d.ts +5 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +5 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/key-providers/index.d.ts +5 -0
  16. package/dist/key-providers/index.d.ts.map +1 -0
  17. package/dist/key-providers/index.js +4 -0
  18. package/dist/key-providers/index.js.map +1 -0
  19. package/dist/key-providers/keychain-provider.d.ts +19 -0
  20. package/dist/key-providers/keychain-provider.d.ts.map +1 -0
  21. package/dist/key-providers/keychain-provider.js +35 -0
  22. package/dist/key-providers/keychain-provider.js.map +1 -0
  23. package/dist/key-providers/onepassword-provider.d.ts +38 -0
  24. package/dist/key-providers/onepassword-provider.d.ts.map +1 -0
  25. package/dist/key-providers/onepassword-provider.js +146 -0
  26. package/dist/key-providers/onepassword-provider.js.map +1 -0
  27. package/dist/key-providers/resolve.d.ts +46 -0
  28. package/dist/key-providers/resolve.d.ts.map +1 -0
  29. package/dist/key-providers/resolve.js +172 -0
  30. package/dist/key-providers/resolve.js.map +1 -0
  31. package/dist/key-providers/types.d.ts +62 -0
  32. package/dist/key-providers/types.d.ts.map +1 -0
  33. package/dist/key-providers/types.js +12 -0
  34. package/dist/key-providers/types.js.map +1 -0
  35. package/dist/vault/types.d.ts +20 -1
  36. package/dist/vault/types.d.ts.map +1 -1
  37. package/dist/vault/vault-env.d.ts +11 -0
  38. package/dist/vault/vault-env.d.ts.map +1 -1
  39. package/dist/vault/vault-env.js +17 -0
  40. package/dist/vault/vault-env.js.map +1 -1
  41. package/dist/vault/vault-gpg.d.ts +9 -0
  42. package/dist/vault/vault-gpg.d.ts.map +1 -1
  43. package/dist/vault/vault-gpg.js +35 -1
  44. package/dist/vault/vault-gpg.js.map +1 -1
  45. package/dist/vault/vault-libsecret.d.ts +20 -0
  46. package/dist/vault/vault-libsecret.d.ts.map +1 -1
  47. package/dist/vault/vault-libsecret.js +48 -0
  48. package/dist/vault/vault-libsecret.js.map +1 -1
  49. package/dist/vault/vault-windows.d.ts +14 -0
  50. package/dist/vault/vault-windows.d.ts.map +1 -1
  51. package/dist/vault/vault-windows.js +41 -0
  52. package/dist/vault/vault-windows.js.map +1 -1
  53. package/dist/vault/vault.d.ts +24 -0
  54. package/dist/vault/vault.d.ts.map +1 -1
  55. package/dist/vault/vault.js +33 -1
  56. package/dist/vault/vault.js.map +1 -1
  57. 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;AAGxH,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,sBAAsB;AACtB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEpJ,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,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,4 @@
1
+ export { KeychainProvider } from "./keychain-provider.js";
2
+ export { OnePasswordProvider } from "./onepassword-provider.js";
3
+ export { resolveKeyProvider, getProviderByType, loadConfig, saveSecretsConfig } from "./resolve.js";
4
+ //# sourceMappingURL=index.js.map
@@ -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"}