@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.
package/dist/index.js CHANGED
@@ -449,6 +449,32 @@ function ssrfFloorDecision(m, asWritten, opts) {
449
449
  }
450
450
  return "block";
451
451
  }
452
+ function isModeValue(v) {
453
+ return typeof v === "string" && MODE_VALUES.includes(v);
454
+ }
455
+ function levelOf(mode) {
456
+ if (mode === "observe") return "audit";
457
+ return LEVELS.includes(mode ?? "") ? mode : "standard";
458
+ }
459
+ function isRecordOnly(mode) {
460
+ return levelOf(mode) === "audit";
461
+ }
462
+ function reviewsEveryInline(mode) {
463
+ const level = levelOf(mode);
464
+ return level === "strict" || level === "block-all";
465
+ }
466
+ function isBlockAll(mode) {
467
+ return levelOf(mode) === "block-all";
468
+ }
469
+ function levelCheckValue(mode, id) {
470
+ return LEVEL_CHECKS[levelOf(mode)][id];
471
+ }
472
+ function levelChecks(mode) {
473
+ return LEVEL_CHECKS[levelOf(mode)];
474
+ }
475
+ function levelPackageSignals(mode) {
476
+ return levelOf(mode) === "soft" ? { newPackage: "off", installScript: "off" } : void 0;
477
+ }
452
478
  function isVerdict(v) {
453
479
  return v === "off" || v === "log" || v === "review" || v === "block";
454
480
  }
@@ -594,19 +620,21 @@ function resolveCheck(settings, id) {
594
620
  if (!def) return void 0;
595
621
  if (isLockedCheck(def)) return { id, value: "block", source: "locked" };
596
622
  const floor = def.floor ? CHECK_VERDICT_RANK[def.floor] : 0;
623
+ const levelDefault = levelCheckValue(settings.mode, id) ?? def.defaultValue;
624
+ const sourceOf = (value2) => value2 === levelDefault ? "default" : "configured";
597
625
  const explicit = settings.checks?.[id];
598
626
  if (isVerdict(explicit)) {
599
627
  const value2 = CHECK_VERDICT_RANK[explicit] < floor ? def.floor : explicit;
600
- return { id, value: value2, source: value2 === def.defaultValue ? "default" : "configured" };
628
+ return { id, value: value2, source: sourceOf(value2) };
601
629
  }
602
630
  if (def.pack) {
603
631
  const on = settings.appliedShields?.includes(def.pack) ?? false;
604
632
  return { id, value: on ? def.defaultValue : "off", source: "default" };
605
633
  }
606
634
  const read2 = LEGACY_READERS[id]?.(settings);
607
- if (read2 === void 0) return { id, value: def.defaultValue, source: "default" };
635
+ if (read2 === void 0) return { id, value: levelDefault, source: "default" };
608
636
  const value = CHECK_VERDICT_RANK[read2] < floor ? def.floor : read2;
609
- return { id, value, source: value === def.defaultValue ? "default" : "configured" };
637
+ return { id, value, source: sourceOf(value) };
610
638
  }
611
639
  function checkValue(settings, id) {
612
640
  return resolveCheck(settings, id)?.value ?? "off";
@@ -5356,6 +5384,20 @@ function extractPackageInstalls(command) {
5356
5384
  return true;
5357
5385
  });
5358
5386
  }
