@claudexor/secrets 1.0.0 → 2.1.1
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/dist/index.d.ts +8 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -140
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
1
|
export { redactSecrets } from "@claudexor/util";
|
|
2
|
-
export type SecretBackend = "auto" | "keychain" | "file";
|
|
3
2
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* harness's own native login.
|
|
3
|
+
* Claudexor v2's file-only 0600 secret store. Vendor-native subscriptions stay
|
|
4
|
+
* in the vendor's own login and are never copied here. The v2 control plane
|
|
5
|
+
* intentionally has no System Keychain code path: a data-root override must be
|
|
6
|
+
* sufficient to prove that every managed-secret read/write/delete is scoped.
|
|
9
7
|
*/
|
|
10
8
|
export declare class SecretStore {
|
|
11
|
-
|
|
12
|
-
constructor(backend?: SecretBackend);
|
|
13
|
-
resolvedBackend(): "keychain" | "file";
|
|
9
|
+
resolvedBackend(): "file";
|
|
14
10
|
/** Why the last `set` landed in the file store despite a keychain backend. */
|
|
15
11
|
lastFallbackReason: string | null;
|
|
16
|
-
set(name: string, value: string): "
|
|
12
|
+
set(name: string, value: string): "file";
|
|
17
13
|
get(name: string): string | null;
|
|
18
14
|
delete(name: string): void;
|
|
19
15
|
list(): {
|
|
20
16
|
name: string;
|
|
21
|
-
backend: "
|
|
17
|
+
backend: "file";
|
|
22
18
|
present: true;
|
|
23
19
|
}[];
|
|
24
20
|
private fileStore;
|
|
@@ -26,17 +22,8 @@ export declare class SecretStore {
|
|
|
26
22
|
private fileSet;
|
|
27
23
|
private fileGet;
|
|
28
24
|
private fileDelete;
|
|
29
|
-
private getKeychain;
|
|
30
|
-
private keychainNames;
|
|
31
25
|
}
|
|
32
|
-
|
|
33
|
-
* The single allowlist of managed secret names (previously duplicated in
|
|
34
|
-
* the CLI and the control API, and BOTH were missing `claude_oauth` — the
|
|
35
|
-
* claude adapter reads it, so it must be settable). Names are secret REFS,
|
|
36
|
-
* never values; adding a name here makes it settable via CLI and HTTP alike.
|
|
37
|
-
*/
|
|
38
|
-
export declare const MANAGED_SECRET_NAMES: readonly ["openai", "anthropic", "claude_oauth", "openrouter", "cursor", "opencode", "raw"];
|
|
39
|
-
export declare function isManagedSecretName(name: string): boolean;
|
|
26
|
+
export { MANAGED_SECRET_NAMES, isManagedSecretName, namespacedSecretRefBase, } from "@claudexor/util";
|
|
40
27
|
export interface ResolveOptions {
|
|
41
28
|
/** Test seam: inject a scoped store. Production callers use the default. */
|
|
42
29
|
store?: SecretStore;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAUhD;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,eAAe,IAAI,MAAM;IAIzB,8EAA8E;IAC9E,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEzC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAMxC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIhC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI1B,IAAI,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,IAAI,CAAA;KAAE,EAAE;IAM1D,OAAO,CAAC,SAAS;IAuBjB,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,UAAU;CAKnB;AAMD,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,MAAM,GAAG,IAAI,CAGpF"}
|
package/dist/index.js
CHANGED
|
@@ -1,128 +1,50 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { platform } from "node:os";
|
|
1
|
+
import { chmodSync, closeSync, constants, existsSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
4
3
|
import { join } from "node:path";
|
|
5
4
|
import { userConfigDir } from "@claudexor/util";
|
|
6
5
|
export { redactSecrets } from "@claudexor/util";
|
|
7
|
-
const SERVICE = "claudexor";
|
|
8
6
|
function configDir() {
|
|
9
7
|
return userConfigDir();
|
|
10
8
|
}
|
|
11
9
|
function fileStorePath() {
|
|
12
10
|
return join(configDir(), "secrets.json");
|
|
13
11
|
}
|
|
14
|
-
function keychainAvailable() {
|
|
15
|
-
if (platform() !== "darwin")
|
|
16
|
-
return false;
|
|
17
|
-
try {
|
|
18
|
-
execFileSync("security", ["help"], { stdio: "ignore" });
|
|
19
|
-
return true;
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
12
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* harness's own native login.
|
|
13
|
+
* Claudexor v2's file-only 0600 secret store. Vendor-native subscriptions stay
|
|
14
|
+
* in the vendor's own login and are never copied here. The v2 control plane
|
|
15
|
+
* intentionally has no System Keychain code path: a data-root override must be
|
|
16
|
+
* sufficient to prove that every managed-secret read/write/delete is scoped.
|
|
31
17
|
*/
|
|
32
18
|
export class SecretStore {
|
|
33
|
-
backend;
|
|
34
|
-
constructor(backend = "auto") {
|
|
35
|
-
this.backend = backend;
|
|
36
|
-
}
|
|
37
19
|
resolvedBackend() {
|
|
38
|
-
|
|
39
|
-
return "keychain";
|
|
40
|
-
if (this.backend === "file")
|
|
41
|
-
return "file";
|
|
42
|
-
// backend === "auto": an explicit env override lets a sandboxed run/test
|
|
43
|
-
// (CLAUDEXOR_CONFIG_DIR + CLAUDEXOR_SECRETS_BACKEND=file) keep ALL secret I/O
|
|
44
|
-
// in the 0600 file store and never read/mutate the real OS login Keychain
|
|
45
|
-
// (which is not path-scoped, so CLAUDEXOR_CONFIG_DIR alone can't redirect it).
|
|
46
|
-
// Precedence: explicit constructor arg > env > platform default. A non-empty
|
|
47
|
-
// env typo FAILS LOUDLY rather than silently falling back to the Keychain
|
|
48
|
-
// (e.g. CLAUDEXOR_SECRETS_BACKEND=fil must not quietly hit the real Keychain).
|
|
49
|
-
const envBackend = process.env.CLAUDEXOR_SECRETS_BACKEND;
|
|
50
|
-
if (envBackend !== undefined && envBackend !== "" && envBackend !== "file" && envBackend !== "keychain" && envBackend !== "auto") {
|
|
51
|
-
throw new Error(`CLAUDEXOR_SECRETS_BACKEND must be file|keychain|auto (got '${envBackend}')`);
|
|
52
|
-
}
|
|
53
|
-
if (envBackend === "file")
|
|
54
|
-
return "file";
|
|
55
|
-
if (envBackend === "keychain")
|
|
56
|
-
return "keychain";
|
|
57
|
-
return keychainAvailable() ? "keychain" : "file";
|
|
20
|
+
return "file";
|
|
58
21
|
}
|
|
59
22
|
/** Why the last `set` landed in the file store despite a keychain backend. */
|
|
60
23
|
lastFallbackReason = null;
|
|
61
24
|
set(name, value) {
|
|
62
25
|
this.lastFallbackReason = null;
|
|
63
|
-
if (this.resolvedBackend() === "keychain") {
|
|
64
|
-
try {
|
|
65
|
-
execFileSync("security", ["add-generic-password", "-U", "-a", SERVICE, "-s", `${SERVICE}:${name}`, "-w"], { input: `${value}\n${value}\n`, stdio: ["pipe", "ignore", "ignore"] });
|
|
66
|
-
return "keychain";
|
|
67
|
-
}
|
|
68
|
-
catch (err) {
|
|
69
|
-
// SURFACED degradation (not silent): callers report this to the UI/CLI.
|
|
70
|
-
this.lastFallbackReason = `keychain write failed (${err instanceof Error ? err.message.split("\n")[0] : "error"}); stored in 0600 file instead`;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
26
|
this.fileSet(name, value);
|
|
74
27
|
return "file";
|
|
75
28
|
}
|
|
76
29
|
get(name) {
|
|
77
|
-
if (this.resolvedBackend() === "keychain") {
|
|
78
|
-
try {
|
|
79
|
-
const out = execFileSync("security", ["find-generic-password", "-a", SERVICE, "-s", `${SERVICE}:${name}`, "-w"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
80
|
-
const v = out.trim();
|
|
81
|
-
if (v)
|
|
82
|
-
return v;
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
/* not in keychain; try file */
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
30
|
return this.fileGet(name);
|
|
89
31
|
}
|
|
90
32
|
delete(name) {
|
|
91
|
-
if (this.resolvedBackend() === "keychain") {
|
|
92
|
-
try {
|
|
93
|
-
execFileSync("security", ["delete-generic-password", "-a", SERVICE, "-s", `${SERVICE}:${name}`], {
|
|
94
|
-
stdio: "ignore",
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
/* ignore */
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
33
|
this.fileDelete(name);
|
|
102
34
|
}
|
|
103
35
|
list() {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
.sort()
|
|
108
|
-
.map((name) => ({ name, backend: "file", present: true }));
|
|
109
|
-
}
|
|
110
|
-
const names = new Set();
|
|
111
|
-
for (const name of this.keychainNames())
|
|
112
|
-
names.add(name);
|
|
113
|
-
for (const name of Object.keys(this.fileStore()))
|
|
114
|
-
names.add(name);
|
|
115
|
-
return [...names].sort().map((name) => ({
|
|
116
|
-
name,
|
|
117
|
-
backend: this.getKeychain(name) !== null ? "keychain" : "file",
|
|
118
|
-
present: true,
|
|
119
|
-
}));
|
|
36
|
+
return Object.keys(this.fileStore())
|
|
37
|
+
.sort()
|
|
38
|
+
.map((name) => ({ name, backend: "file", present: true }));
|
|
120
39
|
}
|
|
121
40
|
fileStore() {
|
|
122
41
|
const path = fileStorePath();
|
|
123
42
|
if (!existsSync(path))
|
|
124
43
|
return {};
|
|
125
44
|
try {
|
|
45
|
+
const stat = lstatSync(path);
|
|
46
|
+
if (stat.isSymbolicLink() || !stat.isFile())
|
|
47
|
+
throw new Error("expected a regular file");
|
|
126
48
|
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
127
49
|
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
128
50
|
throw new Error("expected an object");
|
|
@@ -140,14 +62,37 @@ export class SecretStore {
|
|
|
140
62
|
}
|
|
141
63
|
}
|
|
142
64
|
writeFileStore(store) {
|
|
143
|
-
|
|
65
|
+
const dir = configDir();
|
|
66
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
67
|
+
chmodSync(dir, 0o700);
|
|
144
68
|
const path = fileStorePath();
|
|
145
|
-
|
|
69
|
+
const temporaryPath = join(dir, `.secrets-${randomUUID()}.tmp`);
|
|
70
|
+
let fd;
|
|
146
71
|
try {
|
|
72
|
+
fd = openSync(temporaryPath, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, 0o600);
|
|
73
|
+
writeFileSync(fd, JSON.stringify(store, null, 2) + "\n", "utf8");
|
|
74
|
+
fsyncSync(fd);
|
|
75
|
+
closeSync(fd);
|
|
76
|
+
fd = undefined;
|
|
77
|
+
renameSync(temporaryPath, path);
|
|
147
78
|
chmodSync(path, 0o600);
|
|
79
|
+
const dirFd = openSync(dir, constants.O_RDONLY);
|
|
80
|
+
try {
|
|
81
|
+
fsyncSync(dirFd);
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
closeSync(dirFd);
|
|
85
|
+
}
|
|
148
86
|
}
|
|
149
|
-
|
|
150
|
-
|
|
87
|
+
finally {
|
|
88
|
+
if (fd !== undefined)
|
|
89
|
+
closeSync(fd);
|
|
90
|
+
try {
|
|
91
|
+
unlinkSync(temporaryPath);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// The atomic rename removes the temporary pathname on success.
|
|
95
|
+
}
|
|
151
96
|
}
|
|
152
97
|
}
|
|
153
98
|
fileSet(name, value) {
|
|
@@ -163,52 +108,12 @@ export class SecretStore {
|
|
|
163
108
|
delete store[name];
|
|
164
109
|
this.writeFileStore(store);
|
|
165
110
|
}
|
|
166
|
-
getKeychain(name) {
|
|
167
|
-
try {
|
|
168
|
-
const out = execFileSync("security", ["find-generic-password", "-a", SERVICE, "-s", `${SERVICE}:${name}`, "-w"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
169
|
-
const v = out.trim();
|
|
170
|
-
return v || null;
|
|
171
|
-
}
|
|
172
|
-
catch {
|
|
173
|
-
return null;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
keychainNames() {
|
|
177
|
-
if (platform() !== "darwin")
|
|
178
|
-
return [];
|
|
179
|
-
try {
|
|
180
|
-
const out = execFileSync("security", ["dump-keychain"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
181
|
-
const re = new RegExp(`"svce"<blob>="${SERVICE}:([^"]+)"`, "g");
|
|
182
|
-
const names = [];
|
|
183
|
-
for (let m = re.exec(out); m !== null; m = re.exec(out)) {
|
|
184
|
-
if (m[1])
|
|
185
|
-
names.push(m[1]);
|
|
186
|
-
}
|
|
187
|
-
return names;
|
|
188
|
-
}
|
|
189
|
-
catch {
|
|
190
|
-
return [];
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* The single allowlist of managed secret names (previously duplicated in
|
|
196
|
-
* the CLI and the control API, and BOTH were missing `claude_oauth` — the
|
|
197
|
-
* claude adapter reads it, so it must be settable). Names are secret REFS,
|
|
198
|
-
* never values; adding a name here makes it settable via CLI and HTTP alike.
|
|
199
|
-
*/
|
|
200
|
-
export const MANAGED_SECRET_NAMES = [
|
|
201
|
-
"openai",
|
|
202
|
-
"anthropic",
|
|
203
|
-
"claude_oauth",
|
|
204
|
-
"openrouter",
|
|
205
|
-
"cursor",
|
|
206
|
-
"opencode",
|
|
207
|
-
"raw",
|
|
208
|
-
];
|
|
209
|
-
export function isManagedSecretName(name) {
|
|
210
|
-
return MANAGED_SECRET_NAMES.includes(name);
|
|
211
111
|
}
|
|
112
|
+
// The managed secret NAME grammar (allowlist + namespace rule) is owned by
|
|
113
|
+
// the dependency-free util package so the schema layer can validate profile
|
|
114
|
+
// secret_refs against the same single grammar; re-exported here for the
|
|
115
|
+
// store's historical importers.
|
|
116
|
+
export { MANAGED_SECRET_NAMES, isManagedSecretName, namespacedSecretRefBase, } from "@claudexor/util";
|
|
212
117
|
/**
|
|
213
118
|
* Resolve a stored secret by name. (The env-var and helper-command indirection
|
|
214
119
|
* options were retired: no production caller ever passed them — adapters read
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claudexor/secrets",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Cross-platform secret store: OS keychain where available, else a 0600 file; named secret refs resolved by adapters.",
|
|
6
6
|
"type": "module",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@claudexor/util": "1.
|
|
19
|
+
"@claudexor/util": "2.1.1"
|
|
20
20
|
},
|
|
21
21
|
"repository": {
|
|
22
22
|
"type": "git",
|