@node9/proxy 2.36.0 → 2.37.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/scan-ink.mjs CHANGED
@@ -543,6 +543,77 @@ var filesystem_default = {
543
543
  ],
544
544
  dangerousWords: ["wipefs"]
545
545
  };
546
+ var finance_default = {
547
+ name: "finance",
548
+ description: "Asks before money moves through a payment or banking app (refunds, payouts, transfers, charges, invoices), whatever the request said. Reads are never asked about.",
549
+ aliases: ["payments", "money"],
550
+ smartRules: [
551
+ {
552
+ name: "shield:finance:review-refund",
553
+ tool: "{,mcp__*__}{create_refund,refund_payment,refund_charge,refund_order,issue_refund}",
554
+ conditions: [],
555
+ verdict: "review",
556
+ reason: "A refund returns money to a customer. node9 asks before money moves, whatever the request said (Finance shield)."
557
+ },
558
+ {
559
+ name: "shield:finance:review-payout",
560
+ tool: "{,mcp__*__}{create_payout,send_payout,payout,create_payouts_batch}",
561
+ conditions: [],
562
+ verdict: "review",
563
+ reason: "A payout moves the balance to a bank account. node9 asks before money moves (Finance shield)."
564
+ },
565
+ {
566
+ name: "shield:finance:review-transfer",
567
+ tool: "{,mcp__*__}{transfer_create,transfer_authorization_create,create_transfer,transfer_money,transfer_funds,send_money,wire_transfer,create_wire,schedule_transaction,update_scheduled_transaction,create_transaction}",
568
+ conditions: [],
569
+ verdict: "review",
570
+ reason: "A transfer moves money between accounts. node9 asks before money moves (Finance shield)."
571
+ },
572
+ {
573
+ name: "shield:finance:review-charge",
574
+ tool: "{,mcp__*__}{create_payment_intent,confirm_payment_intent,capture_payment_intent,create_charge,create_payment,capture_payment,capture_order,create_order,authorize_order,create_checkout_session}",
575
+ conditions: [],
576
+ verdict: "review",
577
+ reason: "This charges a card or captures a payment. node9 asks before money moves (Finance shield)."
578
+ },
579
+ {
580
+ name: "shield:finance:review-payment-link",
581
+ tool: "{,mcp__*__}{create_payment_link,create_invoice,finalize_invoice,send_invoice,pay_invoice,create_invoice_item}",
582
+ conditions: [],
583
+ verdict: "review",
584
+ reason: "This bills someone or creates a link that charges a card. node9 asks before money moves (Finance shield)."
585
+ },
586
+ {
587
+ name: "shield:finance:review-subscription",
588
+ tool: "{,mcp__*__}{create_subscription,cancel_subscription,update_subscription,pause_subscription,resume_subscription}",
589
+ conditions: [],
590
+ verdict: "review",
591
+ reason: "A subscription starts or stops recurring charges. node9 asks before money moves (Finance shield)."
592
+ },
593
+ {
594
+ name: "shield:finance:review-dispute",
595
+ tool: "{,mcp__*__}{update_dispute,accept_dispute,close_dispute}",
596
+ conditions: [],
597
+ verdict: "review",
598
+ reason: "This answers or concedes a chargeback. node9 asks before money moves (Finance shield)."
599
+ },
600
+ {
601
+ name: "shield:finance:review-card",
602
+ tool: "{,mcp__*__}{issue_card,create_virtual_card,create_issuing_card,update_card_limit}",
603
+ conditions: [],
604
+ verdict: "review",
605
+ reason: "This issues a card or changes its limit. node9 asks before money moves (Finance shield)."
606
+ },
607
+ {
608
+ name: "shield:finance:review-withdraw",
609
+ tool: "{,mcp__*__}{withdraw,withdraw_funds,create_withdrawal,request_withdrawal}",
610
+ conditions: [],
611
+ verdict: "review",
612
+ reason: "A withdrawal moves money out. node9 asks before money moves (Finance shield)."
613
+ }
614
+ ],
615
+ dangerousWords: []
616
+ };
546
617
  var github_default = {
547
618
  name: "github",
548
619
  description: "Protects GitHub repositories from destructive AI operations",
@@ -569,6 +640,56 @@ var github_default = {
569
640
  ],
570
641
  dangerousWords: []
571
642
  };
