@node9/proxy 2.38.0 → 2.39.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.
@@ -415,6 +415,28 @@ function classifySsrf(host2) {
415
415
  return null;
416
416
  }
417
417
  }
418
+ function isModeValue(v) {
419
+ return typeof v === "string" && MODE_VALUES.includes(v);
420
+ }
421
+ function levelOf(mode) {
422
+ if (mode === "observe") return "audit";
423
+ return LEVELS.includes(mode ?? "") ? mode : "standard";
424
+ }
425
+ function isRecordOnly(mode) {
426
+ return levelOf(mode) === "audit";
427
+ }
428
+ function isBlockAll(mode) {
429
+ return levelOf(mode) === "block-all";
430
+ }
431
+ function levelCheckValue(mode, id) {
432
+ return LEVEL_CHECKS[levelOf(mode)][id];
433
+ }
434
+ function levelChecks(mode) {
435
+ return LEVEL_CHECKS[levelOf(mode)];
436
+ }
437
+ function levelPackageSignals(mode) {
438
+ return levelOf(mode) === "soft" ? { newPackage: "off", installScript: "off" } : void 0;
439
+ }
418
440
  function isVerdict(v) {
419
441
  return v === "off" || v === "log" || v === "review" || v === "block";
420
442
  }
@@ -488,19 +510,21 @@ function resolveCheck(settings, id) {
488
510
  if (!def) return void 0;
489
511
  if (isLockedCheck(def)) return { id, value: "block", source: "locked" };
490
512
  const floor = def.floor ? CHECK_VERDICT_RANK[def.floor] : 0;
513
+ const levelDefault = levelCheckValue(settings.mode, id) ?? def.defaultValue;
514
+ const sourceOf = (value2) => value2 === levelDefault ? "default" : "configured";
491
515
  const explicit = settings.checks?.[id];
492
516
  if (isVerdict(explicit)) {
493
517
  const value2 = CHECK_VERDICT_RANK[explicit] < floor ? def.floor : explicit;
494
- return { id, value: value2, source: value2 === def.defaultValue ? "default" : "configured" };
518
+ return { id, value: value2, source: sourceOf(value2) };
495
519
  }
496
520
  if (def.pack) {
497
521
  const on = settings.appliedShields?.includes(def.pack) ?? false;
498
522
  return { id, value: on ? def.defaultValue : "off", source: "default" };
499
523
  }
500
524
  const read = LEGACY_READERS[id]?.(settings);
501
- if (read === void 0) return { id, value: def.defaultValue, source: "default" };
525
+ if (read === void 0) return { id, value: levelDefault, source: "default" };
502
526
  const value = CHECK_VERDICT_RANK[read] < floor ? def.floor : read;
503
- return { id, value, source: value === def.defaultValue ? "default" : "configured" };
527
+ return { id, value, source: sourceOf(value) };
504
528
  }
505
529
  function checkValue(settings, id) {
506
530
  return resolveCheck(settings, id)?.value ?? "off";
@@ -2432,6 +2456,20 @@ function scanArgs(args, depth = 0, fieldPath = "args") {
2432
2456
  }
2433
2457
  return null;
2434
2458
  }
