@claudexor/util 1.0.0 → 2.0.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/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { CLAUDEXOR_VERSION } from "./version.js";
2
+ export * from "./sensitive-resource.js";
2
3
  /** Generate a short unique id, optionally prefixed (e.g. "run-3f2a...."). */
3
4
  export declare function newId(prefix?: string): string;
4
5
  /** Current time as an ISO-8601 string. */
@@ -10,6 +11,13 @@ export declare function hashJson(value: unknown): string;
10
11
  /** JSON.stringify with sorted object keys for stable hashing. */
11
12
  export declare function stableStringify(value: unknown): string;
12
13
  export declare function ensureDir(path: string): void;
14
+ /**
15
+ * Establish a private daemon-owned directory without following any symlink in
16
+ * the supplied spelling. The direct parent must already exist canonically;
17
+ * callers create nested owned roots one level at a time. No chmod occurs until
18
+ * pathname identity has been proven.
19
+ */
20
+ export declare function ensureCanonicalPrivateDirectory(path: string): string;
13
21
  export declare function writeText(path: string, text: string): void;
14
22
  export declare function writeJson(path: string, value: unknown): void;
15
23
  export declare function appendLine(path: string, line: string): void;
@@ -28,6 +36,19 @@ export declare function listDir(path: string): string[];
28
36
  */
29
37
  export declare function userHomeDir(): string;
30
38
  export declare function userConfigDir(): string;
39
+ /**
40
+ * Stable external runtime namespace for a project.
41
+ *
42
+ * A repository's `.claudexor/` directory is user-owned, versionable project
43
+ * configuration. Runtime state (runs, worktrees, scoped homes, review packets)
44
+ * therefore must never be placed below the repository or require Claudexor to
45
+ * edit either of the user's `.gitignore` files. Existing roots are resolved
46
+ * through symlinks before hashing so two spellings of the same project share a
47
+ * single namespace; a not-yet-existing root still gets a deterministic absolute
48
+ * identity and is re-keyed only after it exists and is registered.
49
+ */
50
+ export declare function canonicalProjectRoot(repoRoot: string): string;
51
+ export declare function projectRuntimeDir(repoRoot: string): string;
31
52
  export declare function noProjectRepoRoot(): string;
32
53
  /**
33
54
  * Best-effort redaction of obvious secret tokens from text destined for logs or
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAYjD,6EAA6E;AAC7E,wBAAgB,KAAK,CAAC,MAAM,SAAK,GAAG,MAAM,CAGzC;AAED,0CAA0C;AAC1C,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,sDAAsD;AACtD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE/C;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD;AAcD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAO5C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG1D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAE5D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG3D;AAED;;iDAEiD;AACjD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMxD;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAQhE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM9C;AAQD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CASpC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAQtC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AA+BD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAM,EAAE,OAAO,SAAe,GAAG,IAAI,CAgCnG;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAK1D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAO9E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,cAAc,yBAAyB,CAAC;AAqBxC,6EAA6E;AAC7E,wBAAgB,KAAK,CAAC,MAAM,SAAK,GAAG,MAAM,CAGzC;AAED,0CAA0C;AAC1C,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED,sDAAsD;AACtD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE/C;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD;AAcD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAO5C;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+CpE;AAWD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG1D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAE5D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG3D;AAED;;iDAEiD;AACjD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMxD;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAQhE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM9C;AAQD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAWpC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAatC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO7D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,IAAI,SAAM,EACV,OAAO,SAAe,GACrB,IAAI,CAyCN;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAU1D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAO9E"}
package/dist/index.js CHANGED
@@ -1,8 +1,10 @@
1
1
  export { CLAUDEXOR_VERSION } from "./version.js";
2
+ export * from "./sensitive-resource.js";
3
+ import { sensitiveResourcePolicy } from "./sensitive-resource.js";
2
4
  import { createHash, randomUUID } from "node:crypto";
3
- import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, } from "node:fs";
5
+ import { closeSync, constants, existsSync, fchmodSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, realpathSync, writeFileSync, } from "node:fs";
4
6
  import { homedir } from "node:os";
5
- import { dirname, isAbsolute, join } from "node:path";
7
+ import { dirname, isAbsolute, join, resolve } from "node:path";
6
8
  /** Generate a short unique id, optionally prefixed (e.g. "run-3f2a...."). */
