@node9/proxy 2.50.0 → 2.51.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/cli-main.js +1014 -373
- package/dist/dashboard.mjs +577 -29
- package/dist/hook.js +575 -28
- package/dist/index.js +776 -231
- package/dist/index.mjs +776 -231
- package/dist/scan-ink.mjs +2 -1
- package/package.json +1 -1
package/dist/cli-main.js
CHANGED
|
@@ -2123,9 +2123,15 @@ function detectDangerousShellExec(command) {
|
|
|
2123
2123
|
if (f === PARSE_FAIL) return null;
|
|
2124
2124
|
let result = null;
|
|
2125
2125
|
const assigned = assignedNames(f);
|
|
2126
|
-
|
|
2126
|
+
const known = plainlyNamedPrograms(f);
|
|
2127
|
+
const calledByName = literallyCalledFunctions(f);
|
|
2128
|
+
const bodies = [];
|
|
2129
|
+
const inBody = (pos) => bodies.some(([a, b]) => pos >= a && pos < b);
|
|
2130
|
+
walkWithCalls(f, (node) => {
|
|
2127
2131
|
if (!node || result === "block") return false;
|
|
2128
2132
|
const n = node;
|
|
2133
|
+
if (n.kind === "FuncDecl" && n.Body && callDepth === 0 && calledByName.has(n.Name?.Value))
|
|
2134
|
+
bodies.push([n.Body.pos, n.Body.end]);
|
|
2129
2135
|
if (n.kind === "BinaryCmd" && n.Y && !listOps().has(n.Op)) {
|
|
2130
2136
|
const call = n.Y.Cmd;
|
|
2131
2137
|
if (call && call.kind === "CallExpr") {
|
|
@@ -2149,7 +2155,8 @@ function detectDangerousShellExec(command) {
|
|
|
2149
2155
|
);
|
|
2150
2156
|
const head = unwrapCommandHead(headWords, false, true);
|
|
2151
2157
|
const lookup = headWords[0]?.toLowerCase() === "command" && headWords.slice(1).some((w) => w === "-v" || w === "-V");
|
|
2152
|
-
|
|
2158
|
+
const unboundBody = callDepth === 0 && inBody(n.pos ?? -1);
|
|
2159
|
+
if (!lookup && !unboundBody && (opaqueExecutable(args[0], assigned, known) || opaqueExecutable(args[head], assigned, known)))
|
|
2153
2160
|
result = "review";
|
|
2154
2161
|
const firstParts = args[0].Parts || [];
|
|
2155
2162
|
if (firstParts.length !== 1 || firstParts[0].kind !== "Lit") return true;
|
|
@@ -2209,11 +2216,105 @@ function assignedNames(f) {
|
|
|
2209
2216
|
});
|
|
2210
2217
|
return names;
|
|
2211
2218
|
}
|
|
2212
|
-
function
|
|
2219
|
+
function literallyCalledFunctions(f) {
|
|
2220
|
+
const declared = /* @__PURE__ */ new Set();
|
|
2221
|
+
const called = /* @__PURE__ */ new Set();
|
|
2222
|
+
walk(f, (node) => {
|
|
2223
|
+
if (!node) return false;
|
|
2224
|
+
if (node.kind === "FuncDecl" && node.Name?.Value) declared.add(node.Name.Value);
|
|
2225
|
+
if (node.kind === "CallExpr") {
|
|
2226
|
+
const head = resolveWordLiteral(node.Args?.[0]);
|
|
2227
|
+
if (head) called.add(head);
|
|
2228
|
+
}
|
|
2229
|
+
return true;
|
|
2230
|
+
});
|
|
2231
|
+
return new Set([...declared].filter((name) => called.has(name)));
|
|
2232
|
+
}
|
|
2233
|
+
function plainlyNamedPrograms(f) {
|
|
2234
|
+
const values = /* @__PURE__ */ new Map();
|
|
2235
|
+
const arrays = /* @__PURE__ */ new Set();
|
|
2236
|
+
const give = (name, value) => {
|
|
2237
|
+
if (value === null || !PLAIN_PROGRAM_NAME.test(value)) {
|
|
2238
|
+
values.set(name, null);
|
|
2239
|
+
return;
|
|
2240
|
+
}
|
|
2241
|
+
const cur = values.get(name);
|
|
2242
|
+
if (cur === null) return;
|
|
2243
|
+
if (cur === void 0) values.set(name, /* @__PURE__ */ new Set([value]));
|
|
2244
|
+
else cur.add(value);
|
|
2245
|
+
};
|
|
2246
|
+
const literalOnly = (w) => {
|
|
2247
|
+
const parts = w?.Parts ?? [];
|
|
2248
|
+
if (parts.length !== 1) return null;
|
|
2249
|
+
const p = parts[0];
|
|
2250
|
+
if (p.kind === "Lit") return p.Value ?? null;
|
|
2251
|
+
if (p.kind === "ParamExp" && expansionName(p) === "FUNCNAME") return "FUNCNAME";
|
|
2252
|
+
if (p.kind === "SglQuoted" && !p.Dollar) return p.Value ?? null;
|
|
2253
|
+
if (p.kind === "DblQuoted") {
|
|
2254
|
+
const inner = p.Parts ?? [];
|
|
2255
|
+
return inner.length === 1 && inner[0].kind === "Lit" ? inner[0].Value ?? null : null;
|
|
2256
|
+
}
|
|
2257
|
+
return null;
|
|
2258
|
+
};
|
|
2259
|
+
let ifsTouched = false;
|
|
2260
|
+
walk(f, (node) => {
|
|
2261
|
+
if (!node) return false;
|
|
2262
|
+
const kind = node.kind;
|
|
2263
|
+
if (kind === "FuncDecl" && node.Name?.Value) give(node.Name.Value, node.Name.Value);
|
|
2264
|
+
if (kind === "Assign" && node.Name?.Value) {
|
|
2265
|
+
const name = node.Name.Value;
|
|
2266
|
+
if (name === "IFS") ifsTouched = true;
|
|
2267
|
+
if (node.Append) values.set(name, null);
|
|
2268
|
+
else if (node.Array) {
|
|
2269
|
+
arrays.add(name);
|
|
2270
|
+
for (const el of node.Array.Elems ?? []) give(name, literalOnly(el.Value));
|
|
2271
|
+
} else if (node.Index) {
|
|
2272
|
+
arrays.add(name);
|
|
2273
|
+
give(name, node.Value ? literalOnly(node.Value) : null);
|
|
2274
|
+
} else give(name, node.Value ? literalOnly(node.Value) : null);
|
|
2275
|
+
}
|
|
2276
|
+
if (kind === "ForClause" && node.Loop?.Name?.Value) values.set(node.Loop.Name.Value, null);
|
|
2277
|
+
if (kind === "CallExpr") {
|
|
2278
|
+
const words = (node.Args ?? []).map((a) => resolveWordLiteral(a));
|
|
2279
|
+
if (VARIABLE_READERS.has(words[0] ?? "")) {
|
|
2280
|
+
for (const w of words.slice(1)) if (w && /^[A-Za-z_]\w*$/.test(w)) values.set(w, null);
|
|
2281
|
+
}
|
|
2282
|
+
}
|
|
2283
|
+
return true;
|
|
2284
|
+
});
|
|
2285
|
+
if (ifsTouched) return /* @__PURE__ */ new Set();
|
|
2286
|
+
const functions = /* @__PURE__ */ new Set();
|
|
2287
|
+
walk(f, (node) => {
|
|
2288
|
+
if (node && node.kind === "FuncDecl" && node.Name?.Value) functions.add(node.Name.Value);
|
|
2289
|
+
return true;
|
|
2290
|
+
});
|
|
2291
|
+
const callable = (v) => functions.has(v) || v === "FUNCNAME" || v === "true" || v === "false" || v === ":";
|
|
2292
|
+
for (const [name, vals] of values) {
|
|
2293
|
+
if (vals && ![...vals].every(callable)) values.set(name, null);
|
|
2294
|
+
}
|
|
2295
|
+
const known = /* @__PURE__ */ new Set();
|
|
2296
|
+
for (const [name, vals] of values)
|
|
2297
|
+
if (vals && (vals.size === 1 || arrays.has(name) && vals.size > 0)) known.add(name);
|
|
2298
|
+
return known;
|
|
2299
|
+
}
|
|
2300
|
+
function expansionName(part) {
|
|
2301
|
+
if (part.kind !== "ParamExp") return null;
|
|
2302
|
+
if (part.Excl || part.Length || part.Width || part.Slice || part.Repl || part.Exp) return null;
|
|
2303
|
+
return part.Param?.Value ?? null;
|
|
2304
|
+
}
|
|
2305
|
+
function executableParts(word, assigned, quoted = false, known = EMPTY_NAMES) {
|
|
2213
2306
|
return (word?.Parts ?? []).flatMap((part) => {
|
|
2214
2307
|
const kind = part.kind;
|
|
2215
|
-
if (kind === "DblQuoted") return executableParts(part, assigned, true);
|
|
2308
|
+
if (kind === "DblQuoted") return executableParts(part, assigned, true, known);
|
|
2216
2309
|
if (kind === "Lit") return [{ kind: "Lit", value: part.Value ?? "", quoted }];
|
|
2310
|
+
const name = expansionName(part);
|
|
2311
|
+
if (name !== null && (known.has(name) || name === "FUNCNAME"))
|
|
2312
|
+
return [{ kind: "Lit", value: name, quoted }];
|
|
2313
|
+
if (name !== null) {
|
|
2314
|
+
const bound = recordedExpansion(name === "@" || name === "*" ? "1" : name);
|
|
2315
|
+
if (typeof bound === "string" && PLAIN_PROGRAM_NAME.test(bound))
|
|
2316
|
+
return [{ kind: "Lit", value: bound, quoted }];
|
|
2317
|
+
}
|
|
2217
2318
|
if (kind === "SglQuoted")
|
|
2218
2319
|
return [{ kind: part.Dollar ? "Dynamic" : "Lit", value: part.Value ?? "", quoted: true }];
|
|
2219
2320
|
if (kind === "ParamExp" && isDefaultExpansion(part) && !assigned.has(part.Param?.Value)) {
|
|
@@ -2221,14 +2322,14 @@ function executableParts(word, assigned, quoted = false) {
|
|
|
2221
2322
|
if (fallback !== null) return [{ kind: "Lit", value: fallback, quoted }];
|
|
2222
2323
|
}
|
|
2223
2324
|
if (kind === "CmdSubst") {
|
|
2224
|
-
const
|
|
2225
|
-
if (
|
|
2325
|
+
const name2 = lookupSubstitution(part);
|
|
2326
|
+
if (name2 !== null) return [{ kind: "Lit", value: name2, quoted }];
|
|
2226
2327
|
}
|
|
2227
2328
|
return [{ kind: "Dynamic", value: "", quoted }];
|
|
2228
2329
|
});
|
|
2229
2330
|
}
|
|
2230
|
-
function opaqueExecutable(word, assigned) {
|
|
2231
|
-
const parts = executableParts(word, assigned);
|
|
2331
|
+
function opaqueExecutable(word, assigned, known = EMPTY_NAMES) {
|
|
2332
|
+
const parts = executableParts(word, assigned, false, known);
|
|
2232
2333
|
let lastSlash = -1;
|
|
2233
2334
|
parts.forEach((p, i) => {
|
|
2234
2335
|
if (p.kind === "Lit" && p.value.includes("/")) lastSlash = i;
|
|
@@ -2350,6 +2451,9 @@ function deriveBinaryOp(sample) {
|
|
|
2350
2451
|
function isListOp(op) {
|
|
2351
2452
|
return listOps().has(op);
|
|
2352
2453
|
}
|
|
2454
|
+
function isPipeOp(op) {
|
|
2455
|
+
return pipeOps().has(op);
|
|
2456
|
+
}
|
|
2353
2457
|
function listOps() {
|
|
2354
2458
|
if (_listOps) return _listOps;
|
|
2355
2459
|
_listOps = new Set(
|
|
@@ -2594,6 +2698,33 @@ function isProtectedCodePath(p) {
|
|
|
2594
2698
|
if (matchSensitivePath(p) !== null) return true;
|
|
2595
2699
|
return SYSTEM_AUTH_FILES.includes(p) || SYSTEM_AUTH_DIRS.some((d) => p === d || p.startsWith(d + "/"));
|
|
2596
2700
|
}
|
|
2701
|
+
function isJailedCodePath(literal, jailPaths) {
|
|
2702
|
+
const value = trimTrailingSlashes(literal.replace(/\\/g, "/"));
|
|
2703
|
+
if (!value) return false;
|
|
2704
|
+
for (const raw of jailPaths) {
|
|
2705
|
+
const jail = trimTrailingSlashes(raw.trim().replace(/\\/g, "/"));
|
|
2706
|
+
if (!jail) continue;
|
|
2707
|
+
const home = homeTail(jail);
|
|
2708
|
+
if (home === null) {
|
|
2709
|
+
if (value === jail || value.startsWith(jail + "/")) return true;
|
|
2710
|
+
continue;
|
|
2711
|
+
}
|
|
2712
|
+
if (!home) continue;
|
|
2713
|
+
const tail = homeTail(value);
|
|
2714
|
+
if (tail !== null && (tail === home || tail.startsWith(home + "/"))) return true;
|
|
2715
|
+
}
|
|
2716
|
+
return false;
|
|
2717
|
+
}
|
|
2718
|
+
function trimTrailingSlashes(s) {
|
|
2719
|
+
let end = s.length;
|
|
2720
|
+
while (end > 0 && s.charCodeAt(end - 1) === 47) end--;
|
|
2721
|
+
return s.slice(0, end);
|
|
2722
|
+
}
|
|
2723
|
+
function homeTail(p) {
|
|
2724
|
+
const m = /^(?:~|\$\{?HOME\}?|\/home\/[^/]+|\/Users\/[^/]+|\/root)(?:\/(.*))?$/.exec(p);
|
|
2725
|
+
if (!m) return null;
|
|
2726
|
+
return m[1] ?? "";
|
|
2727
|
+
}
|
|
2597
2728
|
function inlineExecDescription(r) {
|
|
2598
2729
|
const lead = r ? `The AI is running code directly from the command line: ${inlineExecReason(r).replace(/^This/, "this")}.` : "The AI is running code directly from the command line.";
|
|
2599
2730
|
return `${lead} Review the full script below before allowing it to execute.`;
|
|
@@ -2602,7 +2733,8 @@ function inlineExecReason(r) {
|
|
|
2602
2733
|
const who = r.interp ? `This inline ${r.interp} code` : "This inline code";
|
|
2603
2734
|
return r.evidence ? `${who} ${r.what} (${r.evidence})` : `${who} ${r.what}`;
|
|
2604
2735
|
}
|
|
2605
|
-
function inlineExecReview(command) {
|
|
2736
|
+
function inlineExecReview(command, jailPaths = []) {
|
|
2737
|
+
const isProtected = jailPaths.length === 0 ? isProtectedCodePath : (p) => isProtectedCodePath(p) || isJailedCodePath(p, jailPaths);
|
|
2606
2738
|
const calls = inlineExecCalls(command);
|
|
2607
2739
|
if (calls === PARSE_FAIL) {
|
|
2608
2740
|
return INLINE_EXEC_FALLBACK.test(command) ? { outcome: "unreadable", interp: "", what: "could not be parsed" } : null;
|
|
@@ -2625,7 +2757,7 @@ function inlineExecReview(command) {
|
|
|
2625
2757
|
what: `is ${call.interp} code, which node9 does not read`
|
|
2626
2758
|
};
|
|
2627
2759
|
} else {
|
|
2628
|
-
const judged = judgeInlineCode(language, code2,
|
|
2760
|
+
const judged = judgeInlineCode(language, code2, isProtected);
|
|
2629
2761
|
if (judged) finding = { ...judged, interp: call.interp };
|
|
2630
2762
|
}
|
|
2631
2763
|
if (finding?.outcome === "dangerous") return finding;
|
|
@@ -2806,6 +2938,11 @@ function recordTopLevelStmt(stmt) {
|
|
|
2806
2938
|
if (t === "DeclClause") return ASSIGNMENT_HEADS.has(stmt.Cmd.Variant?.Value ?? "");
|
|
2807
2939
|
return (stmt.Cmd.Args || []).length === 0 && (stmt.Cmd.Assigns || []).length > 0;
|
|
2808
2940
|
}
|
|
2941
|
+
function arrayElements(value) {
|
|
2942
|
+
if (typeof value !== "string" || !value.startsWith(ARRAY_MARK)) return null;
|
|
2943
|
+
const body = value.slice(ARRAY_MARK.length);
|
|
2944
|
+
return body === "" ? [] : body.split(ARRAY_SEP);
|
|
2945
|
+
}
|
|
2809
2946
|
function recordAssignments(n, at) {
|
|
2810
2947
|
if (!assignmentTable) return;
|
|
2811
2948
|
const t = n.kind;
|
|
@@ -2819,7 +2956,19 @@ function recordAssignments(n, at) {
|
|
|
2819
2956
|
} else return;
|
|
2820
2957
|
for (const a of assigns) {
|
|
2821
2958
|
const name = a?.Name?.Value;
|
|
2822
|
-
if (!name
|
|
2959
|
+
if (!name) continue;
|
|
2960
|
+
if (a.Array) {
|
|
2961
|
+
const elems = (a.Array.Elems || []).map(
|
|
2962
|
+
(e) => e?.Index ? null : resolveWordLiteral(e?.Value)
|
|
2963
|
+
);
|
|
2964
|
+
const literal = elems.every((v) => v !== null);
|
|
2965
|
+
assignmentTable.set(name, {
|
|
2966
|
+
value: literal && !a.Append ? ARRAY_MARK + elems.join(ARRAY_SEP) : null,
|
|
2967
|
+
at
|
|
2968
|
+
});
|
|
2969
|
+
continue;
|
|
2970
|
+
}
|
|
2971
|
+
if (!a.Value || a.Append) continue;
|
|
2823
2972
|
assignmentTable.set(name, { value: resolveWordLiteral(a.Value), at });
|
|
2824
2973
|
}
|
|
2825
2974
|
}
|
|
@@ -2830,7 +2979,33 @@ function resolveTrivialSubst(part) {
|
|
|
2830
2979
|
const st = stmts[0];
|
|
2831
2980
|
if ((st.Redirs || []).length > 0 || st.Negated || st.Background) return void 0;
|
|
2832
2981
|
const cmd = st.Cmd;
|
|
2833
|
-
if (!cmd
|
|
2982
|
+
if (!cmd) return void 0;
|
|
2983
|
+
if (cmd.kind === "BinaryCmd" && pipeOps().has(cmd.Op)) {
|
|
2984
|
+
const left = cmd.X?.Cmd;
|
|
2985
|
+
const right = cmd.Y?.Cmd;
|
|
2986
|
+
if (!left || !right || left.kind !== "CallExpr" || right.kind !== "CallExpr") return void 0;
|
|
2987
|
+
if ((cmd.X.Redirs || []).length > 0 || (cmd.Y.Redirs || []).length > 0) return void 0;
|
|
2988
|
+
const input = trivialCallOutput(left);
|
|
2989
|
+
if (input === void 0) return void 0;
|
|
2990
|
+
const filter = (right.Args || []).map((a) => resolveWordLiteral(a));
|
|
2991
|
+
if (filter.some((w) => w === null)) return void 0;
|
|
2992
|
+
const f = baseWord(filter[0]);
|
|
2993
|
+
const flags = filter.slice(1);
|
|
2994
|
+
if (f === "base64" && flags.length === 1 && /^(-d|-D|--decode)$/.test(flags[0])) {
|
|
2995
|
+
try {
|
|
2996
|
+
const out = Buffer.from(input, "base64").toString("utf8");
|
|
2997
|
+
return /^[\x20-\x7e]*$/.test(out) ? out : void 0;
|
|
2998
|
+
} catch {
|
|
2999
|
+
return void 0;
|
|
3000
|
+
}
|
|
3001
|
+
}
|
|
3002
|
+
if (f === "rev" && flags.length === 0) return [...input].reverse().join("");
|
|
3003
|
+
return void 0;
|
|
3004
|
+
}
|
|
3005
|
+
if (cmd.kind !== "CallExpr") return void 0;
|
|
3006
|
+
return trivialCallOutput(cmd);
|
|
3007
|
+
}
|
|
3008
|
+
function trivialCallOutput(cmd) {
|
|
2834
3009
|
if ((cmd.Assigns || []).length > 0) return void 0;
|
|
2835
3010
|
const words = (cmd.Args || []).map((a) => resolveWordLiteral(a));
|
|
2836
3011
|
if (words.length === 0 || words.some((w) => w === null)) return void 0;
|
|
@@ -2842,9 +3017,16 @@ function resolveTrivialSubst(part) {
|
|
|
2842
3017
|
return rest.slice(i).join(" ");
|
|
2843
3018
|
}
|
|
2844
3019
|
if (head === "printf") {
|
|
3020
|
+
if (rest.length === 1 && /^(?:\\(?:[0-7]{1,3}|x[0-9A-Fa-f]{1,2}))+$/.test(rest[0])) {
|
|
3021
|
+
return rest[0].replace(
|
|
3022
|
+
/\\(?:x([0-9A-Fa-f]{1,2})|([0-7]{1,3}))/g,
|
|
3023
|
+
(_, hex, oct) => String.fromCharCode(hex ? parseInt(hex, 16) : parseInt(oct, 8))
|
|
3024
|
+
);
|
|
3025
|
+
}
|
|
2845
3026
|
if (rest.length !== 2) return void 0;
|
|
2846
|
-
|
|
2847
|
-
return
|
|
3027
|
+
const m = /^([^%]*)%s([^%]*?)(\\n)?$/.exec(rest[0]);
|
|
3028
|
+
if (!m) return void 0;
|
|
3029
|
+
return m[1] + rest[1] + m[2];
|
|
2848
3030
|
}
|
|
2849
3031
|
return void 0;
|
|
2850
3032
|
}
|
|
@@ -2858,11 +3040,28 @@ function isPlainParam(p) {
|
|
|
2858
3040
|
if (p.kind !== "ParamExp") return false;
|
|
2859
3041
|
return !(p.Excl || p.Length || p.Width || p.Index || p.Slice || p.Repl || p.Exp);
|
|
2860
3042
|
}
|
|
3043
|
+
function indexedParam(p) {
|
|
3044
|
+
if (p.kind !== "ParamExp" || !p.Index) return null;
|
|
3045
|
+
if (p.Excl || p.Length || p.Width || p.Slice || p.Repl || p.Exp) return null;
|
|
3046
|
+
const index = resolveWordLiteral(p.Index);
|
|
3047
|
+
const name = p.Param?.Value;
|
|
3048
|
+
return name && index !== null ? { name, index } : null;
|
|
3049
|
+
}
|
|
2861
3050
|
function expandPlainParam(p) {
|
|
2862
3051
|
if (!assignmentTable) return void 0;
|
|
3052
|
+
const indexed = indexedParam(p);
|
|
3053
|
+
if (indexed) {
|
|
3054
|
+
const elems = arrayElements(recordedExpansion(indexed.name));
|
|
3055
|
+
if (elems === null) return void 0;
|
|
3056
|
+
if (indexed.index === "@" || indexed.index === "*") return elems.join(" ");
|
|
3057
|
+
return /^\d+$/.test(indexed.index) ? elems[Number(indexed.index)] ?? null : null;
|
|
3058
|
+
}
|
|
2863
3059
|
if (!isPlainParam(p)) return void 0;
|
|
2864
3060
|
const recorded = recordedExpansion(p.Param?.Value);
|
|
2865
|
-
if (recorded !== void 0)
|
|
3061
|
+
if (recorded !== void 0) {
|
|
3062
|
+
const elems = arrayElements(recorded);
|
|
3063
|
+
return elems === null ? recorded : elems[0] ?? "";
|
|
3064
|
+
}
|
|
2866
3065
|
return HOME_VARIABLES.has(p.Param?.Value) ? "~" : void 0;
|
|
2867
3066
|
}
|
|
2868
3067
|
function functionBodies(f) {
|
|
@@ -5935,7 +6134,59 @@ function dynamicOptionWord(word) {
|
|
|
5935
6134
|
if (/^--[a-z-]+=/.test(prefix) || /^-[cC]/.test(prefix)) return `${prefix}$\u2026`;
|
|
5936
6135
|
return null;
|
|
5937
6136
|
}
|
|
5938
|
-
function
|
|
6137
|
+
function arrayExpansionWords(word) {
|
|
6138
|
+
let parts = word?.Parts || [];
|
|
6139
|
+
if (parts.length === 1 && parts[0].kind === "DblQuoted") parts = parts[0].Parts || [];
|
|
6140
|
+
if (parts.length !== 1 || parts[0].kind !== "ParamExp" || !parts[0].Index) return null;
|
|
6141
|
+
const index = resolveWordLiteral(parts[0].Index);
|
|
6142
|
+
if (index !== "@" && index !== "*") return null;
|
|
6143
|
+
const elems = arrayElements(recordedExpansion(parts[0].Param?.Value));
|
|
6144
|
+
return elems;
|
|
6145
|
+
}
|
|
6146
|
+
function producedLiteral(call) {
|
|
6147
|
+
if ((call.Assigns || []).length > 0) return null;
|
|
6148
|
+
const words = (call.Args || []).map((a) => resolveWordLiteral(a));
|
|
6149
|
+
if (words.length === 0 || words.some((w) => w === null)) return null;
|
|
6150
|
+
const head = baseWord(words[0]);
|
|
6151
|
+
const rest = words.slice(1);
|
|
6152
|
+
if (head === "git" && rest[0] === "rev-parse" && rest[1] === "--show-toplevel" && rest.length === 2)
|
|
6153
|
+
return ":/";
|
|
6154
|
+
if (head === "echo") {
|
|
6155
|
+
let i = 0;
|
|
6156
|
+
while (i < rest.length && /^-[neE]+$/.test(rest[i])) i++;
|
|
6157
|
+
return rest.length - i === 1 ? rest[i] : null;
|
|
6158
|
+
}
|
|
6159
|
+
if (head === "printf" && rest.length === 2 && /^%s(\\[0n])?$/.test(rest[0])) return rest[1];
|
|
6160
|
+
return null;
|
|
6161
|
+
}
|
|
6162
|
+
function treeTopWord(word, treeTopVars = NO_VARS) {
|
|
6163
|
+
let parts = word?.Parts || [];
|
|
6164
|
+
if (parts.length === 1 && parts[0].kind === "DblQuoted") parts = parts[0].Parts || [];
|
|
6165
|
+
if (parts.length !== 1) return false;
|
|
6166
|
+
const p = parts[0];
|
|
6167
|
+
if (p.kind === "ParamExp") {
|
|
6168
|
+
const name = plainParamName(word)?.name;
|
|
6169
|
+
return name === "PWD" || name !== void 0 && treeTopVars.has(name);
|
|
6170
|
+
}
|
|
6171
|
+
if (p.kind !== "CmdSubst") return false;
|
|
6172
|
+
const stmts = p.Stmts || [];
|
|
6173
|
+
if (stmts.length !== 1 || !stmts[0].Cmd || stmts[0].Cmd.kind !== "CallExpr") return false;
|
|
6174
|
+
const words = (stmts[0].Cmd.Args || []).map((a) => resolveWordLiteral(a));
|
|
6175
|
+
if (words.some((w) => w === null)) return false;
|
|
6176
|
+
const head = baseWord(words[0]);
|
|
6177
|
+
if (head === "pwd") return words.length === 1 || words[1] === "-P" || words[1] === "-L";
|
|
6178
|
+
return head === "git" && words[1] === "rev-parse" && words[2] === "--show-toplevel";
|
|
6179
|
+
}
|
|
6180
|
+
function resolveGitWords(word, treeTopVars = NO_VARS, appended = NO_APPENDS) {
|
|
6181
|
+
if (treeTopWord(word, treeTopVars)) return [":/"];
|
|
6182
|
+
const plain = plainParamName(word);
|
|
6183
|
+
if (plain && appended.has(plain.name)) {
|
|
6184
|
+
const v = appended.get(plain.name);
|
|
6185
|
+
if (v === null || v === void 0) return [null];
|
|
6186
|
+
return plain.quoted ? [v] : splitFields(v);
|
|
6187
|
+
}
|
|
6188
|
+
const elems = arrayExpansionWords(word);
|
|
6189
|
+
if (elems !== null) return elems;
|
|
5939
6190
|
const value = resolveWordLiteral(word);
|
|
5940
6191
|
if (value === null) {
|
|
5941
6192
|
if (isPositionalParam(word)) return boundPositionals() ?? [POSITIONAL2];
|
|
@@ -6043,6 +6294,8 @@ function classify(inv) {
|
|
|
6043
6294
|
if (o.flags.has("-n") || o.flags.has("--dry-run")) break;
|
|
6044
6295
|
const forced = o.flags.has("-f") || o.flags.has("--force") || o.flags.has("--force-with-lease") || o.flags.has("--force-if-includes") || o.flags.has("--mirror") || o.operands.some((r) => r.startsWith("+"));
|
|
6045
6296
|
if (forced) found(FORCE_PUSH);
|
|
6297
|
+
const deletes = o.flags.has("-d") || o.flags.has("--delete") || o.operands.some((r) => /^:[^:]/.test(r));
|
|
6298
|
+
if (deletes) found(DESTRUCTIVE);
|
|
6046
6299
|
break;
|
|
6047
6300
|
}
|
|
6048
6301
|
case "reset": {
|
|
@@ -6070,11 +6323,72 @@ function classify(inv) {
|
|
|
6070
6323
|
if (o.flags.has("-d") || o.flags.has("--delete")) found(DESTRUCTIVE);
|
|
6071
6324
|
break;
|
|
6072
6325
|
}
|
|
6326
|
+
// node9Firewall#385: history and work discarded through plumbing. A ref
|
|
6327
|
+
// deleted by hand, a stash dropped, the reflog expired or pruned: the
|
|
6328
|
+
// commits behind them are gone the way `branch -D` loses them.
|
|
6329
|
+
case "update-ref": {
|
|
6330
|
+
const o = parseOptions(inv.args, "m", /* @__PURE__ */ new Set());
|
|
6331
|
+
if (o.flags.has("-d") && (o.dynamic || o.operands.some(isHistoryRef))) found(DESTRUCTIVE);
|
|
6332
|
+
break;
|
|
6333
|
+
}
|
|
6334
|
+
case "reflog": {
|
|
6335
|
+
const o = parseOptions(inv.args, "", /* @__PURE__ */ new Set());
|
|
6336
|
+
if (o.operands[0] === "expire" || o.operands[0] === "delete") found(DESTRUCTIVE);
|
|
6337
|
+
break;
|
|
6338
|
+
}
|
|
6339
|
+
case "gc": {
|
|
6340
|
+
if (inv.config.get("gc.reflogexpire") === "now") found(DESTRUCTIVE);
|
|
6341
|
+
break;
|
|
6342
|
+
}
|
|
6343
|
+
case "stash": {
|
|
6344
|
+
const o = parseOptions(inv.args, "", /* @__PURE__ */ new Set());
|
|
6345
|
+
if (o.operands[0] === "clear" || o.operands[0] === "drop") found(DESTRUCTIVE);
|
|
6346
|
+
break;
|
|
6347
|
+
}
|
|
6348
|
+
case "worktree": {
|
|
6349
|
+
const o = parseOptions(inv.args, "", /* @__PURE__ */ new Set());
|
|
6350
|
+
if (o.operands[0] === "remove" && (o.flags.has("-f") || o.flags.has("--force")))
|
|
6351
|
+
found(DESTRUCTIVE);
|
|
6352
|
+
break;
|
|
6353
|
+
}
|
|
6354
|
+
// The working tree overwritten: `restore` from another ref, a forced
|
|
6355
|
+
// checkout, or `checkout -- .` (every local change dropped). A bare
|
|
6356
|
+
// `restore .` or `checkout .` stays an ordinary undo, as pinned.
|
|
6357
|
+
case "restore": {
|
|
6358
|
+
const o = parseOptions(inv.args, "s", RESTORE_LONG_VALUE);
|
|
6359
|
+
const src = restoreSource(inv.args);
|
|
6360
|
+
const whole = o.dynamic || o.operands.some(wholeTree);
|
|
6361
|
+
if (src !== null && src !== "HEAD" && whole) found(DESTRUCTIVE);
|
|
6362
|
+
break;
|
|
6363
|
+
}
|
|
6364
|
+
case "checkout": {
|
|
6365
|
+
const o = parseOptions(inv.args, "bB", CHECKOUT_LONG_VALUE);
|
|
6366
|
+
const forced = o.flags.has("-f") || o.flags.has("--force");
|
|
6367
|
+
const dropAll = inv.args.includes("--") && o.operands.some(wholeTree);
|
|
6368
|
+
if (forced || dropAll) found(DESTRUCTIVE);
|
|
6369
|
+
break;
|
|
6370
|
+
}
|
|
6073
6371
|
default:
|
|
6074
6372
|
break;
|
|
6075
6373
|
}
|
|
6076
6374
|
return out;
|
|
6077
6375
|
}
|
|
6376
|
+
function isExcludePathspec(operand) {
|
|
6377
|
+
return /^:[!^]/.test(operand) || /^:\([^)]*\bexclude\b[^)]*\)/.test(operand);
|
|
6378
|
+
}
|
|
6379
|
+
function restoreSource(args) {
|
|
6380
|
+
for (let i = 0; i < args.length; i++) {
|
|
6381
|
+
const w = args[i];
|
|
6382
|
+
if (w === null) continue;
|
|
6383
|
+
if (w.startsWith("--source=")) return w.slice("--source=".length);
|
|
6384
|
+
if (w === "--source" || w === "-s") return args[i + 1] ?? null;
|
|
6385
|
+
if (/^-s./.test(w)) return w.slice(2);
|
|
6386
|
+
}
|
|
6387
|
+
return null;
|
|
6388
|
+
}
|
|
6389
|
+
function isHistoryRef(ref) {
|
|
6390
|
+
return /^refs\/(heads|stash)(\/|$)/.test(ref);
|
|
6391
|
+
}
|
|
6078
6392
|
function killSwitchSet(name, value) {
|
|
6079
6393
|
if (value === null) return false;
|
|
6080
6394
|
switch (name) {
|
|
@@ -6132,6 +6446,7 @@ function hooksBypass(inv) {
|
|
|
6132
6446
|
const o = parseOptions(inv.args, "mFCcut", COMMIT_LONG_VALUE);
|
|
6133
6447
|
return o.flags.has("-n") || o.flags.has("--no-verify");
|
|
6134
6448
|
}
|
|
6449
|
+
if (sub === "commit-tree") return true;
|
|
6135
6450
|
if (sub !== void 0 && NO_VERIFY_SUBS.has(sub)) {
|
|
6136
6451
|
return inv.args.some((a) => a === "--no-verify");
|
|
6137
6452
|
}
|
|
@@ -6169,7 +6484,20 @@ function configWritesHooksPath(args) {
|
|
|
6169
6484
|
return write2;
|
|
6170
6485
|
}
|
|
6171
6486
|
function isHookPath(word) {
|
|
6172
|
-
return /(^|[\\/])(\.git[\\/]hooks|\.husky)([\\/]|$)/.test(word);
|
|
6487
|
+
return /(^|[\\/])(\.git[\\/]hooks|\.husky|\.githooks)([\\/]|$)/.test(word);
|
|
6488
|
+
}
|
|
6489
|
+
function isLiveHookFile(word) {
|
|
6490
|
+
if (!isHookPath(word)) return false;
|
|
6491
|
+
const m = /(^|[\\/])(\.git[\\/]hooks|\.husky|\.githooks)(?:[\\/](.*))?$/.exec(word);
|
|
6492
|
+
if (!m) return false;
|
|
6493
|
+
const rest = m[3] ?? "";
|
|
6494
|
+
if (rest === "" || rest === "_") return true;
|
|
6495
|
+
const leaf = rest.replace(/^_[\\/]/, "");
|
|
6496
|
+
return /^[a-z-]+$/.test(leaf);
|
|
6497
|
+
}
|
|
6498
|
+
function hookBodyIsEmpty(text) {
|
|
6499
|
+
const lines = text.split(/\r?\n/).map((l) => l.trim()).filter((l) => l !== "" && !l.startsWith("#"));
|
|
6500
|
+
return lines.every((l) => /^(exit(\s+0)?|true|:|set\s+-[a-zA-Z]+|set\s+-o\s+\w+)$/.test(l));
|
|
6173
6501
|
}
|
|
6174
6502
|
function modeRemovesExecute(mode) {
|
|
6175
6503
|
if (/^[0-7]{3,4}$/.test(mode)) {
|
|
@@ -6178,6 +6506,22 @@ function modeRemovesExecute(mode) {
|
|
|
6178
6506
|
}
|
|
6179
6507
|
return mode.split(",").some((part) => /^[ugoa]*-[rwst]*x/.test(part));
|
|
6180
6508
|
}
|
|
6509
|
+
function redirOpIsAppend(redir) {
|
|
6510
|
+
return redir?.Op === appendOp();
|
|
6511
|
+
}
|
|
6512
|
+
function appendOp() {
|
|
6513
|
+
if (_appendOp !== null) return _appendOp;
|
|
6514
|
+
try {
|
|
6515
|
+
const f = parseShared("echo x >> y");
|
|
6516
|
+
_appendOp = typeof f === "symbol" ? -1 : f.Stmts[0].Redirs[0].Op;
|
|
6517
|
+
} catch {
|
|
6518
|
+
_appendOp = -1;
|
|
6519
|
+
}
|
|
6520
|
+
return _appendOp;
|
|
6521
|
+
}
|
|
6522
|
+
function hooksBypassed(shown) {
|
|
6523
|
+
return { ...HOOKS_BYPASS, shown, reason: `${HOOKS_BYPASS.reason}: ${shown}` };
|
|
6524
|
+
}
|
|
6181
6525
|
function chmodDisarmsHook(args, shown) {
|
|
6182
6526
|
let i = 0;
|
|
6183
6527
|
while (i < args.length) {
|
|
@@ -6220,6 +6564,7 @@ function stagesEverything(inv) {
|
|
|
6220
6564
|
const sub = inv.sub?.toLowerCase();
|
|
6221
6565
|
const prefix = chdirPrefix(inv);
|
|
6222
6566
|
const judge = (operands2) => {
|
|
6567
|
+
if (operands2.length > 0 && operands2.every(isExcludePathspec)) return {};
|
|
6223
6568
|
let conditional = false;
|
|
6224
6569
|
for (const operand of operands2) {
|
|
6225
6570
|
if (!wholeTree(operand)) continue;
|
|
@@ -6512,7 +6857,7 @@ function evaluateAgentFileWrite(args, accesses, context, settings, shell, hooks
|
|
|
6512
6857
|
}
|
|
6513
6858
|
return null;
|
|
6514
6859
|
}
|
|
6515
|
-
function
|
|
6860
|
+
function isPipeOp2(op) {
|
|
6516
6861
|
return !isListOp(op);
|
|
6517
6862
|
}
|
|
6518
6863
|
function isDupInOp(op) {
|
|
@@ -8590,7 +8935,7 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
|
|
|
8590
8935
|
if (v?.logged) noteLogged(v);
|
|
8591
8936
|
else if (v) candidates2.push(v);
|
|
8592
8937
|
};
|
|
8593
|
-
const inline = reviewsEveryInline(config.settings.mode) ? detectInlineExec(shellCommand) ? void 0 : null : inlineExecReview(shellCommand);
|
|
8938
|
+
const inline = reviewsEveryInline(config.settings.mode) ? detectInlineExec(shellCommand) ? void 0 : null : inlineExecReview(shellCommand, config.policy.jailPaths);
|
|
8594
8939
|
if (inline !== null) {
|
|
8595
8940
|
consider("commands.inline-exec", {
|
|
8596
8941
|
decision: "review",
|
|
@@ -8933,7 +9278,7 @@ function* validCardRuns(text, base22, exemptFractions = true) {
|
|
|
8933
9278
|
let m;
|
|
8934
9279
|
while ((m = re.exec(text)) !== null) {
|
|
8935
9280
|
const digits = m[0].replace(/\D/g, "");
|
|
8936
|
-
const fraction = exemptFractions && isDecimalFraction(text, m.index, digits.length === m[0].length);
|
|
9281
|
+
const fraction = exemptFractions && (isDecimalFraction(text, m.index, digits.length === m[0].length) || isInteriorDotNumber(m[0]));
|
|
8937
9282
|
if (!fraction && validateLuhn(digits)) {
|
|
8938
9283
|
yield { index: m.index, length: m[0].length, digits };
|
|
8939
9284
|
} else {
|
|
@@ -8960,6 +9305,12 @@ function replaceValidCards(text, replace, { exemptFractions = true } = {}) {
|
|
|
8960
9305
|
}
|
|
8961
9306
|
return out;
|
|
8962
9307
|
}
|
|
9308
|
+
function isInteriorDotNumber(run) {
|
|
9309
|
+
const first = run.indexOf(".");
|
|
9310
|
+
if (first <= 0 || first === run.length - 1) return false;
|
|
9311
|
+
if (run.indexOf(".", first + 1) !== -1) return false;
|
|
9312
|
+
return !/[-\s]/.test(run);
|
|
9313
|
+
}
|
|
8963
9314
|
function isDecimalFraction(text, index, unseparated) {
|
|
8964
9315
|
if (!unseparated) return false;
|
|
8965
9316
|
const sep = text[index - 1];
|
|
@@ -10370,7 +10721,7 @@ function* stringLeavesWithKeys(obj, depth = 0, key) {
|
|
|
10370
10721
|
}
|
|
10371
10722
|
for (const [k, v] of Object.entries(obj)) yield* stringLeavesWithKeys(v, depth + 1, k);
|
|
10372
10723
|
}
|
|
10373
|
-
var import_url, import_picomatch, import_safe_regex2, import_picomatch2, import_module, import_picomatch3, import_safe_regex22, import_crypto2, import_crypto3, import_crypto4, import_crypto5, getFilename, __filename2, MAX_REGEX_LENGTH, REGEX_CACHE_MAX, regexCache, aws_default, bash_safe_default, docker_default, filesystem_default, github_default, k8s_default, mongodb_default, postgres_default, project_jail_default, redis_default, finance_default, identity_default, publishing_default, settings_default, branches_default, ACTION_TEMPLATES, ACTION_CHECKS, GAP, prog, httpTo, httpWrite, HTTP_WRITE, HTTP_WRITE_ANY, NOT_STRIPE_TEST, postTo, STRIPE_OBJECTS, APP_SHIELD_SPECS, APP_SHIELDS, APP_SHIELD_NAMES, APP_SERVER_GLOB, GENERAL_ACTION_RULES, REPLACED_SHIELDS, BUILTIN_SHIELDS, SSRF_MAX_HOST, METADATA_ADDRESSES, STRICT_TIERS, METADATA_HOSTNAMES, v4Octets, TIER_REASON, CHECK_TEXT, LEVELS, MODE_VALUES, SOFT, STRICT, BLOCK_ALL, LEVEL_CHECKS, ASI, ASI_IDS, PACK_SHIELD_OWASP, PACK_RULE_OWASP, POSTURE_CATEGORY_OWASP, VERDICTS, CHECK_VERDICT_RANK, CHECK_GROUPS, ALL, BUILTIN_DANGEROUS_WORDS, PRODUCT_CHECKS, SHIELD_RULE_NAME, SHIELD_RULES_FOLDED_INTO_PRODUCT, CHECKS, CHECK_BY_ID, LEGACY_TO_ID, PROJECT_JAIL_BLOCK_READ, OVERRIDE_PREFIX, LABEL_WRAPPERS, LEGACY_READERS, syntax, KINDS, STRUCTS, unknownKinds, INVISIBLE_RE, INVISIBLE_ONE, HOMOGLYPHS, HOMOGLYPH_RE, MAX_BLOBS, MIN_DECODED, BASE64_RUN_RE, HEX_RUN_RE, HEX_ESCAPE_RUN_RE, SYSTEM_AUTH_FILES, SYSTEM_AUTH_DIRS, PASSWORD_HASH_FILES, STARTUP_NAMES, SYSTEM_DIRS, SYSTEM_DIRS_EXEMPT, UPLOAD_SYSTEM_DIRS, AGENT_INSTRUCTION_FILES, AGENT_INSTRUCTION_DIRS, LEGACY_SYSTEM_PATH_RE, MAX_ALTERNATIVES, MAX_CALL_DEPTH, MAX_CALL_WALKS, MAX_XARGS_PAYLOAD, POSITIONAL, MAX_DEPTH, MAX_PAYLOAD_DEPTH, unique, clone, SENDING_STDIN, DOWNLOAD_SHORT_VALUE, DOWNLOAD_LONG_VALUE, DOWNLOAD_OUTPUT_FLAGS, DOWNLOAD_DIR_FLAGS, base, quoteGlob, asWord, ops, MAX_INLINE_CODE, WHAT, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, TABLES, STRING_LITERAL, sharedParser, MESSAGE_FLAGS, SHELL_INTERPRETERS, DOWNLOAD_CMDS, NORMALIZE_CACHE_MAX, normalizeCache, codeBodiesCache, AST_CACHE_MAX, astCache, PARSE_FAIL, INTERPRETER_LINE, PROGRAM_DIR, ACCESS_VIEW_CACHE_MAX, accessViewCache, MAX_READING_PAYLOADS, STDIN_CODE_INTERPRETERS, RUNS_TEXT_ELSEWHERE, defaultExpansionOps, VARIABLE_READERS, FS_READ_TOOLS, GREP_SHAPE, PATTERN_VERBS, PATTERN_VERB_NAMES, GREP_FILE_OPERANDS, READER_VALUE_LETTERS, FILE_OPERAND_FLAGS, SCP_VALUE_FLAGS, CURL_SOURCE_FLAGS, CURL_VALUE_LETTERS, WGET_VALUE_LETTERS, TAR_VALUE_LETTERS, ZIP_VALUE_LETTERS, RSYNC_VALUE_LETTERS, RSYNC_SKIP, CP_VALUE_LETTERS, INSTALL_VALUE_LETTERS, COPY_VERBS, TAR_MODE_WORD, COPY_VERB_HEADS, FS_OP_PRESCREEN_RE, HOME_CACHE_ALLOWLIST, SENSITIVE_PATH_RULES, AST_FS_REGEX_RULES, SQL_DB_CLIS, SQL_DDL_RE, CHMOD_OPEN_PERM_TOKENS, COMMAND_WRAPPERS, INLINE_INTERPRETER, RUNNER_WRAPPERS, _redirStdinOps, _listOps, WRAPPER_TAKES_TARGET, FIND_EXEC_FLAGS, FS_MUTATION_TOOLS, INTERP_LEADING_TARGET, MAX_PAYLOAD_NESTING, payloadNesting, MAX_INLINE_CALLS, INLINE_EXEC_FALLBACK, UNREADABLE_SOURCE, SCRIPT_RUNNERS, SCRIPT_RUNNER_VALUE_FLAGS, MAX_SCRIPT_OPERANDS, NET_BINARIES, VALUE_FLAGS, HOME_VARIABLES, assignmentTable, currentStmtOffset, PAYLOAD_BUDGET, payloadBudget, seenPayloads, UNANALYSABLE_NESTING, ASSIGNMENT_HEADS, andOrOps, MAX_CALL_DEPTH2, MAX_CALL_WALKS2, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, stripDotSlash, REDIR_TRUNCATE_OPS, REDIR_FILE_IN_OPS, REDIR_HEREDOC_OPS, FIND_OPTIONS, COPY_RULE_OF, INDIRECT_SHAPE_RE, SOURCES_FILE_RE, SHELL_SET_VARS, pipeOps, callWords, JAILED_GLOB_NAMES, JAILED_DIR_NAMES, shellGlob, GLOB_META, isReaderWord, positionalAfter, NONE, UNKNOWN, FORBIDDEN_PATH_SEGMENTS, BASH_TOOL_NAMES, MCP_EXECUTORS, BUILTIN_FIELDS, ARGV_FIELDS, BARE_WORD, MAX_ARGV_CHARACTERS, exempt, RANK, SEQUENCE_OPS, BIP39_ENGLISH, BIP39_PUBLIC_VECTORS, indices, lengths, hash, MAX_MNEMONIC_HASHES, SECRET_VIEW_LIMITS, IBAN_LENGTH, IBAN_BBAN_SHAPE, B58, B58_INDEX, XPRV_VERSIONS, B62, CRC32_TABLE, GITHUB_TOKEN_RE, B64URL, B64URL_INDEX, CASK_TWO_ZERO_SUFFIX, CASK_FOUR_ZERO_SUFFIX, CF_ODD, CF_EVEN, SPANISH_LETTERS, HETU_CHARS, VERHOEFF_D, VERHOEFF_P, MAX, UNTRUSTED_TOOLS, INJECTION_SIGNALS, MENTION_QUOTE_RE, MENTION_WORD_RE, ASSIGNMENT_CONTEXT_RE, DLP_STOPWORDS, REFERENCE_VALUE_RE, IDENTIFIER_VALUE_RE, PATH_VALUE_RE, DOTTED_REFERENCE_RE, CONCATENATION_RE, EMAIL_VALUE_RE, FIXTURE_NAME_RE, DERIVATIVE_NAME_RE, QUERY_CREDENTIAL_VALUE_RE, OTP_SECRET_RE, OTP_DOC_SECRETS, ASSIGNED_SECRET_VALUE_RE, ASSIGNED_SECRET_NAME_RE, NAME_KEYWORD_RE, ARN_CONTEXT_RE, CIPHER_KEY_NAME_RE, CIPHER_NAME_PARTS, CIPHER_KEY_VALUE_RE, LARAVEL_KEY_VALUE_RE, SQL_PASSWORD_VALUE_RE, GRAFANA_KEY_VALUE_RE, BASIC_VALUE_RE, BASIC_PAIR_RE, BASIC_HEADER_RE, BASIC_HEADER_PAIR_RE, BASIC_PLACEHOLDER_RE, BASIC_TEMPLATE_MARKERS, DROPBOX_SECRET_RE, OTP_CAPTURE_RE, DB_URL_PASSWORD_RE, DLP_PATTERNS, DLP_PATTERNS_GLOBAL, SENSITIVE_PATH_PATTERNS, SENSITIVE_PATH_REGEXES, MAX_DEPTH2, MAX_STRING_BYTES, MAX_JSON_PARSE_BYTES, DLP_SCAN_LIMITS, BATCH_SEPARATOR, ENCODED_RUN_RE, IMPERATIVE, SECRET_TARGET, GUARD, SIGNALS, DESTINATION_RE, REUSED_SIGNALS, NEVER_NEGATED, NEGATION_BEFORE, RDR_IN, COPY_VERBS2, LITERAL_VERBS, GIT_PRESCREEN_RE, MAX_PAYLOAD_DEPTH2, MAX_ALIAS_DEPTH, CACHE_MAX, cache, PAYLOAD_SHELLS, CONFIG_SCOPE_FLAGS, CONFIG_VALUE_FLAGS, GLOBAL_VALUE_OPTIONS, GLOBAL_FLAG_OPTIONS, MAX_LOOP_ITEMS, GitWalk, POSITIONAL2, FORCE_PUSH, DESTRUCTIVE, UNREADABLE, PUSH_LONG_VALUE, BRANCH_LONG_VALUE, TAG_LONG_VALUE, CLEAN_LONG_VALUE, HOOKS_BYPASS, NO_VERIFY_SUBS, HOOK_KILL_SWITCHES, COMMIT_LONG_VALUE, CHMOD_OPTION_RE, STAGE_ALL, ADD_LONG_VALUE, CHECK_ID, RULE_NAME, INERT_LINE_RE, CHECK_ID2, INSTRUCTION_NAMES, SETTINGS_RE, HOOK_WORDS_RE, SHELLS, NETCATS, NET_CLIENTS, SENDERS, NETCAT_EXEC_LONG, DECL_DUMPS, PROC_ENVIRON_RE, DEV_NET_RE, SOCAT_PROGRAM_RE, SOCAT_NET_RE, PRESCREEN_RE, MAX_PAYLOAD_DEPTH3, CACHE_MAX2, cache2, dupInOp, REVERSE_SHELL_DESCRIPTION, ENV_EXFIL_DESCRIPTION, DYNAMIC_WORD, MULTICALL, SHELL_VALUE_OPTIONS, INTERPRETERS, OutboundWalk, NPM_INSTALL_VERBS, NPM_EXEC_VERBS, PNPM_INSTALL_VERBS, YARN_INSTALL_VERBS, BUN_INSTALL_VERBS, DLX_VERBS, NON_REGISTRY_RE, NPM_NAME_RE, EXACT_SEMVER_RE, NPM_VALUE_FLAGS, PNPM_VALUE_FLAGS, YARN_VALUE_FLAGS, BUN_VALUE_FLAGS, PIP_VALUE_FLAGS, UV_VALUE_FLAGS, POETRY_VALUE_FLAGS, PIPENV_VALUE_FLAGS, PIPX_VALUE_FLAGS, PY_SPEC_RE, PY_EXACT_RE, EXACT_VERSION_RE, GEM_NAME_RE, GEM_VALUE_FLAGS, BUNDLE_VALUE_FLAGS, CRATE_NAME_RE, CARGO_ADD_VALUE_FLAGS, CARGO_INSTALL_VALUE_FLAGS, GO_VALUE_FLAGS, GO_PATH_RE, NUGET_NAME_RE, DOTNET_ADD_VALUE_FLAGS, DOTNET_TOOL_VALUE_FLAGS, NUGET_VALUE_FLAGS, MAVEN_COORD_RE, COMPOSER_NAME_RE, COMPOSER_VALUE_FLAGS, EDITOR_HEADS, EXTENSION_ID_RE, MANAGER_HEADS, SHELLS2, MAX_NESTING, SHELL_VALUE_FLAGS, NPM_FAMILY, PIP_FAMILY, NPM_FETCH_VERBS, PIP_FETCH_VERBS, NPM_FLAGS, PIP_FLAGS, NPM_VARS, PIP_VARS, PRESCREEN_RE2, PIP_ATTACHED_RE, MAX_PAYLOAD_DEPTH4, PUBLIC_REGISTRY_HOSTS, TUNING_FIELDS, MAP_GOVERNED, KNOB_GOVERNED, CONFIGURABLE_CHECK_IDS, DEFAULT_EGRESS_ALLOWLIST, PRIVATE_HOST_SUFFIXES, SOURCE_COMMANDS, SINK_COMMANDS, OBFUSCATORS, SENSITIVE_PATTERNS, FLAGS_WITH_VALUES, DESTINATION_ARGS, MCP_DESTINATION_KEYS, ARGUMENT_SCAN_LIMITS, RUN_CHAR, runChar, VERDICT_RANK, SQL_DML_KEYWORDS, MAX_DESTINATIONS, MAX_SCAN_CHARS, EMAIL_RE, URL_RE, IBAN_RE, RECIPIENT_KEYS, DESTRUCTIVE_VERB_RE, PII_EMAIL_RE, PII_SSN_RE, PII_PHONE_RE, PII_CC16_RE, PII_CC15_RE, PII_CC14_RE, PII_CC13_RE, PII_CC19_RE, CARD_PATTERNS, PII_ROUTING_RE, ROUTING_LABEL_RE, ROUTING_LABEL_WINDOW, NATIONAL_ID_SHAPES, NATIONAL_ID_LABEL_RE, NATIONAL_ID_LABEL_CS_RE, idLabelIn, NATIONAL_ID_LABEL_WINDOW, NATIONAL_ID_GUARD_RE, PII_IBAN_RE, REALTIME_PII_PATTERNS, MAX_PII_SCAN_BYTES, IBAN_DESTINATION_KEYS, WHOLE_IBAN_RE, JSON_ESCAPE_RE, JSON_ESCAPES, MASKED_KINDS, ENTRY_RE, IBAN_TEXT_RE, EMAIL_TEXT_RE, ACCOUNT_KEY_RE, ACCOUNT_VALUE_RE, MAX_MASK_DEPTH, EMPTY, CURL_SEND_FLAGS, WGET_SEND_FLAGS, IWR_SEND_FLAGS, WRITE_METHODS, GH_READ, GH_WRITE, GH_HOSTNAME_FLAGS, GH_REPO_VALUE_FLAGS, GH_API_VALUE_FLAGS, GIT_FETCH, PUBLISH, SHELLS3, OWN_HEADS, MAX_DEPTH3, CWD_CHANGERS, TERMINAL_ESCAPE_RE, CONTROL_CHAR_RE, SHIELD_RULE, ACTION_RULE, LOOP_MAX_RECORDS, FINDING_TO_SIGNAL, SCAN_SIGNAL_WEIGHTS, LOOP_THRESHOLD_FOR_WASTE, MAX_BLAST_PATH, DESTRUCTIVE_OP_RE, SENSITIVE_PATH_RE, FILE_TOOLS, CANARY_MIN_LENGTH, MAX_TEXT, MAX_DEPTH4, MAX_JSON_PARSE, URL_DEPTH, B64_DEPTH, MIN_SEGMENT, SEPARATORS, stripSeparators, looksText, CANARY_DECODERS, VIEWS, LONG_OUTPUT_THRESHOLD_BYTES, CANONICAL_EXTRACTOR_VERSION, DEDUPE_PREVIEW_LEN, ENGINE_VERSION;
|
|
10724
|
+
var import_url, import_picomatch, import_safe_regex2, import_picomatch2, import_module, import_picomatch3, import_safe_regex22, import_crypto2, import_crypto3, import_crypto4, import_crypto5, getFilename, __filename2, MAX_REGEX_LENGTH, REGEX_CACHE_MAX, regexCache, aws_default, bash_safe_default, docker_default, filesystem_default, github_default, k8s_default, mongodb_default, postgres_default, project_jail_default, redis_default, finance_default, identity_default, publishing_default, settings_default, branches_default, ACTION_TEMPLATES, ACTION_CHECKS, GAP, prog, httpTo, httpWrite, HTTP_WRITE, HTTP_WRITE_ANY, NOT_STRIPE_TEST, postTo, STRIPE_OBJECTS, APP_SHIELD_SPECS, APP_SHIELDS, APP_SHIELD_NAMES, APP_SERVER_GLOB, GENERAL_ACTION_RULES, REPLACED_SHIELDS, BUILTIN_SHIELDS, SSRF_MAX_HOST, METADATA_ADDRESSES, STRICT_TIERS, METADATA_HOSTNAMES, v4Octets, TIER_REASON, CHECK_TEXT, LEVELS, MODE_VALUES, SOFT, STRICT, BLOCK_ALL, LEVEL_CHECKS, ASI, ASI_IDS, PACK_SHIELD_OWASP, PACK_RULE_OWASP, POSTURE_CATEGORY_OWASP, VERDICTS, CHECK_VERDICT_RANK, CHECK_GROUPS, ALL, BUILTIN_DANGEROUS_WORDS, PRODUCT_CHECKS, SHIELD_RULE_NAME, SHIELD_RULES_FOLDED_INTO_PRODUCT, CHECKS, CHECK_BY_ID, LEGACY_TO_ID, PROJECT_JAIL_BLOCK_READ, OVERRIDE_PREFIX, LABEL_WRAPPERS, LEGACY_READERS, syntax, KINDS, STRUCTS, unknownKinds, INVISIBLE_RE, INVISIBLE_ONE, HOMOGLYPHS, HOMOGLYPH_RE, MAX_BLOBS, MIN_DECODED, BASE64_RUN_RE, HEX_RUN_RE, HEX_ESCAPE_RUN_RE, SYSTEM_AUTH_FILES, SYSTEM_AUTH_DIRS, PASSWORD_HASH_FILES, STARTUP_NAMES, SYSTEM_DIRS, SYSTEM_DIRS_EXEMPT, UPLOAD_SYSTEM_DIRS, AGENT_INSTRUCTION_FILES, AGENT_INSTRUCTION_DIRS, LEGACY_SYSTEM_PATH_RE, MAX_ALTERNATIVES, MAX_CALL_DEPTH, MAX_CALL_WALKS, MAX_XARGS_PAYLOAD, POSITIONAL, MAX_DEPTH, MAX_PAYLOAD_DEPTH, unique, clone, SENDING_STDIN, DOWNLOAD_SHORT_VALUE, DOWNLOAD_LONG_VALUE, DOWNLOAD_OUTPUT_FLAGS, DOWNLOAD_DIR_FLAGS, base, quoteGlob, asWord, ops, MAX_INLINE_CODE, WHAT, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, TABLES, STRING_LITERAL, sharedParser, MESSAGE_FLAGS, SHELL_INTERPRETERS, DOWNLOAD_CMDS, NORMALIZE_CACHE_MAX, normalizeCache, codeBodiesCache, AST_CACHE_MAX, astCache, PARSE_FAIL, INTERPRETER_LINE, PROGRAM_DIR, ACCESS_VIEW_CACHE_MAX, accessViewCache, MAX_READING_PAYLOADS, STDIN_CODE_INTERPRETERS, RUNS_TEXT_ELSEWHERE, defaultExpansionOps, EMPTY_NAMES, VARIABLE_READERS, PLAIN_PROGRAM_NAME, FS_READ_TOOLS, GREP_SHAPE, PATTERN_VERBS, PATTERN_VERB_NAMES, GREP_FILE_OPERANDS, READER_VALUE_LETTERS, FILE_OPERAND_FLAGS, SCP_VALUE_FLAGS, CURL_SOURCE_FLAGS, CURL_VALUE_LETTERS, WGET_VALUE_LETTERS, TAR_VALUE_LETTERS, ZIP_VALUE_LETTERS, RSYNC_VALUE_LETTERS, RSYNC_SKIP, CP_VALUE_LETTERS, INSTALL_VALUE_LETTERS, COPY_VERBS, TAR_MODE_WORD, COPY_VERB_HEADS, FS_OP_PRESCREEN_RE, HOME_CACHE_ALLOWLIST, SENSITIVE_PATH_RULES, AST_FS_REGEX_RULES, SQL_DB_CLIS, SQL_DDL_RE, CHMOD_OPEN_PERM_TOKENS, COMMAND_WRAPPERS, INLINE_INTERPRETER, RUNNER_WRAPPERS, _redirStdinOps, _listOps, WRAPPER_TAKES_TARGET, FIND_EXEC_FLAGS, FS_MUTATION_TOOLS, INTERP_LEADING_TARGET, MAX_PAYLOAD_NESTING, payloadNesting, MAX_INLINE_CALLS, INLINE_EXEC_FALLBACK, UNREADABLE_SOURCE, SCRIPT_RUNNERS, SCRIPT_RUNNER_VALUE_FLAGS, MAX_SCRIPT_OPERANDS, NET_BINARIES, VALUE_FLAGS, HOME_VARIABLES, assignmentTable, currentStmtOffset, PAYLOAD_BUDGET, payloadBudget, seenPayloads, UNANALYSABLE_NESTING, ASSIGNMENT_HEADS, andOrOps, ARRAY_MARK, ARRAY_SEP, MAX_CALL_DEPTH2, MAX_CALL_WALKS2, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, stripDotSlash, REDIR_TRUNCATE_OPS, REDIR_FILE_IN_OPS, REDIR_HEREDOC_OPS, FIND_OPTIONS, COPY_RULE_OF, INDIRECT_SHAPE_RE, SOURCES_FILE_RE, SHELL_SET_VARS, pipeOps, callWords, JAILED_GLOB_NAMES, JAILED_DIR_NAMES, shellGlob, GLOB_META, isReaderWord, positionalAfter, NONE, UNKNOWN, FORBIDDEN_PATH_SEGMENTS, BASH_TOOL_NAMES, MCP_EXECUTORS, BUILTIN_FIELDS, ARGV_FIELDS, BARE_WORD, MAX_ARGV_CHARACTERS, exempt, RANK, SEQUENCE_OPS, BIP39_ENGLISH, BIP39_PUBLIC_VECTORS, indices, lengths, hash, MAX_MNEMONIC_HASHES, SECRET_VIEW_LIMITS, IBAN_LENGTH, IBAN_BBAN_SHAPE, B58, B58_INDEX, XPRV_VERSIONS, B62, CRC32_TABLE, GITHUB_TOKEN_RE, B64URL, B64URL_INDEX, CASK_TWO_ZERO_SUFFIX, CASK_FOUR_ZERO_SUFFIX, CF_ODD, CF_EVEN, SPANISH_LETTERS, HETU_CHARS, VERHOEFF_D, VERHOEFF_P, MAX, UNTRUSTED_TOOLS, INJECTION_SIGNALS, MENTION_QUOTE_RE, MENTION_WORD_RE, ASSIGNMENT_CONTEXT_RE, DLP_STOPWORDS, REFERENCE_VALUE_RE, IDENTIFIER_VALUE_RE, PATH_VALUE_RE, DOTTED_REFERENCE_RE, CONCATENATION_RE, EMAIL_VALUE_RE, FIXTURE_NAME_RE, DERIVATIVE_NAME_RE, QUERY_CREDENTIAL_VALUE_RE, OTP_SECRET_RE, OTP_DOC_SECRETS, ASSIGNED_SECRET_VALUE_RE, ASSIGNED_SECRET_NAME_RE, NAME_KEYWORD_RE, ARN_CONTEXT_RE, CIPHER_KEY_NAME_RE, CIPHER_NAME_PARTS, CIPHER_KEY_VALUE_RE, LARAVEL_KEY_VALUE_RE, SQL_PASSWORD_VALUE_RE, GRAFANA_KEY_VALUE_RE, BASIC_VALUE_RE, BASIC_PAIR_RE, BASIC_HEADER_RE, BASIC_HEADER_PAIR_RE, BASIC_PLACEHOLDER_RE, BASIC_TEMPLATE_MARKERS, DROPBOX_SECRET_RE, OTP_CAPTURE_RE, DB_URL_PASSWORD_RE, DLP_PATTERNS, DLP_PATTERNS_GLOBAL, SENSITIVE_PATH_PATTERNS, SENSITIVE_PATH_REGEXES, MAX_DEPTH2, MAX_STRING_BYTES, MAX_JSON_PARSE_BYTES, DLP_SCAN_LIMITS, BATCH_SEPARATOR, ENCODED_RUN_RE, IMPERATIVE, SECRET_TARGET, GUARD, SIGNALS, DESTINATION_RE, REUSED_SIGNALS, NEVER_NEGATED, NEGATION_BEFORE, RDR_IN, COPY_VERBS2, LITERAL_VERBS, GIT_PRESCREEN_RE, MAX_PAYLOAD_DEPTH2, MAX_ALIAS_DEPTH, CACHE_MAX, cache, PAYLOAD_SHELLS, CONFIG_SCOPE_FLAGS, CONFIG_VALUE_FLAGS, GLOBAL_VALUE_OPTIONS, GLOBAL_FLAG_OPTIONS, MAX_LOOP_ITEMS, GitWalk, POSITIONAL2, NO_VARS, NO_APPENDS, FORCE_PUSH, DESTRUCTIVE, UNREADABLE, PUSH_LONG_VALUE, BRANCH_LONG_VALUE, TAG_LONG_VALUE, CLEAN_LONG_VALUE, RESTORE_LONG_VALUE, CHECKOUT_LONG_VALUE, HOOKS_BYPASS, NO_VERIFY_SUBS, HOOK_KILL_SWITCHES, COMMIT_LONG_VALUE, CHMOD_OPTION_RE, _appendOp, STAGE_ALL, ADD_LONG_VALUE, CHECK_ID, RULE_NAME, INERT_LINE_RE, CHECK_ID2, INSTRUCTION_NAMES, SETTINGS_RE, HOOK_WORDS_RE, SHELLS, NETCATS, NET_CLIENTS, SENDERS, NETCAT_EXEC_LONG, DECL_DUMPS, PROC_ENVIRON_RE, DEV_NET_RE, SOCAT_PROGRAM_RE, SOCAT_NET_RE, PRESCREEN_RE, MAX_PAYLOAD_DEPTH3, CACHE_MAX2, cache2, dupInOp, REVERSE_SHELL_DESCRIPTION, ENV_EXFIL_DESCRIPTION, DYNAMIC_WORD, MULTICALL, SHELL_VALUE_OPTIONS, INTERPRETERS, OutboundWalk, NPM_INSTALL_VERBS, NPM_EXEC_VERBS, PNPM_INSTALL_VERBS, YARN_INSTALL_VERBS, BUN_INSTALL_VERBS, DLX_VERBS, NON_REGISTRY_RE, NPM_NAME_RE, EXACT_SEMVER_RE, NPM_VALUE_FLAGS, PNPM_VALUE_FLAGS, YARN_VALUE_FLAGS, BUN_VALUE_FLAGS, PIP_VALUE_FLAGS, UV_VALUE_FLAGS, POETRY_VALUE_FLAGS, PIPENV_VALUE_FLAGS, PIPX_VALUE_FLAGS, PY_SPEC_RE, PY_EXACT_RE, EXACT_VERSION_RE, GEM_NAME_RE, GEM_VALUE_FLAGS, BUNDLE_VALUE_FLAGS, CRATE_NAME_RE, CARGO_ADD_VALUE_FLAGS, CARGO_INSTALL_VALUE_FLAGS, GO_VALUE_FLAGS, GO_PATH_RE, NUGET_NAME_RE, DOTNET_ADD_VALUE_FLAGS, DOTNET_TOOL_VALUE_FLAGS, NUGET_VALUE_FLAGS, MAVEN_COORD_RE, COMPOSER_NAME_RE, COMPOSER_VALUE_FLAGS, EDITOR_HEADS, EXTENSION_ID_RE, MANAGER_HEADS, SHELLS2, MAX_NESTING, SHELL_VALUE_FLAGS, NPM_FAMILY, PIP_FAMILY, NPM_FETCH_VERBS, PIP_FETCH_VERBS, NPM_FLAGS, PIP_FLAGS, NPM_VARS, PIP_VARS, PRESCREEN_RE2, PIP_ATTACHED_RE, MAX_PAYLOAD_DEPTH4, PUBLIC_REGISTRY_HOSTS, TUNING_FIELDS, MAP_GOVERNED, KNOB_GOVERNED, CONFIGURABLE_CHECK_IDS, DEFAULT_EGRESS_ALLOWLIST, PRIVATE_HOST_SUFFIXES, SOURCE_COMMANDS, SINK_COMMANDS, OBFUSCATORS, SENSITIVE_PATTERNS, FLAGS_WITH_VALUES, DESTINATION_ARGS, MCP_DESTINATION_KEYS, ARGUMENT_SCAN_LIMITS, RUN_CHAR, runChar, VERDICT_RANK, SQL_DML_KEYWORDS, MAX_DESTINATIONS, MAX_SCAN_CHARS, EMAIL_RE, URL_RE, IBAN_RE, RECIPIENT_KEYS, DESTRUCTIVE_VERB_RE, PII_EMAIL_RE, PII_SSN_RE, PII_PHONE_RE, PII_CC16_RE, PII_CC15_RE, PII_CC14_RE, PII_CC13_RE, PII_CC19_RE, CARD_PATTERNS, PII_ROUTING_RE, ROUTING_LABEL_RE, ROUTING_LABEL_WINDOW, NATIONAL_ID_SHAPES, NATIONAL_ID_LABEL_RE, NATIONAL_ID_LABEL_CS_RE, idLabelIn, NATIONAL_ID_LABEL_WINDOW, NATIONAL_ID_GUARD_RE, PII_IBAN_RE, REALTIME_PII_PATTERNS, MAX_PII_SCAN_BYTES, IBAN_DESTINATION_KEYS, WHOLE_IBAN_RE, JSON_ESCAPE_RE, JSON_ESCAPES, MASKED_KINDS, ENTRY_RE, IBAN_TEXT_RE, EMAIL_TEXT_RE, ACCOUNT_KEY_RE, ACCOUNT_VALUE_RE, MAX_MASK_DEPTH, EMPTY, CURL_SEND_FLAGS, WGET_SEND_FLAGS, IWR_SEND_FLAGS, WRITE_METHODS, GH_READ, GH_WRITE, GH_HOSTNAME_FLAGS, GH_REPO_VALUE_FLAGS, GH_API_VALUE_FLAGS, GIT_FETCH, PUBLISH, SHELLS3, OWN_HEADS, MAX_DEPTH3, CWD_CHANGERS, TERMINAL_ESCAPE_RE, CONTROL_CHAR_RE, SHIELD_RULE, ACTION_RULE, LOOP_MAX_RECORDS, FINDING_TO_SIGNAL, SCAN_SIGNAL_WEIGHTS, LOOP_THRESHOLD_FOR_WASTE, MAX_BLAST_PATH, DESTRUCTIVE_OP_RE, SENSITIVE_PATH_RE, FILE_TOOLS, CANARY_MIN_LENGTH, MAX_TEXT, MAX_DEPTH4, MAX_JSON_PARSE, URL_DEPTH, B64_DEPTH, MIN_SEGMENT, SEPARATORS, stripSeparators, looksText, CANARY_DECODERS, VIEWS, LONG_OUTPUT_THRESHOLD_BYTES, CANONICAL_EXTRACTOR_VERSION, DEDUPE_PREVIEW_LEN, ENGINE_VERSION;
|
|
10374
10725
|
var init_dist = __esm({
|
|
10375
10726
|
"packages/policy-engine/dist/index.mjs"() {
|
|
10376
10727
|
"use strict";
|
|
@@ -13684,6 +14035,7 @@ var init_dist = __esm({
|
|
|
13684
14035
|
"sqlite3"
|
|
13685
14036
|
]);
|
|
13686
14037
|
defaultExpansionOps = null;
|
|
14038
|
+
EMPTY_NAMES = /* @__PURE__ */ new Set();
|
|
13687
14039
|
VARIABLE_READERS = /* @__PURE__ */ new Set([
|
|
13688
14040
|
"read",
|
|
13689
14041
|
"mapfile",
|
|
@@ -13696,6 +14048,7 @@ var init_dist = __esm({
|
|
|
13696
14048
|
"readonly",
|
|
13697
14049
|
"printf"
|
|
13698
14050
|
]);
|
|
14051
|
+
PLAIN_PROGRAM_NAME = /^[A-Za-z_][\w.+-]*$/;
|
|
13699
14052
|
FS_READ_TOOLS = /* @__PURE__ */ new Set([
|
|
13700
14053
|
"cat",
|
|
13701
14054
|
"less",
|
|
@@ -14590,6 +14943,8 @@ var init_dist = __esm({
|
|
|
14590
14943
|
AND_OR_OPS: new Set([and, or].filter((o) => o !== null))
|
|
14591
14944
|
};
|
|
14592
14945
|
});
|
|
14946
|
+
ARRAY_MARK = "array";
|
|
14947
|
+
ARRAY_SEP = "";
|
|
14593
14948
|
MAX_CALL_DEPTH2 = 4;
|
|
14594
14949
|
MAX_CALL_WALKS2 = 256;
|
|
14595
14950
|
callDepth = 0;
|
|
@@ -17927,7 +18282,22 @@ zoo`.split("\n");
|
|
|
17927
18282
|
found;
|
|
17928
18283
|
/** Aliases defined earlier in this command: name -> value (null = dynamic). */
|
|
17929
18284
|
aliases = /* @__PURE__ */ new Map();
|
|
18285
|
+
/** node9Firewall#385: variables assigned a tree-top word (`scope="$PWD"`,
|
|
18286
|
+
* `root=$(git rev-parse --show-toplevel)`, `DIR=$(pwd)`), so the
|
|
18287
|
+
* variable reads as the top where it is used. */
|
|
18288
|
+
treeTopVars = /* @__PURE__ */ new Set();
|
|
18289
|
+
/** node9Firewall#385 (c): a string a script builds with `+=` from
|
|
18290
|
+
* literals (`mode=--ha; mode+=rd`). The jail's table does not follow an
|
|
18291
|
+
* append (JAIL-14a); the git rules read the built word, since a flag
|
|
18292
|
+
* spelled in two halves is still that flag. name -> value, null once a
|
|
18293
|
+
* half is unknown. */
|
|
18294
|
+
appended = /* @__PURE__ */ new Map();
|
|
17930
18295
|
payloads = /* @__PURE__ */ new Set();
|
|
18296
|
+
/** node9Firewall#385 (a): the text this command writes to each path
|
|
18297
|
+
* (`cat > /tmp/x.sh <<'SH' ... SH`, `echo '...' > f`, `>>` appends), so
|
|
18298
|
+
* a later statement that runs the path (`bash f`, `sh f`, `./f`) is
|
|
18299
|
+
* judged on what it runs. null once a write to the path is unknown. */
|
|
18300
|
+
written = /* @__PURE__ */ new Map();
|
|
17931
18301
|
/** `for NAME in a b c`: the literal items, or null when one is dynamic. */
|
|
17932
18302
|
loopVars = /* @__PURE__ */ new Map();
|
|
17933
18303
|
/** Walk one command string. Returns false when it did not parse. */
|
|
@@ -17946,6 +18316,25 @@ zoo`.split("\n");
|
|
|
17946
18316
|
const type = n.kind;
|
|
17947
18317
|
if (type === "Stmt") {
|
|
17948
18318
|
this.visitHeredocShell(n, depth);
|
|
18319
|
+
this.visitPipeline(n, depth);
|
|
18320
|
+
this.visitHookWrite(n);
|
|
18321
|
+
this.recordScriptWrite(n);
|
|
18322
|
+
this.visitWrittenScript(n, depth);
|
|
18323
|
+
return true;
|
|
18324
|
+
}
|
|
18325
|
+
if (type === "Assign" && n.Name?.Value && n.Value) {
|
|
18326
|
+
const name = n.Name.Value;
|
|
18327
|
+
if (n.Append) {
|
|
18328
|
+
const prev = this.appended.has(name) ? this.appended.get(name) : resolveWordLiteral(n.Value) === null ? null : void 0;
|
|
18329
|
+
const base22 = prev === void 0 ? recordedExpansion(name) : prev;
|
|
18330
|
+
const piece = resolveWordLiteral(n.Value);
|
|
18331
|
+
this.appended.set(name, typeof base22 === "string" && piece !== null ? base22 + piece : null);
|
|
18332
|
+
this.treeTopVars.delete(name);
|
|
18333
|
+
return true;
|
|
18334
|
+
}
|
|
18335
|
+
this.appended.delete(name);
|
|
18336
|
+
if (treeTopWord(n.Value, this.treeTopVars)) this.treeTopVars.add(name);
|
|
18337
|
+
else this.treeTopVars.delete(name);
|
|
17949
18338
|
return true;
|
|
17950
18339
|
}
|
|
17951
18340
|
if (type === "ForClause") {
|
|
@@ -17974,13 +18363,13 @@ zoo`.split("\n");
|
|
|
17974
18363
|
const param = plainParamName(rawArgs[loopArg]);
|
|
17975
18364
|
for (const item of this.loopVars.get(param.name)) {
|
|
17976
18365
|
const words2 = rawArgs.flatMap(
|
|
17977
|
-
(a, i) => i === loopArg ? param.quoted ? [item] : splitFields(item) : resolveGitWords(a)
|
|
18366
|
+
(a, i) => i === loopArg ? param.quoted ? [item] : splitFields(item) : resolveGitWords(a, this.treeTopVars, this.appended)
|
|
17978
18367
|
);
|
|
17979
18368
|
this.visitWords(words2, new Map(prefixEnv), depth, false);
|
|
17980
18369
|
}
|
|
17981
18370
|
return true;
|
|
17982
18371
|
}
|
|
17983
|
-
const words = rawArgs.flatMap((a) => resolveGitWords(a));
|
|
18372
|
+
const words = rawArgs.flatMap((a) => resolveGitWords(a, this.treeTopVars, this.appended));
|
|
17984
18373
|
this.visitWords(words, prefixEnv, depth, false);
|
|
17985
18374
|
return true;
|
|
17986
18375
|
}
|
|
@@ -18005,6 +18394,23 @@ zoo`.split("\n");
|
|
|
18005
18394
|
if (f) this.found(f);
|
|
18006
18395
|
return;
|
|
18007
18396
|
}
|
|
18397
|
+
if (headWord === "rm" || headWord === "unlink") {
|
|
18398
|
+
if (words.slice(head + 1).some((w) => w !== null && isLiveHookFile(w)))
|
|
18399
|
+
this.found(hooksBypassed(shownOf(words)));
|
|
18400
|
+
return;
|
|
18401
|
+
}
|
|
18402
|
+
if (headWord === "mv") {
|
|
18403
|
+
const operands2 = words.slice(head + 1).filter((w) => w === null || !w.startsWith("-"));
|
|
18404
|
+
const src = operands2[0];
|
|
18405
|
+
if (typeof src === "string" && isLiveHookFile(src)) this.found(hooksBypassed(shownOf(words)));
|
|
18406
|
+
return;
|
|
18407
|
+
}
|
|
18408
|
+
if (headWord === "perl") {
|
|
18409
|
+
const code2 = words.slice(head + 1).find((w) => w !== null && /\brename\b/.test(w));
|
|
18410
|
+
const m = code2 ? /rename\s*\(?\s*q[qw]?\s*[(\[{<'"]([^)\]}>'"]+)/.exec(code2) : null;
|
|
18411
|
+
if (m && isLiveHookFile(m[1])) this.found(hooksBypassed(shownOf(words)));
|
|
18412
|
+
return;
|
|
18413
|
+
}
|
|
18008
18414
|
if (depth < MAX_PAYLOAD_DEPTH2) {
|
|
18009
18415
|
const payload = literalShellPayload(words, baseWord(words[0]));
|
|
18010
18416
|
if (payload !== null) this.runPayload(payload, depth);
|
|
@@ -18015,6 +18421,127 @@ zoo`.split("\n");
|
|
|
18015
18421
|
this.payloads.add(payload);
|
|
18016
18422
|
this.run(payload, depth + 1);
|
|
18017
18423
|
}
|
|
18424
|
+
/**
|
|
18425
|
+
* node9Firewall#385: a pipeline whose last stage reads its pathspec from
|
|
18426
|
+
* stdin (`git add --pathspec-from-file=-`) or runs git over the names it
|
|
18427
|
+
* is fed (`xargs -0 git add --`), with a producer that is one literal
|
|
18428
|
+
* (`git rev-parse --show-toplevel`, `printf '%s\0' .`): the literal is
|
|
18429
|
+
* the operand, and the call is judged with it.
|
|
18430
|
+
*/
|
|
18431
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18432
|
+
visitPipeline(stmt, depth) {
|
|
18433
|
+
const cmd = stmt.Cmd;
|
|
18434
|
+
if (!cmd || cmd.kind !== "BinaryCmd" || !isPipeOp(cmd.Op)) return;
|
|
18435
|
+
const stages = [];
|
|
18436
|
+
let cur = cmd;
|
|
18437
|
+
while (cur?.kind === "BinaryCmd" && isPipeOp(cur.Op)) {
|
|
18438
|
+
stages.unshift(cur.Y);
|
|
18439
|
+
const left = cur.X;
|
|
18440
|
+
if (left?.Cmd?.kind === "BinaryCmd" && isPipeOp(left.Cmd.Op)) cur = left.Cmd;
|
|
18441
|
+
else {
|
|
18442
|
+
stages.unshift(left);
|
|
18443
|
+
break;
|
|
18444
|
+
}
|
|
18445
|
+
}
|
|
18446
|
+
if (stages.length < 2) return;
|
|
18447
|
+
const producer = stages[stages.length - 2]?.Cmd;
|
|
18448
|
+
const consumer = stages[stages.length - 1]?.Cmd;
|
|
18449
|
+
if (!producer || !consumer || producer.kind !== "CallExpr" || consumer.kind !== "CallExpr")
|
|
18450
|
+
return;
|
|
18451
|
+
const fed = producedLiteral(producer);
|
|
18452
|
+
if (fed === null) return;
|
|
18453
|
+
const words = (consumer.Args || []).flatMap(
|
|
18454
|
+
(a) => resolveGitWords(a, this.treeTopVars, this.appended)
|
|
18455
|
+
);
|
|
18456
|
+
const head = unwrapCommandHead(words);
|
|
18457
|
+
const viaXargs = words.slice(0, head).some((w) => baseWord(w) === "xargs");
|
|
18458
|
+
const fromFile = words.findIndex(
|
|
18459
|
+
(w) => w === "--pathspec-from-file=-" || w === "--pathspec-from-file"
|
|
18460
|
+
);
|
|
18461
|
+
if (!viaXargs && fromFile < 0) return;
|
|
18462
|
+
let fedWords;
|
|
18463
|
+
if (fromFile >= 0) {
|
|
18464
|
+
fedWords = words.filter(
|
|
18465
|
+
(w, k) => !(k === fromFile || w === "-" && words[k - 1] === "--pathspec-from-file")
|
|
18466
|
+
);
|
|
18467
|
+
fedWords.push(fed);
|
|
18468
|
+
} else fedWords = [...words, fed];
|
|
18469
|
+
this.visitWords(fedWords, /* @__PURE__ */ new Map(), depth, false);
|
|
18470
|
+
}
|
|
18471
|
+
/**
|
|
18472
|
+
* node9Firewall#385 (e): a hook file written with a body that checks
|
|
18473
|
+
* nothing (`cat > .githooks/pre-commit <<'SH' exit 0 SH`, `echo 'exit 0'
|
|
18474
|
+
* > .git/hooks/pre-push`, `: > .githooks/pre-commit`). A real body (a
|
|
18475
|
+
* test, a linter) is ordinary work on the hooks.
|
|
18476
|
+
*/
|
|
18477
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18478
|
+
visitHookWrite(stmt) {
|
|
18479
|
+
const cmd = stmt.Cmd;
|
|
18480
|
+
if (!cmd || cmd.kind !== "CallExpr") return;
|
|
18481
|
+
const redirs = stmt.Redirs || [];
|
|
18482
|
+
const target = redirs.find((r) => r?.Word && !r.Hdoc && (r.N == null || r.N.Value === "1"));
|
|
18483
|
+
if (!target) return;
|
|
18484
|
+
const path210 = resolveWordLiteral(target.Word);
|
|
18485
|
+
if (path210 === null || !isLiveHookFile(path210)) return;
|
|
18486
|
+
const hdoc = redirs.find((r) => r?.Hdoc);
|
|
18487
|
+
const words = (cmd.Args || []).map((a) => resolveWordLiteral(a));
|
|
18488
|
+
const head = baseWord(words[0]);
|
|
18489
|
+
let body = null;
|
|
18490
|
+
if (hdoc) body = resolveWordLiteral(hdoc.Hdoc);
|
|
18491
|
+
else if (head === ":" || head === "true" || words.length === 0) body = "";
|
|
18492
|
+
else if (head === "echo" || head === "printf") {
|
|
18493
|
+
const rest = words.slice(1);
|
|
18494
|
+
body = rest.some((w) => w === null) ? null : rest.filter((w) => !/^-[neE]+$/.test(w)).join(" ");
|
|
18495
|
+
if (body !== null) body = body.replace(/\\n/g, "\n");
|
|
18496
|
+
}
|
|
18497
|
+
if (body !== null && hookBodyIsEmpty(body)) this.found(hooksBypassed(shownOf(words)));
|
|
18498
|
+
}
|
|
18499
|
+
/** A statement that writes a literal text to a path, by redirect. */
|
|
18500
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18501
|
+
recordScriptWrite(stmt) {
|
|
18502
|
+
const cmd = stmt.Cmd;
|
|
18503
|
+
if (!cmd || cmd.kind !== "CallExpr") return;
|
|
18504
|
+
const redirs = stmt.Redirs || [];
|
|
18505
|
+
const target = redirs.find((r) => r?.Word && !r.Hdoc && (r.N == null || r.N.Value === "1"));
|
|
18506
|
+
if (!target) return;
|
|
18507
|
+
const path210 = resolveWordLiteral(target.Word);
|
|
18508
|
+
if (path210 === null) return;
|
|
18509
|
+
const append = /^>>/.test(target.Op?.toString() ?? "") || redirOpIsAppend(target);
|
|
18510
|
+
const hdoc = redirs.find((r) => r?.Hdoc);
|
|
18511
|
+
const words = (cmd.Args || []).map((a) => resolveWordLiteral(a));
|
|
18512
|
+
const head = baseWord(words[0]);
|
|
18513
|
+
let text = null;
|
|
18514
|
+
if (hdoc && (head === "cat" || head === "tee")) text = resolveWordLiteral(hdoc.Hdoc);
|
|
18515
|
+
else if (head === "echo" || head === "printf") {
|
|
18516
|
+
const rest = words.slice(1);
|
|
18517
|
+
text = rest.some((w) => w === null) ? null : rest.filter((w) => !/^-[neE]+$/.test(w)).join(" ");
|
|
18518
|
+
if (text !== null && head === "printf") text = text.replace(/\\n/g, "\n");
|
|
18519
|
+
} else return;
|
|
18520
|
+
const prev = this.written.get(path210);
|
|
18521
|
+
if (text === null || append && prev === null) this.written.set(path210, null);
|
|
18522
|
+
else this.written.set(path210, append && typeof prev === "string" ? `${prev}
|
|
18523
|
+
${text}` : text);
|
|
18524
|
+
}
|
|
18525
|
+
/** A statement that runs a path this command wrote: the text is the script. */
|
|
18526
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18527
|
+
visitWrittenScript(stmt, depth) {
|
|
18528
|
+
const cmd = stmt.Cmd;
|
|
18529
|
+
if (!cmd || cmd.kind !== "CallExpr" || this.written.size === 0 || depth >= MAX_PAYLOAD_DEPTH2)
|
|
18530
|
+
return;
|
|
18531
|
+
const words = (cmd.Args || []).map((a) => resolveWordLiteral(a));
|
|
18532
|
+
const head = unwrapCommandHead(words);
|
|
18533
|
+
const name = baseWord(words[head]);
|
|
18534
|
+
let ran = null;
|
|
18535
|
+
if (PAYLOAD_SHELLS.has(name) && name !== "eval") {
|
|
18536
|
+
const operand = words.slice(head + 1).find((w) => w === null || !w.startsWith("-"));
|
|
18537
|
+
if (typeof operand === "string") ran = operand;
|
|
18538
|
+
} else if (typeof words[head] === "string" && this.written.has(words[head])) {
|
|
18539
|
+
ran = words[head];
|
|
18540
|
+
}
|
|
18541
|
+
if (ran === null) return;
|
|
18542
|
+
const text = this.written.get(ran);
|
|
18543
|
+
if (typeof text === "string") this.runPayload(text, depth);
|
|
18544
|
+
}
|
|
18018
18545
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18019
18546
|
visitHeredocShell(stmt, depth) {
|
|
18020
18547
|
const cmd = stmt.Cmd;
|
|
@@ -18166,6 +18693,8 @@ zoo`.split("\n");
|
|
|
18166
18693
|
}
|
|
18167
18694
|
};
|
|
18168
18695
|
POSITIONAL2 = "\0positional";
|
|
18696
|
+
NO_VARS = /* @__PURE__ */ new Set();
|
|
18697
|
+
NO_APPENDS = /* @__PURE__ */ new Map();
|
|
18169
18698
|
FORCE_PUSH = {
|
|
18170
18699
|
checkId: "commands.git-destructive",
|
|
18171
18700
|
ruleName: "review-force-push",
|
|
@@ -18224,6 +18753,8 @@ zoo`.split("\n");
|
|
|
18224
18753
|
"--cleanup"
|
|
18225
18754
|
]);
|
|
18226
18755
|
CLEAN_LONG_VALUE = /* @__PURE__ */ new Set(["--exclude"]);
|
|
18756
|
+
RESTORE_LONG_VALUE = /* @__PURE__ */ new Set(["--source", "--pathspec-from-file"]);
|
|
18757
|
+
CHECKOUT_LONG_VALUE = /* @__PURE__ */ new Set(["--pathspec-from-file", "--orphan", "--conflict"]);
|
|
18227
18758
|
HOOKS_BYPASS = {
|
|
18228
18759
|
checkId: "commands.git-hooks-bypass",
|
|
18229
18760
|
ruleName: "review-git-hooks-bypass",
|
|
@@ -18249,6 +18780,7 @@ zoo`.split("\n");
|
|
|
18249
18780
|
"--gpg-sign"
|
|
18250
18781
|
]);
|
|
18251
18782
|
CHMOD_OPTION_RE = /^-[RvcfHLP]+$/;
|
|
18783
|
+
_appendOp = null;
|
|
18252
18784
|
STAGE_ALL = {
|
|
18253
18785
|
checkId: "commands.git-stage-all",
|
|
18254
18786
|
ruleName: "review-git-stage-all",
|
|
@@ -18373,7 +18905,7 @@ zoo`.split("\n");
|
|
|
18373
18905
|
this.visitStmt(n, depth);
|
|
18374
18906
|
return true;
|
|
18375
18907
|
}
|
|
18376
|
-
if (type === "BinaryCmd" &&
|
|
18908
|
+
if (type === "BinaryCmd" && isPipeOp2(n.Op)) {
|
|
18377
18909
|
this.visitPipeline(n);
|
|
18378
18910
|
return true;
|
|
18379
18911
|
}
|
|
@@ -18474,7 +19006,7 @@ zoo`.split("\n");
|
|
|
18474
19006
|
const stages = [];
|
|
18475
19007
|
const flatten = (s) => {
|
|
18476
19008
|
const c = s?.Cmd;
|
|
18477
|
-
if (c && c.kind === "BinaryCmd" &&
|
|
19009
|
+
if (c && c.kind === "BinaryCmd" && isPipeOp2(c.Op)) {
|
|
18478
19010
|
flatten(c.X);
|
|
18479
19011
|
flatten(c.Y);
|
|
18480
19012
|
} else stages.push(s);
|
|
@@ -19705,7 +20237,7 @@ zoo`.split("\n");
|
|
|
19705
20237
|
{ view: "separators-stripped", decoder: "separators", stripped: true }
|
|
19706
20238
|
];
|
|
19707
20239
|
LONG_OUTPUT_THRESHOLD_BYTES = 100 * 1024;
|
|
19708
|
-
CANONICAL_EXTRACTOR_VERSION = "canonical-
|
|
20240
|
+
CANONICAL_EXTRACTOR_VERSION = "canonical-v37";
|
|
19709
20241
|
DEDUPE_PREVIEW_LEN = 120;
|
|
19710
20242
|
ENGINE_VERSION = "1.4.0";
|
|
19711
20243
|
}
|
|
@@ -20211,11 +20743,18 @@ function slug(s) {
|
|
|
20211
20743
|
return s.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "rule";
|
|
20212
20744
|
}
|
|
20213
20745
|
function pathToRegexFragment(rawPath) {
|
|
20214
|
-
const
|
|
20746
|
+
const trimmed = rawPath.trim();
|
|
20747
|
+
const tail = trimmed.replace(/^~[\\/]?/, "").replace(/^\$\{?HOME\}?[\\/]?/, "").replace(/^\/(?:home|Users)\/[^\\/]+[\\/]?/, "").replace(/^[A-Za-z]:[\\/]Users[\\/][^\\/]+[\\/]?/, "").replace(/^[\\/]+/, "").replace(/[\\/]+$/, "");
|
|
20215
20748
|
const segments2 = tail.split(/[\\/]+/).filter(Boolean).map(escapeRegex);
|
|
20216
20749
|
if (segments2.length === 0) return "";
|
|
20750
|
+
if (isAbsoluteOutsideHome(trimmed)) {
|
|
20751
|
+
return `(^|[^A-Za-z0-9_.~\\/-])/${segments2.join(SEP)}(${B}|$)`;
|
|
20752
|
+
}
|
|
20217
20753
|
return `(^|${B})${segments2.join(SEP)}(${B}|$)`;
|
|
20218
20754
|
}
|
|
20755
|
+
function isAbsoluteOutsideHome(p) {
|
|
20756
|
+
return p.startsWith("/") && !/^\/(?:home|Users|root)(?:\/|$)/.test(p);
|
|
20757
|
+
}
|
|
20219
20758
|
function toolRule(tool, verdict, reason) {
|
|
20220
20759
|
return {
|
|
20221
20760
|
name: `${verdict}-${slug(tool)}`,
|
|
@@ -20636,13 +21175,115 @@ var init_managed = __esm({
|
|
|
20636
21175
|
}
|
|
20637
21176
|
});
|
|
20638
21177
|
|
|
21178
|
+
// src/shields/jail.ts
|
|
21179
|
+
function jailStorePath() {
|
|
21180
|
+
return import_path3.default.join(import_os3.default.homedir(), ".node9", "jail-paths.json");
|
|
21181
|
+
}
|
|
21182
|
+
function readJailPaths() {
|
|
21183
|
+
let text;
|
|
21184
|
+
try {
|
|
21185
|
+
text = import_fs3.default.readFileSync(jailStorePath(), "utf8");
|
|
21186
|
+
} catch (err2) {
|
|
21187
|
+
if (err2.code === "ENOENT") return [];
|
|
21188
|
+
throw err2;
|
|
21189
|
+
}
|
|
21190
|
+
let parsed;
|
|
21191
|
+
try {
|
|
21192
|
+
parsed = JSON.parse(text);
|
|
21193
|
+
} catch {
|
|
21194
|
+
throw new Error(`${jailStorePath()} is not valid JSON \u2014 fix it before changing the jail.`);
|
|
21195
|
+
}
|
|
21196
|
+
if (!Array.isArray(parsed.paths)) return [];
|
|
21197
|
+
return parsed.paths.filter(
|
|
21198
|
+
(p) => !!p && typeof p.path === "string" && (p.verdict === "block" || p.verdict === "review")
|
|
21199
|
+
);
|
|
21200
|
+
}
|
|
21201
|
+
function writeJailPaths(paths) {
|
|
21202
|
+
const p = jailStorePath();
|
|
21203
|
+
import_fs3.default.mkdirSync(import_path3.default.dirname(p), { recursive: true });
|
|
21204
|
+
import_fs3.default.writeFileSync(p, JSON.stringify({ paths }, null, 2) + "\n", { mode: 384 });
|
|
21205
|
+
}
|
|
21206
|
+
function addJailPath(rawPath, verdict) {
|
|
21207
|
+
const norm = rawPath.trim();
|
|
21208
|
+
const fragment = pathToRegexFragment(norm);
|
|
21209
|
+
if (!fragment) {
|
|
21210
|
+
throw new Error(
|
|
21211
|
+
`"${rawPath}" is too broad to jail \u2014 give a specific path (e.g. ~/.gmail-mcp), not a home or root directory.`
|
|
21212
|
+
);
|
|
21213
|
+
}
|
|
21214
|
+
const rejection = validateRegex(fragment);
|
|
21215
|
+
if (rejection !== null) {
|
|
21216
|
+
throw new Error(
|
|
21217
|
+
`"${rawPath}" cannot be jailed: the generated match pattern was rejected by the policy engine (${rejection}). Try a shorter or more specific path.`
|
|
21218
|
+
);
|
|
21219
|
+
}
|
|
21220
|
+
const next = [...readJailPaths().filter((p) => p.path !== norm), { path: norm, verdict }];
|
|
21221
|
+
writeJailPaths(next);
|
|
21222
|
+
return next;
|
|
21223
|
+
}
|
|
21224
|
+
function findJailedPath(candidate) {
|
|
21225
|
+
return findJailedPathIn(candidate, readJailPaths());
|
|
21226
|
+
}
|
|
21227
|
+
function findJailedPathIn(candidate, paths) {
|
|
21228
|
+
if (!candidate) return null;
|
|
21229
|
+
for (const entry of paths) {
|
|
21230
|
+
if (pathMatchesFragment(candidate, entry.path)) return entry;
|
|
21231
|
+
}
|
|
21232
|
+
return null;
|
|
21233
|
+
}
|
|
21234
|
+
function removeJailPath(rawPath) {
|
|
21235
|
+
const norm = rawPath.trim();
|
|
21236
|
+
const before = readJailPaths();
|
|
21237
|
+
const after = before.filter((p) => p.path !== norm);
|
|
21238
|
+
const removed = after.length !== before.length;
|
|
21239
|
+
if (removed) writeJailPaths(after);
|
|
21240
|
+
return { removed, paths: after };
|
|
21241
|
+
}
|
|
21242
|
+
function regenerateUserJail(paths) {
|
|
21243
|
+
const file2 = import_path3.default.join(USER_SHIELDS_DIR_PATH, `${USER_JAIL_SHIELD}.json`);
|
|
21244
|
+
if (paths.length === 0) {
|
|
21245
|
+
const active2 = readActiveShields();
|
|
21246
|
+
if (active2.includes(USER_JAIL_SHIELD)) {
|
|
21247
|
+
writeActiveShields(active2.filter((s) => s !== USER_JAIL_SHIELD));
|
|
21248
|
+
}
|
|
21249
|
+
try {
|
|
21250
|
+
import_fs3.default.rmSync(file2, { force: true });
|
|
21251
|
+
} catch {
|
|
21252
|
+
}
|
|
21253
|
+
return;
|
|
21254
|
+
}
|
|
21255
|
+
const def = buildShield({
|
|
21256
|
+
name: USER_JAIL_SHIELD,
|
|
21257
|
+
description: "User-added credential jail paths (node9 jail add)",
|
|
21258
|
+
blockPaths: paths.filter((p) => p.verdict === "block").map((p) => p.path),
|
|
21259
|
+
reviewPaths: paths.filter((p) => p.verdict === "review").map((p) => p.path)
|
|
21260
|
+
});
|
|
21261
|
+
installShield(USER_JAIL_SHIELD, def);
|
|
21262
|
+
const active = readActiveShields();
|
|
21263
|
+
if (!active.includes(USER_JAIL_SHIELD)) writeActiveShields([...active, USER_JAIL_SHIELD]);
|
|
21264
|
+
}
|
|
21265
|
+
var import_fs3, import_os3, import_path3, USER_JAIL_SHIELD;
|
|
21266
|
+
var init_jail = __esm({
|
|
21267
|
+
"src/shields/jail.ts"() {
|
|
21268
|
+
"use strict";
|
|
21269
|
+
init_cjs_shims();
|
|
21270
|
+
import_fs3 = __toESM(require("fs"));
|
|
21271
|
+
import_os3 = __toESM(require("os"));
|
|
21272
|
+
import_path3 = __toESM(require("path"));
|
|
21273
|
+
init_build();
|
|
21274
|
+
init_dist();
|
|
21275
|
+
init_shields();
|
|
21276
|
+
USER_JAIL_SHIELD = "user-jail";
|
|
21277
|
+
}
|
|
21278
|
+
});
|
|
21279
|
+
|
|
20639
21280
|
// src/auth/trusted-hosts.ts
|
|
20640
21281
|
function getTrustedHostsPath() {
|
|
20641
|
-
return
|
|
21282
|
+
return import_path4.default.join(import_os4.default.homedir(), ".node9", "trusted-hosts.json");
|
|
20642
21283
|
}
|
|
20643
21284
|
function readTrustedHosts() {
|
|
20644
21285
|
try {
|
|
20645
|
-
const raw =
|
|
21286
|
+
const raw = import_fs4.default.readFileSync(getTrustedHostsPath(), "utf8");
|
|
20646
21287
|
const parsed = JSON.parse(raw);
|
|
20647
21288
|
return Array.isArray(parsed.hosts) ? parsed.hosts : [];
|
|
20648
21289
|
} catch {
|
|
@@ -20651,7 +21292,7 @@ function readTrustedHosts() {
|
|
|
20651
21292
|
}
|
|
20652
21293
|
function getFileMtime() {
|
|
20653
21294
|
try {
|
|
20654
|
-
return
|
|
21295
|
+
return import_fs4.default.statSync(getTrustedHostsPath()).mtimeMs;
|
|
20655
21296
|
} catch {
|
|
20656
21297
|
return 0;
|
|
20657
21298
|
}
|
|
@@ -20668,10 +21309,10 @@ function getCachedHosts() {
|
|
|
20668
21309
|
}
|
|
20669
21310
|
function writeTrustedHosts(hosts) {
|
|
20670
21311
|
const filePath = getTrustedHostsPath();
|
|
20671
|
-
|
|
21312
|
+
import_fs4.default.mkdirSync(import_path4.default.dirname(filePath), { recursive: true });
|
|
20672
21313
|
const tmp = filePath + ".node9-tmp";
|
|
20673
|
-
|
|
20674
|
-
|
|
21314
|
+
import_fs4.default.writeFileSync(tmp, JSON.stringify({ hosts }, null, 2), { mode: 384 });
|
|
21315
|
+
import_fs4.default.renameSync(tmp, filePath);
|
|
20675
21316
|
_cache = { hosts, expiry: Date.now() + CACHE_TTL_MS, mtime: getFileMtime() };
|
|
20676
21317
|
}
|
|
20677
21318
|
function addTrustedHost(host2) {
|
|
@@ -20716,14 +21357,14 @@ function isTrustedHost(host2) {
|
|
|
20716
21357
|
getCachedHosts().map((entry) => entry.host)
|
|
20717
21358
|
);
|
|
20718
21359
|
}
|
|
20719
|
-
var
|
|
21360
|
+
var import_fs4, import_path4, import_os4, _cache, CACHE_TTL_MS;
|
|
20720
21361
|
var init_trusted_hosts = __esm({
|
|
20721
21362
|
"src/auth/trusted-hosts.ts"() {
|
|
20722
21363
|
"use strict";
|
|
20723
21364
|
init_cjs_shims();
|
|
20724
|
-
|
|
20725
|
-
|
|
20726
|
-
|
|
21365
|
+
import_fs4 = __toESM(require("fs"));
|
|
21366
|
+
import_path4 = __toESM(require("path"));
|
|
21367
|
+
import_os4 = __toESM(require("os"));
|
|
20727
21368
|
_cache = null;
|
|
20728
21369
|
CACHE_TTL_MS = 5e3;
|
|
20729
21370
|
}
|
|
@@ -21004,9 +21645,9 @@ function _resetConfigCache() {
|
|
|
21004
21645
|
}
|
|
21005
21646
|
function getGlobalSettings() {
|
|
21006
21647
|
try {
|
|
21007
|
-
const globalConfigPath2 =
|
|
21008
|
-
if (
|
|
21009
|
-
const raw = JSON.parse(
|
|
21648
|
+
const globalConfigPath2 = import_path5.default.join(import_os5.default.homedir(), ".node9", "config.json");
|
|
21649
|
+
if (import_fs5.default.existsSync(globalConfigPath2)) {
|
|
21650
|
+
const raw = JSON.parse(import_fs5.default.readFileSync(globalConfigPath2, "utf-8"));
|
|
21010
21651
|
const parsed = isV2File(raw) ? v2ToLegacy(raw).legacy : raw;
|
|
21011
21652
|
const settings = parsed.settings || {};
|
|
21012
21653
|
return {
|
|
@@ -21035,8 +21676,8 @@ function noteRejectedApiUrl(raw) {
|
|
|
21035
21676
|
if (rejectedApiUrlsSeen.has(key)) return;
|
|
21036
21677
|
rejectedApiUrlsSeen.add(key);
|
|
21037
21678
|
try {
|
|
21038
|
-
|
|
21039
|
-
|
|
21679
|
+
import_fs5.default.appendFileSync(
|
|
21680
|
+
import_path5.default.join(import_os5.default.homedir(), ".node9", "hook-debug.log"),
|
|
21040
21681
|
`[${(/* @__PURE__ */ new Date()).toISOString()}] REFUSED apiUrl, using the default instead: ${String(raw).slice(0, 200).replace(/[\r\n]+/g, " ")}
|
|
21041
21682
|
`
|
|
21042
21683
|
);
|
|
@@ -21053,9 +21694,9 @@ function getCredentials() {
|
|
|
21053
21694
|
};
|
|
21054
21695
|
}
|
|
21055
21696
|
try {
|
|
21056
|
-
const credPath =
|
|
21057
|
-
if (
|
|
21058
|
-
const creds = JSON.parse(
|
|
21697
|
+
const credPath = import_path5.default.join(import_os5.default.homedir(), ".node9", "credentials.json");
|
|
21698
|
+
if (import_fs5.default.existsSync(credPath)) {
|
|
21699
|
+
const creds = JSON.parse(import_fs5.default.readFileSync(credPath, "utf-8"));
|
|
21059
21700
|
const profileName = process.env.NODE9_PROFILE || "default";
|
|
21060
21701
|
const profile = creds[profileName];
|
|
21061
21702
|
if (typeof profile?.apiKey === "string" && profile.apiKey.length > 0) {
|
|
@@ -21087,7 +21728,7 @@ function readRulesCacheResilient(cacheFile) {
|
|
|
21087
21728
|
for (let attempt = 0; attempt < 3; attempt++) {
|
|
21088
21729
|
let content;
|
|
21089
21730
|
try {
|
|
21090
|
-
content =
|
|
21731
|
+
content = import_fs5.default.readFileSync(cacheFile, "utf-8");
|
|
21091
21732
|
existed = true;
|
|
21092
21733
|
} catch (err2) {
|
|
21093
21734
|
if (err2.code === "ENOENT") return {};
|
|
@@ -21102,10 +21743,10 @@ function readRulesCacheResilient(cacheFile) {
|
|
|
21102
21743
|
}
|
|
21103
21744
|
}
|
|
21104
21745
|
if (existed || sawReadError) {
|
|
21105
|
-
const backup =
|
|
21746
|
+
const backup = import_path5.default.join(import_path5.default.dirname(cacheFile), "rules-cache.last-good.json");
|
|
21106
21747
|
if (backup !== cacheFile) {
|
|
21107
21748
|
try {
|
|
21108
|
-
const raw = JSON.parse(
|
|
21749
|
+
const raw = JSON.parse(import_fs5.default.readFileSync(backup, "utf-8"));
|
|
21109
21750
|
logCacheReadIssue(cacheFile, "RULES_CACHE_CORRUPT_USED_BACKUP");
|
|
21110
21751
|
lastParsedRulesCache = raw;
|
|
21111
21752
|
return raw;
|
|
@@ -21125,8 +21766,8 @@ function logCacheReadIssue(cacheFile, kind) {
|
|
|
21125
21766
|
if (now - cacheReadLastLoggedAt < CACHE_LOG_REARM_MS) return;
|
|
21126
21767
|
cacheReadLastLoggedAt = now;
|
|
21127
21768
|
try {
|
|
21128
|
-
|
|
21129
|
-
|
|
21769
|
+
import_fs5.default.appendFileSync(
|
|
21770
|
+
import_path5.default.join(import_os5.default.homedir(), ".node9", "hook-debug.log"),
|
|
21130
21771
|
`[${(/* @__PURE__ */ new Date()).toISOString()}] ${kind} ${cacheFile}
|
|
21131
21772
|
`
|
|
21132
21773
|
);
|
|
@@ -21143,8 +21784,8 @@ function catalogSettingsFrom(settings, policy) {
|
|
|
21143
21784
|
}
|
|
21144
21785
|
function getConfig(cwd) {
|
|
21145
21786
|
if (!cwd && cachedConfig) return cachedConfig;
|
|
21146
|
-
const globalPath =
|
|
21147
|
-
const projectPath =
|
|
21787
|
+
const globalPath = import_path5.default.join(import_os5.default.homedir(), ".node9", "config.json");
|
|
21788
|
+
const projectPath = import_path5.default.join(cwd ?? process.cwd(), "node9.config.json");
|
|
21148
21789
|
const globalConfig = tryLoadConfig(globalPath);
|
|
21149
21790
|
const projectConfig = tryLoadConfig(projectPath, { project: true });
|
|
21150
21791
|
const mergedSettings = {
|
|
@@ -21194,7 +21835,8 @@ function getConfig(cwd) {
|
|
|
21194
21835
|
trustedHostsManaged: false,
|
|
21195
21836
|
appPermissions: {},
|
|
21196
21837
|
appLinks: {},
|
|
21197
|
-
managedJailPaths: []
|
|
21838
|
+
managedJailPaths: [],
|
|
21839
|
+
jailPaths: []
|
|
21198
21840
|
};
|
|
21199
21841
|
const mergedEnvironments = { ...DEFAULT_CONFIG.environments };
|
|
21200
21842
|
const rank = (v) => {
|
|
@@ -21389,7 +22031,7 @@ function getConfig(cwd) {
|
|
|
21389
22031
|
let cloudMandatesEnforcement = false;
|
|
21390
22032
|
let cloudMandatesAppPerm = false;
|
|
21391
22033
|
{
|
|
21392
|
-
const cacheFile =
|
|
22034
|
+
const cacheFile = import_path5.default.join(import_os5.default.homedir(), ".node9", "rules-cache.json");
|
|
21393
22035
|
try {
|
|
21394
22036
|
const raw = readRulesCacheResilient(cacheFile);
|
|
21395
22037
|
if (Array.isArray(raw.rules) && raw.rules.length > 0) {
|
|
@@ -21589,6 +22231,7 @@ function getConfig(cwd) {
|
|
|
21589
22231
|
mergedPolicy.smartRules.push({ ...r, name: `org:${r.name}` });
|
|
21590
22232
|
}
|
|
21591
22233
|
mergedPolicy.managedJailPaths.push({ path: path114, verdict });
|
|
22234
|
+
mergedPolicy.jailPaths.push(path114);
|
|
21592
22235
|
}
|
|
21593
22236
|
}
|
|
21594
22237
|
if (Array.isArray(mc.trustedHosts)) {
|
|
@@ -21664,6 +22307,11 @@ function getConfig(cwd) {
|
|
|
21664
22307
|
}
|
|
21665
22308
|
}
|
|
21666
22309
|
mergedPolicy.appliedShields = appliedShields.sort();
|
|
22310
|
+
if (appliedShields.includes(USER_JAIL_SHIELD)) {
|
|
22311
|
+
for (const { path: path114 } of readJailPaths()) {
|
|
22312
|
+
if (!mergedPolicy.jailPaths.includes(path114)) mergedPolicy.jailPaths.push(path114);
|
|
22313
|
+
}
|
|
22314
|
+
}
|
|
21667
22315
|
const existingAdvisoryNames = new Set(mergedPolicy.smartRules.map((r) => r.name));
|
|
21668
22316
|
const cc = mergedPolicy.commandChecks ?? {};
|
|
21669
22317
|
const advisoryKnobKey = (name) => {
|
|
@@ -21821,10 +22469,10 @@ function getConfig(cwd) {
|
|
|
21821
22469
|
}
|
|
21822
22470
|
function tryLoadConfig(filePath, options = {}) {
|
|
21823
22471
|
v2ChecksByPath.delete(filePath);
|
|
21824
|
-
if (!
|
|
22472
|
+
if (!import_fs5.default.existsSync(filePath)) return null;
|
|
21825
22473
|
let raw;
|
|
21826
22474
|
try {
|
|
21827
|
-
raw = JSON.parse(
|
|
22475
|
+
raw = JSON.parse(import_fs5.default.readFileSync(filePath, "utf-8"));
|
|
21828
22476
|
} catch (err2) {
|
|
21829
22477
|
const msg = err2 instanceof Error ? err2.message : String(err2);
|
|
21830
22478
|
process.stderr.write(
|
|
@@ -21922,18 +22570,19 @@ function applyUntrustedContent(cur, raw, replaceLists = false, isProject = false
|
|
|
21922
22570
|
cur.roles = next;
|
|
21923
22571
|
}
|
|
21924
22572
|
}
|
|
21925
|
-
var
|
|
22573
|
+
var import_fs5, import_path5, import_os5, DANGEROUS_WORDS, RUNTIME_ONLY_CONFIG_KEYS, DEFAULT_CONFIG, RM_SAFE_PATH_PATTERN, VERDICT_ORDER, ADVISORY_SMART_RULES, cachedConfig, rejectedApiUrlsSeen, lastParsedRulesCache, CACHE_LOG_REARM_MS, cacheReadLastLoggedAt, v2ChecksByPath, KNOB_TO_CHECK;
|
|
21926
22574
|
var init_config = __esm({
|
|
21927
22575
|
"src/config/index.ts"() {
|
|
21928
22576
|
"use strict";
|
|
21929
22577
|
init_cjs_shims();
|
|
21930
|
-
|
|
21931
|
-
|
|
21932
|
-
|
|
22578
|
+
import_fs5 = __toESM(require("fs"));
|
|
22579
|
+
import_path5 = __toESM(require("path"));
|
|
22580
|
+
import_os5 = __toESM(require("os"));
|
|
21933
22581
|
init_config_schema();
|
|
21934
22582
|
init_shields();
|
|
21935
22583
|
init_managed();
|
|
21936
22584
|
init_build();
|
|
22585
|
+
init_jail();
|
|
21937
22586
|
init_trusted_hosts();
|
|
21938
22587
|
init_dist();
|
|
21939
22588
|
init_dist();
|
|
@@ -22202,7 +22851,8 @@ var init_config = __esm({
|
|
|
22202
22851
|
trustedHostsManaged: false,
|
|
22203
22852
|
appPermissions: {},
|
|
22204
22853
|
appLinks: {},
|
|
22205
|
-
managedJailPaths: []
|
|
22854
|
+
managedJailPaths: [],
|
|
22855
|
+
jailPaths: []
|
|
22206
22856
|
},
|
|
22207
22857
|
environments: {}
|
|
22208
22858
|
};
|
|
@@ -22295,18 +22945,18 @@ function readCapped(file2, maxBytes, openFlags = "r") {
|
|
|
22295
22945
|
if (maxBytes < 0) return null;
|
|
22296
22946
|
let fd;
|
|
22297
22947
|
try {
|
|
22298
|
-
fd =
|
|
22948
|
+
fd = import_fs6.default.openSync(file2, openFlags);
|
|
22299
22949
|
} catch {
|
|
22300
22950
|
return null;
|
|
22301
22951
|
}
|
|
22302
22952
|
try {
|
|
22303
|
-
const st =
|
|
22953
|
+
const st = import_fs6.default.fstatSync(fd);
|
|
22304
22954
|
if (!st.isFile()) return null;
|
|
22305
22955
|
const want = Math.min(st.size, maxBytes + 1);
|
|
22306
22956
|
const buf = Buffer.alloc(want);
|
|
22307
22957
|
let read3 = 0;
|
|
22308
22958
|
while (read3 < want) {
|
|
22309
|
-
const n =
|
|
22959
|
+
const n = import_fs6.default.readSync(fd, buf, read3, want - read3, read3);
|
|
22310
22960
|
if (n <= 0) break;
|
|
22311
22961
|
read3 += n;
|
|
22312
22962
|
}
|
|
@@ -22318,7 +22968,7 @@ function readCapped(file2, maxBytes, openFlags = "r") {
|
|
|
22318
22968
|
return null;
|
|
22319
22969
|
} finally {
|
|
22320
22970
|
try {
|
|
22321
|
-
|
|
22971
|
+
import_fs6.default.closeSync(fd);
|
|
22322
22972
|
} catch {
|
|
22323
22973
|
}
|
|
22324
22974
|
}
|
|
@@ -22327,12 +22977,12 @@ function readCappedText(file2, maxBytes, openFlags = "r") {
|
|
|
22327
22977
|
const r = readCapped(file2, maxBytes, openFlags);
|
|
22328
22978
|
return r ? { text: r.bytes.toString("utf8"), truncated: r.truncated } : null;
|
|
22329
22979
|
}
|
|
22330
|
-
var
|
|
22980
|
+
var import_fs6;
|
|
22331
22981
|
var init_read_capped = __esm({
|
|
22332
22982
|
"src/utils/read-capped.ts"() {
|
|
22333
22983
|
"use strict";
|
|
22334
22984
|
init_cjs_shims();
|
|
22335
|
-
|
|
22985
|
+
import_fs6 = __toESM(require("fs"));
|
|
22336
22986
|
}
|
|
22337
22987
|
});
|
|
22338
22988
|
|
|
@@ -22341,25 +22991,25 @@ function scanFilePath(filePath, cwd = process.cwd(), options = {}) {
|
|
|
22341
22991
|
if (!filePath) return null;
|
|
22342
22992
|
let resolved;
|
|
22343
22993
|
try {
|
|
22344
|
-
const absolute2 =
|
|
22345
|
-
resolved =
|
|
22994
|
+
const absolute2 = import_path6.default.resolve(cwd, filePath);
|
|
22995
|
+
resolved = import_fs7.default.realpathSync.native(absolute2);
|
|
22346
22996
|
} catch (err2) {
|
|
22347
22997
|
const code2 = err2.code;
|
|
22348
22998
|
if (code2 === "ENOENT" || code2 === "ENOTDIR") {
|
|
22349
|
-
resolved =
|
|
22999
|
+
resolved = import_path6.default.resolve(cwd, filePath);
|
|
22350
23000
|
} else {
|
|
22351
23001
|
return sensitivePathMatch(filePath);
|
|
22352
23002
|
}
|
|
22353
23003
|
}
|
|
22354
23004
|
return matchSensitivePath2(resolved, filePath, options);
|
|
22355
23005
|
}
|
|
22356
|
-
var
|
|
23006
|
+
var import_fs7, import_path6;
|
|
22357
23007
|
var init_dlp = __esm({
|
|
22358
23008
|
"src/dlp.ts"() {
|
|
22359
23009
|
"use strict";
|
|
22360
23010
|
init_cjs_shims();
|
|
22361
|
-
|
|
22362
|
-
|
|
23011
|
+
import_fs7 = __toESM(require("fs"));
|
|
23012
|
+
import_path6 = __toESM(require("path"));
|
|
22363
23013
|
init_dist();
|
|
22364
23014
|
init_dist();
|
|
22365
23015
|
}
|
|
@@ -22586,24 +23236,24 @@ var init_gate_order = __esm({
|
|
|
22586
23236
|
// src/policy/file-access.ts
|
|
22587
23237
|
function absoluteSpelling(p, cwd, home) {
|
|
22588
23238
|
if (p === "~" || p.startsWith("~/")) p = home + p.slice(1);
|
|
22589
|
-
return
|
|
23239
|
+
return import_path7.default.isAbsolute(p) ? p : `${cwd}/${p}`;
|
|
22590
23240
|
}
|
|
22591
23241
|
function physical(p, followFinal, links = 0) {
|
|
22592
23242
|
if (links > 40) throw new Error("Too many symbolic links");
|
|
22593
23243
|
if (!followFinal) {
|
|
22594
|
-
const parent = physical(
|
|
22595
|
-
return { path: `${parent.path}/${
|
|
23244
|
+
const parent = physical(import_path7.default.dirname(p), true, links);
|
|
23245
|
+
return { path: `${parent.path}/${import_path7.default.basename(p)}`, missing: parent.missing };
|
|
22596
23246
|
}
|
|
22597
23247
|
try {
|
|
22598
|
-
return { path:
|
|
23248
|
+
return { path: import_fs8.default.realpathSync.native(p), missing: false };
|
|
22599
23249
|
} catch (error) {
|
|
22600
23250
|
const code2 = error.code;
|
|
22601
23251
|
if (!["ENOENT", "ENOTDIR"].includes(code2 ?? "")) throw error;
|
|
22602
23252
|
try {
|
|
22603
|
-
if (
|
|
22604
|
-
const target =
|
|
23253
|
+
if (import_fs8.default.lstatSync(p).isSymbolicLink()) {
|
|
23254
|
+
const target = import_fs8.default.readlinkSync(p);
|
|
22605
23255
|
return physical(
|
|
22606
|
-
|
|
23256
|
+
import_path7.default.isAbsolute(target) ? target : `${import_path7.default.dirname(p)}/${target}`,
|
|
22607
23257
|
true,
|
|
22608
23258
|
links + 1
|
|
22609
23259
|
);
|
|
@@ -22612,13 +23262,13 @@ function physical(p, followFinal, links = 0) {
|
|
|
22612
23262
|
if (!["ENOENT", "ENOTDIR"].includes(linkError.code ?? ""))
|
|
22613
23263
|
throw linkError;
|
|
22614
23264
|
}
|
|
22615
|
-
const parent =
|
|
23265
|
+
const parent = import_path7.default.dirname(p);
|
|
22616
23266
|
if (parent === p) return { path: p, missing: true };
|
|
22617
23267
|
const resolved = physical(parent, true, links);
|
|
22618
|
-
return { path: `${resolved.path}/${
|
|
23268
|
+
return { path: `${resolved.path}/${import_path7.default.basename(p)}`, missing: true };
|
|
22619
23269
|
}
|
|
22620
23270
|
}
|
|
22621
|
-
function prepareFileAccesses(tool, args, cwd = process.cwd(), inspection = {}, home =
|
|
23271
|
+
function prepareFileAccesses(tool, args, cwd = process.cwd(), inspection = {}, home = import_os6.default.homedir()) {
|
|
22622
23272
|
const context = { cwd, homeDirs: [home, "/root"] };
|
|
22623
23273
|
const accesses = collectFileAccesses(tool, args, context, inspection);
|
|
22624
23274
|
const handledPaths = /* @__PURE__ */ new Set();
|
|
@@ -22641,14 +23291,14 @@ function prepareFileAccesses(tool, args, cwd = process.cwd(), inspection = {}, h
|
|
|
22641
23291
|
const raw = absoluteSpelling(access.path, access.cwd ?? cwd, home);
|
|
22642
23292
|
if (access.directoryTarget) {
|
|
22643
23293
|
try {
|
|
22644
|
-
if (!
|
|
23294
|
+
if (!import_fs8.default.statSync(absoluteSpelling(access.directoryTarget, access.cwd ?? cwd, home)).isDirectory())
|
|
22645
23295
|
continue;
|
|
22646
23296
|
} catch {
|
|
22647
23297
|
}
|
|
22648
23298
|
}
|
|
22649
23299
|
if (access.operation === "create") {
|
|
22650
23300
|
try {
|
|
22651
|
-
|
|
23301
|
+
import_fs8.default.statSync(raw);
|
|
22652
23302
|
continue;
|
|
22653
23303
|
} catch {
|
|
22654
23304
|
}
|
|
@@ -22695,59 +23345,59 @@ function prepareFileAccesses(tool, args, cwd = process.cwd(), inspection = {}, h
|
|
|
22695
23345
|
}
|
|
22696
23346
|
return { ...context, accesses: prepared, handledPaths };
|
|
22697
23347
|
}
|
|
22698
|
-
var
|
|
23348
|
+
var import_fs8, import_os6, import_path7;
|
|
22699
23349
|
var init_file_access = __esm({
|
|
22700
23350
|
"src/policy/file-access.ts"() {
|
|
22701
23351
|
"use strict";
|
|
22702
23352
|
init_cjs_shims();
|
|
22703
|
-
|
|
22704
|
-
|
|
22705
|
-
|
|
23353
|
+
import_fs8 = __toESM(require("fs"));
|
|
23354
|
+
import_os6 = __toESM(require("os"));
|
|
23355
|
+
import_path7 = __toESM(require("path"));
|
|
22706
23356
|
init_dist();
|
|
22707
23357
|
}
|
|
22708
23358
|
});
|
|
22709
23359
|
|
|
22710
23360
|
// src/utils/atomic-write.ts
|
|
22711
23361
|
function atomicWriteSync(filePath, data, options) {
|
|
22712
|
-
const dir2 =
|
|
22713
|
-
if (!
|
|
23362
|
+
const dir2 = import_path8.default.dirname(filePath);
|
|
23363
|
+
if (!import_fs9.default.existsSync(dir2)) import_fs9.default.mkdirSync(dir2, { recursive: true });
|
|
22714
23364
|
const tmpPath = `${filePath}.${(0, import_crypto8.randomUUID)()}.tmp`;
|
|
22715
23365
|
try {
|
|
22716
|
-
|
|
23366
|
+
import_fs9.default.writeFileSync(tmpPath, data, options);
|
|
22717
23367
|
} catch (err2) {
|
|
22718
23368
|
try {
|
|
22719
|
-
|
|
23369
|
+
import_fs9.default.unlinkSync(tmpPath);
|
|
22720
23370
|
} catch {
|
|
22721
23371
|
}
|
|
22722
23372
|
throw err2;
|
|
22723
23373
|
}
|
|
22724
23374
|
try {
|
|
22725
|
-
|
|
23375
|
+
import_fs9.default.renameSync(tmpPath, filePath);
|
|
22726
23376
|
} catch (err2) {
|
|
22727
23377
|
try {
|
|
22728
|
-
|
|
23378
|
+
import_fs9.default.unlinkSync(tmpPath);
|
|
22729
23379
|
} catch {
|
|
22730
23380
|
}
|
|
22731
23381
|
throw err2;
|
|
22732
23382
|
}
|
|
22733
23383
|
}
|
|
22734
|
-
var
|
|
23384
|
+
var import_fs9, import_path8, import_crypto8;
|
|
22735
23385
|
var init_atomic_write = __esm({
|
|
22736
23386
|
"src/utils/atomic-write.ts"() {
|
|
22737
23387
|
"use strict";
|
|
22738
23388
|
init_cjs_shims();
|
|
22739
|
-
|
|
22740
|
-
|
|
23389
|
+
import_fs9 = __toESM(require("fs"));
|
|
23390
|
+
import_path8 = __toESM(require("path"));
|
|
22741
23391
|
import_crypto8 = require("crypto");
|
|
22742
23392
|
}
|
|
22743
23393
|
});
|
|
22744
23394
|
|
|
22745
23395
|
// src/supply-chain/osv-index.ts
|
|
22746
23396
|
function osvRoot() {
|
|
22747
|
-
return
|
|
23397
|
+
return import_path9.default.join(import_os7.default.homedir(), ".node9", "osv");
|
|
22748
23398
|
}
|
|
22749
23399
|
function ecoDir(eco) {
|
|
22750
|
-
return
|
|
23400
|
+
return import_path9.default.join(osvRoot(), eco);
|
|
22751
23401
|
}
|
|
22752
23402
|
function indexKey(eco, name) {
|
|
22753
23403
|
switch (eco) {
|
|
@@ -22769,11 +23419,11 @@ function shardOf(key) {
|
|
|
22769
23419
|
return (0, import_crypto9.createHash)("sha1").update(key).digest("hex").slice(0, 2);
|
|
22770
23420
|
}
|
|
22771
23421
|
function shardPath(eco, shard) {
|
|
22772
|
-
return
|
|
23422
|
+
return import_path9.default.join(ecoDir(eco), "shards", `${shard}.json`);
|
|
22773
23423
|
}
|
|
22774
23424
|
function readMeta(eco) {
|
|
22775
23425
|
try {
|
|
22776
|
-
const m = JSON.parse(
|
|
23426
|
+
const m = JSON.parse(import_fs10.default.readFileSync(import_path9.default.join(ecoDir(eco), "meta.json"), "utf8"));
|
|
22777
23427
|
if (typeof m?.syncedAt !== "string" || typeof m?.lastModifiedMs !== "number") return null;
|
|
22778
23428
|
return m;
|
|
22779
23429
|
} catch {
|
|
@@ -22781,11 +23431,11 @@ function readMeta(eco) {
|
|
|
22781
23431
|
}
|
|
22782
23432
|
}
|
|
22783
23433
|
function writeMeta(eco, meta) {
|
|
22784
|
-
atomicWriteSync(
|
|
23434
|
+
atomicWriteSync(import_path9.default.join(ecoDir(eco), "meta.json"), JSON.stringify(meta));
|
|
22785
23435
|
}
|
|
22786
23436
|
function readShard(eco, shard) {
|
|
22787
23437
|
try {
|
|
22788
|
-
const s = JSON.parse(
|
|
23438
|
+
const s = JSON.parse(import_fs10.default.readFileSync(shardPath(eco, shard), "utf8"));
|
|
22789
23439
|
return s && typeof s === "object" && !Array.isArray(s) ? s : {};
|
|
22790
23440
|
} catch {
|
|
22791
23441
|
return {};
|
|
@@ -22880,14 +23530,14 @@ function entryCovers(entry, version2) {
|
|
|
22880
23530
|
if (entry.versions?.includes(version2)) return true;
|
|
22881
23531
|
return (entry.ranges ?? []).some((r) => inRange(version2, r));
|
|
22882
23532
|
}
|
|
22883
|
-
var
|
|
23533
|
+
var import_fs10, import_os7, import_path9, import_crypto9, INDEX_FRESH_MS;
|
|
22884
23534
|
var init_osv_index = __esm({
|
|
22885
23535
|
"src/supply-chain/osv-index.ts"() {
|
|
22886
23536
|
"use strict";
|
|
22887
23537
|
init_cjs_shims();
|
|
22888
|
-
|
|
22889
|
-
|
|
22890
|
-
|
|
23538
|
+
import_fs10 = __toESM(require("fs"));
|
|
23539
|
+
import_os7 = __toESM(require("os"));
|
|
23540
|
+
import_path9 = __toESM(require("path"));
|
|
22891
23541
|
import_crypto9 = require("crypto");
|
|
22892
23542
|
init_dist();
|
|
22893
23543
|
init_atomic_write();
|
|
@@ -23229,14 +23879,14 @@ var init_registry = __esm({
|
|
|
23229
23879
|
|
|
23230
23880
|
// src/supply-chain/local-resolve.ts
|
|
23231
23881
|
function resolveInstalled(name, cwd) {
|
|
23232
|
-
if (!cwd || !
|
|
23882
|
+
if (!cwd || !import_path10.default.isAbsolute(cwd)) return null;
|
|
23233
23883
|
if (!/^(?:@[^/\\]+\/)?[^/\\]+$/.test(name)) return null;
|
|
23234
|
-
let dir2 =
|
|
23884
|
+
let dir2 = import_path10.default.resolve(cwd);
|
|
23235
23885
|
for (let i = 0; i < MAX_LEVELS; i++) {
|
|
23236
|
-
const pkgDir =
|
|
23237
|
-
const manifest =
|
|
23886
|
+
const pkgDir = import_path10.default.join(dir2, "node_modules", ...name.split("/"));
|
|
23887
|
+
const manifest = import_path10.default.join(pkgDir, "package.json");
|
|
23238
23888
|
try {
|
|
23239
|
-
const raw =
|
|
23889
|
+
const raw = import_fs11.default.readFileSync(manifest, "utf8");
|
|
23240
23890
|
const parsed = JSON.parse(raw);
|
|
23241
23891
|
if (typeof parsed.version === "string" && parsed.version.length > 0) {
|
|
23242
23892
|
return { version: parsed.version, dir: pkgDir };
|
|
@@ -23244,19 +23894,19 @@ function resolveInstalled(name, cwd) {
|
|
|
23244
23894
|
return null;
|
|
23245
23895
|
} catch {
|
|
23246
23896
|
}
|
|
23247
|
-
const parent =
|
|
23897
|
+
const parent = import_path10.default.dirname(dir2);
|
|
23248
23898
|
if (parent === dir2) break;
|
|
23249
23899
|
dir2 = parent;
|
|
23250
23900
|
}
|
|
23251
23901
|
return null;
|
|
23252
23902
|
}
|
|
23253
|
-
var
|
|
23903
|
+
var import_fs11, import_path10, MAX_LEVELS, LOCAL_FIRST_MANAGERS;
|
|
23254
23904
|
var init_local_resolve = __esm({
|
|
23255
23905
|
"src/supply-chain/local-resolve.ts"() {
|
|
23256
23906
|
"use strict";
|
|
23257
23907
|
init_cjs_shims();
|
|
23258
|
-
|
|
23259
|
-
|
|
23908
|
+
import_fs11 = __toESM(require("fs"));
|
|
23909
|
+
import_path10 = __toESM(require("path"));
|
|
23260
23910
|
MAX_LEVELS = 32;
|
|
23261
23911
|
LOCAL_FIRST_MANAGERS = /* @__PURE__ */ new Set(["npx", "bunx", "npm exec"]);
|
|
23262
23912
|
}
|
|
@@ -23364,7 +24014,7 @@ function checkInstalled(p, version2, misses) {
|
|
|
23364
24014
|
}
|
|
23365
24015
|
async function checkOne(p, cfg, misses, networkCapped, cwd) {
|
|
23366
24016
|
if (p.ecosystem === "npm" && LOCAL_FIRST_MANAGERS.has(p.manager) && p.localCwd !== null && (p.raw === p.name || p.version)) {
|
|
23367
|
-
const localCwd = cwd &&
|
|
24017
|
+
const localCwd = cwd && import_path11.default.isAbsolute(cwd) ? (p.localCwd ?? []).reduce((dir2, step) => import_path11.default.resolve(dir2, step), cwd) : void 0;
|
|
23368
24018
|
const installed = resolveInstalled(p.name, localCwd);
|
|
23369
24019
|
if (installed && (!p.version || p.version === installed.version))
|
|
23370
24020
|
return checkInstalled(p, installed.version, misses);
|
|
@@ -23505,13 +24155,13 @@ async function runPackageCheck(toolName, args, cfg, cwd, opts = {}) {
|
|
|
23505
24155
|
return { ...ALLOW, misses: [`package check error: ${err2?.message ?? err2}`] };
|
|
23506
24156
|
}
|
|
23507
24157
|
}
|
|
23508
|
-
var import_picomatch4,
|
|
24158
|
+
var import_picomatch4, import_path11, MAX_NETWORK_PACKAGES, ALLOW, KIND, SOFT2;
|
|
23509
24159
|
var init_check = __esm({
|
|
23510
24160
|
"src/supply-chain/check.ts"() {
|
|
23511
24161
|
"use strict";
|
|
23512
24162
|
init_cjs_shims();
|
|
23513
24163
|
import_picomatch4 = __toESM(require("picomatch"));
|
|
23514
|
-
|
|
24164
|
+
import_path11 = __toESM(require("path"));
|
|
23515
24165
|
init_dist();
|
|
23516
24166
|
init_osv_index();
|
|
23517
24167
|
init_osv_online();
|
|
@@ -23537,29 +24187,29 @@ var init_check = __esm({
|
|
|
23537
24187
|
|
|
23538
24188
|
// src/supply-chain/registries.ts
|
|
23539
24189
|
function userFiles(home, env) {
|
|
23540
|
-
const xdg = env.XDG_CONFIG_HOME ||
|
|
24190
|
+
const xdg = env.XDG_CONFIG_HOME || import_path12.default.join(home, ".config");
|
|
23541
24191
|
return [
|
|
23542
|
-
env.NPM_CONFIG_USERCONFIG || env.npm_config_userconfig ||
|
|
23543
|
-
|
|
23544
|
-
|
|
23545
|
-
|
|
24192
|
+
env.NPM_CONFIG_USERCONFIG || env.npm_config_userconfig || import_path12.default.join(home, ".npmrc"),
|
|
24193
|
+
import_path12.default.join(home, ".yarnrc"),
|
|
24194
|
+
import_path12.default.join(home, ".yarnrc.yml"),
|
|
24195
|
+
import_path12.default.join(home, ".bunfig.toml"),
|
|
23546
24196
|
env.PIP_CONFIG_FILE || "",
|
|
23547
|
-
|
|
23548
|
-
|
|
24197
|
+
import_path12.default.join(xdg, "pip", "pip.conf"),
|
|
24198
|
+
import_path12.default.join(home, ".pip", "pip.conf"),
|
|
23549
24199
|
"/etc/pip.conf",
|
|
23550
|
-
env.VIRTUAL_ENV ?
|
|
24200
|
+
env.VIRTUAL_ENV ? import_path12.default.join(env.VIRTUAL_ENV, "pip.conf") : "",
|
|
23551
24201
|
env.UV_CONFIG_FILE || "",
|
|
23552
|
-
|
|
24202
|
+
import_path12.default.join(xdg, "uv", "uv.toml"),
|
|
23553
24203
|
"/etc/uv/uv.toml"
|
|
23554
24204
|
].filter(Boolean);
|
|
23555
24205
|
}
|
|
23556
24206
|
function projectFiles(cwd) {
|
|
23557
|
-
if (!cwd || !
|
|
24207
|
+
if (!cwd || !import_path12.default.isAbsolute(cwd)) return [];
|
|
23558
24208
|
const out = [];
|
|
23559
24209
|
let dir2 = cwd;
|
|
23560
24210
|
for (let i = 0; i < MAX_PARENT_DIRS; i++) {
|
|
23561
|
-
for (const f of PROJECT_FILES) out.push(
|
|
23562
|
-
const parent =
|
|
24211
|
+
for (const f of PROJECT_FILES) out.push(import_path12.default.join(dir2, f));
|
|
24212
|
+
const parent = import_path12.default.dirname(dir2);
|
|
23563
24213
|
if (parent === dir2) break;
|
|
23564
24214
|
dir2 = parent;
|
|
23565
24215
|
}
|
|
@@ -23598,7 +24248,7 @@ function hostsInText(text, out) {
|
|
|
23598
24248
|
}
|
|
23599
24249
|
}
|
|
23600
24250
|
}
|
|
23601
|
-
function configuredRegistryHosts(cwd, env = process.env, home =
|
|
24251
|
+
function configuredRegistryHosts(cwd, env = process.env, home = import_os8.default.homedir()) {
|
|
23602
24252
|
const key = [
|
|
23603
24253
|
cwd ?? "",
|
|
23604
24254
|
home,
|
|
@@ -23620,21 +24270,21 @@ function configuredRegistryHosts(cwd, env = process.env, home = import_os7.defau
|
|
|
23620
24270
|
const r = readCappedText(
|
|
23621
24271
|
file2,
|
|
23622
24272
|
MAX_CONFIG_BYTES,
|
|
23623
|
-
|
|
24273
|
+
import_fs12.default.constants.O_RDONLY | (import_fs12.default.constants.O_NONBLOCK ?? 0)
|
|
23624
24274
|
);
|
|
23625
24275
|
if (r) hostsInText(r.text, hosts);
|
|
23626
24276
|
}
|
|
23627
24277
|
cache3.set(key, { at: Date.now(), hosts });
|
|
23628
24278
|
return hosts;
|
|
23629
24279
|
}
|
|
23630
|
-
var
|
|
24280
|
+
var import_os8, import_path12, import_fs12, MAX_CONFIG_BYTES, MAX_PARENT_DIRS, TTL_MS, PROJECT_FILES, ENV_VARS, PATH_VARS, REGISTRY_KEY_RE, REGISTRY_SECTION_RE, URL_RE2, cache3;
|
|
23631
24281
|
var init_registries = __esm({
|
|
23632
24282
|
"src/supply-chain/registries.ts"() {
|
|
23633
24283
|
"use strict";
|
|
23634
24284
|
init_cjs_shims();
|
|
23635
|
-
|
|
23636
|
-
|
|
23637
|
-
|
|
24285
|
+
import_os8 = __toESM(require("os"));
|
|
24286
|
+
import_path12 = __toESM(require("path"));
|
|
24287
|
+
import_fs12 = __toESM(require("fs"));
|
|
23638
24288
|
init_dist();
|
|
23639
24289
|
init_read_capped();
|
|
23640
24290
|
MAX_CONFIG_BYTES = 256 * 1024;
|
|
@@ -23682,13 +24332,13 @@ var init_registries = __esm({
|
|
|
23682
24332
|
|
|
23683
24333
|
// src/utils/provenance.ts
|
|
23684
24334
|
function findInPath(cmd) {
|
|
23685
|
-
if (
|
|
24335
|
+
if (import_path13.default.posix.isAbsolute(cmd)) return cmd;
|
|
23686
24336
|
const pathEnv = process.env.PATH ?? "";
|
|
23687
|
-
for (const dir2 of pathEnv.split(
|
|
24337
|
+
for (const dir2 of pathEnv.split(import_path13.default.delimiter)) {
|
|
23688
24338
|
if (!dir2) continue;
|
|
23689
|
-
const full =
|
|
24339
|
+
const full = import_path13.default.join(dir2, cmd);
|
|
23690
24340
|
try {
|
|
23691
|
-
|
|
24341
|
+
import_fs13.default.accessSync(full, import_fs13.default.constants.X_OK);
|
|
23692
24342
|
return full;
|
|
23693
24343
|
} catch {
|
|
23694
24344
|
}
|
|
@@ -23699,7 +24349,7 @@ function _classifyPath(resolved, cwd) {
|
|
|
23699
24349
|
if (cwd && resolved.startsWith(cwd + "/")) {
|
|
23700
24350
|
return { trustLevel: "user", reason: "binary in project directory" };
|
|
23701
24351
|
}
|
|
23702
|
-
const osTmp =
|
|
24352
|
+
const osTmp = import_os9.default.tmpdir();
|
|
23703
24353
|
const allSuspect = osTmp ? [...SUSPECT_PREFIXES, osTmp] : SUSPECT_PREFIXES;
|
|
23704
24354
|
if (allSuspect.some((p) => resolved === p || resolved.startsWith(p + "/"))) {
|
|
23705
24355
|
return { trustLevel: "suspect", reason: `binary in temp directory: ${resolved}` };
|
|
@@ -23717,7 +24367,7 @@ function _classifyPath(resolved, cwd) {
|
|
|
23717
24367
|
}
|
|
23718
24368
|
function checkProvenance(cmd, cwd) {
|
|
23719
24369
|
const bare = cmd.startsWith("./") ? cmd.slice(2) : cmd;
|
|
23720
|
-
if (
|
|
24370
|
+
if (import_path13.default.posix.isAbsolute(bare)) {
|
|
23721
24371
|
const early = _classifyPath(bare, cwd);
|
|
23722
24372
|
if (early.trustLevel === "suspect") {
|
|
23723
24373
|
return { resolvedPath: bare, ...early };
|
|
@@ -23733,7 +24383,7 @@ function checkProvenance(cmd, cwd) {
|
|
|
23733
24383
|
reason: "binary not found in PATH"
|
|
23734
24384
|
};
|
|
23735
24385
|
}
|
|
23736
|
-
resolved =
|
|
24386
|
+
resolved = import_fs13.default.realpathSync(found);
|
|
23737
24387
|
} catch {
|
|
23738
24388
|
return {
|
|
23739
24389
|
resolvedPath: cmd,
|
|
@@ -23742,7 +24392,7 @@ function checkProvenance(cmd, cwd) {
|
|
|
23742
24392
|
};
|
|
23743
24393
|
}
|
|
23744
24394
|
try {
|
|
23745
|
-
const stat =
|
|
24395
|
+
const stat = import_fs13.default.statSync(resolved);
|
|
23746
24396
|
if (stat.mode & 2) {
|
|
23747
24397
|
return {
|
|
23748
24398
|
resolvedPath: resolved,
|
|
@@ -23760,22 +24410,22 @@ function checkProvenance(cmd, cwd) {
|
|
|
23760
24410
|
const classify2 = _classifyPath(resolved, cwd);
|
|
23761
24411
|
return { resolvedPath: resolved, ...classify2 };
|
|
23762
24412
|
}
|
|
23763
|
-
var
|
|
24413
|
+
var import_fs13, import_path13, import_os9, SYSTEM_PREFIXES, MANAGED_PREFIXES, USER_PREFIXES, SUSPECT_PREFIXES;
|
|
23764
24414
|
var init_provenance2 = __esm({
|
|
23765
24415
|
"src/utils/provenance.ts"() {
|
|
23766
24416
|
"use strict";
|
|
23767
24417
|
init_cjs_shims();
|
|
23768
|
-
|
|
23769
|
-
|
|
23770
|
-
|
|
24418
|
+
import_fs13 = __toESM(require("fs"));
|
|
24419
|
+
import_path13 = __toESM(require("path"));
|
|
24420
|
+
import_os9 = __toESM(require("os"));
|
|
23771
24421
|
SYSTEM_PREFIXES = ["/usr/bin", "/usr/sbin", "/bin", "/sbin"];
|
|
23772
24422
|
MANAGED_PREFIXES = ["/usr/local/bin", "/opt/homebrew", "/home/linuxbrew", "/nix/store"];
|
|
23773
24423
|
USER_PREFIXES = [
|
|
23774
|
-
|
|
23775
|
-
|
|
23776
|
-
|
|
23777
|
-
|
|
23778
|
-
|
|
24424
|
+
import_path13.default.join(import_os9.default.homedir(), "bin"),
|
|
24425
|
+
import_path13.default.join(import_os9.default.homedir(), ".local", "bin"),
|
|
24426
|
+
import_path13.default.join(import_os9.default.homedir(), ".cargo", "bin"),
|
|
24427
|
+
import_path13.default.join(import_os9.default.homedir(), ".npm-global", "bin"),
|
|
24428
|
+
import_path13.default.join(import_os9.default.homedir(), ".volta", "bin")
|
|
23779
24429
|
];
|
|
23780
24430
|
SUSPECT_PREFIXES = ["/tmp", "/var/tmp", "/dev/shm"];
|
|
23781
24431
|
}
|
|
@@ -23813,9 +24463,9 @@ async function evaluatePolicy2(toolName, args, agent, cwd, opts) {
|
|
|
23813
24463
|
);
|
|
23814
24464
|
}
|
|
23815
24465
|
function isGitWorkTreeTop(dir2, cwd) {
|
|
23816
|
-
if (!
|
|
24466
|
+
if (!import_path14.default.isAbsolute(cwd)) return true;
|
|
23817
24467
|
try {
|
|
23818
|
-
return
|
|
24468
|
+
return import_fs14.default.existsSync(import_path14.default.join(import_path14.default.resolve(cwd, dir2), ".git"));
|
|
23819
24469
|
} catch {
|
|
23820
24470
|
return true;
|
|
23821
24471
|
}
|
|
@@ -23824,7 +24474,7 @@ function readAgentSettings(absPath) {
|
|
|
23824
24474
|
const r = readCappedText(
|
|
23825
24475
|
absPath,
|
|
23826
24476
|
MAX_AGENT_SETTINGS_BYTES,
|
|
23827
|
-
|
|
24477
|
+
import_fs14.default.constants.O_RDONLY | (import_fs14.default.constants.O_NONBLOCK ?? 0)
|
|
23828
24478
|
);
|
|
23829
24479
|
return r && !r.truncated ? r.text : null;
|
|
23830
24480
|
}
|
|
@@ -24017,9 +24667,9 @@ async function explainEngineVerdict(toolName, args, agent, config, prepared) {
|
|
|
24017
24667
|
};
|
|
24018
24668
|
}
|
|
24019
24669
|
function explainWaterfall(config) {
|
|
24020
|
-
const globalPath =
|
|
24021
|
-
const projectPath =
|
|
24022
|
-
const credsPath =
|
|
24670
|
+
const globalPath = import_path14.default.join(import_os10.default.homedir(), ".node9", "config.json");
|
|
24671
|
+
const projectPath = import_path14.default.join(process.cwd(), "node9.config.json");
|
|
24672
|
+
const credsPath = import_path14.default.join(import_os10.default.homedir(), ".node9", "credentials.json");
|
|
24023
24673
|
const wsGoverned = config.policySource === "workspace";
|
|
24024
24674
|
const waterfall = [
|
|
24025
24675
|
{
|
|
@@ -24031,22 +24681,22 @@ function explainWaterfall(config) {
|
|
|
24031
24681
|
{
|
|
24032
24682
|
tier: 2,
|
|
24033
24683
|
label: wsGoverned ? "Workspace config" : "Cloud policy",
|
|
24034
|
-
status:
|
|
24035
|
-
note:
|
|
24684
|
+
status: import_fs14.default.existsSync(credsPath) ? "active" : "missing",
|
|
24685
|
+
note: import_fs14.default.existsSync(credsPath) ? wsGoverned ? "authoritative \u2014 this machine follows the workspace configuration (app.node9.ai)" : "credentials found (not evaluated in explain mode)" : "not connected \u2014 run: node9 login"
|
|
24036
24686
|
},
|
|
24037
24687
|
{
|
|
24038
24688
|
tier: 3,
|
|
24039
24689
|
label: "Project config",
|
|
24040
|
-
status:
|
|
24690
|
+
status: import_fs14.default.existsSync(projectPath) ? "active" : "missing",
|
|
24041
24691
|
path: projectPath,
|
|
24042
|
-
...wsGoverned &&
|
|
24692
|
+
...wsGoverned && import_fs14.default.existsSync(projectPath) ? { note: "present \u2014 ignored (workspace config governs policy)" } : {}
|
|
24043
24693
|
},
|
|
24044
24694
|
{
|
|
24045
24695
|
tier: 4,
|
|
24046
24696
|
label: "Global config",
|
|
24047
|
-
status:
|
|
24697
|
+
status: import_fs14.default.existsSync(globalPath) ? "active" : "missing",
|
|
24048
24698
|
path: globalPath,
|
|
24049
|
-
...wsGoverned &&
|
|
24699
|
+
...wsGoverned && import_fs14.default.existsSync(globalPath) ? { note: "present \u2014 ignored (workspace config governs policy)" } : {}
|
|
24050
24700
|
},
|
|
24051
24701
|
{
|
|
24052
24702
|
tier: 5,
|
|
@@ -24133,7 +24783,7 @@ async function deriveExplainTrace(toolName, args) {
|
|
|
24133
24783
|
});
|
|
24134
24784
|
const everyInline = reviewsEveryInline(config.settings.mode);
|
|
24135
24785
|
const strictInline = everyInline && detectInlineExec(shellCommand);
|
|
24136
|
-
const inline = everyInline ? null : inlineExecReview(shellCommand);
|
|
24786
|
+
const inline = everyInline ? null : inlineExecReview(shellCommand, config.policy.jailPaths);
|
|
24137
24787
|
const inlineValue = checkValue(
|
|
24138
24788
|
catalogSettingsFromConfig(config.settings, config.policy),
|
|
24139
24789
|
"commands.inline-exec"
|
|
@@ -24306,16 +24956,16 @@ async function deriveExplainTrace(toolName, args) {
|
|
|
24306
24956
|
});
|
|
24307
24957
|
return { tool: toolName, args, waterfall, steps, decision: "allow" };
|
|
24308
24958
|
}
|
|
24309
|
-
var
|
|
24959
|
+
var import_fs14, import_path14, import_os10, MAX_AGENT_SETTINGS_BYTES, SQL_DML_KEYWORDS2, EXPLAIN_AGENT, PACKAGE_STEP, ENGINE_STEP, GATE_STEP, GATE_PLAIN;
|
|
24310
24960
|
var init_policy = __esm({
|
|
24311
24961
|
"src/policy/index.ts"() {
|
|
24312
24962
|
"use strict";
|
|
24313
24963
|
init_cjs_shims();
|
|
24314
24964
|
init_dist();
|
|
24315
|
-
|
|
24965
|
+
import_fs14 = __toESM(require("fs"));
|
|
24316
24966
|
init_read_capped();
|
|
24317
|
-
|
|
24318
|
-
|
|
24967
|
+
import_path14 = __toESM(require("path"));
|
|
24968
|
+
import_os10 = __toESM(require("os"));
|
|
24319
24969
|
init_dlp();
|
|
24320
24970
|
init_gate_order();
|
|
24321
24971
|
init_file_access();
|
|
@@ -24360,11 +25010,11 @@ function extractCommandPattern(toolName, args) {
|
|
|
24360
25010
|
function checkPause() {
|
|
24361
25011
|
if (forecastRun()) return { paused: false };
|
|
24362
25012
|
try {
|
|
24363
|
-
if (!
|
|
24364
|
-
const state = JSON.parse(
|
|
25013
|
+
if (!import_fs15.default.existsSync(PAUSED_FILE)) return { paused: false };
|
|
25014
|
+
const state = JSON.parse(import_fs15.default.readFileSync(PAUSED_FILE, "utf-8"));
|
|
24365
25015
|
if (state.expiry > 0 && Date.now() >= state.expiry) {
|
|
24366
25016
|
try {
|
|
24367
|
-
|
|
25017
|
+
import_fs15.default.unlinkSync(PAUSED_FILE);
|
|
24368
25018
|
} catch {
|
|
24369
25019
|
}
|
|
24370
25020
|
return { paused: false };
|
|
@@ -24380,15 +25030,15 @@ function pauseNode9(durationMs, durationStr) {
|
|
|
24380
25030
|
}
|
|
24381
25031
|
function resumeNode9() {
|
|
24382
25032
|
try {
|
|
24383
|
-
if (
|
|
25033
|
+
if (import_fs15.default.existsSync(PAUSED_FILE)) import_fs15.default.unlinkSync(PAUSED_FILE);
|
|
24384
25034
|
} catch {
|
|
24385
25035
|
}
|
|
24386
25036
|
}
|
|
24387
25037
|
function getActiveTrustSession(toolName, args) {
|
|
24388
25038
|
if (forecastRun()) return false;
|
|
24389
25039
|
try {
|
|
24390
|
-
if (!
|
|
24391
|
-
const trust = JSON.parse(
|
|
25040
|
+
if (!import_fs15.default.existsSync(TRUST_FILE)) return false;
|
|
25041
|
+
const trust = JSON.parse(import_fs15.default.readFileSync(TRUST_FILE, "utf-8"));
|
|
24392
25042
|
const now = Date.now();
|
|
24393
25043
|
const active = trust.entries.filter((e) => e.expiry > now);
|
|
24394
25044
|
if (active.length !== trust.entries.length) {
|
|
@@ -24411,8 +25061,8 @@ function writeTrustSession(toolName, durationMs, args) {
|
|
|
24411
25061
|
try {
|
|
24412
25062
|
let trust = { entries: [] };
|
|
24413
25063
|
try {
|
|
24414
|
-
if (
|
|
24415
|
-
trust = JSON.parse(
|
|
25064
|
+
if (import_fs15.default.existsSync(TRUST_FILE)) {
|
|
25065
|
+
trust = JSON.parse(import_fs15.default.readFileSync(TRUST_FILE, "utf-8"));
|
|
24416
25066
|
}
|
|
24417
25067
|
} catch {
|
|
24418
25068
|
}
|
|
@@ -24434,28 +25084,28 @@ function writeTrustSession(toolName, durationMs, args) {
|
|
|
24434
25084
|
}
|
|
24435
25085
|
function getPersistentDecision(toolName) {
|
|
24436
25086
|
try {
|
|
24437
|
-
const file2 =
|
|
24438
|
-
if (!
|
|
24439
|
-
const decisions = JSON.parse(
|
|
25087
|
+
const file2 = import_path15.default.join(import_os11.default.homedir(), ".node9", "decisions.json");
|
|
25088
|
+
if (!import_fs15.default.existsSync(file2)) return null;
|
|
25089
|
+
const decisions = JSON.parse(import_fs15.default.readFileSync(file2, "utf-8"));
|
|
24440
25090
|
const d = decisions[toolName];
|
|
24441
25091
|
if (d === "allow" || d === "deny") return d;
|
|
24442
25092
|
} catch {
|
|
24443
25093
|
}
|
|
24444
25094
|
return null;
|
|
24445
25095
|
}
|
|
24446
|
-
var
|
|
25096
|
+
var import_fs15, import_path15, import_os11, PAUSED_FILE, TRUST_FILE;
|
|
24447
25097
|
var init_state = __esm({
|
|
24448
25098
|
"src/auth/state.ts"() {
|
|
24449
25099
|
"use strict";
|
|
24450
25100
|
init_cjs_shims();
|
|
24451
|
-
|
|
24452
|
-
|
|
24453
|
-
|
|
25101
|
+
import_fs15 = __toESM(require("fs"));
|
|
25102
|
+
import_path15 = __toESM(require("path"));
|
|
25103
|
+
import_os11 = __toESM(require("os"));
|
|
24454
25104
|
init_policy();
|
|
24455
25105
|
init_atomic_write();
|
|
24456
25106
|
init_forecast_context();
|
|
24457
|
-
PAUSED_FILE =
|
|
24458
|
-
TRUST_FILE =
|
|
25107
|
+
PAUSED_FILE = import_path15.default.join(import_os11.default.homedir(), ".node9", "PAUSED");
|
|
25108
|
+
TRUST_FILE = import_path15.default.join(import_os11.default.homedir(), ".node9", "trust.json");
|
|
24459
25109
|
}
|
|
24460
25110
|
});
|
|
24461
25111
|
|
|
@@ -24469,8 +25119,8 @@ function ownRealDir(st) {
|
|
|
24469
25119
|
}
|
|
24470
25120
|
function ensureOwnDir(dir2) {
|
|
24471
25121
|
try {
|
|
24472
|
-
|
|
24473
|
-
const st =
|
|
25122
|
+
import_fs16.default.mkdirSync(dir2, { recursive: true, mode: 448 });
|
|
25123
|
+
const st = import_fs16.default.lstatSync(dir2);
|
|
24474
25124
|
return ownRealDir(st) ? { dev: st.dev, ino: st.ino } : null;
|
|
24475
25125
|
} catch {
|
|
24476
25126
|
return null;
|
|
@@ -24478,7 +25128,7 @@ function ensureOwnDir(dir2) {
|
|
|
24478
25128
|
}
|
|
24479
25129
|
function isSameOwnDir(dir2, seen) {
|
|
24480
25130
|
try {
|
|
24481
|
-
const st =
|
|
25131
|
+
const st = import_fs16.default.lstatSync(dir2);
|
|
24482
25132
|
return ownRealDir(st) && st.dev === seen.dev && st.ino === seen.ino;
|
|
24483
25133
|
} catch {
|
|
24484
25134
|
return false;
|
|
@@ -24486,22 +25136,22 @@ function isSameOwnDir(dir2, seen) {
|
|
|
24486
25136
|
}
|
|
24487
25137
|
function removeOldFlag(dir2, seen, name, cutoffMs) {
|
|
24488
25138
|
if (!isSessionFlagName(name)) return;
|
|
24489
|
-
const p =
|
|
25139
|
+
const p = import_path16.default.join(dir2, name);
|
|
24490
25140
|
try {
|
|
24491
|
-
const st =
|
|
25141
|
+
const st = import_fs16.default.lstatSync(p);
|
|
24492
25142
|
if (!st.isFile() || st.mtimeMs >= cutoffMs) return;
|
|
24493
25143
|
if (!isSameOwnDir(dir2, seen)) return;
|
|
24494
|
-
|
|
25144
|
+
import_fs16.default.unlinkSync(p);
|
|
24495
25145
|
} catch {
|
|
24496
25146
|
}
|
|
24497
25147
|
}
|
|
24498
|
-
var
|
|
25148
|
+
var import_fs16, import_path16, SESSION_FLAG_SUFFIX, SESSION_FLAG_NAME;
|
|
24499
25149
|
var init_own_dir = __esm({
|
|
24500
25150
|
"src/utils/own-dir.ts"() {
|
|
24501
25151
|
"use strict";
|
|
24502
25152
|
init_cjs_shims();
|
|
24503
|
-
|
|
24504
|
-
|
|
25153
|
+
import_fs16 = __toESM(require("fs"));
|
|
25154
|
+
import_path16 = __toESM(require("path"));
|
|
24505
25155
|
SESSION_FLAG_SUFFIX = ".node9-flag";
|
|
24506
25156
|
SESSION_FLAG_NAME = /^[A-Za-z0-9_-]{1,128}\.node9-flag$/;
|
|
24507
25157
|
}
|
|
@@ -24513,7 +25163,7 @@ function maxSocketPathBytes(platform) {
|
|
|
24513
25163
|
}
|
|
24514
25164
|
function isPrivateDir(dir2, uid = currentUid()) {
|
|
24515
25165
|
try {
|
|
24516
|
-
const st =
|
|
25166
|
+
const st = import_fs17.default.lstatSync(dir2);
|
|
24517
25167
|
if (st.isSymbolicLink() || !st.isDirectory()) return false;
|
|
24518
25168
|
if (uid !== void 0 && st.uid !== uid) return false;
|
|
24519
25169
|
return (st.mode & 18) === 0;
|
|
@@ -24524,30 +25174,32 @@ function isPrivateDir(dir2, uid = currentUid()) {
|
|
|
24524
25174
|
function privateDir(dir2) {
|
|
24525
25175
|
if (!ensureOwnDir(dir2)) return false;
|
|
24526
25176
|
try {
|
|
24527
|
-
const st =
|
|
24528
|
-
if ((st.mode & 63) !== 0)
|
|
25177
|
+
const st = import_fs17.default.lstatSync(dir2);
|
|
25178
|
+
if ((st.mode & 63) !== 0) import_fs17.default.chmodSync(dir2, 448);
|
|
24529
25179
|
} catch {
|
|
24530
25180
|
return false;
|
|
24531
25181
|
}
|
|
24532
25182
|
return isPrivateDir(dir2);
|
|
24533
25183
|
}
|
|
25184
|
+
function perHomeRuntimeDir(env, home) {
|
|
25185
|
+
const xdg = env.XDG_RUNTIME_DIR;
|
|
25186
|
+
if (!xdg || !import_path17.default.isAbsolute(xdg)) return null;
|
|
25187
|
+
return import_path17.default.join(xdg, `node9-${(0, import_crypto10.createHash)("sha256").update(home).digest("hex").slice(0, 12)}`);
|
|
25188
|
+
}
|
|
24534
25189
|
function chooseActivitySocketPath(env, home, platform = process.platform) {
|
|
24535
25190
|
const candidates2 = [];
|
|
24536
|
-
const
|
|
24537
|
-
if (
|
|
24538
|
-
|
|
24539
|
-
import_path16.default.join(xdg, `node9-${(0, import_crypto10.createHash)("sha256").update(home).digest("hex").slice(0, 12)}`)
|
|
24540
|
-
);
|
|
24541
|
-
candidates2.push(import_path16.default.join(home, ".node9", "run"));
|
|
25191
|
+
const xdgDir = perHomeRuntimeDir(env, home);
|
|
25192
|
+
if (xdgDir && isPrivateDir(import_path17.default.dirname(xdgDir))) candidates2.push(xdgDir);
|
|
25193
|
+
candidates2.push(import_path17.default.join(home, ".node9", "run"));
|
|
24542
25194
|
for (const dir2 of candidates2) {
|
|
24543
|
-
const socketPath =
|
|
25195
|
+
const socketPath = import_path17.default.join(dir2, SOCKET_NAME);
|
|
24544
25196
|
if (Buffer.byteLength(socketPath) >= maxSocketPathBytes(platform)) continue;
|
|
24545
25197
|
if (privateDir(dir2)) return socketPath;
|
|
24546
25198
|
}
|
|
24547
25199
|
return null;
|
|
24548
25200
|
}
|
|
24549
25201
|
function ensureActivitySocketDir(socketPath) {
|
|
24550
|
-
return privateDir(
|
|
25202
|
+
return privateDir(import_path17.default.dirname(socketPath));
|
|
24551
25203
|
}
|
|
24552
25204
|
function windowsActivityPipeName() {
|
|
24553
25205
|
return `\\\\.\\pipe\\node9-activity-${(0, import_crypto10.randomBytes)(16).toString("hex")}`;
|
|
@@ -24555,30 +25207,43 @@ function windowsActivityPipeName() {
|
|
|
24555
25207
|
function isTrustedActivitySocket(socketPath, uid = currentUid()) {
|
|
24556
25208
|
if (process.platform === "win32") return WINDOWS_PIPE.test(socketPath);
|
|
24557
25209
|
try {
|
|
24558
|
-
const st =
|
|
25210
|
+
const st = import_fs17.default.lstatSync(socketPath);
|
|
24559
25211
|
if (!st.isSocket()) return false;
|
|
24560
25212
|
if (uid !== void 0 && st.uid !== uid) return false;
|
|
24561
25213
|
} catch {
|
|
24562
25214
|
return false;
|
|
24563
25215
|
}
|
|
24564
|
-
return isPrivateDir(
|
|
25216
|
+
return isPrivateDir(import_path17.default.dirname(socketPath), uid);
|
|
24565
25217
|
}
|
|
24566
25218
|
function isOwnStaleSocket(socketPath) {
|
|
24567
25219
|
try {
|
|
24568
|
-
const st =
|
|
25220
|
+
const st = import_fs17.default.lstatSync(socketPath);
|
|
24569
25221
|
const uid = currentUid();
|
|
24570
25222
|
return st.isSocket() && (uid === void 0 || st.uid === uid);
|
|
24571
25223
|
} catch {
|
|
24572
25224
|
return false;
|
|
24573
25225
|
}
|
|
24574
25226
|
}
|
|
24575
|
-
|
|
25227
|
+
function removeOwnSocketDir(socketPath, env, home, platform = process.platform) {
|
|
25228
|
+
if (platform === "win32") return false;
|
|
25229
|
+
const dir2 = import_path17.default.dirname(socketPath);
|
|
25230
|
+
if (dir2 !== perHomeRuntimeDir(env, home)) return false;
|
|
25231
|
+
if (!isPrivateDir(dir2)) return false;
|
|
25232
|
+
try {
|
|
25233
|
+
if (import_fs17.default.readdirSync(dir2).length > 0) return false;
|
|
25234
|
+
import_fs17.default.rmdirSync(dir2);
|
|
25235
|
+
return true;
|
|
25236
|
+
} catch {
|
|
25237
|
+
return false;
|
|
25238
|
+
}
|
|
25239
|
+
}
|
|
25240
|
+
var import_fs17, import_path17, import_crypto10, SOCKET_NAME, currentUid, WINDOWS_PIPE;
|
|
24576
25241
|
var init_activity_socket = __esm({
|
|
24577
25242
|
"src/utils/activity-socket.ts"() {
|
|
24578
25243
|
"use strict";
|
|
24579
25244
|
init_cjs_shims();
|
|
24580
|
-
|
|
24581
|
-
|
|
25245
|
+
import_fs17 = __toESM(require("fs"));
|
|
25246
|
+
import_path17 = __toESM(require("path"));
|
|
24582
25247
|
import_crypto10 = require("crypto");
|
|
24583
25248
|
init_own_dir();
|
|
24584
25249
|
SOCKET_NAME = "activity.sock";
|
|
@@ -24784,9 +25449,9 @@ var init_decision_record = __esm({
|
|
|
24784
25449
|
});
|
|
24785
25450
|
|
|
24786
25451
|
// src/auth/daemon.ts
|
|
24787
|
-
function daemonActivitySocket(home =
|
|
25452
|
+
function daemonActivitySocket(home = import_os12.default.homedir()) {
|
|
24788
25453
|
try {
|
|
24789
|
-
const raw =
|
|
25454
|
+
const raw = import_fs18.default.readFileSync(import_path18.default.join(home, ".node9", "daemon.pid"), "utf-8");
|
|
24790
25455
|
const p = JSON.parse(raw).activitySocket;
|
|
24791
25456
|
return typeof p === "string" && isTrustedActivitySocket(p) ? p : null;
|
|
24792
25457
|
} catch {
|
|
@@ -24846,9 +25511,9 @@ function resolveDaemonPort(env = process.env) {
|
|
|
24846
25511
|
function getInternalToken() {
|
|
24847
25512
|
if (forecastRun()) return null;
|
|
24848
25513
|
try {
|
|
24849
|
-
const pidFile =
|
|
24850
|
-
if (!
|
|
24851
|
-
const data = JSON.parse(
|
|
25514
|
+
const pidFile = import_path18.default.join(import_os12.default.homedir(), ".node9", "daemon.pid");
|
|
25515
|
+
if (!import_fs18.default.existsSync(pidFile)) return null;
|
|
25516
|
+
const data = JSON.parse(import_fs18.default.readFileSync(pidFile, "utf-8"));
|
|
24852
25517
|
process.kill(data.pid, 0);
|
|
24853
25518
|
return data.internalToken ?? null;
|
|
24854
25519
|
} catch {
|
|
@@ -24857,12 +25522,12 @@ function getInternalToken() {
|
|
|
24857
25522
|
}
|
|
24858
25523
|
function isDaemonRunning() {
|
|
24859
25524
|
if (forecastRun()) return false;
|
|
24860
|
-
const pidFile =
|
|
24861
|
-
if (
|
|
25525
|
+
const pidFile = import_path18.default.join(import_os12.default.homedir(), ".node9", "daemon.pid");
|
|
25526
|
+
if (import_fs18.default.existsSync(pidFile)) {
|
|
24862
25527
|
let pid;
|
|
24863
25528
|
let port;
|
|
24864
25529
|
try {
|
|
24865
|
-
const data = JSON.parse(
|
|
25530
|
+
const data = JSON.parse(import_fs18.default.readFileSync(pidFile, "utf-8"));
|
|
24866
25531
|
pid = data.pid;
|
|
24867
25532
|
port = data.port;
|
|
24868
25533
|
} catch {
|
|
@@ -24880,7 +25545,7 @@ function isDaemonRunning() {
|
|
|
24880
25545
|
} catch (err2) {
|
|
24881
25546
|
if (err2 instanceof Error && "code" in err2 && err2.code === "ESRCH") {
|
|
24882
25547
|
try {
|
|
24883
|
-
|
|
25548
|
+
import_fs18.default.unlinkSync(pidFile);
|
|
24884
25549
|
} catch {
|
|
24885
25550
|
}
|
|
24886
25551
|
}
|
|
@@ -25352,16 +26017,16 @@ async function resolveViaDaemon(id, decision, internalToken, source, record2) {
|
|
|
25352
26017
|
const winner = parseDecisionRecord(body?.record);
|
|
25353
26018
|
return winner && typeof body?.won === "boolean" ? { won: body.won, record: winner } : null;
|
|
25354
26019
|
}
|
|
25355
|
-
var
|
|
26020
|
+
var import_fs18, import_http, import_net4, import_path18, import_os12, ACTIVITY_SOCKET_TIMEOUT_MS, DEFAULT_DAEMON_PORT, DAEMON_PORT, DAEMON_HOST;
|
|
25356
26021
|
var init_daemon = __esm({
|
|
25357
26022
|
"src/auth/daemon.ts"() {
|
|
25358
26023
|
"use strict";
|
|
25359
26024
|
init_cjs_shims();
|
|
25360
|
-
|
|
26025
|
+
import_fs18 = __toESM(require("fs"));
|
|
25361
26026
|
import_http = __toESM(require("http"));
|
|
25362
26027
|
import_net4 = __toESM(require("net"));
|
|
25363
|
-
|
|
25364
|
-
|
|
26028
|
+
import_path18 = __toESM(require("path"));
|
|
26029
|
+
import_os12 = __toESM(require("os"));
|
|
25365
26030
|
init_forecast_context();
|
|
25366
26031
|
init_activity_socket();
|
|
25367
26032
|
init_decision_record();
|
|
@@ -25624,13 +26289,13 @@ function deriveServerName(cmd) {
|
|
|
25624
26289
|
return strip(base3) || "MCP Server";
|
|
25625
26290
|
}
|
|
25626
26291
|
function getMcpToolsFile() {
|
|
25627
|
-
return
|
|
26292
|
+
return import_path19.default.join(import_os13.default.homedir(), ".node9", "mcp-tools.json");
|
|
25628
26293
|
}
|
|
25629
26294
|
function readMcpToolsConfig() {
|
|
25630
26295
|
try {
|
|
25631
26296
|
const file2 = getMcpToolsFile();
|
|
25632
|
-
if (!
|
|
25633
|
-
const raw =
|
|
26297
|
+
if (!import_fs19.default.existsSync(file2)) return {};
|
|
26298
|
+
const raw = import_fs19.default.readFileSync(file2, "utf-8");
|
|
25634
26299
|
return JSON.parse(raw);
|
|
25635
26300
|
} catch {
|
|
25636
26301
|
return {};
|
|
@@ -25639,11 +26304,11 @@ function readMcpToolsConfig() {
|
|
|
25639
26304
|
function writeMcpToolsConfig(config) {
|
|
25640
26305
|
try {
|
|
25641
26306
|
const file2 = getMcpToolsFile();
|
|
25642
|
-
const dir2 =
|
|
25643
|
-
if (!
|
|
25644
|
-
const tmpPath = `${file2}.${
|
|
25645
|
-
|
|
25646
|
-
|
|
26307
|
+
const dir2 = import_path19.default.dirname(file2);
|
|
26308
|
+
if (!import_fs19.default.existsSync(dir2)) import_fs19.default.mkdirSync(dir2, { recursive: true });
|
|
26309
|
+
const tmpPath = `${file2}.${import_os13.default.hostname()}.${process.pid}.tmp`;
|
|
26310
|
+
import_fs19.default.writeFileSync(tmpPath, JSON.stringify(config, null, 2));
|
|
26311
|
+
import_fs19.default.renameSync(tmpPath, file2);
|
|
25647
26312
|
} catch (e) {
|
|
25648
26313
|
console.error("Failed to write mcp-tools.json", e);
|
|
25649
26314
|
}
|
|
@@ -25698,21 +26363,21 @@ function approveServer(serverKey, disabledTools) {
|
|
|
25698
26363
|
writeMcpToolsConfig(config);
|
|
25699
26364
|
}
|
|
25700
26365
|
}
|
|
25701
|
-
var
|
|
26366
|
+
var import_fs19, import_path19, import_os13;
|
|
25702
26367
|
var init_mcp_tools = __esm({
|
|
25703
26368
|
"src/daemon/mcp-tools.ts"() {
|
|
25704
26369
|
"use strict";
|
|
25705
26370
|
init_cjs_shims();
|
|
25706
|
-
|
|
25707
|
-
|
|
25708
|
-
|
|
26371
|
+
import_fs19 = __toESM(require("fs"));
|
|
26372
|
+
import_path19 = __toESM(require("path"));
|
|
26373
|
+
import_os13 = __toESM(require("os"));
|
|
25709
26374
|
init_mcp_cmd();
|
|
25710
26375
|
}
|
|
25711
26376
|
});
|
|
25712
26377
|
|
|
25713
26378
|
// src/apps/state.ts
|
|
25714
|
-
function appsFilePath(home =
|
|
25715
|
-
return
|
|
26379
|
+
function appsFilePath(home = import_os14.default.homedir()) {
|
|
26380
|
+
return import_path20.default.join(home, ".node9", "apps.json");
|
|
25716
26381
|
}
|
|
25717
26382
|
function emptyFile() {
|
|
25718
26383
|
return { version: 1, apps: /* @__PURE__ */ Object.create(null), links: /* @__PURE__ */ Object.create(null) };
|
|
@@ -25759,7 +26424,7 @@ function readAppsFile(home) {
|
|
|
25759
26424
|
function readAppsFileStrict(home) {
|
|
25760
26425
|
let text;
|
|
25761
26426
|
try {
|
|
25762
|
-
text =
|
|
26427
|
+
text = import_fs20.default.readFileSync(appsFilePath(home), "utf8");
|
|
25763
26428
|
} catch (e) {
|
|
25764
26429
|
return e.code === "ENOENT" ? emptyFile() : null;
|
|
25765
26430
|
}
|
|
@@ -25771,10 +26436,10 @@ function readAppsFileStrict(home) {
|
|
|
25771
26436
|
}
|
|
25772
26437
|
function writeAppsFile(data, home) {
|
|
25773
26438
|
const file2 = appsFilePath(home);
|
|
25774
|
-
|
|
26439
|
+
import_fs20.default.mkdirSync(import_path20.default.dirname(file2), { recursive: true });
|
|
25775
26440
|
const tmp = `${file2}.${import_crypto11.default.randomBytes(6).toString("hex")}.tmp`;
|
|
25776
|
-
|
|
25777
|
-
|
|
26441
|
+
import_fs20.default.writeFileSync(tmp, JSON.stringify(data, null, 2) + "\n", { mode: 384 });
|
|
26442
|
+
import_fs20.default.renameSync(tmp, file2);
|
|
25778
26443
|
}
|
|
25779
26444
|
function applyDetection(found, opts = { managed: false }) {
|
|
25780
26445
|
const result = { turnedOn: [], recordedOnly: [] };
|
|
@@ -25840,7 +26505,7 @@ function setLink(server, slug2, home) {
|
|
|
25840
26505
|
function localLinks() {
|
|
25841
26506
|
const file2 = appsFilePath();
|
|
25842
26507
|
try {
|
|
25843
|
-
const mtimeMs =
|
|
26508
|
+
const mtimeMs = import_fs20.default.statSync(file2).mtimeMs;
|
|
25844
26509
|
if (!linkCache || linkCache.file !== file2 || linkCache.mtimeMs !== mtimeMs) {
|
|
25845
26510
|
linkCache = { mtimeMs, file: file2, links: readAppsFile().links };
|
|
25846
26511
|
}
|
|
@@ -25878,14 +26543,14 @@ function resolveLinkedServer(label3, opts = {}) {
|
|
|
25878
26543
|
}
|
|
25879
26544
|
return label3;
|
|
25880
26545
|
}
|
|
25881
|
-
var
|
|
26546
|
+
var import_fs20, import_os14, import_path20, import_crypto11, SIGNAL_KINDS, linkCache, NO_LINKS;
|
|
25882
26547
|
var init_state2 = __esm({
|
|
25883
26548
|
"src/apps/state.ts"() {
|
|
25884
26549
|
"use strict";
|
|
25885
26550
|
init_cjs_shims();
|
|
25886
|
-
|
|
25887
|
-
|
|
25888
|
-
|
|
26551
|
+
import_fs20 = __toESM(require("fs"));
|
|
26552
|
+
import_os14 = __toESM(require("os"));
|
|
26553
|
+
import_path20 = __toESM(require("path"));
|
|
25889
26554
|
import_crypto11 = __toESM(require("crypto"));
|
|
25890
26555
|
init_catalog();
|
|
25891
26556
|
init_shields();
|
|
@@ -25949,7 +26614,7 @@ function computeRiskMetadata(args, tier, blockedByLabel, matchedField, matchedWo
|
|
|
25949
26614
|
intent = "EDIT";
|
|
25950
26615
|
if (obj.file_path) {
|
|
25951
26616
|
editFilePath = String(obj.file_path);
|
|
25952
|
-
editFileName =
|
|
26617
|
+
editFileName = import_path21.default.basename(editFilePath);
|
|
25953
26618
|
}
|
|
25954
26619
|
const result = extractContext(String(obj.new_string), matchedWord);
|
|
25955
26620
|
contextSnippet = result.snippet;
|
|
@@ -25981,12 +26646,12 @@ function computeRiskMetadata(args, tier, blockedByLabel, matchedField, matchedWo
|
|
|
25981
26646
|
...ruleName && { ruleName }
|
|
25982
26647
|
};
|
|
25983
26648
|
}
|
|
25984
|
-
var
|
|
26649
|
+
var import_path21, CODE_KEYS;
|
|
25985
26650
|
var init_context_sniper = __esm({
|
|
25986
26651
|
"src/context-sniper.ts"() {
|
|
25987
26652
|
"use strict";
|
|
25988
26653
|
init_cjs_shims();
|
|
25989
|
-
|
|
26654
|
+
import_path21 = __toESM(require("path"));
|
|
25990
26655
|
CODE_KEYS = [
|
|
25991
26656
|
"command",
|
|
25992
26657
|
"cmd",
|
|
@@ -26043,7 +26708,7 @@ function formatArgs(args, matchedField, matchedWord) {
|
|
|
26043
26708
|
if (typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
26044
26709
|
const obj = parsed;
|
|
26045
26710
|
if (obj.old_string !== void 0 && obj.new_string !== void 0) {
|
|
26046
|
-
const file2 = obj.file_path ?
|
|
26711
|
+
const file2 = obj.file_path ? import_path22.default.basename(String(obj.file_path)) : "file";
|
|
26047
26712
|
const oldPreview = smartTruncate(String(obj.old_string), 120);
|
|
26048
26713
|
const newPreview = extractContext(String(obj.new_string), matchedWord).snippet;
|
|
26049
26714
|
return {
|
|
@@ -26260,13 +26925,13 @@ end run`;
|
|
|
26260
26925
|
}
|
|
26261
26926
|
});
|
|
26262
26927
|
}
|
|
26263
|
-
var import_child_process,
|
|
26928
|
+
var import_child_process, import_path22, isTestEnv, MIN_INTERACTION_MS;
|
|
26264
26929
|
var init_native = __esm({
|
|
26265
26930
|
"src/ui/native.ts"() {
|
|
26266
26931
|
"use strict";
|
|
26267
26932
|
init_cjs_shims();
|
|
26268
26933
|
import_child_process = require("child_process");
|
|
26269
|
-
|
|
26934
|
+
import_path22 = __toESM(require("path"));
|
|
26270
26935
|
init_context_sniper();
|
|
26271
26936
|
init_safe_text();
|
|
26272
26937
|
isTestEnv = () => {
|
|
@@ -26276,108 +26941,6 @@ var init_native = __esm({
|
|
|
26276
26941
|
}
|
|
26277
26942
|
});
|
|
26278
26943
|
|
|
26279
|
-
// src/shields/jail.ts
|
|
26280
|
-
function jailStorePath() {
|
|
26281
|
-
return import_path22.default.join(import_os14.default.homedir(), ".node9", "jail-paths.json");
|
|
26282
|
-
}
|
|
26283
|
-
function readJailPaths() {
|
|
26284
|
-
let text;
|
|
26285
|
-
try {
|
|
26286
|
-
text = import_fs20.default.readFileSync(jailStorePath(), "utf8");
|
|
26287
|
-
} catch (err2) {
|
|
26288
|
-
if (err2.code === "ENOENT") return [];
|
|
26289
|
-
throw err2;
|
|
26290
|
-
}
|
|
26291
|
-
let parsed;
|
|
26292
|
-
try {
|
|
26293
|
-
parsed = JSON.parse(text);
|
|
26294
|
-
} catch {
|
|
26295
|
-
throw new Error(`${jailStorePath()} is not valid JSON \u2014 fix it before changing the jail.`);
|
|
26296
|
-
}
|
|
26297
|
-
if (!Array.isArray(parsed.paths)) return [];
|
|
26298
|
-
return parsed.paths.filter(
|
|
26299
|
-
(p) => !!p && typeof p.path === "string" && (p.verdict === "block" || p.verdict === "review")
|
|
26300
|
-
);
|
|
26301
|
-
}
|
|
26302
|
-
function writeJailPaths(paths) {
|
|
26303
|
-
const p = jailStorePath();
|
|
26304
|
-
import_fs20.default.mkdirSync(import_path22.default.dirname(p), { recursive: true });
|
|
26305
|
-
import_fs20.default.writeFileSync(p, JSON.stringify({ paths }, null, 2) + "\n", { mode: 384 });
|
|
26306
|
-
}
|
|
26307
|
-
function addJailPath(rawPath, verdict) {
|
|
26308
|
-
const norm = rawPath.trim();
|
|
26309
|
-
const fragment = pathToRegexFragment(norm);
|
|
26310
|
-
if (!fragment) {
|
|
26311
|
-
throw new Error(
|
|
26312
|
-
`"${rawPath}" is too broad to jail \u2014 give a specific path (e.g. ~/.gmail-mcp), not a home or root directory.`
|
|
26313
|
-
);
|
|
26314
|
-
}
|
|
26315
|
-
const rejection = validateRegex(fragment);
|
|
26316
|
-
if (rejection !== null) {
|
|
26317
|
-
throw new Error(
|
|
26318
|
-
`"${rawPath}" cannot be jailed: the generated match pattern was rejected by the policy engine (${rejection}). Try a shorter or more specific path.`
|
|
26319
|
-
);
|
|
26320
|
-
}
|
|
26321
|
-
const next = [...readJailPaths().filter((p) => p.path !== norm), { path: norm, verdict }];
|
|
26322
|
-
writeJailPaths(next);
|
|
26323
|
-
return next;
|
|
26324
|
-
}
|
|
26325
|
-
function findJailedPath(candidate) {
|
|
26326
|
-
return findJailedPathIn(candidate, readJailPaths());
|
|
26327
|
-
}
|
|
26328
|
-
function findJailedPathIn(candidate, paths) {
|
|
26329
|
-
if (!candidate) return null;
|
|
26330
|
-
for (const entry of paths) {
|
|
26331
|
-
if (pathMatchesFragment(candidate, entry.path)) return entry;
|
|
26332
|
-
}
|
|
26333
|
-
return null;
|
|
26334
|
-
}
|
|
26335
|
-
function removeJailPath(rawPath) {
|
|
26336
|
-
const norm = rawPath.trim();
|
|
26337
|
-
const before = readJailPaths();
|
|
26338
|
-
const after = before.filter((p) => p.path !== norm);
|
|
26339
|
-
const removed = after.length !== before.length;
|
|
26340
|
-
if (removed) writeJailPaths(after);
|
|
26341
|
-
return { removed, paths: after };
|
|
26342
|
-
}
|
|
26343
|
-
function regenerateUserJail(paths) {
|
|
26344
|
-
const file2 = import_path22.default.join(USER_SHIELDS_DIR_PATH, `${USER_JAIL_SHIELD}.json`);
|
|
26345
|
-
if (paths.length === 0) {
|
|
26346
|
-
const active2 = readActiveShields();
|
|
26347
|
-
if (active2.includes(USER_JAIL_SHIELD)) {
|
|
26348
|
-
writeActiveShields(active2.filter((s) => s !== USER_JAIL_SHIELD));
|
|
26349
|
-
}
|
|
26350
|
-
try {
|
|
26351
|
-
import_fs20.default.rmSync(file2, { force: true });
|
|
26352
|
-
} catch {
|
|
26353
|
-
}
|
|
26354
|
-
return;
|
|
26355
|
-
}
|
|
26356
|
-
const def = buildShield({
|
|
26357
|
-
name: USER_JAIL_SHIELD,
|
|
26358
|
-
description: "User-added credential jail paths (node9 jail add)",
|
|
26359
|
-
blockPaths: paths.filter((p) => p.verdict === "block").map((p) => p.path),
|
|
26360
|
-
reviewPaths: paths.filter((p) => p.verdict === "review").map((p) => p.path)
|
|
26361
|
-
});
|
|
26362
|
-
installShield(USER_JAIL_SHIELD, def);
|
|
26363
|
-
const active = readActiveShields();
|
|
26364
|
-
if (!active.includes(USER_JAIL_SHIELD)) writeActiveShields([...active, USER_JAIL_SHIELD]);
|
|
26365
|
-
}
|
|
26366
|
-
var import_fs20, import_os14, import_path22, USER_JAIL_SHIELD;
|
|
26367
|
-
var init_jail = __esm({
|
|
26368
|
-
"src/shields/jail.ts"() {
|
|
26369
|
-
"use strict";
|
|
26370
|
-
init_cjs_shims();
|
|
26371
|
-
import_fs20 = __toESM(require("fs"));
|
|
26372
|
-
import_os14 = __toESM(require("os"));
|
|
26373
|
-
import_path22 = __toESM(require("path"));
|
|
26374
|
-
init_build();
|
|
26375
|
-
init_dist();
|
|
26376
|
-
init_shields();
|
|
26377
|
-
USER_JAIL_SHIELD = "user-jail";
|
|
26378
|
-
}
|
|
26379
|
-
});
|
|
26380
|
-
|
|
26381
26944
|
// src/canary/registry.ts
|
|
26382
26945
|
function canaryStorePath() {
|
|
26383
26946
|
return import_path23.default.join(import_os15.default.homedir(), ".node9", "canaries.json");
|
|
@@ -44460,6 +45023,9 @@ function getDaemonServer() {
|
|
|
44460
45023
|
function markRejectionHandlerRegistered() {
|
|
44461
45024
|
daemonRejectionHandlerRegistered = true;
|
|
44462
45025
|
}
|
|
45026
|
+
function markSignalHandlersRegistered() {
|
|
45027
|
+
daemonSignalHandlersRegistered = true;
|
|
45028
|
+
}
|
|
44463
45029
|
function getActivitySocketPath() {
|
|
44464
45030
|
return ACTIVITY_SOCKET_PATH;
|
|
44465
45031
|
}
|
|
@@ -44679,18 +45245,80 @@ function startActivitySocket() {
|
|
|
44679
45245
|
return;
|
|
44680
45246
|
}
|
|
44681
45247
|
bindActivitySocket();
|
|
44682
|
-
|
|
44683
|
-
|
|
44684
|
-
|
|
45248
|
+
startHealthProbe();
|
|
45249
|
+
process.on("exit", stopActivitySocket);
|
|
45250
|
+
}
|
|
45251
|
+
function startHealthProbe() {
|
|
45252
|
+
if (activityHealthInterval) clearInterval(activityHealthInterval);
|
|
45253
|
+
activityHealthInterval = setInterval(probeActivitySocket, ACTIVITY_HEALTH_PROBE_MS);
|
|
44685
45254
|
activityHealthInterval.unref();
|
|
44686
|
-
|
|
44687
|
-
|
|
44688
|
-
|
|
44689
|
-
|
|
44690
|
-
|
|
44691
|
-
|
|
44692
|
-
|
|
44693
|
-
|
|
45255
|
+
}
|
|
45256
|
+
function stopHealthProbe() {
|
|
45257
|
+
if (activityHealthInterval) clearInterval(activityHealthInterval);
|
|
45258
|
+
activityHealthInterval = null;
|
|
45259
|
+
}
|
|
45260
|
+
function isLiveOtherDaemonPid(pid) {
|
|
45261
|
+
if (typeof pid !== "number" || !Number.isInteger(pid) || pid <= 0 || pid > 4194304)
|
|
45262
|
+
return false;
|
|
45263
|
+
if (pid === process.pid) return false;
|
|
45264
|
+
try {
|
|
45265
|
+
process.kill(pid, 0);
|
|
45266
|
+
return true;
|
|
45267
|
+
} catch {
|
|
45268
|
+
return false;
|
|
45269
|
+
}
|
|
45270
|
+
}
|
|
45271
|
+
function anotherDaemonOwnsPidFile() {
|
|
45272
|
+
try {
|
|
45273
|
+
const raw = import_fs65.default.readFileSync(import_path68.default.join(homeDir, ".node9", "daemon.pid"), "utf-8");
|
|
45274
|
+
return isLiveOtherDaemonPid(JSON.parse(raw).pid);
|
|
45275
|
+
} catch {
|
|
45276
|
+
return false;
|
|
45277
|
+
}
|
|
45278
|
+
}
|
|
45279
|
+
function yieldToOtherDaemon() {
|
|
45280
|
+
if (!activityYieldLogged) {
|
|
45281
|
+
logActivitySocket("another daemon owns daemon.pid; this one leaves the socket to it");
|
|
45282
|
+
activityYieldLogged = true;
|
|
45283
|
+
}
|
|
45284
|
+
}
|
|
45285
|
+
function probeActivitySocket() {
|
|
45286
|
+
const socketPath = ACTIVITY_SOCKET_PATH;
|
|
45287
|
+
if (!socketPath) return;
|
|
45288
|
+
if (process.platform === "win32") {
|
|
45289
|
+
if (!import_fs65.default.existsSync(socketPath)) attemptRebind("health-probe");
|
|
45290
|
+
return;
|
|
45291
|
+
}
|
|
45292
|
+
let st;
|
|
45293
|
+
try {
|
|
45294
|
+
st = import_fs65.default.lstatSync(socketPath);
|
|
45295
|
+
} catch {
|
|
45296
|
+
attemptRebind("health-probe");
|
|
45297
|
+
return;
|
|
45298
|
+
}
|
|
45299
|
+
const bound = activitySocketIdentity;
|
|
45300
|
+
if (!bound || st.dev === bound.dev && st.ino === bound.ino) return;
|
|
45301
|
+
if (anotherDaemonOwnsPidFile()) {
|
|
45302
|
+
yieldToOtherDaemon();
|
|
45303
|
+
return;
|
|
45304
|
+
}
|
|
45305
|
+
activityYieldLogged = false;
|
|
45306
|
+
attemptRebind("socket-replaced");
|
|
45307
|
+
}
|
|
45308
|
+
function stopActivitySocket() {
|
|
45309
|
+
stopHealthProbe();
|
|
45310
|
+
const socketPath = ACTIVITY_SOCKET_PATH;
|
|
45311
|
+
const bound = activitySocketIdentity;
|
|
45312
|
+
ACTIVITY_SOCKET_PATH = null;
|
|
45313
|
+
activitySocketIdentity = null;
|
|
45314
|
+
if (!socketPath || !bound || process.platform === "win32") return;
|
|
45315
|
+
try {
|
|
45316
|
+
const st = import_fs65.default.lstatSync(socketPath);
|
|
45317
|
+
if (isOwnStaleSocket(socketPath) && st.dev === bound.dev && st.ino === bound.ino)
|
|
45318
|
+
import_fs65.default.unlinkSync(socketPath);
|
|
45319
|
+
} catch {
|
|
45320
|
+
}
|
|
45321
|
+
removeOwnSocketDir(socketPath, process.env, import_os55.default.homedir());
|
|
44694
45322
|
}
|
|
44695
45323
|
function attemptRebind(reason) {
|
|
44696
45324
|
if (!shouldRebind()) {
|
|
@@ -44701,6 +45329,7 @@ function attemptRebind(reason) {
|
|
|
44701
45329
|
reason: "rebind-loop",
|
|
44702
45330
|
message: "Activity socket repeatedly disappearing \u2014 run: node9 daemon restart"
|
|
44703
45331
|
});
|
|
45332
|
+
stopHealthProbe();
|
|
44704
45333
|
return;
|
|
44705
45334
|
}
|
|
44706
45335
|
logActivitySocket(`rebinding (reason: ${reason}, attempt ${activityRebindAttempts.length})`);
|
|
@@ -44824,6 +45453,8 @@ function bindActivitySocket() {
|
|
|
44824
45453
|
if (process.platform !== "win32") {
|
|
44825
45454
|
try {
|
|
44826
45455
|
import_fs65.default.chmodSync(socketPath, 384);
|
|
45456
|
+
const st = import_fs65.default.lstatSync(socketPath);
|
|
45457
|
+
activitySocketIdentity = { dev: st.dev, ino: st.ino };
|
|
44827
45458
|
} catch {
|
|
44828
45459
|
}
|
|
44829
45460
|
}
|
|
@@ -44831,7 +45462,7 @@ function bindActivitySocket() {
|
|
|
44831
45462
|
});
|
|
44832
45463
|
activitySocketServer = unixServer;
|
|
44833
45464
|
}
|
|
44834
|
-
var import_net5, import_fs65, import_path68, import_os55, import_crypto20, homeDir, DAEMON_PID_FILE, DECISIONS_FILE, AUDIT_LOG_FILE, TRUST_FILE2, GLOBAL_CONFIG_FILE, CREDENTIALS_FILE, INSIGHT_COUNTS_FILE, sseClients, cards, suggestionTracker, taintStore, sessionTaintStore, sessionExposureStore, sessionWriteStore, insightCounts, _abandonTimer, _hadBrowserClient, _daemonServer, daemonRejectionHandlerRegistered, AUTO_DENY_MS, TRUST_DURATIONS, autoStarted, ACTIVITY_SOCKET_PATH, activitySocketPathListeners, ACTIVITY_RING_SIZE, activityRing, LARGE_RESPONSE_RING_SIZE, largeResponseRing, cachedScanResult, cachedScanTs, SCAN_CACHE_TTL_MS, SECRET_KEY_RE, INPUT_PRICE_PER_1M, OUTPUT_PRICE_PER_1M, BYTES_PER_TOKEN, CRITICAL_FORENSIC_CATEGORIES, WRITE_TOOL_NAMES, ACTIVITY_REBIND_MAX_ATTEMPTS, ACTIVITY_REBIND_WINDOW_MS, ACTIVITY_HEALTH_PROBE_MS, activitySocketServer, activityHealthInterval, activityRebindAttempts, activityCircuitTripped;
|
|
45465
|
+
var import_net5, import_fs65, import_path68, import_os55, import_crypto20, homeDir, DAEMON_PID_FILE, DECISIONS_FILE, AUDIT_LOG_FILE, TRUST_FILE2, GLOBAL_CONFIG_FILE, CREDENTIALS_FILE, INSIGHT_COUNTS_FILE, sseClients, cards, suggestionTracker, taintStore, sessionTaintStore, sessionExposureStore, sessionWriteStore, insightCounts, _abandonTimer, _hadBrowserClient, _daemonServer, daemonRejectionHandlerRegistered, daemonSignalHandlersRegistered, AUTO_DENY_MS, TRUST_DURATIONS, autoStarted, ACTIVITY_SOCKET_PATH, activitySocketPathListeners, ACTIVITY_RING_SIZE, activityRing, LARGE_RESPONSE_RING_SIZE, largeResponseRing, cachedScanResult, cachedScanTs, SCAN_CACHE_TTL_MS, SECRET_KEY_RE, INPUT_PRICE_PER_1M, OUTPUT_PRICE_PER_1M, BYTES_PER_TOKEN, CRITICAL_FORENSIC_CATEGORIES, WRITE_TOOL_NAMES, ACTIVITY_REBIND_MAX_ATTEMPTS, ACTIVITY_REBIND_WINDOW_MS, ACTIVITY_HEALTH_PROBE_MS, activitySocketServer, activitySocketIdentity, activityHealthInterval, activityRebindAttempts, activityCircuitTripped, activityYieldLogged;
|
|
44835
45466
|
var init_state3 = __esm({
|
|
44836
45467
|
"src/daemon/state.ts"() {
|
|
44837
45468
|
"use strict";
|
|
@@ -44876,6 +45507,7 @@ var init_state3 = __esm({
|
|
|
44876
45507
|
_hadBrowserClient = false;
|
|
44877
45508
|
_daemonServer = null;
|
|
44878
45509
|
daemonRejectionHandlerRegistered = false;
|
|
45510
|
+
daemonSignalHandlersRegistered = false;
|
|
44879
45511
|
AUTO_DENY_MS = 12e4;
|
|
44880
45512
|
TRUST_DURATIONS = {
|
|
44881
45513
|
"30m": 30 * 6e4,
|
|
@@ -44916,9 +45548,11 @@ var init_state3 = __esm({
|
|
|
44916
45548
|
ACTIVITY_REBIND_WINDOW_MS = 6e4;
|
|
44917
45549
|
ACTIVITY_HEALTH_PROBE_MS = 2e3;
|
|
44918
45550
|
activitySocketServer = null;
|
|
45551
|
+
activitySocketIdentity = null;
|
|
44919
45552
|
activityHealthInterval = null;
|
|
44920
45553
|
activityRebindAttempts = [];
|
|
44921
45554
|
activityCircuitTripped = false;
|
|
45555
|
+
activityYieldLogged = false;
|
|
44922
45556
|
}
|
|
44923
45557
|
});
|
|
44924
45558
|
|
|
@@ -48528,6 +49162,12 @@ data: ${JSON.stringify(item.data)}
|
|
|
48528
49162
|
console.error(import_chalk8.default.red("[node9 daemon] unhandled rejection \u2014 keeping daemon alive:"), stack);
|
|
48529
49163
|
});
|
|
48530
49164
|
}
|
|
49165
|
+
if (!daemonSignalHandlersRegistered) {
|
|
49166
|
+
markSignalHandlersRegistered();
|
|
49167
|
+
process.once("SIGTERM", () => process.exit(0));
|
|
49168
|
+
process.once("SIGINT", () => process.exit(130));
|
|
49169
|
+
process.once("SIGHUP", () => process.exit(129));
|
|
49170
|
+
}
|
|
48531
49171
|
const writeOwnPidFile = () => atomicWriteSync(
|
|
48532
49172
|
DAEMON_PID_FILE,
|
|
48533
49173
|
JSON.stringify({
|
|
@@ -48544,6 +49184,7 @@ data: ${JSON.stringify(item.data)}
|
|
|
48544
49184
|
{ mode: 384 }
|
|
48545
49185
|
);
|
|
48546
49186
|
server.listen(DAEMON_PORT, DAEMON_HOST, () => {
|
|
49187
|
+
startActivitySocket();
|
|
48547
49188
|
writeOwnPidFile();
|
|
48548
49189
|
onActivitySocketPathChange(() => {
|
|
48549
49190
|
try {
|
|
@@ -48558,7 +49199,6 @@ data: ${JSON.stringify(item.data)}
|
|
|
48558
49199
|
if (watchMode) {
|
|
48559
49200
|
console.error(import_chalk8.default.cyan("\u{1F6F0}\uFE0F Flight Recorder active \u2014 daemon will not idle-timeout"));
|
|
48560
49201
|
}
|
|
48561
|
-
startActivitySocket();
|
|
48562
49202
|
}
|
|
48563
49203
|
var import_http4, import_fs72, import_path74, import_os60, import_crypto23, import_child_process5, import_chalk8;
|
|
48564
49204
|
var init_server = __esm({
|
|
@@ -85738,7 +86378,8 @@ function summarize(results, config) {
|
|
|
85738
86378
|
if (stopped) c.interrupted++;
|
|
85739
86379
|
continue;
|
|
85740
86380
|
}
|
|
85741
|
-
|
|
86381
|
+
const notEnforcedStop = r.enforced === false && (r.decision === "review" || r.decision === "block");
|
|
86382
|
+
if (!stopped && !notEnforcedStop && (r.unknown?.length ?? 0) > 0) {
|
|
85742
86383
|
c.undetermined++;
|
|
85743
86384
|
continue;
|
|
85744
86385
|
}
|