@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/cli-main.js +5480 -4202
- package/dist/dashboard.mjs +2452 -519
- package/dist/hook.js +530 -384
- package/dist/index.js +258 -113
- package/dist/index.mjs +258 -113
- package/dist/scan-ink.mjs +100 -0
- package/package.json +2 -2
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
|
|
19070
|
-
return ` \u2022 ${
|
|
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
|
|
19183
|
+
for (const path32 of ordered) {
|
|
19084
19184
|
let cur = root;
|
|
19085
|
-
for (const key of
|
|
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 =
|
|
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((
|
|
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
|
|
20574
|
-
if (!
|
|
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(
|
|
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:
|
|
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
|
|
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
|
|
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
|
-
|
|
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(
|
|
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 =
|
|
22636
|
-
if (!
|
|
22637
|
-
const data = JSON.parse(
|
|
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 =
|
|
22647
|
-
if (
|
|
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(
|
|
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
|
-
|
|
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
|
|
23152
|
+
var import_fs18 = __toESM(require("fs"));
|
|
23010
23153
|
var import_os12 = __toESM(require("os"));
|
|
23011
|
-
var
|
|
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
|
|
23146
|
-
var
|
|
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
|
|
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 (!
|
|
23160
|
-
const raw =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
23421
|
+
var import_path20 = __toESM(require("path"));
|
|
23279
23422
|
|
|
23280
23423
|
// src/context-sniper.ts
|
|
23281
23424
|
init_cjs_shims();
|
|
23282
|
-
var
|
|
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 =
|
|
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 ?
|
|
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
|
|
23766
|
+
var import_fs20 = __toESM(require("fs"));
|
|
23624
23767
|
var import_os14 = __toESM(require("os"));
|
|
23625
|
-
var
|
|
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
|
|
23773
|
+
var import_fs19 = __toESM(require("fs"));
|
|
23631
23774
|
var import_os13 = __toESM(require("os"));
|
|
23632
|
-
var
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
23851
|
+
var import_fs21 = __toESM(require("fs"));
|
|
23709
23852
|
var import_os15 = __toESM(require("os"));
|
|
23710
|
-
var
|
|
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 =
|
|
23718
|
-
const st =
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
|
23805
|
-
var
|
|
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
|
|
23810
|
-
var
|
|
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 =
|
|
23816
|
-
const st =
|
|
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 =
|
|
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)
|
|
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 =
|
|
23986
|
+
let cur = import_path24.default.resolve(dir2);
|
|
23844
23987
|
for (let i = 0; i < (walkUp ? 64 : 1); i++) {
|
|
23845
|
-
const dotGit =
|
|
23846
|
-
const direct = readSmallFile(
|
|
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 =
|
|
23852
|
-
const common = readSmallFile(
|
|
23853
|
-
if (common !== null) gitDir =
|
|
23854
|
-
return readSmallFile(
|
|
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 =
|
|
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"}:${
|
|
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(
|
|
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 =
|
|
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 (
|
|
24054
|
+
if (import_fs23.default.existsSync(import_path25.default.join(cur, m))) return cur;
|
|
23912
24055
|
} catch {
|
|
23913
24056
|
}
|
|
23914
24057
|
}
|
|
23915
|
-
const parent =
|
|
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 =
|
|
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 (
|
|
24080
|
+
if (import_fs23.default.existsSync(import_path25.default.join(root, m))) out.hosts.add(registry);
|
|
23938
24081
|
}
|
|
23939
24082
|
try {
|
|
23940
|
-
if (
|
|
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
|
|
24096
|
+
var import_fs24 = __toESM(require("fs"));
|
|
23954
24097
|
var import_os16 = __toESM(require("os"));
|
|
23955
|
-
var
|
|
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(
|
|
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) && (
|
|
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
|
|
24172
|
+
var import_fs25 = __toESM(require("fs"));
|
|
24030
24173
|
var import_os17 = __toESM(require("os"));
|
|
24031
|
-
var
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
24156
|
-
var
|
|
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
|
|
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 =
|
|
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
|
-
|
|
24316
|
+
import_fs27.default.mkdirSync(import_path28.default.dirname(filePath), { recursive: true });
|
|
24174
24317
|
const tmp = filePath + ".node9-tmp";
|
|
24175
|
-
|
|
24176
|
-
|
|
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
|
|
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
|
|
24352
|
+
var import_fs28 = __toESM(require("fs"));
|
|
24210
24353
|
var import_os19 = __toESM(require("os"));
|
|
24211
|
-
var
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
24383
|
-
var
|
|
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
|
|
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 (!
|
|
24394
|
-
const raw =
|
|
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 =
|
|
24404
|
-
if (!
|
|
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
|
-
|
|
24407
|
-
|
|
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("~/") ?
|
|
24607
|
-
if (
|
|
24608
|
-
return cwd &&
|
|
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, {
|
|
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) {
|