5387
+ function tuningFromLegacyPolicy(policy) {
5388
+ const out = {};
5389
+ const p = policy;
5390
+ if (policy.packageCheck?.registrySignals === false) {
5391
+ out["loading.malicious-package"] = { newPackage: "off", installScript: "off" };
5392
+ }
5393
+ for (const f of TUNING_FIELDS) {
5394
+ const [block, key] = f.legacy;
5395
+ const value = p[block]?.[key];
5396
+ if (value === void 0) continue;
5397
+ (out[f.checkId] ??= {})[f.name] = value;
5398
+ }
5399
+ return out;
5400
+ }
5359
5401
  function tuningToLegacyPolicy(policy, tuning) {
5360
5402
  const unknown = [];
5361
5403
  for (const [id, fields] of Object.entries(tuning)) {
@@ -5470,6 +5512,25 @@ function checkToLegacyPolicy(policy, id, v) {
5470
5512
  return false;
5471
5513
  }
5472
5514
  }
5515
+ function knobStatedChecks(policy) {
5516
+ const out = /* @__PURE__ */ new Set();
5517
+ const has = (o, key) => !!o && typeof o === "object" && o[key] !== void 0;
5518
+ const { dlp, egress, loopDetection, injectionScan, skillPinning, packageCheck } = policy;
5519
+ const uc = policy.untrustedContent;
5520
+ if (has(dlp, "enabled")) out.add("data.secrets");
5521
+ if (has(dlp, "reviewAction") || dlp?.enabled === false) out.add("data.secrets-weak");
5522
+ if (has(dlp, "pii")) out.add("data.pii");
5523
+ if (has(egress, "enabled") || has(egress, "mode")) out.add("network.unknown-host");
5524
+ if (has(egress, "ssrfStrict")) out.add("network.internal-addresses");
5525
+ if (has(loopDetection, "enabled")) out.add("behavior.loops");
5526
+ if (has(injectionScan, "enabled")) out.add("behavior.prompt-injection");
5527
+ if (has(skillPinning, "enabled") || has(skillPinning, "mode")) out.add("loading.skill-tamper");
5528
+ if (has(packageCheck, "enabled") || has(packageCheck, "onMalicious"))
5529
+ out.add("loading.malicious-package");
5530
+ if (uc && typeof uc === "object" && (uc.enabled === false || has(uc, "afterExposure")))
5531
+ out.add("behavior.untrusted-content");
5532
+ return out;
5533
+ }
5473
5534
  function isKnobGoverned(id) {
5474
5535
  return id in KNOB_GOVERNED;
5475
5536
  }
@@ -6280,7 +6341,7 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
6280
6341
  if (v?.logged) noteLogged(v);
6281
6342
  else if (v) candidates.push(v);
6282
6343
  };