2459
+ function tuningFromLegacyPolicy(policy) {
2460
+ const out = {};
2461
+ const p = policy;
2462
+ if (policy.packageCheck?.registrySignals === false) {
2463
+ out["loading.malicious-package"] = { newPackage: "off", installScript: "off" };
2464
+ }
2465
+ for (const f of TUNING_FIELDS) {
2466
+ const [block, key] = f.legacy;
2467
+ const value = p[block]?.[key];
2468
+ if (value === void 0) continue;
2469
+ (out[f.checkId] ??= {})[f.name] = value;
2470
+ }
2471
+ return out;
2472
+ }
2435
2473
  function tuningToLegacyPolicy(policy, tuning) {
2436
2474
  const unknown = [];
2437
2475
  for (const [id, fields] of Object.entries(tuning)) {
@@ -2546,6 +2584,25 @@ function checkToLegacyPolicy(policy, id, v) {
2546
2584
  return false;
2547
2585
  }
2548
2586
  }
2587
+ function knobStatedChecks(policy) {
2588
+ const out = /* @__PURE__ */ new Set();
2589
+ const has2 = (o, key) => !!o && typeof o === "object" && o[key] !== void 0;
2590
+ const { dlp, egress, loopDetection, injectionScan, skillPinning, packageCheck } = policy;
2591
+ const uc = policy.untrustedContent;
2592
+ if (has2(dlp, "enabled")) out.add("data.secrets");
2593
+ if (has2(dlp, "reviewAction") || dlp?.enabled === false) out.add("data.secrets-weak");
2594
+ if (has2(dlp, "pii")) out.add("data.pii");
2595
+ if (has2(egress, "enabled") || has2(egress, "mode")) out.add("network.unknown-host");
2596
+ if (has2(egress, "ssrfStrict")) out.add("network.internal-addresses");
2597
+ if (has2(loopDetection, "enabled")) out.add("behavior.loops");
2598
+ if (has2(injectionScan, "enabled")) out.add("behavior.prompt-injection");
2599
+ if (has2(skillPinning, "enabled") || has2(skillPinning, "mode")) out.add("loading.skill-tamper");
2600
+ if (has2(packageCheck, "enabled") || has2(packageCheck, "onMalicious"))
2601
+ out.add("loading.malicious-package");
2602
+ if (uc && typeof uc === "object" && (uc.enabled === false || has2(uc, "afterExposure")))
2603
+ out.add("behavior.untrusted-content");
2604
+ return out;
2605
+ }
2549
2606
  function isKnobGoverned(id) {
2550
2607
  return id in KNOB_GOVERNED;
2551
2608
  }
@@ -2804,7 +2861,7 @@ function matchCanaryArgs(args, values) {
2804
2861
  return null;
2805
2862
  }
2806
2863
  }