7
9
  export function newId(prefix = "") {
8
10
  const id = randomUUID().replace(/-/g, "").slice(0, 12);
@@ -44,6 +46,67 @@ export function ensureDir(path) {
44
46
  // (secrets, daemon token) assert their own permissions at their writers.
45
47
  mkdirSync(path, { recursive: true, mode: 0o700 });
46
48
  }
49
+ /**
50
+ * Establish a private daemon-owned directory without following any symlink in
51
+ * the supplied spelling. The direct parent must already exist canonically;
52
+ * callers create nested owned roots one level at a time. No chmod occurs until
53
+ * pathname identity has been proven.
54
+ */
55
+ export function ensureCanonicalPrivateDirectory(path) {
56
+ const absolute = resolve(path);
57
+ if (!existsSync(absolute)) {
58
+ const parent = dirname(absolute);
59
+ const parentStat = lstatSync(parent);
60
+ if (parentStat.isSymbolicLink() ||
61
+ !parentStat.isDirectory() ||
62
+ realpathSync.native(parent) !== parent) {
63
+ throw new Error(`owned directory parent is not canonical: ${parent}`);
64
+ }
65
+ mkdirSync(absolute, { recursive: false, mode: 0o700 });
66
+ fsyncCanonicalDirectory(parent);
67
+ }
68
+ const preliminary = lstatSync(absolute);
69
+ if (preliminary.isSymbolicLink() || !preliminary.isDirectory()) {
70
+ throw new Error(`owned directory path is not canonical: ${absolute}`);
71
+ }
72
+ let fd;
73
+ try {
74
+ fd = openSync(absolute, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
75
+ }
76
+ catch {
77
+ throw new Error(`owned directory path is not canonical: ${absolute}`);
78
+ }
79
+ try {
80
+ const opened = fstatSync(fd);
81
+ const named = lstatSync(absolute);
82
+ if (!opened.isDirectory() ||
83
+ named.isSymbolicLink() ||
84
+ !named.isDirectory() ||
85
+ opened.dev !== named.dev ||
86
+ opened.ino !== named.ino ||
87
+ realpathSync.native(absolute) !== absolute ||
88
+ (typeof process.getuid === "function" && opened.uid !== process.getuid())) {
89
+ throw new Error(`owned directory path is not canonical: ${absolute}`);
90
+ }
91
+ // Mutate permissions only through the descriptor whose inode and pathname
92
+ // identity were proven above; never follow a replacement path with chmod.
93
+ fchmodSync(fd, 0o700);
94
+ fsyncSync(fd);
95
+ }
96
+ finally {
97
+ closeSync(fd);
98
+ }
99
+ return absolute;
100
+ }
101
+ function fsyncCanonicalDirectory(path) {
102
+ const fd = openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
103
+ try {
104
+ fsyncSync(fd);
105
+ }
106
+ finally {
107
+ closeSync(fd);
108
+ }
109
+ }
47
110
  export function writeText(path, text) {
48
111
  ensureDir(dirname(path));
49
112
  writeFileSync(path, text, { encoding: "utf8", mode: 0o600 });
@@ -117,52 +180,50 @@ export function userConfigDir() {
117
180
  throw new Error("CLAUDEXOR_CONFIG_DIR must be a safe absolute path");
118
181
  return safe;
119
182
  }
120
- return join(userHomeDir(), ".claudexor");
183
+ // v2 is an intentionally empty, non-migrating namespace. Keeping the
184
+ // version boundary in the default root prevents the daemon from even
185
+ // probing v1 config, trust, secret, token, or journal bytes. An explicit
186
+ // CLAUDEXOR_CONFIG_DIR remains the hermetic test/operator override and is
187
+ // already treated as the complete v2 root.
188
+ return join(userHomeDir(), ".claudexor", "v2");
189
+ }
190
+ /**
191
+ * Stable external runtime namespace for a project.
192
+ *
193
+ * A repository's `.claudexor/` directory is user-owned, versionable project
194
+ * configuration. Runtime state (runs, worktrees, scoped homes, review packets)
195
+ * therefore must never be placed below the repository or require Claudexor to
196
+ * edit either of the user's `.gitignore` files. Existing roots are resolved
197
+ * through symlinks before hashing so two spellings of the same project share a
198
+ * single namespace; a not-yet-existing root still gets a deterministic absolute
199
+ * identity and is re-keyed only after it exists and is registered.
200
+ */
201
+ export function canonicalProjectRoot(repoRoot) {
202
+ const absolute = resolve(repoRoot);
203
+ try {
204
+ return realpathSync.native(absolute);
205
+ }
206
+ catch {
207
+ return absolute;
208
+ }
209
+ }
210
+ export function projectRuntimeDir(repoRoot) {
211
+ const digest = sha256(canonicalProjectRoot(repoRoot)).slice("sha256:".length);
212
+ return join(userConfigDir(), "projects", digest);
121
213
  }
122
214
  export function noProjectRepoRoot() {
123
215
  return join(userHomeDir(), ".cache", "claudexor", "no-project");
124
216
  }
125
- const SECRET_PATTERNS = [
126
- /\bgithub_pat_[A-Za-z0-9_]{20,}\b/g,
127
- /\bghp_[A-Za-z0-9]{20,}\b/g,
128
- /\bgho_[A-Za-z0-9]{20,}\b/g,
129
- /\bghs_[A-Za-z0-9]{20,}\b/g,
130
- /\bghu_[A-Za-z0-9]{20,}\b/g,
131
- /\bglpat-[A-Za-z0-9_-]{16,}\b/g,
132
- /\bsk-ant-[A-Za-z0-9_-]{20,}\b/g,
133
- /\bsk-or-v1-[A-Za-z0-9]{20,}\b/g,
134
- /\bsk-[A-Za-z0-9_-]{20,}\b/g,
135
- /\bAIza[A-Za-z0-9_-]{30,}\b/g,
136
- /\bxai-[A-Za-z0-9_-]{20,}\b/g,
137
- /\bAKIA[0-9A-Z]{16}\b/g,
138
- // Slack tokens incl. xoxe (refresh) and xoxc (session) classes.
139
- /\bxox[abceprs]-[A-Za-z0-9-]{10,}\b/g,
140
- // Cursor API keys (key_<hex>); OpenRouter keys (sk-or-v1-... handled above).
141
- /\bkey_[A-Za-z0-9]{20,}\b/g,
142
- // Google OAuth access tokens.
143
- /\bya29\.[A-Za-z0-9._-]{20,}\b/g,
144
- // npm granular access tokens.
145
- /\bnpm_[A-Za-z0-9]{20,}\b/g,
146
- // PEM private key blocks (RSA/EC/OPENSSH/PKCS8 headers all match).
147
- /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g,
148
- // Bearer tokens (length-gated to avoid redacting prose like "Bearer of news").
149
- /\bBearer\s+[A-Za-z0-9._~+/-]{20,}=*/gi,
150
- // JWTs (header.payload.signature) — anthropic/cursor/openai OAuth tokens.
151
- /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{6,}\b/g,
152
- ];
153
217
  /**
154
218
  * Best-effort redaction of obvious secret tokens from text destined for logs or
155
219
  * artifacts. This is defense-in-depth, never the primary control: secrets must
156
220
  * not reach this layer in the first place.
157
221
  */
158
222
  export function redactSecrets(text) {
159
- let out = text;
160
- for (const pattern of SECRET_PATTERNS)
161
- out = out.replace(pattern, "[redacted]");
162
- return out;
223
+ return sensitiveResourcePolicy.redact(text);
163
224
  }
164
225
  export function containsSecretLikeToken(text) {
165
- return redactSecrets(text) !== text;
226
+ return sensitiveResourcePolicy.containsSensitiveContent(text);
166
227
  }
167
228
  export function assertNoInlineSecretValues(value, path = "$", context = "run params") {
168
229
  if (typeof value === "string") {
@@ -189,7 +250,9 @@ export function assertNoInlineSecretValues(value, path = "$", context = "run par
189
250
  return;
190
251
  }
191
252
  for (const [key, child] of Object.entries(value)) {
192
- if (key === "env" || key === "secrets" || /(^|[_-])(secret|token|password|api[_-]?key)($|[_-])/i.test(key)) {
253
+ if (key === "env" ||
254
+ key === "secrets" ||
255
+ /(^|[_-])(secret|token|password|api[_-]?key)($|[_-])/i.test(key)) {
193
256
  throw Object.assign(new Error(`inline secrets/env are not accepted in ${context} (${path}.${key}); store values via secrets and pass refs/profiles`), { status: 400, code: "inline_secret_rejected" });
194
257
  }
195
258
  assertNoInlineSecretValues(child, `${path}.${key}`, context);
@@ -197,7 +260,10 @@ export function assertNoInlineSecretValues(value, path = "$", context = "run par
197
260
  }
198
261
  /** The machine-readable `code` a typed error carries (e.g. inline_secret_rejected), if any. */
199
262
  export function errorCode(err) {
200
- if (err && typeof err === "object" && "code" in err && typeof err.code === "string") {
263
+ if (err &&
264
+ typeof err === "object" &&
265
+ "code" in err &&
266
+ typeof err.code === "string") {
201
267
  return err.code;
202
268
  }
203
269
  return undefined;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export type SensitiveResourcePathClass = "credential_file" | "credential_store" | "environment_file" | "private_key" | "secret_container";
2
+ export interface SensitiveResourcePathDecision {
3
+ readonly sensitive: boolean;
4
+ readonly class: SensitiveResourcePathClass | null;
5
+ readonly matchedPart: string | null;
6
+ readonly reason: string | null;
7
+ }
8
+ export type SensitiveContentHandling = "redact" | "reject";
9
+ export type SensitiveContentSignature = "anthropic_api_key" | "aws_access_key" | "bearer_token" | "cursor_api_key" | "github_token" | "gitlab_token" | "google_api_key" | "google_oauth_token" | "jwt" | "npm_token" | "openai_compatible_api_key" | "private_key_block" | "slack_token" | "xai_api_key";
10
+ export interface SensitiveContentDecision {
11
+ readonly action: "allow" | "redact" | "reject";
12
+ readonly containsSensitiveContent: boolean;
13
+ readonly signatures: readonly SensitiveContentSignature[];
14
+ readonly text: string;
15
+ }
16
+ export type SymlinkTargetKind = "directory" | "file" | "other" | "unknown";
17
+ export type SensitiveSymlinkDenyReason = "absolute_target" | "excluded_target" | "invalid_source" | "relocation_escape" | "sensitive_source" | "sensitive_target" | "target_kind" | "target_outside_root" | "unresolved_target";
18
+ export interface SensitiveSymlinkInput {
19
+ /** Logical root containing the symlink. */
20
+ sourceRoot: string;
21
+ /** Canonical identity of sourceRoot (normally realpath(sourceRoot)). */
22
+ canonicalSourceRoot: string;
23
+ sourcePath: string;
24
+ linkTarget: string;
25
+ resolvedTargetPath: string | null;
26
+ targetKind: SymlinkTargetKind;
27
+ allowedTargetKinds: readonly SymlinkTargetKind[];
28
+ /** Roots that must not be reachable from the copied/mapped tree. */
29
+ excludedRoots?: readonly string[];
30
+ /** Destination root used to prove that a relative link remains contained after relocation. */
31
+ relocationRoot?: string;
32
+ }
33
+ export interface SensitiveSymlinkDecision {
34
+ readonly allowed: boolean;
35
+ readonly reason: SensitiveSymlinkDenyReason | null;
36
+ readonly detail: string | null;
37
+ readonly pathDecision: SensitiveResourcePathDecision | null;
38
+ }
39
+ /**
40
+ * Single owner for sensitive path, symlink-target, and content decisions.
41
+ *
42
+ * The API is deliberately surface-neutral: context/review consume it now;
43
+ * upload and release scanners can consume the same typed decisions later
44
+ * without growing another classifier or weakening this policy.
45
+ */
46
+ export declare class SensitiveResourcePolicy {
47
+ readonly redactionMarker = "[redacted]";
48
+ classifyPath(path: string): SensitiveResourcePathDecision;
49
+ inspectContent(text: string, handling?: SensitiveContentHandling): SensitiveContentDecision;
50
+ redact(text: string): string;
51
+ containsSensitiveContent(text: string): boolean;
52
+ assessSymlink(input: SensitiveSymlinkInput): SensitiveSymlinkDecision;
53
+ }
54
+ export declare const sensitiveResourcePolicy: Readonly<SensitiveResourcePolicy>;
55
+ //# sourceMappingURL=sensitive-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitive-resource.d.ts","sourceRoot":"","sources":["../src/sensitive-resource.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,0BAA0B,GAClC,iBAAiB,GACjB,kBAAkB,GAClB,kBAAkB,GAClB,aAAa,GACb,kBAAkB,CAAC;AAEvB,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D,MAAM,MAAM,yBAAyB,GACjC,mBAAmB,GACnB,gBAAgB,GAChB,cAAc,GACd,gBAAgB,GAChB,cAAc,GACd,cAAc,GACd,gBAAgB,GAChB,oBAAoB,GACpB,KAAK,GACL,WAAW,GACX,2BAA2B,GAC3B,mBAAmB,GACnB,aAAa,GACb,aAAa,CAAC;AAElB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/C,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3E,MAAM,MAAM,0BAA0B,GAClC,iBAAiB,GACjB,iBAAiB,GACjB,gBAAgB,GAChB,mBAAmB,GACnB,kBAAkB,GAClB,kBAAkB,GAClB,aAAa,GACb,qBAAqB,GACrB,mBAAmB,CAAC;AAExB,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,kBAAkB,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACjD,oEAAoE;IACpE,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,8FAA8F;IAC9F,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,6BAA6B,GAAG,IAAI,CAAC;CAC7D;AAoED;;;;;;GAMG;AACH,qBAAa,uBAAuB;IAClC,QAAQ,CAAC,eAAe,gBAAgB;IAExC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,6BAA6B;IA2DzD,cAAc,CACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,wBAAmC,GAC5C,wBAAwB;IAqB3B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/C,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,wBAAwB;CA2CtE;AAED,eAAO,MAAM,uBAAuB,mCAA+C,CAAC"}
@@ -0,0 +1,221 @@
1
+ import { dirname, extname, isAbsolute, join, normalize, relative, resolve } from "node:path";
2
+ const SAFE_ENV_TEMPLATE_BASENAMES = new Set([".env.example", ".env.sample", ".env.template"]);
3
+ const CREDENTIAL_STORE_PARTS = new Set([
4
+ ".anthropic",
5
+ ".aws",
6
+ ".azure",
7
+ ".claude",
8
+ ".codex",
9
+ ".cursor",
10
+ ".docker",
11
+ ".gcloud",
12
+ ".gnupg",
13
+ ".kube",
14
+ ".openai",
15
+ ".ssh",
16
+ ]);
17
+ const CREDENTIAL_FILE_BASENAMES = new Set([
18
+ ".git-credentials",
19
+ ".netrc",
20
+ ".npmrc",
21
+ ".pypirc",
22
+ "application_default_credentials.json",
23
+ ]);
24
+ const PRIVATE_KEY_EXTENSIONS = new Set([".jks", ".key", ".keystore", ".p12", ".pem", ".pfx"]);
25
+ const PRIVATE_KEY_BASENAME = /^id_(?:dsa|ecdsa|ed25519|rsa)(?:[._-].+)?$/;
26
+ const CREDENTIAL_FILE_BASENAME = /^(?:credentials(?:[._-].*)?|service-account(?:[._-].*)?\.json)$/;
27
+ const CONTENT_RULES = [
28
+ { id: "github_token", pattern: /\bgithub_pat_[A-Za-z0-9_]{20,}\b/g },
29
+ { id: "github_token", pattern: /\bghp_[A-Za-z0-9]{20,}\b/g },
30
+ { id: "github_token", pattern: /\bgho_[A-Za-z0-9]{20,}\b/g },
31
+ { id: "github_token", pattern: /\bghs_[A-Za-z0-9]{20,}\b/g },
32
+ { id: "github_token", pattern: /\bghu_[A-Za-z0-9]{20,}\b/g },
33
+ { id: "gitlab_token", pattern: /\bglpat-[A-Za-z0-9_-]{16,}\b/g },
34
+ { id: "anthropic_api_key", pattern: /\bsk-ant-[A-Za-z0-9_-]{20,}\b/g },
35
+ { id: "openai_compatible_api_key", pattern: /\bsk-or-v1-[A-Za-z0-9]{20,}\b/g },
36
+ { id: "openai_compatible_api_key", pattern: /\bsk-[A-Za-z0-9_-]{20,}\b/g },
37
+ { id: "google_api_key", pattern: /\bAIza[A-Za-z0-9_-]{30,}\b/g },
38
+ { id: "xai_api_key", pattern: /\bxai-[A-Za-z0-9_-]{20,}\b/g },
39
+ { id: "aws_access_key", pattern: /\bAKIA[0-9A-Z]{16}\b/g },
40
+ { id: "slack_token", pattern: /\bxox[abceprs]-[A-Za-z0-9-]{10,}\b/g },
41
+ { id: "cursor_api_key", pattern: /\bkey_[A-Za-z0-9]{20,}\b/g },
42
+ { id: "google_oauth_token", pattern: /\bya29\.[A-Za-z0-9._-]{20,}\b/g },
43
+ { id: "npm_token", pattern: /\bnpm_[A-Za-z0-9]{20,}\b/g },
44
+ {
45
+ id: "private_key_block",
46
+ pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g,
47
+ },
48
+ { id: "bearer_token", pattern: /\bBearer\s+[A-Za-z0-9._~+/-]{20,}=*/gi },
49
+ { id: "jwt", pattern: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{6,}\b/g },
50
+ ];
51
+ const ALLOW_PATH = Object.freeze({
52
+ sensitive: false,
53
+ class: null,
54
+ matchedPart: null,
55
+ reason: null,
56
+ });
57
+ /**
58
+ * Single owner for sensitive path, symlink-target, and content decisions.
59
+ *
60
+ * The API is deliberately surface-neutral: context/review consume it now;
61
+ * upload and release scanners can consume the same typed decisions later
62
+ * without growing another classifier or weakening this policy.
63
+ */
64
+ export class SensitiveResourcePolicy {
65
+ redactionMarker = "[redacted]";
66
+ classifyPath(path) {
67
+ const parts = normalizedPathParts(path);
68
+ for (let index = 0; index < parts.length; index += 1) {
69
+ const part = parts[index] ?? "";
70
+ const lower = part.toLowerCase();
71
+ if (CREDENTIAL_STORE_PARTS.has(lower)) {
72
+ return sensitivePath("credential_store", part, `credential-store path component: ${part}`);
73
+ }
74
+ if (lower === ".config" && parts[index + 1]?.toLowerCase() === "gcloud") {
75
+ return sensitivePath("credential_store", `${part}/${parts[index + 1]}`, `credential-store path component: ${part}/${parts[index + 1]}`);
76
+ }
77
+ // A monorepo package may legitimately own secret-management source code
78
+ // (`packages/secrets/**`). Its files still pass the shared content scan;
79
+ // every other `secrets` container remains path-sensitive.
80
+ const sourcePackage = index > 0 && parts[index - 1]?.toLowerCase() === "packages";
81
+ if (lower === "secrets" && !sourcePackage) {
82
+ return sensitivePath("secret_container", part, `secret-container path component: ${part}`);
83
+ }
84
+ if (lower === ".env" ||
85
+ lower === ".envrc" ||
86
+ lower.startsWith(".envrc.") ||
87
+ (lower.startsWith(".env.") && !SAFE_ENV_TEMPLATE_BASENAMES.has(lower))) {
88
+ return sensitivePath("environment_file", part, `environment secret file: ${part}`);
89
+ }
90
+ if (CREDENTIAL_FILE_BASENAMES.has(lower) || CREDENTIAL_FILE_BASENAME.test(lower)) {
91
+ return sensitivePath("credential_file", part, `credential file: ${part}`);
92
+ }
93
+ if (!lower.endsWith(".pub") && PRIVATE_KEY_BASENAME.test(lower)) {
94
+ return sensitivePath("private_key", part, `private-key basename: ${part}`);
95
+ }
96
+ if (PRIVATE_KEY_EXTENSIONS.has(extname(lower))) {
97
+ return sensitivePath("private_key", part, `private-key/container extension: ${extname(lower)}`);
98
+ }
99
+ if (lower === ".claudexor") {
100
+ const runtimePart = parts[index + 1]?.toLowerCase();
101
+ if (runtimePart && ["auth", "home", "homes", "secrets"].includes(runtimePart)) {
102
+ return sensitivePath("credential_store", `${part}/${parts[index + 1]}`, `Claudexor credential/runtime path: ${part}/${parts[index + 1]}`);
103
+ }
104
+ }
105
+ }
106
+ return ALLOW_PATH;
107
+ }
108
+ inspectContent(text, handling = "redact") {
109
+ let redacted = text;
110
+ const signatures = new Set();
111
+ for (const rule of CONTENT_RULES) {
112
+ const before = redacted;
113
+ redacted = redacted.replace(rule.pattern, this.redactionMarker);
114
+ if (redacted !== before)
115
+ signatures.add(rule.id);
116
+ }
117
+ if (signatures.size === 0) {
118
+ return { action: "allow", containsSensitiveContent: false, signatures: [], text };
119
+ }
120
+ return {
121
+ action: handling,
122
+ containsSensitiveContent: true,
123
+ signatures: [...signatures],
124
+ // Never echo a matched secret from a policy decision, including a reject
125
+ // decision that a caller might later persist as diagnostic evidence.
126
+ text: redacted,
127
+ };
128
+ }
129
+ redact(text) {
130
+ return this.inspectContent(text, "redact").text;
131
+ }
132
+ containsSensitiveContent(text) {
133
+ return this.inspectContent(text, "reject").containsSensitiveContent;
134
+ }
135
+ assessSymlink(input) {
136
+ const sourceRoot = resolve(input.sourceRoot);
137
+ const canonicalRoot = resolve(input.canonicalSourceRoot);
138
+ const sourcePath = resolve(input.sourcePath);
139
+ const excludedRoots = (input.excludedRoots ?? []).map((path) => resolve(path));
140
+ if (!isSameOrInside(sourceRoot, sourcePath)) {
141
+ return denySymlink("invalid_source", "symlink source is outside the allowed root");
142
+ }
143
+ const sourceDecision = this.classifyPath(relative(sourceRoot, sourcePath));
144
+ if (sourceDecision.sensitive) {
145
+ return denySymlink("sensitive_source", sourceDecision.reason ?? "symlink source is sensitive", sourceDecision);
146
+ }
147
+ if (!input.resolvedTargetPath) {
148
+ return denySymlink("unresolved_target", "symlink target cannot be resolved");
149
+ }
150
+ if (!input.allowedTargetKinds.includes(input.targetKind)) {
151
+ return denySymlink("target_kind", `symlink target kind is not allowed: ${input.targetKind}`);
152
+ }
153
+ const resolvedTarget = resolve(input.resolvedTargetPath);
154
+ if (!isSameOrInside(canonicalRoot, resolvedTarget)) {
155
+ return denySymlink("target_outside_root", "symlink resolves outside the allowed root");
156
+ }
157
+ if (excludedRoots.some((root) => isSameOrInside(root, resolvedTarget))) {
158
+ return denySymlink("excluded_target", "symlink resolves into an excluded root");
159
+ }
160
+ const targetDecision = this.classifyPath(relative(canonicalRoot, resolvedTarget));
161
+ if (targetDecision.sensitive) {
162
+ return denySymlink("sensitive_target", targetDecision.reason ?? "symlink target is sensitive", targetDecision);
163
+ }
164
+ return assessRelocation(input, sourceRoot, sourcePath, excludedRoots);
165
+ }
166
+ }
167
+ export const sensitiveResourcePolicy = Object.freeze(new SensitiveResourcePolicy());
168
+ function normalizedPathParts(path) {
169
+ return path
170
+ .replace(/\\/g, "/")
171
+ .split("/")
172
+ .filter((part) => part.length > 0 && part !== ".");
173
+ }
174
+ function sensitivePath(pathClass, matchedPart, reason) {
175
+ return { sensitive: true, class: pathClass, matchedPart, reason };
176
+ }
177
+ function denySymlink(reason, detail, pathDecision = null) {
178
+ return { allowed: false, reason, detail, pathDecision };
179
+ }
180
+ function allowSymlink() {
181
+ return { allowed: true, reason: null, detail: null, pathDecision: null };
182
+ }
183
+ function assessRelocation(input, sourceRoot, sourcePath, excludedRoots) {
184
+ if (isAbsolute(input.linkTarget)) {
185
+ return input.relocationRoot
186
+ ? denySymlink("absolute_target", "absolute symlink targets are not relocatable")
187
+ : allowSymlink();
188
+ }
189
+ if (!input.relocationRoot)
190
+ return allowSymlink();
191
+ const relocationRoot = resolve(input.relocationRoot);
192
+ const sourceParentRelative = relative(sourceRoot, dirname(sourcePath));
193
+ if (escapesRelativeRoot(sourceParentRelative)) {
194
+ return denySymlink("invalid_source", "symlink source parent is outside the allowed root");
195
+ }
196
+ const relocatedTargetRelative = normalize(join(sourceParentRelative, input.linkTarget));
197
+ if (escapesRelativeRoot(relocatedTargetRelative)) {
198
+ return denySymlink("relocation_escape", "symlink escapes when relocated");
199
+ }
200
+ const relocatedTarget = resolve(relocationRoot, relocatedTargetRelative);
201
+ if (!isSameOrInside(relocationRoot, relocatedTarget)) {
202
+ return denySymlink("relocation_escape", "symlink escapes the relocation root");
203
+ }
204
+ if (excludedRoots.some((root) => isSameOrInside(root, relocatedTarget))) {
205
+ return denySymlink("excluded_target", "relocated symlink resolves into an excluded root");
206
+ }
207
+ return allowSymlink();
208
+ }
209
+ function escapesRelativeRoot(path) {
210
+ if (isAbsolute(path))
211
+ return true;
212
+ const normalized = normalize(path);
213
+ const first = normalized.split(/[\\/]+/)[0];
214
+ return normalized === ".." || first === "..";
215
+ }
216
+ function isSameOrInside(parent, target) {
217
+ const rel = relative(resolve(parent), resolve(target));
218
+ const firstPart = rel.split(/[\\/]+/)[0];
219
+ return rel === "" || (!!rel && firstPart !== ".." && !isAbsolute(rel));
220
+ }
221
+ //# sourceMappingURL=sensitive-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitive-resource.js","sourceRoot":"","sources":["../src/sensitive-resource.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const CLAUDEXOR_VERSION = "1.0.0";
1
+ export declare const CLAUDEXOR_VERSION = "2.0.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // GENERATED by scripts/gen-version.mjs from the root package.json — do not edit by hand.
2
2
  // Run `pnpm gen:version` after bumping the root version (changesets keeps the
3
3
  // workspace manifests in lockstep). The docs-truth gate enforces parity.
4
- export const CLAUDEXOR_VERSION = "1.0.0";
4
+ export const CLAUDEXOR_VERSION = "2.0.0";
5
5
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claudexor/util",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "license": "MIT",
5
5
  "description": "Low-level utilities (ids, hashing, fs, redaction) with no Claudexor deps.",
6
6
  "type": "module",