@centient/secrets 0.2.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/dist/cli/messages.d.ts +60 -0
  2. package/dist/cli/messages.d.ts.map +1 -0
  3. package/dist/cli/messages.js +63 -0
  4. package/dist/cli/messages.js.map +1 -0
  5. package/dist/cli/secrets-cli.d.ts +38 -0
  6. package/dist/cli/secrets-cli.d.ts.map +1 -0
  7. package/dist/cli/secrets-cli.js +532 -0
  8. package/dist/cli/secrets-cli.js.map +1 -0
  9. package/dist/crypto/vault-common.d.ts +63 -0
  10. package/dist/crypto/vault-common.d.ts.map +1 -0
  11. package/dist/crypto/vault-common.js +180 -0
  12. package/dist/crypto/vault-common.js.map +1 -0
  13. package/dist/environment/EnvironmentManager.d.ts +171 -0
  14. package/dist/environment/EnvironmentManager.d.ts.map +1 -0
  15. package/dist/environment/EnvironmentManager.js +604 -0
  16. package/dist/environment/EnvironmentManager.js.map +1 -0
  17. package/dist/index.d.ts +12 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +17 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/platform/agent-detect.d.ts +15 -0
  22. package/dist/platform/agent-detect.d.ts.map +1 -0
  23. package/dist/platform/agent-detect.js +22 -0
  24. package/dist/platform/agent-detect.js.map +1 -0
  25. package/dist/platform/platform.d.ts +51 -0
  26. package/dist/platform/platform.d.ts.map +1 -0
  27. package/dist/platform/platform.js +141 -0
  28. package/dist/platform/platform.js.map +1 -0
  29. package/dist/vault/types.d.ts +54 -0
  30. package/dist/vault/types.d.ts.map +1 -0
  31. package/dist/vault/types.js +12 -0
  32. package/dist/vault/types.js.map +1 -0
  33. package/dist/vault/vault-env.d.ts +58 -0
  34. package/dist/vault/vault-env.d.ts.map +1 -0
  35. package/dist/vault/vault-env.js +73 -0
  36. package/dist/vault/vault-env.js.map +1 -0
  37. package/dist/vault/vault-gpg.d.ts +40 -0
  38. package/dist/vault/vault-gpg.d.ts.map +1 -0
  39. package/dist/vault/vault-gpg.js +149 -0
  40. package/dist/vault/vault-gpg.js.map +1 -0
  41. package/dist/vault/vault-libsecret.d.ts +51 -0
  42. package/dist/vault/vault-libsecret.d.ts.map +1 -0
  43. package/dist/vault/vault-libsecret.js +115 -0
  44. package/dist/vault/vault-libsecret.js.map +1 -0
  45. package/dist/vault/vault-utils.d.ts +12 -0
  46. package/dist/vault/vault-utils.d.ts.map +1 -0
  47. package/dist/vault/vault-utils.js +16 -0
  48. package/dist/vault/vault-utils.js.map +1 -0
  49. package/dist/vault/vault-windows.d.ts +71 -0
  50. package/dist/vault/vault-windows.d.ts.map +1 -0
  51. package/dist/vault/vault-windows.js +186 -0
  52. package/dist/vault/vault-windows.js.map +1 -0
  53. package/dist/vault/vault.d.ts +53 -0
  54. package/dist/vault/vault.d.ts.map +1 -0
  55. package/dist/vault/vault.js +132 -0
  56. package/dist/vault/vault.js.map +1 -0
  57. package/package.json +37 -0
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Auth Vault — Credential Storage (Cascade: Keychain -> Windows -> Libsecret -> GPG -> Env)
3
+ *
4
+ * Provides secure storage for auth tokens using a cascade of backends:
5
+ * 1. KeychainVault — macOS Keychain via `security` CLI (macOS only)
6
+ * 2. WindowsVault — Windows Credential Manager via powershell.exe (WSL)
7
+ * 3. LibsecretVault — GNOME libsecret via `secret-tool` (Linux)
8
+ * 4. GpgVault — GPG-encrypted files (Linux / WSL)
9
+ * 5. EnvVault — Environment variable fallback (always available)
10
+ *
11
+ * The active backend is selected once at module load by calling each backend's
12
+ * static `detect()` method in order and choosing the first one that returns true.
13
+ *
14
+ * Session TTL: 4 hours from the last successful read/write.
15
+ *
16
+ * Error handling: all functions return null/false on failure — never throw.
17
+ */
18
+ import { storeStringInKeychain, getStringFromKeychain, deleteFromKeychain, } from "../crypto/vault-common.js";
19
+ import { WindowsVault } from "./vault-windows.js";
20
+ import { LibsecretVault } from "./vault-libsecret.js";
21
+ import { GpgVault } from "./vault-gpg.js";
22
+ import { EnvVault } from "./vault-env.js";
23
+ // =============================================================================
24
+ // Constants
25
+ // =============================================================================
26
+ const AUTH_KEYCHAIN_SERVICE = "centient-auth";
27
+ const SESSION_TTL_MS = 4 * 60 * 60 * 1000; // 4 hours
28
+ // =============================================================================
29
+ // KeychainVault wrapper
30
+ // =============================================================================
31
+ /**
32
+ * Wraps the existing macOS Keychain helper functions as a VaultBackend.
33
+ * Only available on macOS (darwin).
34
+ */
35
+ class KeychainVault {
36
+ static detect() {
37
+ return process.platform === "darwin";
38
+ }
39
+ store(key, value) {
40
+ return storeStringInKeychain(AUTH_KEYCHAIN_SERVICE, key, value);
41
+ }
42
+ retrieve(key) {
43
+ return getStringFromKeychain(AUTH_KEYCHAIN_SERVICE, key);
44
+ }
45
+ delete(key) {
46
+ return deleteFromKeychain(AUTH_KEYCHAIN_SERVICE, key);
47
+ }
48
+ }
49
+ // =============================================================================
50
+ // Cascade initialization
51
+ // =============================================================================
52
+ /**
53
+ * Selects the first available vault backend in priority order:
54
+ * Keychain -> Windows -> Libsecret -> GPG -> Env
55
+ */
56
+ function initVaultBackend() {
57
+ if (KeychainVault.detect())
58
+ return { backend: new KeychainVault(), type: "keychain" };
59
+ if (WindowsVault.detect())
60
+ return { backend: new WindowsVault(), type: "windows" };
61
+ if (LibsecretVault.detect())
62
+ return { backend: new LibsecretVault(), type: "libsecret" };
63
+ if (GpgVault.detect())
64
+ return { backend: new GpgVault(), type: "gpg" };
65
+ return { backend: new EnvVault(), type: "env" };
66
+ }
67
+ const { backend: activeBackend, type: activeVaultType } = initVaultBackend();
68
+ // =============================================================================
69
+ // Session State
70
+ // =============================================================================
71
+ /** Last successful vault access timestamp (epoch ms). */
72
+ let lastAccessAt = null;
73
+ /**
74
+ * Returns true if the in-process session is still within the TTL window.
75
+ * This does NOT validate the token itself — use validateToken() for that.
76
+ */
77
+ export function isSessionValid() {
78
+ if (lastAccessAt === null)
79
+ return false;
80
+ return Date.now() - lastAccessAt < SESSION_TTL_MS;
81
+ }
82
+ /** Update session timestamp on successful access. */
83
+ function touchSession() {
84
+ lastAccessAt = Date.now();
85
+ }
86
+ // =============================================================================
87
+ // Public API
88
+ // =============================================================================
89
+ /**
90
+ * Returns the type identifier for the active vault backend.
91
+ *
92
+ * Useful for diagnostics and health checks to know which backend was selected
93
+ * at startup (e.g. "keychain", "libsecret", "gpg", "env").
94
+ */
95
+ export function getActiveVaultType() {
96
+ return activeVaultType;
97
+ }
98
+ /**
99
+ * Store a credential in the active vault backend.
100
+ *
101
+ * @param key - Logical key name (e.g. 'auth-token', 'refresh-token')
102
+ * @param value - The credential value to store
103
+ * @returns true on success, false if the backend write fails
104
+ */
105
+ export async function storeCredential(key, value) {
106
+ const success = activeBackend.store(key, value);
107
+ if (success)
108
+ touchSession();
109
+ return success;
110
+ }
111
+ /**
112
+ * Retrieve a credential from the active vault backend.
113
+ *
114
+ * @param key - Logical key name (e.g. 'auth-token')
115
+ * @returns The stored value, or null if not found / backend unavailable
116
+ */
117
+ export async function getCredential(key) {
118
+ const value = activeBackend.retrieve(key);
119
+ if (value !== null)
120
+ touchSession();
121
+ return value;
122
+ }
123
+ /**
124
+ * Delete a credential from the active vault backend.
125
+ *
126
+ * @param key - Logical key name (e.g. 'auth-token')
127
+ * @returns true on success (including "already deleted"), false on unexpected error
128
+ */
129
+ export async function deleteCredential(key) {
130
+ return activeBackend.delete(key);
131
+ }
132
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/vault/vault.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@centient/secrets",
3
+ "version": "0.2.0",
4
+ "description": "Cross-platform secrets vault with AES-256-GCM encryption and platform-native key storage",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "lint": "tsc --noEmit",
23
+ "clean": "rm -rf dist"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^20.0.0",
27
+ "typescript": "^5.3.0",
28
+ "vitest": "^4.0.17"
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "engines": {
34
+ "node": ">=18.0.0"
35
+ },
36
+ "license": "MIT"
37
+ }