2807
- var 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, 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, BUILTIN_SHIELDS, SSRF_MAX_HOST, METADATA_ADDRESSES, METADATA_HOSTNAMES, v4Octets, CHECK_TEXT, VERDICTS, CHECK_VERDICT_RANK, ALL, BUILTIN_DANGEROUS_WORDS, PRODUCT_CHECKS, SHIELD_RULE_NAME, SHIELD_RULES_FOLDED_INTO_PRODUCT, CHECKS, CHECK_BY_ID, LEGACY_TO_ID, LEGACY_READERS, INVISIBLE_RE, INVISIBLE_ONE, HOMOGLYPHS, HOMOGLYPH_RE, SYSTEM_DIRS, UPLOAD_SYSTEM_DIRS, LEGACY_SYSTEM_PATH_RE, MAX_INLINE_CODE, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, syntax, sharedParser, MESSAGE_FLAGS, SHELL_INTERPRETERS, DOWNLOAD_CMDS, NORMALIZE_CACHE_MAX, normalizeCache, AST_CACHE_MAX, astCache, PARSE_FAIL, INTERPRETER_LINE, PROGRAM_DIR, ACCESS_VIEW_CACHE_MAX, accessViewCache, MAX_READING_PAYLOADS, 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, COMMAND_WRAPPERS, INLINE_INTERPRETER, RUNNER_WRAPPERS, _listOps, WRAPPER_TAKES_TARGET, FIND_EXEC_FLAGS, FS_MUTATION_TOOLS, HOME_VARIABLES, assignmentTable, currentStmtOffset, PAYLOAD_BUDGET, payloadBudget, seenPayloads, UNANALYSABLE_NESTING, ASSIGNMENT_HEADS, AND_OP, OR_OP, AND_OR_OPS, MAX_CALL_DEPTH, MAX_CALL_WALKS, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, REDIR_TRUNCATE_OPS, REDIR_FILE_IN_OPS, REDIR_HEREDOC_OPS, FIND_OPTIONS, COPY_RULE_OF, isReaderWord, positionalAfter, NONE, UNKNOWN, FORBIDDEN_PATH_SEGMENTS, BASH_TOOL_NAMES, MCP_EXECUTORS, BUILTIN_FIELDS, ARGV_FIELDS, BARE_WORD, MAX_ARGV_CHARACTERS, syntax2, WRITES, READS, DUP_OUT, HERE_STRING, AND, OR, DEFAULT_OPS, BIP39_ENGLISH, indices, 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, 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, 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, syntax3, EDITOR_HEADS, MANAGER_HEADS, TUNING_FIELDS, MAP_GOVERNED, KNOB_GOVERNED, CONFIGURABLE_CHECK_IDS, SOURCE_COMMANDS, MAX_DESTINATIONS, MAX_SCAN_CHARS, EMAIL_RE, URL_RE, IBAN_RE, RECIPIENT_KEYS, MASKED_KINDS, ENTRY_RE, syntax4, PUBLISH, OWN_HEADS, TERMINAL_ESCAPE_RE, 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;
2864
+ var 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, 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, BUILTIN_SHIELDS, SSRF_MAX_HOST, METADATA_ADDRESSES, METADATA_HOSTNAMES, v4Octets, CHECK_TEXT, LEVELS, MODE_VALUES, SOFT, STRICT, BLOCK_ALL, LEVEL_CHECKS, VERDICTS, CHECK_VERDICT_RANK, ALL, BUILTIN_DANGEROUS_WORDS, PRODUCT_CHECKS, SHIELD_RULE_NAME, SHIELD_RULES_FOLDED_INTO_PRODUCT, CHECKS, CHECK_BY_ID, LEGACY_TO_ID, LEGACY_READERS, INVISIBLE_RE, INVISIBLE_ONE, HOMOGLYPHS, HOMOGLYPH_RE, SYSTEM_DIRS, UPLOAD_SYSTEM_DIRS, LEGACY_SYSTEM_PATH_RE, MAX_INLINE_CODE, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, syntax, sharedParser, MESSAGE_FLAGS, SHELL_INTERPRETERS, DOWNLOAD_CMDS, NORMALIZE_CACHE_MAX, normalizeCache, AST_CACHE_MAX, astCache, PARSE_FAIL, INTERPRETER_LINE, PROGRAM_DIR, ACCESS_VIEW_CACHE_MAX, accessViewCache, MAX_READING_PAYLOADS, 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, COMMAND_WRAPPERS, INLINE_INTERPRETER, RUNNER_WRAPPERS, _listOps, WRAPPER_TAKES_TARGET, FIND_EXEC_FLAGS, FS_MUTATION_TOOLS, HOME_VARIABLES, assignmentTable, currentStmtOffset, PAYLOAD_BUDGET, payloadBudget, seenPayloads, UNANALYSABLE_NESTING, ASSIGNMENT_HEADS, AND_OP, OR_OP, AND_OR_OPS, MAX_CALL_DEPTH, MAX_CALL_WALKS, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, REDIR_TRUNCATE_OPS, REDIR_FILE_IN_OPS, REDIR_HEREDOC_OPS, FIND_OPTIONS, COPY_RULE_OF, isReaderWord, positionalAfter, NONE, UNKNOWN, FORBIDDEN_PATH_SEGMENTS, BASH_TOOL_NAMES, MCP_EXECUTORS, BUILTIN_FIELDS, ARGV_FIELDS, BARE_WORD, MAX_ARGV_CHARACTERS, syntax2, WRITES, READS, DUP_OUT, HERE_STRING, AND, OR, DEFAULT_OPS, BIP39_ENGLISH, indices, 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, 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, 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, syntax3, EDITOR_HEADS, MANAGER_HEADS, TUNING_FIELDS, MAP_GOVERNED, KNOB_GOVERNED, CONFIGURABLE_CHECK_IDS, SOURCE_COMMANDS, MAX_DESTINATIONS, MAX_SCAN_CHARS, EMAIL_RE, URL_RE, IBAN_RE, RECIPIENT_KEYS, MASKED_KINDS, ENTRY_RE, syntax4, PUBLISH, OWN_HEADS, TERMINAL_ESCAPE_RE, 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;
2808
2865
  var init_dist = __esm({
2809
2866
  "packages/policy-engine/dist/index.mjs"() {
2810
2867
  "use strict";
@@ -4603,6 +4660,52 @@ var init_dist = __esm({
4603
4660
  advice: "Keep Block for known-malicious packages; brand-new packages already stop for Review."
4604
4661
  }
4605
4662
  };
4663
+ LEVELS = ["audit", "soft", "standard", "strict", "block-all"];
4664
+ MODE_VALUES = ["observe", ...LEVELS];
4665
+ SOFT = {
4666
+ "commands.inline-exec": "log",
4667
+ "commands.eval-dynamic": "log",
4668
+ "commands.rm": "log",
4669
+ "commands.chmod": "log",
4670
+ "commands.sudo": "log",
4671
+ "commands.git-destructive": "log",
4672
+ "commands.sql-ddl": "log",
4673
+ "commands.sql-no-where": "log",
4674
+ "commands.temp-binary": "log",
4675
+ "commands.disk-destroy": "log",
4676
+ "commands.dangerous-word": "log",
4677
+ "files.system-dirs": "log",
4678
+ "files.shell-startup": "log",
4679
+ "files.password-hashes": "log",
4680
+ "data.pipe-chain": "log",
4681
+ "behavior.untrusted-content": "log"
4682
+ };
4683
+ STRICT = {
4684
+ "commands.sql-ddl": "block",
4685
+ "commands.disk-destroy": "block",
4686
+ "commands.node9-disarm": "block",
4687
+ "files.system-dirs": "block",
4688
+ "files.shell-startup": "block",
4689
+ "files.password-hashes": "block",
4690
+ "data.secrets-weak": "block",
4691
+ "data.pipe-chain": "block",
4692
+ "network.unknown-host": "review",
4693
+ "network.internal-addresses": "block",
4694
+ "behavior.prompt-injection": "log",
4695
+ "loading.skill-tamper": "block"
4696
+ };
4697
+ BLOCK_ALL = {
4698
+ ...STRICT,
4699
+ "commands.unknown": "review",
4700
+ "commands.temp-binary": "block"
4701
+ };
4702
+ LEVEL_CHECKS = {
4703
+ audit: {},
4704
+ soft: SOFT,
4705
+ standard: {},
4706
+ strict: STRICT,
4707
+ "block-all": BLOCK_ALL
4708
+ };
4606
4709
  VERDICTS = ["off", "log", "review", "block"];
4607
4710
  CHECK_VERDICT_RANK = { off: 0, log: 1, review: 2, block: 3 };
4608
4711
  ALL = VERDICTS;
@@ -5056,7 +5159,7 @@ var init_dist = __esm({
5056
5159
  "commands.rm": (s) => knob(s.commandChecks?.rmAdvisory),
5057
5160
  "commands.chmod": (s) => knob(s.commandChecks?.chmod),
5058
5161
  "commands.sql-ddl": (s) => knob(s.commandChecks?.sqlDdl),
5059
- "commands.unknown": (s) => s.mode === void 0 ? void 0 : s.mode === "strict" ? "review" : "off",
5162
+ "commands.unknown": (s) => s.mode === void 0 ? void 0 : isBlockAll(s.mode) ? "review" : "off",
5060
5163
  "data.secrets": (s) => enabledOr(s.dlp?.enabled, "block"),
5061
5164
  "data.secrets-weak": (s) => {
5062
5165
  if (s.dlp?.enabled === false) return "off";
@@ -10066,7 +10169,8 @@ var init_config_schema = __esm({
10066
10169
  ConfigFileSchema = z.object({
10067
10170
  version: z.string().optional(),
10068
10171
  settings: z.object({
10069
- mode: z.enum(["standard", "strict", "audit", "observe"]).optional(),
10172
+ // The protection level (levels.ts in the engine); `observe` is Audit's older name.
10173
+ mode: z.enum(["observe", "audit", "soft", "standard", "strict", "block-all"]).optional(),
10070
10174
  autoStartDaemon: z.boolean().optional(),
10071
10175
  // enableUndo / policy.snapshot: removed with the undo feature. The
10072
10176
  // schema strips undeclared keys silently (plain zod object — no
@@ -10472,7 +10576,7 @@ var MODE_ORDER, EGRESS_MODE_ORDER, DLP_PII_ORDER, DLP_REVIEW_ACTION_ORDER, COMMA
10472
10576
  var init_managed = __esm({
10473
10577
  "src/config/managed.ts"() {
10474
10578
  "use strict";
10475
- MODE_ORDER = ["observe", "audit", "standard", "strict"];
10579
+ MODE_ORDER = ["observe", "audit", "soft", "standard", "strict", "block-all"];
10476
10580
  EGRESS_MODE_ORDER = ["off", "review", "block"];
10477
10581
  DLP_PII_ORDER = ["off", "block"];
10478
10582
  DLP_REVIEW_ACTION_ORDER = ["review", "block"];
@@ -10562,7 +10666,7 @@ function v2ToLegacy(raw, options = {}) {
10562
10666
  continue;
10563
10667
  }
10564
10668
  if (id === "commands.unknown") {
10565
- warnings.push(`checks.${id}: set "mode": "strict" instead`);
10669
+ warnings.push(`checks.${id}: set "mode": "block-all" instead`);
10566
10670
  continue;
10567
10671
  }
10568
10672
  const allowed = configurableValues(id);
@@ -10795,6 +10899,11 @@ function logCacheReadIssue(cacheFile, kind) {
10795
10899
  } catch {
10796
10900
  }
10797
10901
  }
10902
+ function statedSignalFields(policy) {
10903
+ return Object.keys(tuningFromLegacyPolicy(policy)["loading.malicious-package"] ?? {}).filter(
10904
+ (k) => k === "newPackage" || k === "installScript"
10905
+ );
10906
+ }
10798
10907
  function catalogSettingsFrom(settings, policy) {
10799
10908
  return catalogSettingsFromConfig(settings, policy);
10800
10909
  }
@@ -10862,6 +10971,8 @@ function getConfig(cwd) {
10862
10971
  const keyed = !!pr2Creds?.apiKey && pr2Creds.localOnly !== true;
10863
10972
  let ssrfStrictSource = "default";
10864
10973
  const workspaceChecks = {};
10974
+ const managedStatedChecks = /* @__PURE__ */ new Set();
10975
+ const managedStatedSignals = /* @__PURE__ */ new Set();
10865
10976
  const applyLayer = (source, isProject = false, isCloud = false) => {
10866
10977
  if (!source) return;
10867
10978
  const s = source.settings || {};
@@ -11069,9 +11180,11 @@ function getConfig(cwd) {
11069
11180
  if (raw.managedConfig && typeof raw.managedConfig === "object") {
11070
11181
  const mc = raw.managedConfig;
11071
11182
  const locked = Array.isArray(mc.locked) ? mc.locked.filter((f) => typeof f === "string") : [];
11183
+ for (const id of knobStatedChecks(mc)) managedStatedChecks.add(id);
11184
+ for (const k of statedSignalFields(mc)) managedStatedSignals.add(k);
11072
11185
  if (typeof mc.mode === "string") {
11073
11186
  if (keyed) {
11074
- if (["observe", "audit", "standard", "strict"].includes(mc.mode)) {
11187
+ if (isModeValue(mc.mode)) {
11075
11188
  mergedSettings.mode = mc.mode;
11076
11189
  }
11077
11190
  } else {
@@ -11353,14 +11466,15 @@ function getConfig(cwd) {
11353
11466
  const envMode = process.env.NODE9_MODE;
11354
11467
  if (envMode && !modeCloudControlled && // PR-2: one listening point includes the env var — a keyed machine's
11355
11468
  // mode comes from the workspace (or the shipped default), never the shell.
11356
- !keyed && ["observe", "audit", "standard", "strict"].includes(envMode)) {
11469
+ !keyed && isModeValue(envMode)) {
11357
11470
  mergedSettings.mode = envMode;
11358
11471
  }
11359
- if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && (mergedSettings.mode === "observe" || mergedSettings.mode === "audit")) {
11472
+ if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && isRecordOnly(mergedSettings.mode)) {
11360
11473
  mergedSettings.mode = "standard";
11361
11474
  }
11362
- const managedFloorActive = cloudManagedShields.length > 0 || cloudMandatesEnforcement || modeCloudControlled && mergedSettings.mode === "strict";
11363
- if (modeCloudControlled && mergedSettings.mode === "strict") {
11475
+ const cloudStrictLevel = levelOf(mergedSettings.mode) === "strict" || levelOf(mergedSettings.mode) === "block-all";
11476
+ const managedFloorActive = cloudManagedShields.length > 0 || cloudMandatesEnforcement || modeCloudControlled && cloudStrictLevel;
11477
+ if (modeCloudControlled && cloudStrictLevel) {
11364
11478
  for (const name of Object.keys(mergedEnvironments)) {
11365
11479
  if (mergedEnvironments[name]?.requireApproval === false) {
11366
11480
  const cleaned = { ...mergedEnvironments[name] };
@@ -11378,6 +11492,35 @@ function getConfig(cwd) {
11378
11492
  mergedPolicy.ignoredTools = [...new Set(mergedPolicy.ignoredTools)];
11379
11493
  mergedPolicy.skillPinning.roots = [...new Set(mergedPolicy.skillPinning.roots)];
11380
11494
  const resolvedSsrfStrictSource = keyed && ssrfStrictSource === "local" ? "default" : ssrfStrictSource;
11495
+ const level = levelOf(mergedSettings.mode);
11496
+ const levelKnobChecks = Object.entries(levelChecks(level)).filter(([id]) => isKnobGoverned(id));
11497
+ const signals = levelPackageSignals(level);
11498
+ if (levelKnobChecks.length > 0 || signals) {
11499
+ const policyOf = (layer) => layer?.policy ?? {};
11500
+ const trusted = /* @__PURE__ */ new Set([...managedStatedChecks, ...Object.keys(workspaceChecks)]);
11501
+ const trustedSignals = new Set(managedStatedSignals);
11502
+ const project = /* @__PURE__ */ new Set();
11503
+ const projectSignals = /* @__PURE__ */ new Set();
11504
+ if (!keyed) {
11505
+ for (const id of knobStatedChecks(policyOf(globalConfig))) trusted.add(id);
11506
+ for (const k of statedSignalFields(policyOf(globalConfig))) trustedSignals.add(k);
11507
+ for (const id of knobStatedChecks(policyOf(projectConfig))) project.add(id);
11508
+ for (const k of statedSignalFields(policyOf(projectConfig))) projectSignals.add(k);
11509
+ }
11510
+ const before = resolveCheckMap(catalogSettingsFromConfig({}, mergedPolicy));
11511
+ for (const [id, v] of levelKnobChecks) {
11512
+ if (trusted.has(id)) continue;
11513
+ if (project.has(id) && CHECK_VERDICT_RANK[v] <= CHECK_VERDICT_RANK[before[id] ?? "off"])
11514
+ continue;
11515
+ checkToLegacyPolicy(mergedPolicy, id, v);
11516
+ }
11517
+ if (signals) {
11518
+ for (const key of ["newPackage", "installScript"]) {
11519
+ if (trustedSignals.has(key) || projectSignals.has(key)) continue;
11520
+ mergedPolicy.packageCheck[key] = signals[key];
11521
+ }
11522
+ }
11523
+ }
11381
11524
  const explicit = {};
11382
11525
  const checkSources = {};
11383
11526
  if (keyed) {
@@ -12859,6 +13002,7 @@ var init_provenance = __esm({
12859
13002
  var init_policy = __esm({
12860
13003
  "src/policy/index.ts"() {
12861
13004
  "use strict";
13005
+ init_dist();
12862
13006
  init_dlp();
12863
13007
  init_file_access();
12864
13008
  init_config();