6283
- const inline = config.settings.mode === "strict" ? detectInlineExec(shellCommand) ? void 0 : null : inlineExecReview(shellCommand);
6344
+ const inline = reviewsEveryInline(config.settings.mode) ? detectInlineExec(shellCommand) ? void 0 : null : inlineExecReview(shellCommand);
6284
6345
  if (inline !== null) {
6285
6346
  consider("commands.inline-exec", {
6286
6347
  decision: "review",
@@ -6340,21 +6401,17 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
6340
6401
  if (firstToken && firstToken.startsWith("/") && checkProvenance2) {
6341
6402
  const prov = checkProvenance2(firstToken, cwd);
6342
6403
  if (prov.trustLevel === "suspect") {
6343
- const value = cv("commands.temp-binary");
6344
- const v = applyCheckValue(
6345
- value === "review" && config.settings.mode === "strict" ? "block" : value,
6346
- {
6347
- decision: "review",
6348
- blockedByLabel: "Node9: Suspect Binary",
6349
- reason: `Binary "${firstToken}" resolved to ${prov.resolvedPath} \u2014 ${prov.reason}`,
6350
- tier: 3,
6351
- checkId: "commands.temp-binary"
6352
- }
6353
- );
6404
+ const v = applyCheckValue(cv("commands.temp-binary"), {
6405
+ decision: "review",
6406
+ blockedByLabel: "Node9: Suspect Binary",
6407
+ reason: `Binary "${firstToken}" resolved to ${prov.resolvedPath} \u2014 ${prov.reason}`,
6408
+ tier: 3,
6409
+ checkId: "commands.temp-binary"
6410
+ });
6354
6411
  if (v?.logged) noteLogged(v);
6355
6412
  else if (v) return v;
6356
6413
  }
6357
- if (prov.trustLevel === "unknown" && config.settings.mode === "strict") {
6414
+ if (prov.trustLevel === "unknown" && isBlockAll(config.settings.mode)) {
6358
6415
  return {
6359
6416
  decision: "review",
6360
6417
  blockedByLabel: "Node9: Unknown Binary (strict mode)",
@@ -6445,7 +6502,7 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
6445
6502
  if (v?.logged) noteLogged(v);
6446
6503
  else if (v) return v;
6447
6504
  }
6448
- if (config.settings.mode === "strict") {
6505
+ if (isBlockAll(config.settings.mode)) {
6449
6506
  if (activeEnvironment?.requireApproval === false) return allowed();
6450
6507
  return {
6451
6508
  decision: "review",
@@ -7376,7 +7433,7 @@ function matchCanaryArgs(args, values) {
7376
7433
  return null;
7377
7434
  }
7378
7435
  }
7379
- var import_picomatch, import_safe_regex2, import_picomatch2, import_mvdan_sh, import_mvdan_sh2, import_safe_regex22, import_crypto2, import_crypto3, import_mvdan_sh3, import_crypto4, import_mvdan_sh4, import_crypto5, 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, STRICT_TIERS, METADATA_HOSTNAMES, v4Octets, TIER_REASON, 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, PROJECT_JAIL_BLOCK_READ, OVERRIDE_PREFIX, LABEL_WRAPPERS, LEGACY_READERS, 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_INLINE_CODE, WHAT, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, TABLES, STRING_LITERAL, 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, 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, AND_OP, OR_OP, AND_OR_OPS, MAX_CALL_DEPTH, MAX_CALL_WALKS, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, stripDotSlash, 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, MAX_ALTERNATIVES, MAX_CALL_DEPTH2, MAX_CALL_WALKS2, 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, WRITES, READS, DUP_OUT, HERE_STRING, AND, OR, DEFAULT_OPS, exempt, RANK, 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, MAX, UNTRUSTED_TOOLS, 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, 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, BATCH_SEPARATOR, syntax3, 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, SHELLS, MAX_NESTING, SHELL_VALUE_FLAGS, 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_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, syntax4, 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, SHELLS2, OWN_HEADS, MAX_DEPTH3, CWD_CHANGERS, TERMINAL_ESCAPE_RE, LOOP_MAX_RECORDS, 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;
7436
+ var import_picomatch, import_safe_regex2, import_picomatch2, import_mvdan_sh, import_mvdan_sh2, import_safe_regex22, import_crypto2, import_crypto3, import_mvdan_sh3, import_crypto4, import_mvdan_sh4, import_crypto5, 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, STRICT_TIERS, METADATA_HOSTNAMES, v4Octets, TIER_REASON, 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, PROJECT_JAIL_BLOCK_READ, OVERRIDE_PREFIX, LABEL_WRAPPERS, LEGACY_READERS, 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_INLINE_CODE, WHAT, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, TABLES, STRING_LITERAL, 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, 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, AND_OP, OR_OP, AND_OR_OPS, MAX_CALL_DEPTH, MAX_CALL_WALKS, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, stripDotSlash, 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, MAX_ALTERNATIVES, MAX_CALL_DEPTH2, MAX_CALL_WALKS2, 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, WRITES, READS, DUP_OUT, HERE_STRING, AND, OR, DEFAULT_OPS, exempt, RANK, 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, MAX, UNTRUSTED_TOOLS, 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, 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, BATCH_SEPARATOR, syntax3, 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, SHELLS, MAX_NESTING, SHELL_VALUE_FLAGS, 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_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, syntax4, 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, SHELLS2, OWN_HEADS, MAX_DEPTH3, CWD_CHANGERS, TERMINAL_ESCAPE_RE, LOOP_MAX_RECORDS, 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;
7380
7437
  var init_dist = __esm({
7381
7438
  "packages/policy-engine/dist/index.mjs"() {
7382
7439
  "use strict";
@@ -9019,7 +9076,7 @@ var init_dist = __esm({
9019
9076
  "actions.money": {
9020
9077
  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.",
9021
9078
  example: "refund_order on a server called acme-billing",
9022
- 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."
9079
+ 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."
9023
9080
  },
9024
9081
  "actions.access": {
9025
9082
  plain: "The agent changes a password, a key, a role or who belongs to a team, through an app node9 has no protection for.",
@@ -9196,6 +9253,54 @@ var init_dist = __esm({
9196
9253
  advice: "Keep Block for known-malicious packages; brand-new packages already stop for Review."
9197
9254
  }
9198
9255
  };
9256
+ LEVELS = ["audit", "soft", "standard", "strict", "block-all"];
9257
+ MODE_VALUES = ["observe", ...LEVELS];
9258
+ SOFT = {
9259
+ "commands.inline-exec": "log",
9260
+ "commands.eval-dynamic": "log",
9261
+ "commands.rm": "log",
9262
+ "commands.chmod": "log",
9263
+ "commands.sudo": "log",
9264
+ "commands.git-destructive": "log",
9265
+ "commands.sql-ddl": "log",
9266
+ "commands.sql-no-where": "log",
9267
+ "commands.temp-binary": "log",
9268
+ "commands.disk-destroy": "log",
9269
+ "commands.dangerous-word": "log",
9270
+ "files.system-dirs": "log",
9271
+ "files.shell-startup": "log",
9272
+ "files.password-hashes": "log",
9273
+ "data.pipe-chain": "log",
9274
+ "behavior.untrusted-content": "log"
9275
+ };
9276
+ STRICT = {
9277
+ "commands.sql-ddl": "block",
9278
+ "commands.disk-destroy": "block",
9279
+ "commands.node9-disarm": "block",
9280
+ "files.system-dirs": "block",
9281
+ "files.shell-startup": "block",
9282
+ "files.password-hashes": "block",
9283
+ "data.secrets-weak": "block",
9284
+ "data.pipe-chain": "block",
9285
+ "network.unknown-host": "review",
9286
+ "network.internal-addresses": "block",
9287
+ "behavior.prompt-injection": "log",
9288
+ "loading.skill-tamper": "block",
9289
+ // Standard records money moves (catalog default log); Strict asks.
9290
+ "actions.money": "review"
9291
+ };
9292
+ BLOCK_ALL = {
9293
+ ...STRICT,
9294
+ "commands.unknown": "review",
9295
+ "commands.temp-binary": "block"
9296
+ };
9297
+ LEVEL_CHECKS = {
9298
+ audit: {},
9299
+ soft: SOFT,
9300
+ standard: {},
9301
+ strict: STRICT,
9302
+ "block-all": BLOCK_ALL
9303
+ };
9199
9304
  VERDICTS = ["off", "log", "review", "block"];
9200
9305
  CHECK_VERDICT_RANK = { off: 0, log: 1, review: 2, block: 3 };
9201
9306
  ALL = VERDICTS;
@@ -9612,7 +9717,10 @@ var init_dist = __esm({
9612
9717
  title: "Money moves",
9613
9718
  catches: "a refund, payout, transfer, charge or withdrawal through an app with no protection of its own",
9614
9719
  values: ALL,
9615
- defaultValue: "review",
9720
+ // Founder decision 2026-10-25: a transfer the user asked for is ordinary
9721
+ // work. Standard records it; Strict asks (levels.ts); a user who wants to
9722
+ // be asked states review.
9723
+ defaultValue: "log",
9616
9724
  legacy: generalActionRuleNames("finance")
9617
9725
  },
9618
9726
  {
@@ -9652,7 +9760,7 @@ var init_dist = __esm({
9652
9760
  "commands.rm": (s) => knob(s.commandChecks?.rmAdvisory),
9653
9761
  "commands.chmod": (s) => knob(s.commandChecks?.chmod),
9654
9762
  "commands.sql-ddl": (s) => knob(s.commandChecks?.sqlDdl),
9655
- "commands.unknown": (s) => s.mode === void 0 ? void 0 : s.mode === "strict" ? "review" : "off",
9763
+ "commands.unknown": (s) => s.mode === void 0 ? void 0 : isBlockAll(s.mode) ? "review" : "off",
9656
9764
  "data.secrets": (s) => enabledOr(s.dlp?.enabled, "block"),
9657
9765
  "data.secrets-weak": (s) => {
9658
9766
  if (s.dlp?.enabled === false) return "off";
@@ -15288,7 +15396,8 @@ var SmartRuleSchema = import_zod.z.object({
15288
15396
  var ConfigFileSchema = import_zod.z.object({
15289
15397
  version: import_zod.z.string().optional(),
15290
15398
  settings: import_zod.z.object({
15291
- mode: import_zod.z.enum(["standard", "strict", "audit", "observe"]).optional(),
15399
+ // The protection level (levels.ts in the engine); `observe` is Audit's older name.
15400
+ mode: import_zod.z.enum(["observe", "audit", "soft", "standard", "strict", "block-all"]).optional(),
15292
15401
  autoStartDaemon: import_zod.z.boolean().optional(),
15293
15402
  // enableUndo / policy.snapshot: removed with the undo feature. The
15294
15403
  // schema strips undeclared keys silently (plain zod object — no
@@ -15663,7 +15772,7 @@ function readShieldOverrides() {
15663
15772
  }
15664
15773
 
15665
15774
  // src/config/managed.ts
15666
- var MODE_ORDER = ["observe", "audit", "standard", "strict"];
15775
+ var MODE_ORDER = ["observe", "audit", "soft", "standard", "strict", "block-all"];
15667
15776
  var EGRESS_MODE_ORDER = ["off", "review", "block"];
15668
15777
  function rankIn(order, value) {
15669
15778
  return value === void 0 ? -1 : order.indexOf(value);
@@ -15926,7 +16035,7 @@ function v2ToLegacy(raw, options = {}) {
15926
16035
  continue;
15927
16036
  }
15928
16037
  if (id === "commands.unknown") {
15929
- warnings.push(`checks.${id}: set "mode": "strict" instead`);
16038
+ warnings.push(`checks.${id}: set "mode": "block-all" instead`);
15930
16039
  continue;
15931
16040
  }
15932
16041
  const allowed = configurableValues(id);
@@ -16247,7 +16356,8 @@ var DEFAULT_CONFIG = {
16247
16356
  // ── Actions in apps (node9Firewall#390) ───────────────────────────────
16248
16357
  // actions.money / actions.access / actions.publish: the action templates
16249
16358
  // on every MCP server no app shield claims, plus the shell publishing
16250
- // rules. Review by default; the check value governs them.
16359
+ // rules. Review on the rule; the check value governs them (money is
16360
+ // recorded at Standard, asked at Strict).
16251
16361
  ...GENERAL_ACTION_RULES
16252
16362
  ],
16253
16363
  dlp: { enabled: true, scanIgnoredTools: true, pii: "block" },
@@ -16465,6 +16575,11 @@ var KNOB_TO_CHECK = {
16465
16575
  evalDynamic: "commands.eval-dynamic",
16466
16576
  pipeChainHigh: "data.pipe-chain"
16467
16577
  };
16578
+ function statedSignalFields(policy) {
16579
+ return Object.keys(tuningFromLegacyPolicy(policy)["loading.malicious-package"] ?? {}).filter(
16580
+ (k) => k === "newPackage" || k === "installScript"
16581
+ );
16582
+ }
16468
16583
  function catalogSettingsFrom(settings, policy) {
16469
16584
  return catalogSettingsFromConfig(settings, policy);
16470
16585
  }
@@ -16532,6 +16647,8 @@ function getConfig(cwd) {
16532
16647
  const keyed = !!pr2Creds?.apiKey && pr2Creds.localOnly !== true;
16533
16648
  let ssrfStrictSource = "default";
16534
16649
  const workspaceChecks = {};
16650
+ const managedStatedChecks = /* @__PURE__ */ new Set();
16651
+ const managedStatedSignals = /* @__PURE__ */ new Set();
16535
16652
  const applyLayer = (source, isProject = false, isCloud = false) => {
16536
16653
  if (!source) return;
16537
16654
  const s = source.settings || {};
@@ -16739,9 +16856,11 @@ function getConfig(cwd) {
16739
16856
  if (raw.managedConfig && typeof raw.managedConfig === "object") {
16740
16857
  const mc = raw.managedConfig;
16741
16858
  const locked = Array.isArray(mc.locked) ? mc.locked.filter((f) => typeof f === "string") : [];
16859
+ for (const id of knobStatedChecks(mc)) managedStatedChecks.add(id);
16860
+ for (const k of statedSignalFields(mc)) managedStatedSignals.add(k);
16742
16861
  if (typeof mc.mode === "string") {
16743
16862
  if (keyed) {
16744
- if (["observe", "audit", "standard", "strict"].includes(mc.mode)) {
16863
+ if (isModeValue(mc.mode)) {
16745
16864
  mergedSettings.mode = mc.mode;
16746
16865
  }
16747
16866
  } else {
@@ -17023,14 +17142,15 @@ function getConfig(cwd) {
17023
17142
  const envMode = process.env.NODE9_MODE;
17024
17143
  if (envMode && !modeCloudControlled && // PR-2: one listening point includes the env var — a keyed machine's
17025
17144
  // mode comes from the workspace (or the shipped default), never the shell.
17026
- !keyed && ["observe", "audit", "standard", "strict"].includes(envMode)) {
17145
+ !keyed && isModeValue(envMode)) {
17027
17146
  mergedSettings.mode = envMode;
17028
17147
  }
17029
- if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && (mergedSettings.mode === "observe" || mergedSettings.mode === "audit")) {
17148
+ if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && isRecordOnly(mergedSettings.mode)) {
17030
17149
  mergedSettings.mode = "standard";
17031
17150
  }
17032
- const managedFloorActive = cloudManagedShields.length > 0 || cloudMandatesEnforcement || modeCloudControlled && mergedSettings.mode === "strict";
17033
- if (modeCloudControlled && mergedSettings.mode === "strict") {
17151
+ const cloudStrictLevel = levelOf(mergedSettings.mode) === "strict" || levelOf(mergedSettings.mode) === "block-all";
17152
+ const managedFloorActive = cloudManagedShields.length > 0 || cloudMandatesEnforcement || modeCloudControlled && cloudStrictLevel;
17153
+ if (modeCloudControlled && cloudStrictLevel) {
17034
17154
  for (const name of Object.keys(mergedEnvironments)) {
17035
17155
  if (mergedEnvironments[name]?.requireApproval === false) {
17036
17156
  const cleaned = { ...mergedEnvironments[name] };
@@ -17048,6 +17168,35 @@ function getConfig(cwd) {
17048
17168
  mergedPolicy.ignoredTools = [...new Set(mergedPolicy.ignoredTools)];
17049
17169
  mergedPolicy.skillPinning.roots = [...new Set(mergedPolicy.skillPinning.roots)];
17050
17170
  const resolvedSsrfStrictSource = keyed && ssrfStrictSource === "local" ? "default" : ssrfStrictSource;
17171
+ const level = levelOf(mergedSettings.mode);
17172
+ const levelKnobChecks = Object.entries(levelChecks(level)).filter(([id]) => isKnobGoverned(id));
17173
+ const signals = levelPackageSignals(level);
17174
+ if (levelKnobChecks.length > 0 || signals) {
17175
+ const policyOf = (layer) => layer?.policy ?? {};
17176
+ const trusted = /* @__PURE__ */ new Set([...managedStatedChecks, ...Object.keys(workspaceChecks)]);
17177
+ const trustedSignals = new Set(managedStatedSignals);
17178
+ const project = /* @__PURE__ */ new Set();
17179
+ const projectSignals = /* @__PURE__ */ new Set();
17180
+ if (!keyed) {
17181
+ for (const id of knobStatedChecks(policyOf(globalConfig))) trusted.add(id);
17182
+ for (const k of statedSignalFields(policyOf(globalConfig))) trustedSignals.add(k);
17183
+ for (const id of knobStatedChecks(policyOf(projectConfig))) project.add(id);
17184
+ for (const k of statedSignalFields(policyOf(projectConfig))) projectSignals.add(k);
17185
+ }
17186
+ const before = resolveCheckMap(catalogSettingsFromConfig({}, mergedPolicy));
17187
+ for (const [id, v] of levelKnobChecks) {
17188
+ if (trusted.has(id)) continue;
17189
+ if (project.has(id) && CHECK_VERDICT_RANK[v] <= CHECK_VERDICT_RANK[before[id] ?? "off"])
17190
+ continue;
17191
+ checkToLegacyPolicy(mergedPolicy, id, v);
17192
+ }
17193
+ if (signals) {
17194
+ for (const key of ["newPackage", "installScript"]) {
17195
+ if (trustedSignals.has(key) || projectSignals.has(key)) continue;
17196
+ mergedPolicy.packageCheck[key] = signals[key];
17197
+ }
17198
+ }
17199
+ }
17051
17200
  const explicit = {};
17052
17201
  const checkSources = {};
17053
17202
  if (keyed) {
@@ -17219,6 +17368,9 @@ function applyUntrustedContent(cur, raw, replaceLists = false, isProject = false
17219
17368
  // src/utils/regex.ts
17220
17369
  init_dist();
17221
17370
 
17371
+ // src/policy/index.ts
17372
+ init_dist();
17373
+
17222
17374
  // src/dlp.ts
17223
17375
  var import_fs5 = __toESM(require("fs"));
17224
17376
  var import_path5 = __toESM(require("path"));
@@ -20147,11 +20299,11 @@ async function checkOne(p, cfg, misses, networkCapped, cwd) {
20147
20299
  }
20148
20300
  return findings;
20149
20301
  }
20150
- var SOFT = /* @__PURE__ */ new Set(["new", "install-script"]);
20302
+ var SOFT2 = /* @__PURE__ */ new Set(["new", "install-script"]);
20151
20303
  async function byHistory(p, version, info, findings, misses) {
20152
20304
  let out = findings;
20153
20305
  let h = info.history;
20154
- if (!h && p.ecosystem === "PyPI" && out.some((f) => SOFT.has(f.kind))) {
20306
+ if (!h && p.ecosystem === "PyPI" && out.some((f) => SOFT2.has(f.kind))) {
20155
20307
  try {
20156
20308
  h = await pypiHistory(p.name, version) ?? void 0;
20157
20309
  } catch (err) {
@@ -20171,7 +20323,7 @@ async function byHistory(p, version, info, findings, misses) {
20171
20323
  });
20172
20324
  if (p.ecosystem === "npm") {
20173
20325
  if (h.previousProvenance && h.provenance === false) return [...out, drop()];
20174
- if (!out.some((f) => SOFT.has(f.kind)) || !h.provenance || !h.previousProvenance) return out;
20326
+ if (!out.some((f) => SOFT2.has(f.kind)) || !h.provenance || !h.previousProvenance) return out;
20175
20327
  const [now, before] = await Promise.all([
20176
20328
  npmSourceRepo(p.name, version),
20177
20329
  npmSourceRepo(p.name, previous)
@@ -20179,7 +20331,7 @@ async function byHistory(p, version, info, findings, misses) {
20179
20331
  return vouched(p, version, now, before, out, misses);
20180
20332
  }
20181
20333
  if (p.ecosystem === "PyPI") {
20182
- if (!out.some((f) => SOFT.has(f.kind)) || !info.file || !h.previousFile) return out;
20334
+ if (!out.some((f) => SOFT2.has(f.kind)) || !info.file || !h.previousFile) return out;
20183
20335
  const [now, before] = await Promise.all([
20184
20336
  pypiSourceRepo(p.name, version, info.file),
20185
20337
  pypiSourceRepo(p.name, previous, h.previousFile)
@@ -20195,7 +20347,7 @@ function vouched(p, version, now, before, findings, misses) {
20195
20347
  return findings;
20196
20348
  }
20197
20349
  if (now === "none" || before === "none" || now !== before) return findings;
20198
- return findings.filter((f) => !SOFT.has(f.kind));
20350
+ return findings.filter((f) => !SOFT2.has(f.kind));
20199
20351
  }
20200
20352
  async function runPackageCheck(toolName, args, cfg, cwd) {
20201
20353
  if (!cfg.enabled) return ALLOW;
@@ -20515,7 +20667,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
20515
20667
  appendHookDebug(toolName, args, meta, hashAuditArgs);
20516
20668
  }
20517
20669
  const isManual = meta?.agent === "Terminal";
20518
- const isObserveMode = config.settings.mode === "observe";
20670
+ const isObserveMode = isRecordOnly(config.settings.mode);
20519
20671
  let explainableLabel = "Local Config";
20520
20672
  let dlpReviewFlagged = false;
20521
20673
  let packageReview = null;
@@ -20573,7 +20725,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
20573
20725
  explainableLabel = "Shell inspection incomplete";
20574
20726
  policyRuleDescription = "The executable command could not be inspected. Approve this call explicitly.";
20575
20727
  }
20576
- const fileReview = !isObserveMode && config.settings.mode !== "audit" && fileFinding?.decision === "review";
20728
+ const fileReview = !isObserveMode && fileFinding?.decision === "review";
20577
20729
  const evaluateCurrentPolicy = async (skipIgnoredFastPath = false) => {
20578
20730
  const own = await evaluatePolicy2(toolName, args, meta?.agent, options?.cwd, {
20579
20731
  fileAccess,
@@ -20600,7 +20752,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
20600
20752
  if (fileFinding) {
20601
20753
  meta = { ...meta, ruleName: fileFinding.ruleName };
20602
20754
  hashAuditArgs = true;
20603
- const observing = isObserveMode || config.settings.mode === "audit";
20755
+ const observing = isObserveMode;
20604
20756
  const blocked = !observing && (fileFinding.decision === "block" || fileReview && config.settings.panicMode);
20605
20757
  appendLocalAudit(
20606
20758
  toolName,
@@ -21082,15 +21234,6 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
21082
21234
  }
21083
21235
  return { approved: true, checkedBy: "audit" };
21084
21236
  }
21085
- if (config.settings.mode === "audit") {
21086
- if (judge) {
21087
- const policyResult = await evaluateCurrentPolicy();
21088
- if (policyResult.decision === "review") {
21089
- appendLocalAudit(toolName, args, "allow", "audit-mode", ownRowMeta(true), hashAuditArgs);
21090
- }
21091
- }
21092
- return { approved: true, checkedBy: "audit" };
21093
- }
21094
21237
  let appPermReview = null;
21095
21238
  let appPermReviewTool = null;
21096
21239
  const callSpecificReview = () => fileReview || shellReview || dlpReviewFlagged || !!appPermReview || !!taintWarning || !!exposureReview || !!packageReview;