643
+ var identity_default = {
644
+ name: "identity",
645
+ description: "Asks before a password, a key, a token, a role or a user changes in an identity or admin app, whatever the request said. Reads are never asked about.",
646
+ aliases: ["access", "iam"],
647
+ smartRules: [
648
+ {
649
+ name: "shield:identity:review-password",
650
+ tool: "{,mcp__*__}{change_password,update_password,reset_password,set_password,expire_password,force_password_reset}",
651
+ conditions: [],
652
+ verdict: "review",
653
+ reason: "This changes or resets a password. node9 asks before credentials change, whatever the request said (Identity shield)."
654
+ },
655
+ {
656
+ name: "shield:identity:review-key",
657
+ tool: "{,mcp__*__}{rotate_key,rotate_api_key,create_api_key,create_token,create_access_token,create_personal_access_token,regenerate_secret,rotate_secret,create_service_account_key,create_credential}",
658
+ conditions: [],
659
+ verdict: "review",
660
+ reason: "This creates or rotates a key, token or secret. node9 asks before credentials change (Identity shield)."
661
+ },
662
+ {
663
+ name: "shield:identity:review-access",
664
+ tool: "{,mcp__*__}{grant_access,grant_permission,grant_role,revoke_access,revoke_permission,revoke_role,revoke_token,set_permission,set_permissions,set_role,assign_role,update_role,add_permission,remove_permission,attach_policy,detach_policy}",
665
+ conditions: [],
666
+ verdict: "review",
667
+ reason: "This grants or revokes access. node9 asks before access changes (Identity shield)."
668
+ },
669
+ {
670
+ name: "shield:identity:review-membership",
671
+ tool: "{,mcp__*__}{add_member,remove_member,add_user_to_group,remove_user_from_group,add_collaborator,remove_collaborator,invite_user,invite_member,invite_user_to_slack,invite_users,add_org_member,remove_org_member,add_team_member,remove_team_member}",
672
+ conditions: [],
673
+ verdict: "review",
674
+ reason: "This changes who belongs where. node9 asks before membership changes (Identity shield)."
675
+ },
676
+ {
677
+ name: "shield:identity:review-user",
678
+ tool: "{,mcp__*__}{create_user,delete_user,deactivate_user,suspend_user,activate_user,unlock_user,make_admin,promote_user,demote_user,update_user_role}",
679
+ conditions: [],
680
+ verdict: "review",
681
+ reason: "This creates, removes or promotes an account. node9 asks before accounts change (Identity shield)."
682
+ },
683
+ {
684
+ name: "shield:identity:review-mfa",
685
+ tool: "{,mcp__*__}{reset_mfa,reset_factors,disable_mfa,enroll_factor,deactivate_factor}",
686
+ conditions: [],
687
+ verdict: "review",
688
+ reason: "This changes a second factor. node9 asks before credentials change (Identity shield)."
689
+ }
690
+ ],
691
+ dangerousWords: []
692
+ };
572
693
  var k8s_default = {
573
694
  name: "k8s",
574
695
  description: "Protects Kubernetes clusters from destructive AI operations",
@@ -901,6 +1022,175 @@ var project_jail_default = {
901
1022
  ],
902
1023
  dangerousWords: []
903
1024
  };
