@node9/proxy 2.38.0 → 2.40.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";
@@ -4426,7 +4483,7 @@ var init_dist = __esm({
4426
4483
  "actions.money": {
4427
4484
  plain: "The agent moves money (a refund, a payout, a transfer, a charge) through an app node9 has no protection for, such as an internal billing server.",
4428
4485
  example: "refund_order on a server called acme-billing",
4429
- advice: "Keep Review. When the app is Stripe or PayPal, turn on its own protection instead: it covers the CLI, the API and scripts too, and a call from it no longer comes here."
4486
+ advice: "Standard records these and Strict asks. Set Review to be asked before every money move at any level. When the app is Stripe or PayPal, turn on its own protection instead: it covers the CLI, the API and scripts too, and a call from it no longer comes here."
4430
4487
  },
4431
4488
  "actions.access": {
4432
4489
  plain: "The agent changes a password, a key, a role or who belongs to a team, through an app node9 has no protection for.",
@@ -4603,6 +4660,54 @@ 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
+ // Standard records money moves (catalog default log); Strict asks.
4697
+ "actions.money": "review"
4698
+ };
4699
+ BLOCK_ALL = {
4700
+ ...STRICT,
4701
+ "commands.unknown": "review",
4702
+ "commands.temp-binary": "block"
4703
+ };
4704
+ LEVEL_CHECKS = {
4705
+ audit: {},
4706
+ soft: SOFT,
4707
+ standard: {},
4708
+ strict: STRICT,
4709
+ "block-all": BLOCK_ALL
4710
+ };
4606
4711
  VERDICTS = ["off", "log", "review", "block"];
4607
4712
  CHECK_VERDICT_RANK = { off: 0, log: 1, review: 2, block: 3 };
4608
4713
  ALL = VERDICTS;
@@ -5019,7 +5124,10 @@ var init_dist = __esm({
5019
5124
  title: "Money moves",
5020
5125
  catches: "a refund, payout, transfer, charge or withdrawal through an app with no protection of its own",
5021
5126
  values: ALL,
5022
- defaultValue: "review",
5127
+ // Founder decision 2026-10-25: a transfer the user asked for is ordinary
5128
+ // work. Standard records it; Strict asks (levels.ts); a user who wants to
5129
+ // be asked states review.
5130
+ defaultValue: "log",
5023
5131
  legacy: generalActionRuleNames("finance")
5024
5132
  },
5025
5133
  {
@@ -5056,7 +5164,7 @@ var init_dist = __esm({
5056
5164
  "commands.rm": (s) => knob(s.commandChecks?.rmAdvisory),
5057
5165
  "commands.chmod": (s) => knob(s.commandChecks?.chmod),
5058
5166
  "commands.sql-ddl": (s) => knob(s.commandChecks?.sqlDdl),
5059
- "commands.unknown": (s) => s.mode === void 0 ? void 0 : s.mode === "strict" ? "review" : "off",
5167
+ "commands.unknown": (s) => s.mode === void 0 ? void 0 : isBlockAll(s.mode) ? "review" : "off",
5060
5168
  "data.secrets": (s) => enabledOr(s.dlp?.enabled, "block"),
5061
5169
  "data.secrets-weak": (s) => {
5062
5170
  if (s.dlp?.enabled === false) return "off";
@@ -10066,7 +10174,8 @@ var init_config_schema = __esm({
10066
10174
  ConfigFileSchema = z.object({
10067
10175
  version: z.string().optional(),
10068
10176
  settings: z.object({
10069
- mode: z.enum(["standard", "strict", "audit", "observe"]).optional(),
10177
+ // The protection level (levels.ts in the engine); `observe` is Audit's older name.
10178
+ mode: z.enum(["observe", "audit", "soft", "standard", "strict", "block-all"]).optional(),
10070
10179
  autoStartDaemon: z.boolean().optional(),
10071
10180
  // enableUndo / policy.snapshot: removed with the undo feature. The
10072
10181
  // schema strips undeclared keys silently (plain zod object — no
@@ -10472,7 +10581,7 @@ var MODE_ORDER, EGRESS_MODE_ORDER, DLP_PII_ORDER, DLP_REVIEW_ACTION_ORDER, COMMA
10472
10581
  var init_managed = __esm({
10473
10582
  "src/config/managed.ts"() {
10474
10583
  "use strict";
10475
- MODE_ORDER = ["observe", "audit", "standard", "strict"];
10584
+ MODE_ORDER = ["observe", "audit", "soft", "standard", "strict", "block-all"];
10476
10585
  EGRESS_MODE_ORDER = ["off", "review", "block"];
10477
10586
  DLP_PII_ORDER = ["off", "block"];
10478
10587
  DLP_REVIEW_ACTION_ORDER = ["review", "block"];
@@ -10562,7 +10671,7 @@ function v2ToLegacy(raw, options = {}) {
10562
10671
  continue;
10563
10672
  }
10564
10673
  if (id === "commands.unknown") {
10565
- warnings.push(`checks.${id}: set "mode": "strict" instead`);
10674
+ warnings.push(`checks.${id}: set "mode": "block-all" instead`);
10566
10675
  continue;
10567
10676
  }
10568
10677
  const allowed = configurableValues(id);
@@ -10795,6 +10904,11 @@ function logCacheReadIssue(cacheFile, kind) {
10795
10904
  } catch {
10796
10905
  }
10797
10906
  }
10907
+ function statedSignalFields(policy) {
10908
+ return Object.keys(tuningFromLegacyPolicy(policy)["loading.malicious-package"] ?? {}).filter(
10909
+ (k) => k === "newPackage" || k === "installScript"
10910
+ );
10911
+ }
10798
10912
  function catalogSettingsFrom(settings, policy) {
10799
10913
  return catalogSettingsFromConfig(settings, policy);
10800
10914
  }
@@ -10862,6 +10976,8 @@ function getConfig(cwd) {
10862
10976
  const keyed = !!pr2Creds?.apiKey && pr2Creds.localOnly !== true;
10863
10977
  let ssrfStrictSource = "default";
10864
10978
  const workspaceChecks = {};
10979
+ const managedStatedChecks = /* @__PURE__ */ new Set();
10980
+ const managedStatedSignals = /* @__PURE__ */ new Set();
10865
10981
  const applyLayer = (source, isProject = false, isCloud = false) => {
10866
10982
  if (!source) return;
10867
10983
  const s = source.settings || {};
@@ -11069,9 +11185,11 @@ function getConfig(cwd) {
11069
11185
  if (raw.managedConfig && typeof raw.managedConfig === "object") {
11070
11186
  const mc = raw.managedConfig;
11071
11187
  const locked = Array.isArray(mc.locked) ? mc.locked.filter((f) => typeof f === "string") : [];
11188
+ for (const id of knobStatedChecks(mc)) managedStatedChecks.add(id);
11189
+ for (const k of statedSignalFields(mc)) managedStatedSignals.add(k);
11072
11190
  if (typeof mc.mode === "string") {
11073
11191
  if (keyed) {
11074
- if (["observe", "audit", "standard", "strict"].includes(mc.mode)) {
11192
+ if (isModeValue(mc.mode)) {
11075
11193
  mergedSettings.mode = mc.mode;
11076
11194
  }
11077
11195
  } else {
@@ -11353,14 +11471,15 @@ function getConfig(cwd) {
11353
11471
  const envMode = process.env.NODE9_MODE;
11354
11472
  if (envMode && !modeCloudControlled && // PR-2: one listening point includes the env var — a keyed machine's
11355
11473
  // mode comes from the workspace (or the shipped default), never the shell.
11356
- !keyed && ["observe", "audit", "standard", "strict"].includes(envMode)) {
11474
+ !keyed && isModeValue(envMode)) {
11357
11475
  mergedSettings.mode = envMode;
11358
11476
  }
11359
- if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && (mergedSettings.mode === "observe" || mergedSettings.mode === "audit")) {
11477
+ if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && isRecordOnly(mergedSettings.mode)) {
11360
11478
  mergedSettings.mode = "standard";
11361
11479
  }
11362
- const managedFloorActive = cloudManagedShields.length > 0 || cloudMandatesEnforcement || modeCloudControlled && mergedSettings.mode === "strict";
11363
- if (modeCloudControlled && mergedSettings.mode === "strict") {
11480
+ const cloudStrictLevel = levelOf(mergedSettings.mode) === "strict" || levelOf(mergedSettings.mode) === "block-all";
11481
+ const managedFloorActive = cloudManagedShields.length > 0 || cloudMandatesEnforcement || modeCloudControlled && cloudStrictLevel;
11482
+ if (modeCloudControlled && cloudStrictLevel) {
11364
11483
  for (const name of Object.keys(mergedEnvironments)) {
11365
11484
  if (mergedEnvironments[name]?.requireApproval === false) {
11366
11485
  const cleaned = { ...mergedEnvironments[name] };
@@ -11378,6 +11497,35 @@ function getConfig(cwd) {
11378
11497
  mergedPolicy.ignoredTools = [...new Set(mergedPolicy.ignoredTools)];
11379
11498
  mergedPolicy.skillPinning.roots = [...new Set(mergedPolicy.skillPinning.roots)];
11380
11499
  const resolvedSsrfStrictSource = keyed && ssrfStrictSource === "local" ? "default" : ssrfStrictSource;
11500
+ const level = levelOf(mergedSettings.mode);
11501
+ const levelKnobChecks = Object.entries(levelChecks(level)).filter(([id]) => isKnobGoverned(id));
11502
+ const signals = levelPackageSignals(level);
11503
+ if (levelKnobChecks.length > 0 || signals) {
11504
+ const policyOf = (layer) => layer?.policy ?? {};
11505
+ const trusted = /* @__PURE__ */ new Set([...managedStatedChecks, ...Object.keys(workspaceChecks)]);
11506
+ const trustedSignals = new Set(managedStatedSignals);
11507
+ const project = /* @__PURE__ */ new Set();
11508
+ const projectSignals = /* @__PURE__ */ new Set();
11509
+ if (!keyed) {
11510
+ for (const id of knobStatedChecks(policyOf(globalConfig))) trusted.add(id);
11511
+ for (const k of statedSignalFields(policyOf(globalConfig))) trustedSignals.add(k);
11512
+ for (const id of knobStatedChecks(policyOf(projectConfig))) project.add(id);
11513
+ for (const k of statedSignalFields(policyOf(projectConfig))) projectSignals.add(k);
11514
+ }
11515
+ const before = resolveCheckMap(catalogSettingsFromConfig({}, mergedPolicy));
11516
+ for (const [id, v] of levelKnobChecks) {
11517
+ if (trusted.has(id)) continue;
11518
+ if (project.has(id) && CHECK_VERDICT_RANK[v] <= CHECK_VERDICT_RANK[before[id] ?? "off"])
11519
+ continue;
11520
+ checkToLegacyPolicy(mergedPolicy, id, v);
11521
+ }
11522
+ if (signals) {
11523
+ for (const key of ["newPackage", "installScript"]) {
11524
+ if (trustedSignals.has(key) || projectSignals.has(key)) continue;
11525
+ mergedPolicy.packageCheck[key] = signals[key];
11526
+ }
11527
+ }
11528
+ }
11381
11529
  const explicit = {};
11382
11530
  const checkSources = {};
11383
11531
  if (keyed) {
@@ -11781,7 +11929,8 @@ var init_config = __esm({
11781
11929
  // ── Actions in apps (node9Firewall#390) ───────────────────────────────
11782
11930
  // actions.money / actions.access / actions.publish: the action templates
11783
11931
  // on every MCP server no app shield claims, plus the shell publishing
11784
- // rules. Review by default; the check value governs them.
11932
+ // rules. Review on the rule; the check value governs them (money is
11933
+ // recorded at Standard, asked at Strict).
11785
11934
  ...GENERAL_ACTION_RULES
11786
11935
  ],
11787
11936
  dlp: { enabled: true, scanIgnoredTools: true, pii: "block" },
@@ -12859,6 +13008,7 @@ var init_provenance = __esm({
12859
13008
  var init_policy = __esm({
12860
13009
  "src/policy/index.ts"() {
12861
13010
  "use strict";
13011
+ init_dist();
12862
13012
  init_dlp();
12863
13013
  init_file_access();
12864
13014
  init_config();