@node9/proxy 2.48.2 → 2.50.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
@@ -510,6 +510,9 @@ function levelChecks(mode) {
510
510
  function levelPackageSignals(mode) {
511
511
  return levelOf(mode) === "soft" ? { newPackage: "off", installScript: "off" } : void 0;
512
512
  }
513
+ function packRowOwasp(id, shield) {
514
+ return PACK_RULE_OWASP[id] ?? PACK_SHIELD_OWASP[shield];
515
+ }
513
516
  function isVerdict(v) {
514
517
  return v === "off" || v === "log" || v === "review" || v === "block";
515
518
  }
@@ -529,6 +532,10 @@ function packRows() {
529
532
  rows.push({
530
533
  id,
531
534
  group: "commands",
535
+ // A shield missing from the table falls back to tool misuse instead of
536
+ // throwing here: this module loads on every hook call, and a mapping
537
+ // omission must fail a test (owasp.spec.ts), never the gate.
538
+ owasp: packRowOwasp(id, shield.name) ?? "ASI02",
532
539
  title: rule.name.replace(SHIELD_RULE_NAME, "$3").replace(/-/g, " "),
533
540
  catches: rule.description ?? rule.reason ?? "",
534
541
  values: ALL,
@@ -9486,7 +9493,7 @@ function matchCanaryArgs(args, values) {
9486
9493
  return null;
9487
9494
  }
9488
9495
  }
9489
- 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, 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, 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, BATCH_SEPARATOR, 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, 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;
9496
+ 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, 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, 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, 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, BATCH_SEPARATOR, 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, 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;
9490
9497
  var init_dist = __esm({
9491
9498
  "packages/policy-engine/dist/index.mjs"() {
9492
9499
  "use strict";
@@ -11587,6 +11594,44 @@ var init_dist = __esm({
11587
11594
  strict: STRICT,
11588
11595
  "block-all": BLOCK_ALL
11589
11596
  };
11597
+ ASI = {
11598
+ ASI01: "Agent Goal Hijack",
11599
+ ASI02: "Tool Misuse and Exploitation",
11600
+ ASI03: "Identity and Privilege Abuse",
11601
+ ASI04: "Agentic Supply Chain Vulnerabilities",
11602
+ ASI05: "Unexpected Code Execution",
11603
+ ASI06: "Memory and Context Poisoning",
11604
+ ASI07: "Insecure Inter-Agent Communication",
11605
+ ASI08: "Cascading Failures",
11606
+ ASI09: "Human-Agent Trust Exploitation",
11607
+ ASI10: "Rogue Agents"
11608
+ };
11609
+ ASI_IDS = Object.keys(ASI);
11610
+ PACK_SHIELD_OWASP = {
11611
+ aws: "ASI02",
11612
+ "bash-safe": "ASI02",
11613
+ docker: "ASI02",
11614
+ filesystem: "ASI02",
11615
+ github: "ASI02",
11616
+ k8s: "ASI02",
11617
+ mongodb: "ASI02",
11618
+ postgres: "ASI02",
11619
+ redis: "ASI02",
11620
+ stripe: "ASI09",
11621
+ paypal: "ASI09",
11622
+ square: "ASI09",
11623
+ plaid: "ASI09",
11624
+ okta: "ASI09",
11625
+ auth0: "ASI09"
11626
+ };
11627
+ PACK_RULE_OWASP = {
11628
+ "packs.bash-safe.pipe-to-shell": "ASI05",
11629
+ "packs.bash-safe.obfuscated-exec": "ASI05",
11630
+ "packs.bash-safe.eval-remote": "ASI05",
11631
+ "packs.bash-safe.eval-dynamic": "ASI05",
11632
+ "packs.aws.iam-changes": "ASI03",
11633
+ "packs.postgres.grant-revoke": "ASI03"
11634
+ };
11590
11635
  VERDICTS = ["off", "log", "review", "block"];
11591
11636
  CHECK_VERDICT_RANK = { off: 0, log: 1, review: 2, block: 3 };
11592
11637
  ALL = VERDICTS;
@@ -11595,6 +11640,7 @@ var init_dist = __esm({
11595
11640
  {
11596
11641
  id: "files.shell-startup",
11597
11642
  group: "files",
11643
+ owasp: "ASI02",
11598
11644
  title: "Shell startup files",
11599
11645
  catches: "Writes, replacements and removals of personal shell startup files",
11600
11646
  values: ALL,
@@ -11604,6 +11650,7 @@ var init_dist = __esm({
11604
11650
  {
11605
11651
  id: "files.system-auth",
11606
11652
  group: "files",
11653
+ owasp: "ASI03",
11607
11654
  title: "System authentication files",
11608
11655
  catches: "Changes to system authentication files and PAM configuration",
11609
11656
  values: ["block"],
@@ -11614,6 +11661,7 @@ var init_dist = __esm({
11614
11661
  {
11615
11662
  id: "files.password-hashes",
11616
11663
  group: "files",
11664
+ owasp: "ASI03",
11617
11665
  title: "System password hashes",
11618
11666
  catches: "Reads and copies of /etc/shadow and /etc/gshadow",
11619
11667
  values: ALL,
@@ -11623,6 +11671,7 @@ var init_dist = __esm({
11623
11671
  {
11624
11672
  id: "files.system-dirs",
11625
11673
  group: "files",
11674
+ owasp: "ASI02",
11626
11675
  title: "System directories",
11627
11676
  catches: "Writes, new files and removals under /usr, /etc, /boot, /bin, /sbin, /lib and /var/log, and uploads of system files",
11628
11677
  values: ALL,
@@ -11632,6 +11681,7 @@ var init_dist = __esm({
11632
11681
  {
11633
11682
  id: "files.agent-instructions",
11634
11683
  group: "files",
11684
+ owasp: "ASI06",
11635
11685
  title: "Agent instruction and memory files",
11636
11686
  catches: "writes to the files every later agent session loads as instructions (CLAUDE.md, AGENTS.md, memory, agents, commands) and changes to the agent's hooks; Standard asks only when the text carries an instruction to hide, skip approvals or touch secrets",
11637
11687
  values: ALL,
@@ -11642,6 +11692,7 @@ var init_dist = __esm({
11642
11692
  {
11643
11693
  id: "commands.inline-exec",
11644
11694
  group: "commands",
11695
+ owasp: "ASI05",
11645
11696
  title: "Inline code execution",
11646
11697
  catches: "inline code (python -c, node -e, a heredoc into an interpreter) that deletes, sends, opens a socket, runs commands, reads protected files or decodes and runs; unreadable inline code",
11647
11698
  values: ALL,
@@ -11651,6 +11702,7 @@ var init_dist = __esm({
11651
11702
  {
11652
11703
  id: "commands.eval-dynamic",
11653
11704
  group: "commands",
11705
+ owasp: "ASI05",
11654
11706
  title: "Eval of dynamic content",
11655
11707
  catches: "generated executable names, shell code from stdin, or dynamic eval/-c payloads",
11656
11708
  values: ALL,
@@ -11660,6 +11712,7 @@ var init_dist = __esm({
11660
11712
  {
11661
11713
  id: "commands.eval-remote",
11662
11714
  group: "commands",
11715
+ owasp: "ASI05",
11663
11716
  title: "Eval of a remote download",
11664
11717
  catches: "eval or sh over the output of curl or wget",
11665
11718
  values: ["block"],
@@ -11670,6 +11723,7 @@ var init_dist = __esm({
11670
11723
  {
11671
11724
  id: "commands.curl-pipe-shell",
11672
11725
  group: "commands",
11726
+ owasp: "ASI05",
11673
11727
  title: "Remote script piped into a shell",
11674
11728
  catches: "curl or wget piped into sh, bash, zsh or PowerShell",
11675
11729
  values: ALL,
@@ -11679,6 +11733,7 @@ var init_dist = __esm({
11679
11733
  {
11680
11734
  id: "commands.rm",
11681
11735
  group: "commands",
11736
+ owasp: "ASI02",
11682
11737
  title: "Delete files",
11683
11738
  catches: "rm outside the known build-artifact paths",
11684
11739
  values: ALL,
@@ -11688,6 +11743,7 @@ var init_dist = __esm({
11688
11743
  {
11689
11744
  id: "commands.rm-home",
11690
11745
  group: "commands",
11746
+ owasp: "ASI02",
11691
11747
  title: "Recursive delete of the home directory",
11692
11748
  catches: "rm -rf on ~, $HOME, /home or /",
11693
11749
  values: ["block"],
@@ -11698,6 +11754,7 @@ var init_dist = __esm({
11698
11754
  {
11699
11755
  id: "commands.chmod",
11700
11756
  group: "commands",
11757
+ owasp: "ASI02",
11701
11758
  title: "World-writable permissions",
11702
11759
  catches: "chmod 777, 0777 or a+rwx",
11703
11760
  values: ALL,
@@ -11707,6 +11764,7 @@ var init_dist = __esm({
11707
11764
  {
11708
11765
  id: "commands.sudo",
11709
11766
  group: "commands",
11767
+ owasp: "ASI03",
11710
11768
  title: "Elevated privileges",
11711
11769
  catches: "a command run through sudo",
11712
11770
  values: ALL,
@@ -11716,6 +11774,7 @@ var init_dist = __esm({
11716
11774
  {
11717
11775
  id: "commands.git-destructive",
11718
11776
  group: "commands",
11777
+ owasp: "ASI02",
11719
11778
  title: "Destructive git operation",
11720
11779
  catches: "force push, reset --hard, clean -f, branch -D or tag delete, also through -C, env, wrappers, variables and aliases",
11721
11780
  values: ALL,
@@ -11725,6 +11784,7 @@ var init_dist = __esm({
11725
11784
  {
11726
11785
  id: "commands.git-hooks-bypass",
11727
11786
  group: "commands",
11787
+ owasp: "ASI10",
11728
11788
  title: "Git hooks bypassed",
11729
11789
  catches: "the agent switches off the git hooks that check its own work: --no-verify, core.hooksPath, HUSKY=0 and its peers, or a hook file removed, emptied or made non-executable",
11730
11790
  values: ALL,
@@ -11734,6 +11794,7 @@ var init_dist = __esm({
11734
11794
  {
11735
11795
  id: "commands.git-stage-all",
11736
11796
  group: "commands",
11797
+ owasp: "ASI02",
11737
11798
  title: "Stage everything at once",
11738
11799
  catches: "git add -A, git add ., git commit -a and other ways to stage every change instead of naming the files; off unless you switch it on",
11739
11800
  values: ALL,
@@ -11743,6 +11804,7 @@ var init_dist = __esm({
11743
11804
  {
11744
11805
  id: "commands.reverse-shell",
11745
11806
  group: "commands",
11807
+ owasp: "ASI05",
11746
11808
  title: "Reverse shell",
11747
11809
  catches: "a shell wired to a network socket: bash -i >& /dev/tcp/\u2026, nc -e, socat exec:, a socket fd read by a shell, a shell piped to and from nc or telnet",
11748
11810
  values: ALL,
@@ -11752,6 +11814,7 @@ var init_dist = __esm({
11752
11814
  {
11753
11815
  id: "commands.node9-disarm",
11754
11816
  group: "commands",
11817
+ owasp: "ASI10",
11755
11818
  title: "node9 disarmed from the shell",
11756
11819
  catches: "a node9 command that clears a session flag, trusts a destination, pauses the gate or weakens a shield, run by the agent",
11757
11820
  values: ALL,
@@ -11761,6 +11824,7 @@ var init_dist = __esm({
11761
11824
  {
11762
11825
  id: "commands.sql-ddl",
11763
11826
  group: "commands",
11827
+ owasp: "ASI02",
11764
11828
  title: "Drop or truncate",
11765
11829
  catches: "DROP or TRUNCATE through a database CLI or a database tool",
11766
11830
  values: ALL,
@@ -11775,6 +11839,7 @@ var init_dist = __esm({
11775
11839
  {
11776
11840
  id: "commands.sql-no-where",
11777
11841
  group: "commands",
11842
+ owasp: "ASI02",
11778
11843
  title: "Unscoped SQL mutation",
11779
11844
  catches: "DELETE or UPDATE without a WHERE clause",
11780
11845
  values: ALL,
@@ -11784,6 +11849,7 @@ var init_dist = __esm({
11784
11849
  {
11785
11850
  id: "commands.temp-binary",
11786
11851
  group: "commands",
11852
+ owasp: "ASI05",
11787
11853
  title: "Binary from a temp directory",
11788
11854
  catches: "an absolute path under /tmp, /var/tmp, /dev/shm or a world-writable file",
11789
11855
  values: ALL,
@@ -11793,6 +11859,7 @@ var init_dist = __esm({
11793
11859
  {
11794
11860
  id: "commands.disk-destroy",
11795
11861
  group: "commands",
11862
+ owasp: "ASI02",
11796
11863
  title: "Disk or filesystem destruction",
11797
11864
  catches: "mkfs, shred, dd and the manual-terminal disaster list",
11798
11865
  values: ALL,
@@ -11802,6 +11869,7 @@ var init_dist = __esm({
11802
11869
  {
11803
11870
  id: "commands.dangerous-word",
11804
11871
  group: "commands",
11872
+ owasp: "ASI02",
11805
11873
  title: "Dangerous word",
11806
11874
  catches: "a word from a pack or from the config dangerousWords list",
11807
11875
  values: ALL,
@@ -11810,6 +11878,7 @@ var init_dist = __esm({
11810
11878
  {
11811
11879
  id: "commands.unanalysable",
11812
11880
  group: "commands",
11881
+ owasp: "ASI02",
11813
11882
  title: "Command too nested to analyse",
11814
11883
  catches: "wrappers nested past the depth the shell parser follows",
11815
11884
  values: ALL,
@@ -11819,6 +11888,7 @@ var init_dist = __esm({
11819
11888
  {
11820
11889
  id: "commands.unknown",
11821
11890
  group: "commands",
11891
+ owasp: "ASI02",
11822
11892
  title: "Any command no check recognised",
11823
11893
  catches: "the strict-mode catch-all",
11824
11894
  values: ["off", "review"],
@@ -11829,6 +11899,7 @@ var init_dist = __esm({
11829
11899
  {
11830
11900
  id: "data.secrets",
11831
11901
  group: "data",
11902
+ owasp: "ASI03",
11832
11903
  title: "Secret in arguments",
11833
11904
  catches: "an API key, token or private key matching one of the DLP patterns",
11834
11905
  values: ALL,
@@ -11838,6 +11909,7 @@ var init_dist = __esm({
11838
11909
  {
11839
11910
  id: "data.secrets-weak",
11840
11911
  group: "data",
11912
+ owasp: "ASI03",
11841
11913
  title: "Weak credential in arguments",
11842
11914
  catches: "a JWT or a bearer token",
11843
11915
  values: ALL,
@@ -11847,6 +11919,7 @@ var init_dist = __esm({
11847
11919
  {
11848
11920
  id: "data.pii",
11849
11921
  group: "data",
11922
+ owasp: "ASI02",
11850
11923
  title: "Personal data in arguments",
11851
11924
  catches: "a social security number or a credit card number",
11852
11925
  values: ALL,
@@ -11856,6 +11929,7 @@ var init_dist = __esm({
11856
11929
  {
11857
11930
  id: "data.credential-files",
11858
11931
  group: "data",
11932
+ owasp: "ASI03",
11859
11933
  title: "Credential file read",
11860
11934
  catches: "~/.ssh, ~/.aws and .env files, through any reader or any file tool",
11861
11935
  values: ALL,
@@ -11864,6 +11938,7 @@ var init_dist = __esm({
11864
11938
  {
11865
11939
  id: "data.credential-files-other",
11866
11940
  group: "data",
11941
+ owasp: "ASI03",
11867
11942
  title: "Other credential file",
11868
11943
  catches: ".netrc, .npmrc, kube and docker config, and a copy of any credential file",
11869
11944
  values: ALL,
@@ -11872,6 +11947,7 @@ var init_dist = __esm({
11872
11947
  {
11873
11948
  id: "data.credential-files-unknown",
11874
11949
  group: "data",
11950
+ owasp: "ASI03",
11875
11951
  title: "Files read by names known only at run time",
11876
11952
  catches: "a reader fed names from a listing that can include credential files (find . | xargs cat)",
11877
11953
  values: ALL,
@@ -11880,6 +11956,7 @@ var init_dist = __esm({
11880
11956
  {
11881
11957
  id: "data.pipe-chain",
11882
11958
  group: "data",
11959
+ owasp: "ASI03",
11883
11960
  title: "Sensitive file piped to the network",
11884
11961
  catches: "a credential file read and piped into curl, nc or ssh",
11885
11962
  values: ALL,
@@ -11889,6 +11966,7 @@ var init_dist = __esm({
11889
11966
  {
11890
11967
  id: "data.pipe-chain-obfuscated",
11891
11968
  group: "data",
11969
+ owasp: "ASI03",
11892
11970
  title: "Obfuscated exfiltration",
11893
11971
  catches: "a sensitive file encoded or compressed on its way to the network",
11894
11972
  values: ALL,
@@ -11901,6 +11979,7 @@ var init_dist = __esm({
11901
11979
  {
11902
11980
  id: "data.env-exfil",
11903
11981
  group: "data",
11982
+ owasp: "ASI03",
11904
11983
  title: "Environment sent out",
11905
11984
  catches: "the whole environment (env, printenv, set, export -p, /proc/*/environ) handed to curl, nc or another sender, through $(\u2026), a pipe or a variable",
11906
11985
  values: ALL,
@@ -11910,6 +11989,7 @@ var init_dist = __esm({
11910
11989
  {
11911
11990
  id: "data.output-secrets",
11912
11991
  group: "data",
11992
+ owasp: "ASI03",
11913
11993
  title: "Secret in tool output",
11914
11994
  catches: "a credential a tool returned; the session is tainted, nothing is stopped",
11915
11995
  values: ["off", "log"],
@@ -11918,6 +11998,7 @@ var init_dist = __esm({
11918
11998
  {
11919
11999
  id: "data.prompt-secrets",
11920
12000
  group: "data",
12001
+ owasp: "ASI03",
11921
12002
  title: "Secret in the prompt",
11922
12003
  catches: "a credential pasted into the conversation",
11923
12004
  values: ALL,
@@ -11926,6 +12007,7 @@ var init_dist = __esm({
11926
12007
  {
11927
12008
  id: "data.canary",
11928
12009
  group: "data",
12010
+ owasp: "ASI03",
11929
12011
  title: "Decoy credential used",
11930
12012
  catches: "a planted decoy value appears in a tool call",
11931
12013
  values: ALL,
@@ -11936,6 +12018,7 @@ var init_dist = __esm({
11936
12018
  {
11937
12019
  id: "network.unknown-host",
11938
12020
  group: "network",
12021
+ owasp: "ASI02",
11939
12022
  title: "Unknown host",
11940
12023
  catches: "a destination on neither the allowlist nor the builtin list",
11941
12024
  values: ["off", "review", "block"],
@@ -11945,6 +12028,7 @@ var init_dist = __esm({
11945
12028
  {
11946
12029
  id: "network.internal-addresses",
11947
12030
  group: "network",
12031
+ owasp: "ASI02",
11948
12032
  title: "Internal address",
11949
12033
  catches: "loopback, the RFC 1918 ranges and carrier-grade NAT",
11950
12034
  values: ["off", "block"],
@@ -11953,6 +12037,7 @@ var init_dist = __esm({
11953
12037
  {
11954
12038
  id: "network.metadata",
11955
12039
  group: "network",
12040
+ owasp: "ASI02",
11956
12041
  title: "Cloud metadata address",
11957
12042
  catches: "169.254.169.254 and its peers, link-local and multicast",
11958
12043
  values: ["block"],
@@ -11963,6 +12048,7 @@ var init_dist = __esm({
11963
12048
  {
11964
12049
  id: "network.taint-egress",
11965
12050
  group: "network",
12051
+ owasp: "ASI01",
11966
12052
  title: "Tainted data sent out",
11967
12053
  catches: "a file or an output flagged earlier in the session reaches a host not on the allowlist",
11968
12054
  values: ALL,
@@ -11976,6 +12062,7 @@ var init_dist = __esm({
11976
12062
  {
11977
12063
  id: "files.jail",
11978
12064
  group: "files",
12065
+ owasp: "ASI03",
11979
12066
  title: "Jailed path",
11980
12067
  catches: "a path the workspace or the developer added to the jail",
11981
12068
  values: ALL,
@@ -11985,6 +12072,7 @@ var init_dist = __esm({
11985
12072
  {
11986
12073
  id: "behavior.loops",
11987
12074
  group: "behavior",
12075
+ owasp: "ASI08",
11988
12076
  title: "Runaway loop",
11989
12077
  catches: "the same tool call repeated past the threshold inside the window",
11990
12078
  values: ["off", "block"],
@@ -11994,6 +12082,7 @@ var init_dist = __esm({
11994
12082
  {
11995
12083
  id: "behavior.prompt-injection",
11996
12084
  group: "behavior",
12085
+ owasp: "ASI01",
11997
12086
  title: "Prompt injection in tool output",
11998
12087
  catches: "instructions aimed at the model inside content a tool returned",
11999
12088
  values: ["off", "log"],
@@ -12002,6 +12091,7 @@ var init_dist = __esm({
12002
12091
  {
12003
12092
  id: "behavior.session-taint",
12004
12093
  group: "behavior",
12094
+ owasp: "ASI01",
12005
12095
  title: "Action after tainted output",
12006
12096
  catches: "a network call or a write after a flagged file or a flagged tool output",
12007
12097
  values: ALL,
@@ -12011,6 +12101,7 @@ var init_dist = __esm({
12011
12101
  {
12012
12102
  id: "behavior.untrusted-content",
12013
12103
  group: "behavior",
12104
+ owasp: "ASI01",
12014
12105
  title: "Send after reading outside content",
12015
12106
  catches: "a send to an unknown destination, a destination found in what was read, or a destructive call after the session read an email, a web page or an issue",
12016
12107
  values: ["off", "log", "review"],
@@ -12021,6 +12112,7 @@ var init_dist = __esm({
12021
12112
  {
12022
12113
  id: "loading.skill-tamper",
12023
12114
  group: "loading",
12115
+ owasp: "ASI04",
12024
12116
  title: "Skill file changed",
12025
12117
  catches: "a skill or plugin file whose hash differs from the one approved",
12026
12118
  values: ["off", "log", "block"],
@@ -12030,6 +12122,7 @@ var init_dist = __esm({
12030
12122
  {
12031
12123
  id: "loading.mcp-tamper",
12032
12124
  group: "loading",
12125
+ owasp: "ASI04",
12033
12126
  title: "MCP server changed",
12034
12127
  catches: "tool definitions that differ from the pinned ones",
12035
12128
  values: ALL,
@@ -12039,6 +12132,7 @@ var init_dist = __esm({
12039
12132
  {
12040
12133
  id: "loading.malicious-package",
12041
12134
  group: "loading",
12135
+ owasp: "ASI04",
12042
12136
  title: "Malicious package",
12043
12137
  catches: "an install of a package the index flags",
12044
12138
  values: ALL,
@@ -12048,6 +12142,7 @@ var init_dist = __esm({
12048
12142
  {
12049
12143
  id: "loading.unknown-registry",
12050
12144
  group: "loading",
12145
+ owasp: "ASI04",
12051
12146
  title: "Package from an unknown registry",
12052
12147
  catches: "an install that names a registry on the command line (--registry, --index-url, -i, npm_config_registry=\u2026) that is not the public one, not in your npm, yarn, bun, pip or uv config and not on the allowlist",
12053
12148
  values: ALL,
@@ -12062,6 +12157,7 @@ var init_dist = __esm({
12062
12157
  {
12063
12158
  id: "actions.money",
12064
12159
  group: "actions",
12160
+ owasp: "ASI09",
12065
12161
  title: "Money moves",
12066
12162
  catches: "a refund, payout, transfer, charge or withdrawal through an app with no protection of its own",
12067
12163
  values: ALL,
@@ -12074,6 +12170,7 @@ var init_dist = __esm({
12074
12170
  {
12075
12171
  id: "actions.access",
12076
12172
  group: "actions",
12173
+ owasp: "ASI09",
12077
12174
  title: "Accounts and access change",
12078
12175
  catches: "a password, key, role, permission or user changed through an app with no protection of its own",
12079
12176
  values: ALL,
@@ -12083,6 +12180,7 @@ var init_dist = __esm({
12083
12180
  {
12084
12181
  id: "actions.publish",
12085
12182
  group: "actions",
12183
+ owasp: "ASI09",
12086
12184
  title: "Something is published",
12087
12185
  catches: "a release, package, deploy or public post through an app with no protection of its own",
12088
12186
  values: ALL,
@@ -12095,6 +12193,7 @@ var init_dist = __esm({
12095
12193
  {
12096
12194
  id: "actions.settings",
12097
12195
  group: "actions",
12196
+ owasp: "ASI09",
12098
12197
  title: "Repository, account and mailbox settings change",
12099
12198
  catches: "a repository made public, a deploy key, webhook or CI secret added, branch protection changed, mail forwarded outside or a public share link, through an app",
12100
12199
  values: ALL,
@@ -12104,6 +12203,7 @@ var init_dist = __esm({
12104
12203
  {
12105
12204
  id: "actions.protected-branch",
12106
12205
  group: "actions",
12206
+ owasp: "ASI09",
12107
12207
  title: "The main branch changes through an app",
12108
12208
  catches: "a merge, a commit straight to main or master, or a CI workflow file written through an app",
12109
12209
  values: ALL,
@@ -19066,8 +19166,8 @@ var ConfigFileSchema = import_zod.z.object({
19066
19166
  }).strict();
19067
19167
  function formatIssues(issues) {
19068
19168
  const lines = issues.map((issue) => {
19069
- const path31 = issue.path.length > 0 ? issue.path.map(String).join(".") : "root";
19070
- return ` \u2022 ${path31}: ${issue.message}`;
19169
+ const path32 = issue.path.length > 0 ? issue.path.map(String).join(".") : "root";
19170
+ return ` \u2022 ${path32}: ${issue.message}`;
19071
19171
  });
19072
19172
  return `Invalid config:
19073
19173
  ${lines.join("\n")}`;
@@ -19080,9 +19180,9 @@ function prunePaths(root, paths) {
19080
19180
  const yi = y[y.length - 1];
19081
19181
  return typeof xi === "number" && typeof yi === "number" ? yi - xi : 0;
19082
19182
  });
19083
- for (const path31 of ordered) {
19183
+ for (const path32 of ordered) {
19084
19184
  let cur = root;
19085
- for (const key of path31.slice(0, -1)) {
19185
+ for (const key of path32.slice(0, -1)) {
19086
19186
  if (cur === null || typeof cur !== "object") {
19087
19187
  cur = void 0;
19088
19188
  break;
@@ -19090,7 +19190,7 @@ function prunePaths(root, paths) {
19090
19190
  cur = cur[key];
19091
19191
  }
19092
19192
  if (cur === null || typeof cur !== "object") continue;
19093
- const last = path31[path31.length - 1];
19193
+ const last = path32[path32.length - 1];
19094
19194
  if (Array.isArray(cur)) {
19095
19195
  const i = Number(last);
19096
19196
  if (Number.isInteger(i) && i >= 0 && i < cur.length) {
@@ -19126,7 +19226,7 @@ function sanitizeConfig(raw) {
19126
19226
  return issue.keys.map((k) => [...at, k]);
19127
19227
  }
19128
19228
  return [at.slice(0, -level || void 0)];
19129
- }).filter((path31) => path31.length > 0);
19229
+ }).filter((path32) => path32.length > 0);
19130
19230
  if (paths.length === 0 || !prunePaths(working, paths)) break;
19131
19231
  }
19132
19232
  if (ConfigFileSchema.safeParse(working).success) break;
@@ -20570,13 +20670,13 @@ function getConfig(cwd) {
20570
20670
  }
20571
20671
  if (Array.isArray(mc.jailPaths)) {
20572
20672
  for (const jp of mc.jailPaths) {
20573
- const path31 = typeof jp?.path === "string" ? jp.path.trim() : "";
20574
- if (!path31) continue;
20673
+ const path32 = typeof jp?.path === "string" ? jp.path.trim() : "";
20674
+ if (!path32) continue;
20575
20675
  const verdict = jp?.verdict === "review" ? "review" : "block";
20576
- for (const r of pathRules(path31, verdict, "org-managed jail")) {
20676
+ for (const r of pathRules(path32, verdict, "org-managed jail")) {
20577
20677
  mergedPolicy.smartRules.push({ ...r, name: `org:${r.name}` });
20578
20678
  }
20579
- mergedPolicy.managedJailPaths.push({ path: path31, verdict });
20679
+ mergedPolicy.managedJailPaths.push({ path: path32, verdict });
20580
20680
  }
20581
20681
  }
20582
20682
  if (Array.isArray(mc.trustedHosts)) {
@@ -22420,13 +22520,46 @@ function getPersistentDecision(toolName) {
22420
22520
 
22421
22521
  // src/auth/daemon.ts
22422
22522
  init_cjs_shims();
22423
- var import_fs15 = __toESM(require("fs"));
22523
+ var import_fs16 = __toESM(require("fs"));
22424
22524
  var import_http = __toESM(require("http"));
22425
22525
  var import_net4 = __toESM(require("net"));
22426
- var import_path15 = __toESM(require("path"));
22526
+ var import_path16 = __toESM(require("path"));
22427
22527
  var import_os10 = __toESM(require("os"));
22428
22528
  init_forecast_context();
22429
22529
 
22530
+ // src/utils/activity-socket.ts
22531
+ init_cjs_shims();
22532
+ var import_fs15 = __toESM(require("fs"));
22533
+ var import_path15 = __toESM(require("path"));
22534
+
22535
+ // src/utils/own-dir.ts
22536
+ init_cjs_shims();
22537
+
22538
+ // src/utils/activity-socket.ts
22539
+ var currentUid = () => typeof process.getuid === "function" ? process.getuid() : void 0;
22540
+ function isPrivateDir(dir2, uid = currentUid()) {
22541
+ try {
22542
+ const st = import_fs15.default.lstatSync(dir2);
22543
+ if (st.isSymbolicLink() || !st.isDirectory()) return false;
22544
+ if (uid !== void 0 && st.uid !== uid) return false;
22545
+ return (st.mode & 18) === 0;
22546
+ } catch {
22547
+ return false;
22548
+ }
22549
+ }
22550
+ var WINDOWS_PIPE = /^\\\\\.\\pipe\\node9-activity-[0-9a-f]{32}$/;
22551
+ function isTrustedActivitySocket(socketPath, uid = currentUid()) {
22552
+ if (process.platform === "win32") return WINDOWS_PIPE.test(socketPath);
22553
+ try {
22554
+ const st = import_fs15.default.lstatSync(socketPath);
22555
+ if (!st.isSocket()) return false;
22556
+ if (uid !== void 0 && st.uid !== uid) return false;
22557
+ } catch {
22558
+ return false;
22559
+ }
22560
+ return isPrivateDir(import_path15.default.dirname(socketPath), uid);
22561
+ }
22562
+
22430
22563
  // src/auth/decision-record.ts
22431
22564
  init_cjs_shims();
22432
22565
  var CHANNELS = ["terminal", "monitor", "native", "cloud"];
@@ -22576,10 +22709,20 @@ function recordFromLegacyWait(body, now = Date.now()) {
22576
22709
  }
22577
22710
 
22578
22711
  // src/auth/daemon.ts
22579
- var ACTIVITY_SOCKET_PATH = process.platform === "win32" ? "\\\\.\\pipe\\node9-activity" : import_path15.default.join(import_os10.default.tmpdir(), "node9-activity.sock");
22712
+ function daemonActivitySocket(home = import_os10.default.homedir()) {
22713
+ try {
22714
+ const raw = import_fs16.default.readFileSync(import_path16.default.join(home, ".node9", "daemon.pid"), "utf-8");
22715
+ const p = JSON.parse(raw).activitySocket;
22716
+ return typeof p === "string" && isTrustedActivitySocket(p) ? p : null;
22717
+ } catch {
22718
+ return null;
22719
+ }
22720
+ }
22580
22721
  var ACTIVITY_SOCKET_TIMEOUT_MS = 500;
22581
22722
  function notifyActivitySocket(data, opts = {}) {
22582
22723
  if (forecastRun()) return Promise.resolve(false);
22724
+ const target = opts.socketPath ?? daemonActivitySocket();
22725
+ if (!target) return Promise.resolve(false);
22583
22726
  return new Promise((resolve) => {
22584
22727
  let settled = false;
22585
22728
  let sock = null;
@@ -22593,7 +22736,7 @@ function notifyActivitySocket(data, opts = {}) {
22593
22736
  const timer = setTimeout(() => finish(false), opts.timeoutMs ?? ACTIVITY_SOCKET_TIMEOUT_MS);
22594
22737
  try {
22595
22738
  const payload = JSON.stringify(data);
22596
- sock = import_net4.default.createConnection(opts.socketPath ?? ACTIVITY_SOCKET_PATH);
22739
+ sock = import_net4.default.createConnection(target);
22597
22740
  sock.on("connect", () => {
22598
22741
  sock.on("close", () => finish(true));
22599
22742
  sock.end(payload);
@@ -22632,9 +22775,9 @@ var DAEMON_HOST = "127.0.0.1";
22632
22775
  function getInternalToken() {
22633
22776
  if (forecastRun()) return null;
22634
22777
  try {
22635
- const pidFile = import_path15.default.join(import_os10.default.homedir(), ".node9", "daemon.pid");
22636
- if (!import_fs15.default.existsSync(pidFile)) return null;
22637
- const data = JSON.parse(import_fs15.default.readFileSync(pidFile, "utf-8"));
22778
+ const pidFile = import_path16.default.join(import_os10.default.homedir(), ".node9", "daemon.pid");
22779
+ if (!import_fs16.default.existsSync(pidFile)) return null;
22780
+ const data = JSON.parse(import_fs16.default.readFileSync(pidFile, "utf-8"));
22638
22781
  process.kill(data.pid, 0);
22639
22782
  return data.internalToken ?? null;
22640
22783
  } catch {
@@ -22643,12 +22786,12 @@ function getInternalToken() {
22643
22786
  }
22644
22787
  function isDaemonRunning() {
22645
22788
  if (forecastRun()) return false;
22646
- const pidFile = import_path15.default.join(import_os10.default.homedir(), ".node9", "daemon.pid");
22647
- if (import_fs15.default.existsSync(pidFile)) {
22789
+ const pidFile = import_path16.default.join(import_os10.default.homedir(), ".node9", "daemon.pid");
22790
+ if (import_fs16.default.existsSync(pidFile)) {
22648
22791
  let pid;
22649
22792
  let port;
22650
22793
  try {
22651
- const data = JSON.parse(import_fs15.default.readFileSync(pidFile, "utf-8"));
22794
+ const data = JSON.parse(import_fs16.default.readFileSync(pidFile, "utf-8"));
22652
22795
  pid = data.pid;
22653
22796
  port = data.port;
22654
22797
  } catch {
@@ -22666,7 +22809,7 @@ function isDaemonRunning() {
22666
22809
  } catch (err) {
22667
22810
  if (err instanceof Error && "code" in err && err.code === "ESRCH") {
22668
22811
  try {
22669
- import_fs15.default.unlinkSync(pidFile);
22812
+ import_fs16.default.unlinkSync(pidFile);
22670
22813
  } catch {
22671
22814
  }
22672
22815
  }
@@ -23006,9 +23149,9 @@ var import_crypto10 = require("crypto");
23006
23149
 
23007
23150
  // src/apps/state.ts
23008
23151
  init_cjs_shims();
23009
- var import_fs17 = __toESM(require("fs"));
23152
+ var import_fs18 = __toESM(require("fs"));
23010
23153
  var import_os12 = __toESM(require("os"));
23011
- var import_path17 = __toESM(require("path"));
23154
+ var import_path18 = __toESM(require("path"));
23012
23155
 
23013
23156
  // src/apps/catalog.ts
23014
23157
  init_cjs_shims();
@@ -23142,8 +23285,8 @@ init_audit();
23142
23285
 
23143
23286
  // src/daemon/mcp-tools.ts
23144
23287
  init_cjs_shims();
23145
- var import_fs16 = __toESM(require("fs"));
23146
- var import_path16 = __toESM(require("path"));
23288
+ var import_fs17 = __toESM(require("fs"));
23289
+ var import_path17 = __toESM(require("path"));
23147
23290
  var import_os11 = __toESM(require("os"));
23148
23291
 
23149
23292
  // src/mcp-cmd.ts
@@ -23151,13 +23294,13 @@ init_cjs_shims();
23151
23294
 
23152
23295
  // src/daemon/mcp-tools.ts
23153
23296
  function getMcpToolsFile() {
23154
- return import_path16.default.join(import_os11.default.homedir(), ".node9", "mcp-tools.json");
23297
+ return import_path17.default.join(import_os11.default.homedir(), ".node9", "mcp-tools.json");
23155
23298
  }
23156
23299
  function readMcpToolsConfig() {
23157
23300
  try {
23158
23301
  const file2 = getMcpToolsFile();
23159
- if (!import_fs16.default.existsSync(file2)) return {};
23160
- const raw = import_fs16.default.readFileSync(file2, "utf-8");
23302
+ if (!import_fs17.default.existsSync(file2)) return {};
23303
+ const raw = import_fs17.default.readFileSync(file2, "utf-8");
23161
23304
  return JSON.parse(raw);
23162
23305
  } catch {
23163
23306
  return {};
@@ -23166,7 +23309,7 @@ function readMcpToolsConfig() {
23166
23309
 
23167
23310
  // src/apps/state.ts
23168
23311
  function appsFilePath(home = import_os12.default.homedir()) {
23169
- return import_path17.default.join(home, ".node9", "apps.json");
23312
+ return import_path18.default.join(home, ".node9", "apps.json");
23170
23313
  }
23171
23314
  var SIGNAL_KINDS = /* @__PURE__ */ new Set(["mcp-server", "command", "package", "env-name"]);
23172
23315
  function emptyFile() {
@@ -23214,7 +23357,7 @@ function readAppsFile(home) {
23214
23357
  function readAppsFileStrict(home) {
23215
23358
  let text;
23216
23359
  try {
23217
- text = import_fs17.default.readFileSync(appsFilePath(home), "utf8");
23360
+ text = import_fs18.default.readFileSync(appsFilePath(home), "utf8");
23218
23361
  } catch (e) {
23219
23362
  return e.code === "ENOENT" ? emptyFile() : null;
23220
23363
  }
@@ -23229,7 +23372,7 @@ var NO_LINKS = /* @__PURE__ */ Object.create(null);
23229
23372
  function localLinks() {
23230
23373
  const file2 = appsFilePath();
23231
23374
  try {
23232
- const mtimeMs = import_fs17.default.statSync(file2).mtimeMs;
23375
+ const mtimeMs = import_fs18.default.statSync(file2).mtimeMs;
23233
23376
  if (!linkCache || linkCache.file !== file2 || linkCache.mtimeMs !== mtimeMs) {
23234
23377
  linkCache = { mtimeMs, file: file2, links: readAppsFile().links };
23235
23378
  }
@@ -23270,16 +23413,16 @@ function resolveLinkedServer(label2, opts = {}) {
23270
23413
 
23271
23414
  // src/auth/orchestrator.ts
23272
23415
  var import_os21 = __toESM(require("os"));
23273
- var import_path30 = __toESM(require("path"));
23416
+ var import_path31 = __toESM(require("path"));
23274
23417
 
23275
23418
  // src/ui/native.ts
23276
23419
  init_cjs_shims();
23277
23420
  var import_child_process = require("child_process");
23278
- var import_path19 = __toESM(require("path"));
23421
+ var import_path20 = __toESM(require("path"));
23279
23422
 
23280
23423
  // src/context-sniper.ts
23281
23424
  init_cjs_shims();
23282
- var import_path18 = __toESM(require("path"));
23425
+ var import_path19 = __toESM(require("path"));
23283
23426
  function smartTruncate(str, maxLen = 500) {
23284
23427
  if (str.length <= maxLen) return str;
23285
23428
  const edge = Math.floor(maxLen / 2) - 3;
@@ -23347,7 +23490,7 @@ function computeRiskMetadata(args, tier, blockedByLabel, matchedField, matchedWo
23347
23490
  intent = "EDIT";
23348
23491
  if (obj.file_path) {
23349
23492
  editFilePath = String(obj.file_path);
23350
- editFileName = import_path18.default.basename(editFilePath);
23493
+ editFileName = import_path19.default.basename(editFilePath);
23351
23494
  }
23352
23495
  const result = extractContext(String(obj.new_string), matchedWord);
23353
23496
  contextSnippet = result.snippet;
@@ -23416,7 +23559,7 @@ function formatArgs(args, matchedField, matchedWord) {
23416
23559
  if (typeof parsed === "object" && !Array.isArray(parsed)) {
23417
23560
  const obj = parsed;
23418
23561
  if (obj.old_string !== void 0 && obj.new_string !== void 0) {
23419
- const file2 = obj.file_path ? import_path19.default.basename(String(obj.file_path)) : "file";
23562
+ const file2 = obj.file_path ? import_path20.default.basename(String(obj.file_path)) : "file";
23420
23563
  const oldPreview = smartTruncate(String(obj.old_string), 120);
23421
23564
  const newPreview = extractContext(String(obj.new_string), matchedWord).snippet;
23422
23565
  return {
@@ -23620,25 +23763,25 @@ end run`;
23620
23763
 
23621
23764
  // src/canary/registry.ts
23622
23765
  init_cjs_shims();
23623
- var import_fs19 = __toESM(require("fs"));
23766
+ var import_fs20 = __toESM(require("fs"));
23624
23767
  var import_os14 = __toESM(require("os"));
23625
- var import_path21 = __toESM(require("path"));
23768
+ var import_path22 = __toESM(require("path"));
23626
23769
  init_dist();
23627
23770
 
23628
23771
  // src/shields/jail.ts
23629
23772
  init_cjs_shims();
23630
- var import_fs18 = __toESM(require("fs"));
23773
+ var import_fs19 = __toESM(require("fs"));
23631
23774
  var import_os13 = __toESM(require("os"));
23632
- var import_path20 = __toESM(require("path"));
23775
+ var import_path21 = __toESM(require("path"));
23633
23776
  init_dist();
23634
23777
  var USER_JAIL_SHIELD = "user-jail";
23635
23778
  function jailStorePath() {
23636
- return import_path20.default.join(import_os13.default.homedir(), ".node9", "jail-paths.json");
23779
+ return import_path21.default.join(import_os13.default.homedir(), ".node9", "jail-paths.json");
23637
23780
  }
23638
23781
  function readJailPaths() {
23639
23782
  let text;
23640
23783
  try {
23641
- text = import_fs18.default.readFileSync(jailStorePath(), "utf8");
23784
+ text = import_fs19.default.readFileSync(jailStorePath(), "utf8");
23642
23785
  } catch (err) {
23643
23786
  if (err.code === "ENOENT") return [];
23644
23787
  throw err;
@@ -23667,7 +23810,7 @@ function findJailedPathIn(candidate, paths) {
23667
23810
 
23668
23811
  // src/canary/registry.ts
23669
23812
  function canaryStorePath() {
23670
- return import_path21.default.join(import_os14.default.homedir(), ".node9", "canaries.json");
23813
+ return import_path22.default.join(import_os14.default.homedir(), ".node9", "canaries.json");
23671
23814
  }
23672
23815
  function isRecord(x) {
23673
23816
  if (!x || typeof x !== "object") return false;
@@ -23678,7 +23821,7 @@ function loadCanaries(opts) {
23678
23821
  const p = canaryStorePath();
23679
23822
  let raw;
23680
23823
  try {
23681
- raw = import_fs19.default.readFileSync(p, "utf-8");
23824
+ raw = import_fs20.default.readFileSync(p, "utf-8");
23682
23825
  } catch (e) {
23683
23826
  if (e.code === "ENOENT") return [];
23684
23827
  throw e;
@@ -23705,22 +23848,22 @@ init_dist();
23705
23848
 
23706
23849
  // src/auth/session-script.ts
23707
23850
  init_cjs_shims();
23708
- var import_fs20 = __toESM(require("fs"));
23851
+ var import_fs21 = __toESM(require("fs"));
23709
23852
  var import_os15 = __toESM(require("os"));
23710
- var import_path22 = __toESM(require("path"));
23853
+ var import_path23 = __toESM(require("path"));
23711
23854
  init_dist();
23712
23855
  var MAX_SCRIPT_BYTES = 64 * 1024;
23713
23856
  var MAX_RECORDED_WRITES = 32;
23714
23857
  function readScriptFile(resolved) {
23715
23858
  let fd;
23716
23859
  try {
23717
- fd = import_fs20.default.openSync(resolved, import_fs20.default.constants.O_RDONLY | (import_fs20.default.constants.O_NONBLOCK ?? 0));
23718
- const st = import_fs20.default.fstatSync(fd);
23860
+ fd = import_fs21.default.openSync(resolved, import_fs21.default.constants.O_RDONLY | (import_fs21.default.constants.O_NONBLOCK ?? 0));
23861
+ const st = import_fs21.default.fstatSync(fd);
23719
23862
  if (!st.isFile() || st.size > MAX_SCRIPT_BYTES) return null;
23720
23863
  const buf = Buffer.alloc(MAX_SCRIPT_BYTES + 1);
23721
23864
  let n = 0;
23722
23865
  while (n < buf.length) {
23723
- const got = import_fs20.default.readSync(fd, buf, n, buf.length - n, n);
23866
+ const got = import_fs21.default.readSync(fd, buf, n, buf.length - n, n);
23724
23867
  if (got === 0) break;
23725
23868
  n += got;
23726
23869
  }
@@ -23731,7 +23874,7 @@ function readScriptFile(resolved) {
23731
23874
  } finally {
23732
23875
  if (fd !== void 0) {
23733
23876
  try {
23734
- import_fs20.default.closeSync(fd);
23877
+ import_fs21.default.closeSync(fd);
23735
23878
  } catch {
23736
23879
  }
23737
23880
  }
@@ -23739,7 +23882,7 @@ function readScriptFile(resolved) {
23739
23882
  }
23740
23883
  function absolute(p, cwd, home) {
23741
23884
  const spelled = p === "~" || p.startsWith("~/") ? home + p.slice(1) : p;
23742
- return import_path22.default.resolve(cwd, spelled);
23885
+ return import_path23.default.resolve(cwd, spelled);
23743
23886
  }
23744
23887
  async function resolveSessionScript(toolName, args, cwd, layers, deps, home = import_os15.default.homedir()) {
23745
23888
  try {
@@ -23801,27 +23944,27 @@ init_dist();
23801
23944
 
23802
23945
  // src/exposure/known-hosts.ts
23803
23946
  init_cjs_shims();
23804
- var import_fs22 = __toESM(require("fs"));
23805
- var import_path24 = __toESM(require("path"));
23947
+ var import_fs23 = __toESM(require("fs"));
23948
+ var import_path25 = __toESM(require("path"));
23806
23949
 
23807
23950
  // src/utils/git-remotes.ts
23808
23951
  init_cjs_shims();
23809
- var import_fs21 = __toESM(require("fs"));
23810
- var import_path23 = __toESM(require("path"));
23952
+ var import_fs22 = __toESM(require("fs"));
23953
+ var import_path24 = __toESM(require("path"));
23811
23954
  init_dist();
23812
23955
  function readSmallFile(p, max) {
23813
23956
  let fd;
23814
23957
  try {
23815
- fd = import_fs21.default.openSync(p, import_fs21.default.constants.O_RDONLY | (import_fs21.default.constants.O_NOFOLLOW ?? 0));
23816
- const st = import_fs21.default.fstatSync(fd);
23958
+ fd = import_fs22.default.openSync(p, import_fs22.default.constants.O_RDONLY | (import_fs22.default.constants.O_NOFOLLOW ?? 0));
23959
+ const st = import_fs22.default.fstatSync(fd);
23817
23960
  if (!st.isFile() || st.size > max) return null;
23818
23961
  const buf = Buffer.alloc(st.size);
23819
- const n = import_fs21.default.readSync(fd, buf, 0, st.size, 0);
23962
+ const n = import_fs22.default.readSync(fd, buf, 0, st.size, 0);
23820
23963
  return buf.subarray(0, n).toString("utf8");
23821
23964
  } catch {
23822
23965
  return null;
23823
23966
  } finally {
23824
- if (fd !== void 0) import_fs21.default.closeSync(fd);
23967
+ if (fd !== void 0) import_fs22.default.closeSync(fd);
23825
23968
  }
23826
23969
  }
23827
23970
  function gitRemoteHost(url) {
@@ -23840,20 +23983,20 @@ function gitRemoteHost(url) {
23840
23983
  return null;
23841
23984
  }
23842
23985
  function findGitConfig(dir2, walkUp = true) {
23843
- let cur = import_path23.default.resolve(dir2);
23986
+ let cur = import_path24.default.resolve(dir2);
23844
23987
  for (let i = 0; i < (walkUp ? 64 : 1); i++) {
23845
- const dotGit = import_path23.default.join(cur, ".git");
23846
- const direct = readSmallFile(import_path23.default.join(dotGit, "config"), 1e6);
23988
+ const dotGit = import_path24.default.join(cur, ".git");
23989
+ const direct = readSmallFile(import_path24.default.join(dotGit, "config"), 1e6);
23847
23990
  if (direct !== null) return direct;
23848
23991
  const pointer = readSmallFile(dotGit, 4096);
23849
23992
  const m = pointer && /^gitdir:\s*(.+?)\s*$/m.exec(pointer);
23850
23993
  if (m) {
23851
- let gitDir = import_path23.default.resolve(cur, m[1]);
23852
- const common = readSmallFile(import_path23.default.join(gitDir, "commondir"), 4096);
23853
- if (common !== null) gitDir = import_path23.default.resolve(gitDir, common.trim());
23854
- return readSmallFile(import_path23.default.join(gitDir, "config"), 1e6);
23994
+ let gitDir = import_path24.default.resolve(cur, m[1]);
23995
+ const common = readSmallFile(import_path24.default.join(gitDir, "commondir"), 4096);
23996
+ if (common !== null) gitDir = import_path24.default.resolve(gitDir, common.trim());
23997
+ return readSmallFile(import_path24.default.join(gitDir, "config"), 1e6);
23855
23998
  }
23856
- const parent = import_path23.default.dirname(cur);
23999
+ const parent = import_path24.default.dirname(cur);
23857
24000
  if (parent === cur) return null;
23858
24001
  cur = parent;
23859
24002
  }
@@ -23863,12 +24006,12 @@ var cache4 = /* @__PURE__ */ new Map();
23863
24006
  function readGitRemotes(dir2, opts = {}) {
23864
24007
  if (!dir2) return [];
23865
24008
  const walkUp = opts.walkUp !== false;
23866
- const key = `${walkUp ? "up" : "at"}:${import_path23.default.resolve(dir2)}`;
24009
+ const key = `${walkUp ? "up" : "at"}:${import_path24.default.resolve(dir2)}`;
23867
24010
  const hit = cache4.get(key);
23868
24011
  if (hit) return hit;
23869
24012
  const out = [];
23870
24013
  try {
23871
- const cfg = findGitConfig(import_path23.default.resolve(dir2), walkUp);
24014
+ const cfg = findGitConfig(import_path24.default.resolve(dir2), walkUp);
23872
24015
  if (cfg !== null) {
23873
24016
  let current = null;
23874
24017
  for (const line of cfg.split(/\r?\n/)) {
@@ -23904,15 +24047,15 @@ var ECOSYSTEMS = [
23904
24047
  ];
23905
24048
  var cache5 = /* @__PURE__ */ new Map();
23906
24049
  function manifestRoot(dir2) {
23907
- let cur = import_path24.default.resolve(dir2);
24050
+ let cur = import_path25.default.resolve(dir2);
23908
24051
  for (let i = 0; i < 64; i++) {
23909
24052
  for (const [m] of ECOSYSTEMS) {
23910
24053
  try {
23911
- if (import_fs22.default.existsSync(import_path24.default.join(cur, m))) return cur;
24054
+ if (import_fs23.default.existsSync(import_path25.default.join(cur, m))) return cur;
23912
24055
  } catch {
23913
24056
  }
23914
24057
  }
23915
- const parent = import_path24.default.dirname(cur);
24058
+ const parent = import_path25.default.dirname(cur);
23916
24059
  if (parent === cur) return null;
23917
24060
  cur = parent;
23918
24061
  }
@@ -23921,7 +24064,7 @@ function manifestRoot(dir2) {
23921
24064
  function knownProjectHosts(dir2) {
23922
24065
  const empty = { hosts: /* @__PURE__ */ new Set(), repos: /* @__PURE__ */ new Set(), remotes: /* @__PURE__ */ new Map() };
23923
24066
  if (!dir2) return empty;
23924
- const key = import_path24.default.resolve(dir2);
24067
+ const key = import_path25.default.resolve(dir2);
23925
24068
  const hit = cache5.get(key);
23926
24069
  if (hit) return hit;
23927
24070
  const out = { hosts: /* @__PURE__ */ new Set(), repos: /* @__PURE__ */ new Set(), remotes: /* @__PURE__ */ new Map() };
@@ -23934,10 +24077,10 @@ function knownProjectHosts(dir2) {
23934
24077
  const root = manifestRoot(key);
23935
24078
  if (root !== null) {
23936
24079
  for (const [m, registry] of ECOSYSTEMS) {
23937
- if (import_fs22.default.existsSync(import_path24.default.join(root, m))) out.hosts.add(registry);
24080
+ if (import_fs23.default.existsSync(import_path25.default.join(root, m))) out.hosts.add(registry);
23938
24081
  }
23939
24082
  try {
23940
- if (import_fs22.default.readdirSync(root).some((f) => f.endsWith(".gemspec")))
24083
+ if (import_fs23.default.readdirSync(root).some((f) => f.endsWith(".gemspec")))
23941
24084
  out.hosts.add("host:rubygems.org");
23942
24085
  } catch {
23943
24086
  }
@@ -23950,9 +24093,9 @@ function knownProjectHosts(dir2) {
23950
24093
 
23951
24094
  // src/exposure/writes.ts
23952
24095
  init_cjs_shims();
23953
- var import_fs23 = __toESM(require("fs"));
24096
+ var import_fs24 = __toESM(require("fs"));
23954
24097
  var import_os16 = __toESM(require("os"));
23955
- var import_path25 = __toESM(require("path"));
24098
+ var import_path26 = __toESM(require("path"));
23956
24099
  init_dist();
23957
24100
  var WRITE_OPS = /* @__PURE__ */ new Set(["write", "create", "remove"]);
23958
24101
  var LIFECYCLE_RE = /"(scripts|preinstall|install|postinstall|prepare|prepublish|prepublishOnly|prepack|postpack|publish|postpublish)"\s*:/;
@@ -23982,7 +24125,7 @@ function packageScriptsTouched(args, absPath, shellCommand) {
23982
24125
  if (typeof a.content === "string") {
23983
24126
  try {
23984
24127
  const next = JSON.parse(a.content);
23985
- const prev = JSON.parse(import_fs23.default.readFileSync(absPath, "utf8"));
24128
+ const prev = JSON.parse(import_fs24.default.readFileSync(absPath, "utf8"));
23986
24129
  return JSON.stringify(next.scripts ?? null) !== JSON.stringify(prev.scripts ?? null);
23987
24130
  } catch {
23988
24131
  return LIFECYCLE_RE.test(a.content);
@@ -24003,7 +24146,7 @@ function judgeWritesAfterExposure(opts) {
24003
24146
  seen.add(p);
24004
24147
  if (p === "/dev" || p.startsWith("/dev/")) continue;
24005
24148
  if (root !== null && isInside(root, p)) {
24006
- if (isAgentInstructionPath(p, root) && (import_path25.default.basename(p) !== "package.json" || packageScriptsTouched(opts.args, p, opts.shellCommand)))
24149
+ if (isAgentInstructionPath(p, root) && (import_path26.default.basename(p) !== "package.json" || packageScriptsTouched(opts.args, p, opts.shellCommand)))
24007
24150
  holds.push({ path: p, why: "agent-instruction" });
24008
24151
  continue;
24009
24152
  }
@@ -24026,9 +24169,9 @@ function judgeWritesAfterExposure(opts) {
24026
24169
  // src/exposure/marker.ts
24027
24170
  init_cjs_shims();
24028
24171
  var import_crypto9 = __toESM(require("crypto"));
24029
- var import_fs24 = __toESM(require("fs"));
24172
+ var import_fs25 = __toESM(require("fs"));
24030
24173
  var import_os17 = __toESM(require("os"));
24031
- var import_path26 = __toESM(require("path"));
24174
+ var import_path27 = __toESM(require("path"));
24032
24175
 
24033
24176
  // src/daemon/exposure-store.ts
24034
24177
  init_cjs_shims();
@@ -24037,18 +24180,18 @@ var SESSION_EXPOSURE_TTL_MS = 4 * 60 * 60 * 1e3;
24037
24180
  // src/exposure/marker.ts
24038
24181
  init_forecast_context();
24039
24182
  function dir() {
24040
- return import_path26.default.join(import_os17.default.homedir(), ".node9", "exposure-sessions");
24183
+ return import_path27.default.join(import_os17.default.homedir(), ".node9", "exposure-sessions");
24041
24184
  }
24042
24185
  function file(sessionId) {
24043
24186
  const id = import_crypto9.default.createHash("sha256").update(sessionId).digest("hex").slice(0, 32);
24044
- return import_path26.default.join(dir(), id);
24187
+ return import_path27.default.join(dir(), id);
24045
24188
  }
24046
24189
  function maybeSessionExposed(sessionId) {
24047
24190
  if (!sessionId) return false;
24048
24191
  const forecast = forecastRun();
24049
24192
  if (forecast) return forecast.session.checkExposure(forecast.now) !== null;
24050
24193
  try {
24051
- const st = import_fs24.default.statSync(file(sessionId));
24194
+ const st = import_fs25.default.statSync(file(sessionId));
24052
24195
  return Date.now() - st.mtimeMs < SESSION_EXPOSURE_TTL_MS;
24053
24196
  } catch (e) {
24054
24197
  return e.code !== "ENOENT";
@@ -24057,7 +24200,7 @@ function maybeSessionExposed(sessionId) {
24057
24200
 
24058
24201
  // src/exposure/roles.ts
24059
24202
  init_cjs_shims();
24060
- var import_fs25 = __toESM(require("fs"));
24203
+ var import_fs26 = __toESM(require("fs"));
24061
24204
  var EXPOSURE_LABEL = "\u{1F6E1}\uFE0F Node9 Exposure";
24062
24205
  var AGENT_INTERNAL_PREFIXES = ["ccd_", "visualize"];
24063
24206
  function foldServerName(name) {
@@ -24067,7 +24210,7 @@ var inventoryCache = null;
24067
24210
  var inventoryStamp = null;
24068
24211
  function inventoryFileStamp() {
24069
24212
  try {
24070
- const st = import_fs25.default.statSync(getMcpToolsFile());
24213
+ const st = import_fs26.default.statSync(getMcpToolsFile());
24071
24214
  return `${st.mtimeMs}:${st.size}`;
24072
24215
  } catch {
24073
24216
  return "";
@@ -24152,16 +24295,16 @@ function sourceWord(toolName) {
24152
24295
 
24153
24296
  // src/auth/trusted-recipients.ts
24154
24297
  init_cjs_shims();
24155
- var import_fs26 = __toESM(require("fs"));
24156
- var import_path27 = __toESM(require("path"));
24298
+ var import_fs27 = __toESM(require("fs"));
24299
+ var import_path28 = __toESM(require("path"));
24157
24300
  var import_os18 = __toESM(require("os"));
24158
24301
  init_dist();
24159
24302
  function getTrustedRecipientsPath() {
24160
- return import_path27.default.join(import_os18.default.homedir(), ".node9", "trusted-recipients.json");
24303
+ return import_path28.default.join(import_os18.default.homedir(), ".node9", "trusted-recipients.json");
24161
24304
  }
24162
24305
  function readTrustedRecipients() {
24163
24306
  try {
24164
- const raw = import_fs26.default.readFileSync(getTrustedRecipientsPath(), "utf8");
24307
+ const raw = import_fs27.default.readFileSync(getTrustedRecipientsPath(), "utf8");
24165
24308
  const parsed = JSON.parse(raw);
24166
24309
  return Array.isArray(parsed.entries) ? parsed.entries.filter((e) => e && typeof e.value === "string") : [];
24167
24310
  } catch {
@@ -24170,10 +24313,10 @@ function readTrustedRecipients() {
24170
24313
  }
24171
24314
  function writeTrustedRecipients(entries) {
24172
24315
  const filePath = getTrustedRecipientsPath();
24173
- import_fs26.default.mkdirSync(import_path27.default.dirname(filePath), { recursive: true });
24316
+ import_fs27.default.mkdirSync(import_path28.default.dirname(filePath), { recursive: true });
24174
24317
  const tmp = filePath + ".node9-tmp";
24175
- import_fs26.default.writeFileSync(tmp, JSON.stringify({ entries }, null, 2), { mode: 384 });
24176
- import_fs26.default.renameSync(tmp, filePath);
24318
+ import_fs27.default.writeFileSync(tmp, JSON.stringify({ entries }, null, 2), { mode: 384 });
24319
+ import_fs27.default.renameSync(tmp, filePath);
24177
24320
  }
24178
24321
  function addTrustedRecipient(raw, addedBy = "user") {
24179
24322
  const value = normalizeRecipient(raw);
@@ -24188,7 +24331,7 @@ function addTrustedRecipient(raw, addedBy = "user") {
24188
24331
  var cache6 = null;
24189
24332
  function mtimeOf() {
24190
24333
  try {
24191
- return import_fs26.default.statSync(getTrustedRecipientsPath()).mtimeMs;
24334
+ return import_fs27.default.statSync(getTrustedRecipientsPath()).mtimeMs;
24192
24335
  } catch {
24193
24336
  return 0;
24194
24337
  }
@@ -24206,9 +24349,9 @@ init_forecast_context();
24206
24349
 
24207
24350
  // src/auth/cloud.ts
24208
24351
  init_cjs_shims();
24209
- var import_fs27 = __toESM(require("fs"));
24352
+ var import_fs28 = __toESM(require("fs"));
24210
24353
  var import_os19 = __toESM(require("os"));
24211
- var import_path28 = __toESM(require("path"));
24354
+ var import_path29 = __toESM(require("path"));
24212
24355
  init_audit();
24213
24356
  init_dist();
24214
24357
  var CLOUD_ARRAY_KEYS = /* @__PURE__ */ new Set(["exposureDestinations", "exposureDestinationHashes"]);
@@ -24244,7 +24387,7 @@ async function initNode9SaaS(toolName, args, creds, meta, riskMetadata, agentPol
24244
24387
  let ciContext;
24245
24388
  if (process.env.CI) {
24246
24389
  try {
24247
- const ciContextPath = import_path28.default.join(import_os19.default.homedir(), ".node9", "ci-context.json");
24390
+ const ciContextPath = import_path29.default.join(import_os19.default.homedir(), ".node9", "ci-context.json");
24248
24391
  const ci = readCappedText(ciContextPath, 1e4);
24249
24392
  if (!ci) throw new Error("ci-context.json unreadable");
24250
24393
  if (ci.truncated) throw new Error("ci-context.json exceeds 10 KB");
@@ -24362,14 +24505,14 @@ async function resolveNode9SaaS(requestId, creds, approved, decidedBy) {
24362
24505
  });
24363
24506
  clearTimeout(timer);
24364
24507
  if (!res.ok) {
24365
- import_fs27.default.appendFileSync(
24508
+ import_fs28.default.appendFileSync(
24366
24509
  HOOK_DEBUG_LOG,
24367
24510
  `[resolve-cloud] PATCH ${safeMessage(resolveUrl, 200)} \u2192 HTTP ${res.status}
24368
24511
  `
24369
24512
  );
24370
24513
  }
24371
24514
  } catch (err) {
24372
- import_fs27.default.appendFileSync(
24515
+ import_fs28.default.appendFileSync(
24373
24516
  HOOK_DEBUG_LOG,
24374
24517
  `[resolve-cloud] PATCH failed for ${safeMessage(requestId, 64)}: ${safeMessage(err)}
24375
24518
  `
@@ -24379,19 +24522,19 @@ async function resolveNode9SaaS(requestId, creds, approved, decidedBy) {
24379
24522
 
24380
24523
  // src/loop-detector.ts
24381
24524
  init_cjs_shims();
24382
- var import_fs28 = __toESM(require("fs"));
24383
- var import_path29 = __toESM(require("path"));
24525
+ var import_fs29 = __toESM(require("fs"));
24526
+ var import_path30 = __toESM(require("path"));
24384
24527
  var import_os20 = __toESM(require("os"));
24385
24528
  init_dist();
24386
24529
  init_forecast_context();
24387
24530
  init_dist();
24388
24531
  function loopStateFile() {
24389
- return import_path29.default.join(import_os20.default.homedir(), ".node9", "loop-state.json");
24532
+ return import_path30.default.join(import_os20.default.homedir(), ".node9", "loop-state.json");
24390
24533
  }
24391
24534
  function readState() {
24392
24535
  try {
24393
- if (!import_fs28.default.existsSync(loopStateFile())) return [];
24394
- const raw = import_fs28.default.readFileSync(loopStateFile(), "utf-8");
24536
+ if (!import_fs29.default.existsSync(loopStateFile())) return [];
24537
+ const raw = import_fs29.default.readFileSync(loopStateFile(), "utf-8");
24395
24538
  const parsed = JSON.parse(raw);
24396
24539
  if (!Array.isArray(parsed)) return [];
24397
24540
  return parsed;
@@ -24400,11 +24543,11 @@ function readState() {
24400
24543
  }
24401
24544
  }
24402
24545
  function writeState(records) {
24403
- const dir2 = import_path29.default.dirname(loopStateFile());
24404
- if (!import_fs28.default.existsSync(dir2)) import_fs28.default.mkdirSync(dir2, { recursive: true });
24546
+ const dir2 = import_path30.default.dirname(loopStateFile());
24547
+ if (!import_fs29.default.existsSync(dir2)) import_fs29.default.mkdirSync(dir2, { recursive: true });
24405
24548
  const tmpPath = `${loopStateFile()}.${import_os20.default.hostname()}.${process.pid}.tmp`;
24406
- import_fs28.default.writeFileSync(tmpPath, JSON.stringify(records));
24407
- import_fs28.default.renameSync(tmpPath, loopStateFile());
24549
+ import_fs29.default.writeFileSync(tmpPath, JSON.stringify(records));
24550
+ import_fs29.default.renameSync(tmpPath, loopStateFile());
24408
24551
  }
24409
24552
  function recordAndCheck(tool, args, threshold = 3, windowMs = 12e4) {
24410
24553
  try {
@@ -24603,9 +24746,9 @@ function isMcpToolName(toolName) {
24603
24746
  return /^mcp__[^_](?:[^_]|_(?!_))*?__/i.test(toolName);
24604
24747
  }
24605
24748
  function absoluteUploadPath(spelled, cwd) {
24606
- const expanded = spelled === "~" || spelled.startsWith("~/") ? import_path30.default.join(import_os21.default.homedir(), spelled.slice(1)) : spelled;
24607
- if (import_path30.default.isAbsolute(expanded)) return expanded;
24608
- return cwd && import_path30.default.isAbsolute(cwd) ? import_path30.default.resolve(cwd, expanded) : expanded;
24749
+ const expanded = spelled === "~" || spelled.startsWith("~/") ? import_path31.default.join(import_os21.default.homedir(), spelled.slice(1)) : spelled;
24750
+ if (import_path31.default.isAbsolute(expanded)) return expanded;
24751
+ return cwd && import_path31.default.isAbsolute(cwd) ? import_path31.default.resolve(cwd, expanded) : expanded;
24609
24752
  }
24610
24753
  function extractFilePaths(toolName, args, shellCommand) {
24611
24754
  const paths = [];
@@ -25151,7 +25294,9 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
25151
25294
  systemAccessHandled: !isManual && fileAccess.handledPaths.has(filePath)
25152
25295
  }) : null) ?? argumentScan(),
25153
25296
  pii: () => detectArgsPii(args),
25154
- packageCheck: () => packageCheck?.enabled && !isManual ? runPackageCheck(toolName, args, packageCheck, options?.cwd, { offline: !!forecast }) : Promise.resolve(null)
25297
+ packageCheck: () => packageCheck?.enabled && !isManual ? runPackageCheck(toolName, args, packageCheck, options?.cwd, {
25298
+ offline: !!forecast && forecast.onlinePackages !== true
25299
+ }) : Promise.resolve(null)
25155
25300
  });
25156
25301
  const dlpMatch = gates.stop?.dlpMatch ?? gates.reviews.dlp ?? null;
25157
25302
  if (dlpMatch) {