1025
+ var publishing_default = {
1026
+ name: "publishing",
1027
+ description: "Asks before something goes public or ships outside the organisation (a release, a package, a deploy, a post), whatever the request said. The same switch covers the shell commands that publish.",
1028
+ aliases: ["release", "deploy"],
1029
+ smartRules: [
1030
+ {
1031
+ name: "shield:publishing:review-release",
1032
+ tool: "{,mcp__*__}{create_release,publish_release,create_tag_release,update_release,promote_release}",
1033
+ conditions: [],
1034
+ verdict: "review",
1035
+ reason: "A release ships code to everyone who installs it. node9 asks before publishing, whatever the request said (Publishing shield)."
1036
+ },
1037
+ {
1038
+ name: "shield:publishing:review-package",
1039
+ tool: "{,mcp__*__}{publish_package,npm_publish,pypi_upload,publish_version,publish_extension}",
1040
+ conditions: [],
1041
+ verdict: "review",
1042
+ reason: "This publishes a package. node9 asks before publishing (Publishing shield)."
1043
+ },
1044
+ {
1045
+ name: "shield:publishing:review-deploy",
1046
+ tool: "{,mcp__*__}{deploy,create_deployment,deploy_site,promote_deployment,trigger_deploy,deploy_to_production,rollout}",
1047
+ conditions: [],
1048
+ verdict: "review",
1049
+ reason: "This deploys to an environment other people use. node9 asks before publishing (Publishing shield)."
1050
+ },
1051
+ {
1052
+ name: "shield:publishing:review-post",
1053
+ tool: "{,mcp__*__}{post_tweet,create_tweet,post_webpage,publish_post,create_post,publish_page,send_announcement,post_announcement,create_linkedin_post,schedule_post}",
1054
+ conditions: [],
1055
+ verdict: "review",
1056
+ reason: "This posts outside the organisation. node9 asks before publishing (Publishing shield)."
1057
+ },
1058
+ {
1059
+ name: "shield:publishing:review-visibility",
1060
+ tool: "{,mcp__*__}{set_visibility,make_public,set_public,publish_repository,change_visibility,update_visibility}",
1061
+ conditions: [],
1062
+ verdict: "review",
1063
+ reason: "This makes something public. node9 asks before publishing (Publishing shield)."
1064
+ },
1065
+ {
1066
+ name: "shield:publishing:review-npm-publish",
1067
+ tool: "bash",
1068
+ conditions: [
1069
+ {
1070
+ field: "command",
1071
+ op: "matches",
1072
+ value: "(?:^|[^\\w-])(?:npm|pnpm)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
1073
+ flags: "i"
1074
+ }
1075
+ ],
1076
+ verdict: "review",
1077
+ reason: "npm publish ships the package to everyone who installs it. node9 asks before publishing (Publishing shield)."
1078
+ },
1079
+ {
1080
+ name: "shield:publishing:review-yarn-publish",
1081
+ tool: "bash",
1082
+ conditions: [
1083
+ {
1084
+ field: "command",
1085
+ op: "matches",
1086
+ value: "(?:^|[^\\w-])(?:yarn)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
1087
+ flags: "i"
1088
+ }
1089
+ ],
1090
+ verdict: "review",
1091
+ reason: "yarn publish ships the package to everyone who installs it. node9 asks before publishing (Publishing shield)."
1092
+ },
1093
+ {
1094
+ name: "shield:publishing:review-twine-upload",
1095
+ tool: "bash",
1096
+ conditions: [
1097
+ {
1098
+ field: "command",
1099
+ op: "matches",
1100
+ value: "(?:^|[^\\w-])(?:twine)(?![\\w-])[^;&|]{0,200}?\\s(?:upload)(?![\\w-])",
1101
+ flags: "i"
1102
+ }
1103
+ ],
1104
+ verdict: "review",
1105
+ reason: "twine upload publishes to PyPI. node9 asks before publishing (Publishing shield)."
1106
+ },
1107
+ {
1108
+ name: "shield:publishing:review-python-publish",
1109
+ tool: "bash",
1110
+ conditions: [
1111
+ {
1112
+ field: "command",
1113
+ op: "matches",
1114
+ value: "(?:^|[^\\w-])(?:poetry|uv|hatch|flit)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
1115
+ flags: "i"
1116
+ }
1117
+ ],
1118
+ verdict: "review",
1119
+ reason: "This publishes the Python package to PyPI. node9 asks before publishing (Publishing shield)."
1120
+ },
1121
+ {
1122
+ name: "shield:publishing:review-release-tool-publish",
1123
+ tool: "bash",
1124
+ conditions: [
1125
+ {
1126
+ field: "command",
1127
+ op: "matches",
1128
+ value: "(?:^|[^\\w-])(?:lerna|changeset|vsce|ovsx)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
1129
+ flags: "i"
1130
+ }
1131
+ ],
1132
+ verdict: "review",
1133
+ reason: "This publishes packages or an editor extension through a release tool. node9 asks before publishing (Publishing shield)."
1134
+ },
1135
+ {
1136
+ name: "shield:publishing:review-cargo-publish",
1137
+ tool: "bash",
1138
+ conditions: [
1139
+ {
1140
+ field: "command",
1141
+ op: "matches",
1142
+ value: "(?:^|[^\\w-])(?:cargo)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
1143
+ flags: "i"
1144
+ }
1145
+ ],
1146
+ verdict: "review",
1147
+ reason: "cargo publish ships the crate. node9 asks before publishing (Publishing shield)."
1148
+ },
1149
+ {
1150
+ name: "shield:publishing:review-gem-push",
1151
+ tool: "bash",
1152
+ conditions: [
1153
+ {
1154
+ field: "command",
1155
+ op: "matches",
1156
+ value: "(?:^|[^\\w-])(?:gem)(?![\\w-])[^;&|]{0,200}?\\s(?:push)(?![\\w-])",
1157
+ flags: "i"
1158
+ }
1159
+ ],
1160
+ verdict: "review",
1161
+ reason: "gem push publishes to RubyGems. node9 asks before publishing (Publishing shield)."
1162
+ },
1163
+ {
1164
+ name: "shield:publishing:review-docker-push",
1165
+ tool: "bash",
1166
+ conditions: [
1167
+ {
1168
+ field: "command",
1169
+ op: "matches",
1170
+ value: "(?:^|[^\\w-])(?:docker|podman)(?![\\w-])[^;&|]{0,200}?\\s(?:push|--push)(?![\\w-])",
1171
+ flags: "i"
1172
+ }
1173
+ ],
1174
+ verdict: "review",
1175
+ reason: "docker push publishes the image to a registry. node9 asks before publishing (Publishing shield)."
1176
+ },
1177
+ {
1178
+ name: "shield:publishing:review-gh-release",
1179
+ tool: "bash",
1180
+ conditions: [
1181
+ {
1182
+ field: "command",
1183
+ op: "matches",
1184
+ value: "(?:^|[^\\w-])(?:gh)(?![\\w-])[^;&|]{0,200}?\\srelease\\s+(?:create|upload|edit)(?![\\w-])",
1185
+ flags: "i"
1186
+ }
1187
+ ],
1188
+ verdict: "review",
1189
+ reason: "gh release ships a release on GitHub. node9 asks before publishing (Publishing shield)."
1190
+ }
1191
+ ],
1192
+ dangerousWords: []
1193
+ };
904
1194
  var redis_default = {
905
1195
  name: "redis",
906
1196
  description: "Protects Redis instances from destructive AI operations",
@@ -998,13 +1288,25 @@ var BUILTIN_SHIELDS = {
998
1288
  [bash_safe_default.name]: bash_safe_default,
999
1289
  [docker_default.name]: docker_default,
1000
1290
  [filesystem_default.name]: filesystem_default,
1291
+ // Dangerous actions as category shields (node9Firewall#385): an MCP app's
1292
+ // money, credential and publishing tools, asked about whatever the request
1293
+ // said. One glob per rule covers the bare name the gateway sends and the
1294
+ // mcp__<server>__ name the agent hook sends.
1295
+ [finance_default.name]: finance_default,
1001
1296
  [github_default.name]: github_default,
1297
+ [identity_default.name]: identity_default,
1002
1298
  [k8s_default.name]: k8s_default,
1003
1299
  [mongodb_default.name]: mongodb_default,
1004
1300
  [postgres_default.name]: postgres_default,
1005
1301
  [project_jail_default.name]: project_jail_default,
1302
+ [publishing_default.name]: publishing_default,
1006
1303
  [redis_default.name]: redis_default
1007
1304
  };
1305
+ var ACTION_SHIELD_NAMES = /* @__PURE__ */ new Set([
1306
+ "finance",
1307
+ "identity",
1308
+ "publishing"
1309
+ ]);
1008
1310
  function assertBuiltinShieldRegexesAreSafe() {
1009
1311
  for (const shield of Object.values(BUILTIN_SHIELDS)) {
1010
1312
  for (const rule of shield.smartRules) {
@@ -6005,7 +6307,7 @@ function ShieldsPanel({ summary, width, enabledShields = [] }) {
6005
6307
  });
6006
6308
  const hitShields = ranked.filter((i) => i.totalCatches > 0);
6007
6309
  const hitNames = new Set(hitShields.map((i) => i.shieldName));
6008
- const zeroHitAll = Object.keys(BUILTIN_SHIELDS).filter((name) => !hitNames.has(name)).sort();
6310
+ const zeroHitAll = Object.keys(BUILTIN_SHIELDS).filter((name) => !hitNames.has(name) && !ACTION_SHIELD_NAMES.has(name)).sort();
6009
6311
  const zeroHitBuiltins = zeroHitAll.filter((name) => !enabled.has(name));
6010
6312
  const zeroHitEnabled = zeroHitAll.filter((name) => enabled.has(name));
6011
6313
  const topRec = hitShields.find(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node9/proxy",
3
- "version": "2.36.0",
3
+ "version": "2.37.0",
4
4
  "description": "Access control for AI agents. Set what Claude Code, Codex, Gemini, Cursor and any MCP server are allowed to do, review risky actions before they run, and keep every action on the record.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",