nexus-agents 8.83.0 → 8.85.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.
Files changed (130) hide show
  1. package/dist/{ast-rule-runner-O2UYBG74.js → ast-rule-runner-LXMZIGCY.js} +3 -3
  2. package/dist/{child-mcp-config-W2EPNDEU.js → child-mcp-config-OBHZQG2Q.js} +2 -2
  3. package/dist/{chunk-APF7COQN.js → chunk-2EBCZOVZ.js} +2 -2
  4. package/dist/{chunk-NYF2WZAK.js → chunk-45EJ4PBT.js} +2 -2
  5. package/dist/{chunk-TURGEY3I.js → chunk-6FXHSNXA.js} +2 -2
  6. package/dist/{chunk-YRTHZDTO.js → chunk-6Q7EYNH2.js} +2 -2
  7. package/dist/{chunk-PW4DLY5W.js → chunk-7LGBEEKB.js} +2 -2
  8. package/dist/{chunk-3EFOVHKF.js → chunk-AKM6ILIM.js} +144 -9
  9. package/dist/chunk-AKM6ILIM.js.map +1 -0
  10. package/dist/{chunk-3NPRFOSH.js → chunk-BHLPPZZ6.js} +7 -7
  11. package/dist/{chunk-CPJWPHUX.js → chunk-BKRAZWLA.js} +5 -5
  12. package/dist/{chunk-CPJWPHUX.js.map → chunk-BKRAZWLA.js.map} +1 -1
  13. package/dist/{chunk-4NH3RNU6.js → chunk-BXOXALDW.js} +2 -2
  14. package/dist/{chunk-KJHB4KH2.js → chunk-CH2WD3MA.js} +3 -3
  15. package/dist/{chunk-VRTZSUMG.js → chunk-DWZXQYUL.js} +10 -10
  16. package/dist/{chunk-BZPRF4SJ.js → chunk-DY5FNADP.js} +3 -3
  17. package/dist/{chunk-6W4KJFPT.js → chunk-EX5EN5B6.js} +2 -2
  18. package/dist/{chunk-LWVRXNCL.js → chunk-FFUIQBDD.js} +2 -2
  19. package/dist/{chunk-CEPKZE3M.js → chunk-FJVOWWD5.js} +609 -403
  20. package/dist/chunk-FJVOWWD5.js.map +1 -0
  21. package/dist/{chunk-XNX4SH4O.js → chunk-HFPR4I3U.js} +2 -2
  22. package/dist/{chunk-IPZC5BXM.js → chunk-HXOEF3YP.js} +3 -3
  23. package/dist/{chunk-IPZC5BXM.js.map → chunk-HXOEF3YP.js.map} +1 -1
  24. package/dist/{chunk-UFO5A53B.js → chunk-IPWGHYXZ.js} +2 -2
  25. package/dist/{chunk-PD2GZQYH.js → chunk-JN42TCDE.js} +2 -2
  26. package/dist/{chunk-B5C5IMIV.js → chunk-LEYBZKK2.js} +4 -4
  27. package/dist/{chunk-HA2U5XJ2.js → chunk-LNX6D7GM.js} +3 -3
  28. package/dist/{chunk-C4SNSFBV.js → chunk-NHLKZ3KC.js} +2 -2
  29. package/dist/{chunk-256K77ED.js → chunk-OBTPPT3M.js} +5 -5
  30. package/dist/{chunk-ZUWF76BV.js → chunk-OSEM44EE.js} +11 -11
  31. package/dist/chunk-OSEM44EE.js.map +1 -0
  32. package/dist/{chunk-BTFOWREE.js → chunk-R5ASFO5P.js} +2 -2
  33. package/dist/{chunk-ALCCX5DS.js → chunk-RSDKRBZC.js} +2 -2
  34. package/dist/{chunk-YWEZ7W4K.js → chunk-UA6FZ2WV.js} +4 -4
  35. package/dist/{chunk-AQVSAPQD.js → chunk-UB7PB7GI.js} +4 -4
  36. package/dist/{chunk-NXMETLX7.js → chunk-UQR4SSUJ.js} +2 -2
  37. package/dist/{chunk-FMN3QH3O.js → chunk-WUUZ5KH2.js} +2 -2
  38. package/dist/{chunk-NO55AP2L.js → chunk-XRPHJNVB.js} +4 -4
  39. package/dist/{chunk-UMFQ52XI.js → chunk-Y6QNLP5P.js} +8 -8
  40. package/dist/{chunk-U53CKPED.js → chunk-ZA627SSQ.js} +2 -2
  41. package/dist/{cli-circuit-breaker-2T4GGSUE.js → cli-circuit-breaker-GJWYQL6L.js} +3 -3
  42. package/dist/cli.js +51 -47
  43. package/dist/cli.js.map +1 -1
  44. package/dist/{composite-router-DH2S2IVK.js → composite-router-TL5XKK5X.js} +2 -2
  45. package/dist/{consensus-vote-4VBUZ5NH.js → consensus-vote-H363QXSE.js} +16 -16
  46. package/dist/{context-retriever-5NGYA4JC.js → context-retriever-CC3W7XS6.js} +8 -8
  47. package/dist/{doctor-deep-535NDUD2.js → doctor-deep-XBJ5HS3B.js} +3 -3
  48. package/dist/{doctor-live-CAREILU5.js → doctor-live-CNKTVDK6.js} +10 -10
  49. package/dist/{expert-bridge-7WAFFJWN.js → expert-bridge-YPVHOWFB.js} +4 -4
  50. package/dist/{factory-L2OVYRN4.js → factory-JHBJB2O2.js} +9 -9
  51. package/dist/{factory-ZU75VK4Z.js → factory-MRSIKSPG.js} +5 -5
  52. package/dist/{improvement-review-RSKJAU4A.js → improvement-review-TSSTONUQ.js} +5 -5
  53. package/dist/index.d.ts +192 -68
  54. package/dist/index.js +30 -30
  55. package/dist/{init-opencode-SHNOT2CZ.js → init-opencode-FH2LR62J.js} +5 -5
  56. package/dist/issue-triage-TI6R4XZL.js +16 -0
  57. package/dist/model-registry.generated.json +7269 -3654
  58. package/dist/models-dev-snapshot.json +98 -2
  59. package/dist/{pr-reviewer-helpers-P6DXUMTO.js → pr-reviewer-helpers-QG53KLXL.js} +4 -4
  60. package/dist/{registry-command-R336DHZS.js → registry-command-IX7IISYC.js} +2 -2
  61. package/dist/{repo-security-plan-LLTLKJWF.js → repo-security-plan-FE2KXATO.js} +3 -3
  62. package/dist/{research-helpers-synthesize-N7NYBAKW.js → research-helpers-synthesize-TRAPPDBV.js} +4 -4
  63. package/dist/{routing-memory-YLQPO5OH.js → routing-memory-IXTZH2LJ.js} +2 -2
  64. package/dist/{session-memory-6PNSAPG4.js → session-memory-LG3G33MF.js} +3 -3
  65. package/dist/{setup-config-SY3HM5OH.js → setup-config-HAIUEE4A.js} +3 -3
  66. package/dist/{setup-custom-api-ZEGB745O.js → setup-custom-api-437P3KVD.js} +4 -4
  67. package/dist/setup-data-dir-BVALVICE.js +32 -0
  68. package/dist/{tool-memory-3GBF2OOW.js → tool-memory-A7C3WO3Q.js} +5 -5
  69. package/dist/{unified-registry-SCYTXNHW.js → unified-registry-YF3B3PDU.js} +10 -10
  70. package/dist/{weather-report-NGBJYVS6.js → weather-report-NDQU55YN.js} +2 -2
  71. package/package.json +4 -4
  72. package/dist/chunk-3EFOVHKF.js.map +0 -1
  73. package/dist/chunk-CEPKZE3M.js.map +0 -1
  74. package/dist/chunk-ZUWF76BV.js.map +0 -1
  75. package/dist/issue-triage-TS4WXIQ2.js +0 -16
  76. package/dist/setup-data-dir-OFOKYKTI.js +0 -32
  77. /package/dist/{ast-rule-runner-O2UYBG74.js.map → ast-rule-runner-LXMZIGCY.js.map} +0 -0
  78. /package/dist/{child-mcp-config-W2EPNDEU.js.map → child-mcp-config-OBHZQG2Q.js.map} +0 -0
  79. /package/dist/{chunk-APF7COQN.js.map → chunk-2EBCZOVZ.js.map} +0 -0
  80. /package/dist/{chunk-NYF2WZAK.js.map → chunk-45EJ4PBT.js.map} +0 -0
  81. /package/dist/{chunk-TURGEY3I.js.map → chunk-6FXHSNXA.js.map} +0 -0
  82. /package/dist/{chunk-YRTHZDTO.js.map → chunk-6Q7EYNH2.js.map} +0 -0
  83. /package/dist/{chunk-PW4DLY5W.js.map → chunk-7LGBEEKB.js.map} +0 -0
  84. /package/dist/{chunk-3NPRFOSH.js.map → chunk-BHLPPZZ6.js.map} +0 -0
  85. /package/dist/{chunk-4NH3RNU6.js.map → chunk-BXOXALDW.js.map} +0 -0
  86. /package/dist/{chunk-KJHB4KH2.js.map → chunk-CH2WD3MA.js.map} +0 -0
  87. /package/dist/{chunk-VRTZSUMG.js.map → chunk-DWZXQYUL.js.map} +0 -0
  88. /package/dist/{chunk-BZPRF4SJ.js.map → chunk-DY5FNADP.js.map} +0 -0
  89. /package/dist/{chunk-6W4KJFPT.js.map → chunk-EX5EN5B6.js.map} +0 -0
  90. /package/dist/{chunk-LWVRXNCL.js.map → chunk-FFUIQBDD.js.map} +0 -0
  91. /package/dist/{chunk-XNX4SH4O.js.map → chunk-HFPR4I3U.js.map} +0 -0
  92. /package/dist/{chunk-UFO5A53B.js.map → chunk-IPWGHYXZ.js.map} +0 -0
  93. /package/dist/{chunk-PD2GZQYH.js.map → chunk-JN42TCDE.js.map} +0 -0
  94. /package/dist/{chunk-B5C5IMIV.js.map → chunk-LEYBZKK2.js.map} +0 -0
  95. /package/dist/{chunk-HA2U5XJ2.js.map → chunk-LNX6D7GM.js.map} +0 -0
  96. /package/dist/{chunk-C4SNSFBV.js.map → chunk-NHLKZ3KC.js.map} +0 -0
  97. /package/dist/{chunk-256K77ED.js.map → chunk-OBTPPT3M.js.map} +0 -0
  98. /package/dist/{chunk-BTFOWREE.js.map → chunk-R5ASFO5P.js.map} +0 -0
  99. /package/dist/{chunk-ALCCX5DS.js.map → chunk-RSDKRBZC.js.map} +0 -0
  100. /package/dist/{chunk-YWEZ7W4K.js.map → chunk-UA6FZ2WV.js.map} +0 -0
  101. /package/dist/{chunk-AQVSAPQD.js.map → chunk-UB7PB7GI.js.map} +0 -0
  102. /package/dist/{chunk-NXMETLX7.js.map → chunk-UQR4SSUJ.js.map} +0 -0
  103. /package/dist/{chunk-FMN3QH3O.js.map → chunk-WUUZ5KH2.js.map} +0 -0
  104. /package/dist/{chunk-NO55AP2L.js.map → chunk-XRPHJNVB.js.map} +0 -0
  105. /package/dist/{chunk-UMFQ52XI.js.map → chunk-Y6QNLP5P.js.map} +0 -0
  106. /package/dist/{chunk-U53CKPED.js.map → chunk-ZA627SSQ.js.map} +0 -0
  107. /package/dist/{cli-circuit-breaker-2T4GGSUE.js.map → cli-circuit-breaker-GJWYQL6L.js.map} +0 -0
  108. /package/dist/{composite-router-DH2S2IVK.js.map → composite-router-TL5XKK5X.js.map} +0 -0
  109. /package/dist/{consensus-vote-4VBUZ5NH.js.map → consensus-vote-H363QXSE.js.map} +0 -0
  110. /package/dist/{context-retriever-5NGYA4JC.js.map → context-retriever-CC3W7XS6.js.map} +0 -0
  111. /package/dist/{doctor-deep-535NDUD2.js.map → doctor-deep-XBJ5HS3B.js.map} +0 -0
  112. /package/dist/{doctor-live-CAREILU5.js.map → doctor-live-CNKTVDK6.js.map} +0 -0
  113. /package/dist/{expert-bridge-7WAFFJWN.js.map → expert-bridge-YPVHOWFB.js.map} +0 -0
  114. /package/dist/{factory-L2OVYRN4.js.map → factory-JHBJB2O2.js.map} +0 -0
  115. /package/dist/{factory-ZU75VK4Z.js.map → factory-MRSIKSPG.js.map} +0 -0
  116. /package/dist/{improvement-review-RSKJAU4A.js.map → improvement-review-TSSTONUQ.js.map} +0 -0
  117. /package/dist/{init-opencode-SHNOT2CZ.js.map → init-opencode-FH2LR62J.js.map} +0 -0
  118. /package/dist/{issue-triage-TS4WXIQ2.js.map → issue-triage-TI6R4XZL.js.map} +0 -0
  119. /package/dist/{pr-reviewer-helpers-P6DXUMTO.js.map → pr-reviewer-helpers-QG53KLXL.js.map} +0 -0
  120. /package/dist/{registry-command-R336DHZS.js.map → registry-command-IX7IISYC.js.map} +0 -0
  121. /package/dist/{repo-security-plan-LLTLKJWF.js.map → repo-security-plan-FE2KXATO.js.map} +0 -0
  122. /package/dist/{research-helpers-synthesize-N7NYBAKW.js.map → research-helpers-synthesize-TRAPPDBV.js.map} +0 -0
  123. /package/dist/{routing-memory-YLQPO5OH.js.map → routing-memory-IXTZH2LJ.js.map} +0 -0
  124. /package/dist/{session-memory-6PNSAPG4.js.map → session-memory-LG3G33MF.js.map} +0 -0
  125. /package/dist/{setup-config-SY3HM5OH.js.map → setup-config-HAIUEE4A.js.map} +0 -0
  126. /package/dist/{setup-custom-api-ZEGB745O.js.map → setup-custom-api-437P3KVD.js.map} +0 -0
  127. /package/dist/{setup-data-dir-OFOKYKTI.js.map → setup-data-dir-BVALVICE.js.map} +0 -0
  128. /package/dist/{tool-memory-3GBF2OOW.js.map → tool-memory-A7C3WO3Q.js.map} +0 -0
  129. /package/dist/{unified-registry-SCYTXNHW.js.map → unified-registry-YF3B3PDU.js.map} +0 -0
  130. /package/dist/{weather-report-NGBJYVS6.js.map → weather-report-NDQU55YN.js.map} +0 -0
@@ -9,8 +9,8 @@ import {
9
9
  getBuiltInAstRulesPath,
10
10
  loadRules,
11
11
  runAstQaRules
12
- } from "./chunk-BTFOWREE.js";
13
- import "./chunk-IPZC5BXM.js";
12
+ } from "./chunk-R5ASFO5P.js";
13
+ import "./chunk-HXOEF3YP.js";
14
14
  import "./chunk-4UHDDCRB.js";
15
15
  import "./chunk-RNDHNRSX.js";
16
16
  import "./chunk-PX6F3LHL.js";
@@ -26,4 +26,4 @@ export {
26
26
  loadRules,
27
27
  runAstQaRules
28
28
  };
29
- //# sourceMappingURL=ast-rule-runner-O2UYBG74.js.map
29
+ //# sourceMappingURL=ast-rule-runner-LXMZIGCY.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-HERI7LXN.js";
4
4
  import {
5
5
  createLogger
6
- } from "./chunk-IPZC5BXM.js";
6
+ } from "./chunk-HXOEF3YP.js";
7
7
  import "./chunk-4UHDDCRB.js";
8
8
  import "./chunk-RNDHNRSX.js";
9
9
  import "./chunk-PX6F3LHL.js";
@@ -56,4 +56,4 @@ async function generateMcpConfig(options) {
56
56
  export {
57
57
  generateMcpConfig
58
58
  };
59
- //# sourceMappingURL=child-mcp-config-W2EPNDEU.js.map
59
+ //# sourceMappingURL=child-mcp-config-OBHZQG2Q.js.map
@@ -2,7 +2,7 @@ import {
2
2
  createLogger,
3
3
  err,
4
4
  ok
5
- } from "./chunk-IPZC5BXM.js";
5
+ } from "./chunk-HXOEF3YP.js";
6
6
 
7
7
  // src/scm/token-resolver.ts
8
8
  import { execFile } from "node:child_process";
@@ -87,4 +87,4 @@ export {
87
87
  hasToken,
88
88
  getTokenEnvVars
89
89
  };
90
- //# sourceMappingURL=chunk-APF7COQN.js.map
90
+ //# sourceMappingURL=chunk-2EBCZOVZ.js.map
@@ -3,7 +3,7 @@ import {
3
3
  MODEL_IDS,
4
4
  getTimeProvider,
5
5
  resolveModelIdentitySync
6
- } from "./chunk-IPZC5BXM.js";
6
+ } from "./chunk-HXOEF3YP.js";
7
7
 
8
8
  // src/config/model-availability.ts
9
9
  var DEFAULT_TTL_MS = 6e4;
@@ -150,4 +150,4 @@ export {
150
150
  resetAvailabilityCache,
151
151
  filterAvailableModels
152
152
  };
153
- //# sourceMappingURL=chunk-NYF2WZAK.js.map
153
+ //# sourceMappingURL=chunk-45EJ4PBT.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getErrorMessage
3
- } from "./chunk-IPZC5BXM.js";
3
+ } from "./chunk-HXOEF3YP.js";
4
4
 
5
5
  // src/cli/setup-config.ts
6
6
  import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
@@ -77,4 +77,4 @@ function ensureBackup(outputPath) {
77
77
  export {
78
78
  runConfigInitSync
79
79
  };
80
- //# sourceMappingURL=chunk-TURGEY3I.js.map
80
+ //# sourceMappingURL=chunk-6FXHSNXA.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  createLogger,
6
6
  getTimeProvider
7
- } from "./chunk-IPZC5BXM.js";
7
+ } from "./chunk-HXOEF3YP.js";
8
8
 
9
9
  // src/mcp/tools/scanner-registry-fetcher.ts
10
10
  import { z } from "zod";
@@ -740,4 +740,4 @@ export {
740
740
  generateSecurityPlan,
741
741
  buildPlanFromAnalysis
742
742
  };
743
- //# sourceMappingURL=chunk-YRTHZDTO.js.map
743
+ //# sourceMappingURL=chunk-6Q7EYNH2.js.map
@@ -8,7 +8,7 @@ import {
8
8
  MCP_TIMEOUTS,
9
9
  TEST_TIMEOUTS,
10
10
  WORKFLOW_TIMEOUTS
11
- } from "./chunk-IPZC5BXM.js";
11
+ } from "./chunk-HXOEF3YP.js";
12
12
  import {
13
13
  createGetToolRateLimit
14
14
  } from "./chunk-RNDHNRSX.js";
@@ -223,4 +223,4 @@ export {
223
223
  CUSTOM_API_DEFAULT_MODEL,
224
224
  DEFAULTS
225
225
  };
226
- //# sourceMappingURL=chunk-PW4DLY5W.js.map
226
+ //# sourceMappingURL=chunk-7LGBEEKB.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-FMN3QH3O.js";
4
+ } from "./chunk-WUUZ5KH2.js";
5
5
  import {
6
6
  ROLE_DEFAULT_TRUST,
7
7
  ReputationCache,
@@ -12,10 +12,10 @@ import {
12
12
  resolveEnvMode,
13
13
  resolveReputationGatingMode,
14
14
  sanitizeInput
15
- } from "./chunk-U53CKPED.js";
15
+ } from "./chunk-ZA627SSQ.js";
16
16
  import {
17
17
  hasToken
18
- } from "./chunk-APF7COQN.js";
18
+ } from "./chunk-2EBCZOVZ.js";
19
19
  import {
20
20
  CLI_SUBPROCESS_TIMEOUTS,
21
21
  createLogger,
@@ -23,7 +23,7 @@ import {
23
23
  getErrorMessage,
24
24
  getTimeProvider,
25
25
  ok
26
- } from "./chunk-IPZC5BXM.js";
26
+ } from "./chunk-HXOEF3YP.js";
27
27
 
28
28
  // src/security/firewall/firewall-policy-mode.ts
29
29
  import { z } from "zod";
@@ -1012,6 +1012,55 @@ function policyRefusal(policy, policyMode, user, effectiveTrustTier) {
1012
1012
  violations: blocking
1013
1013
  };
1014
1014
  }
1015
+ function executeActionPolicy(action, options, config) {
1016
+ const context = options.context ?? config.defaultContext;
1017
+ const actionContext = buildActionContext(options.effectiveTrustTier, context, options);
1018
+ const evaluation = evaluateFirewallPolicy(
1019
+ actionContext,
1020
+ action,
1021
+ config.auditStage ? config.auditTrail : void 0
1022
+ );
1023
+ const blocking = blockingViolations(evaluation);
1024
+ if (blocking.length > 0) {
1025
+ logger2.warn("Firewall surfaced blocking policy violations", {
1026
+ user: options.user,
1027
+ effectiveTrustTier: options.effectiveTrustTier,
1028
+ scope: evaluation.scope,
1029
+ rules: blocking.map((v) => v.rule)
1030
+ });
1031
+ }
1032
+ const refusal = policyRefusal(
1033
+ evaluation,
1034
+ config.policyMode,
1035
+ options.user,
1036
+ options.effectiveTrustTier
1037
+ );
1038
+ if (refusal !== void 0) return err(refusal);
1039
+ return ok({
1040
+ evaluated: true,
1041
+ policy: evaluation,
1042
+ effectiveTrustTier: options.effectiveTrustTier,
1043
+ policyMode: config.policyMode,
1044
+ wouldRefuse: blocking.length > 0 && config.policyMode === "audit"
1045
+ });
1046
+ }
1047
+ function evaluateActionPolicy(action, options, config) {
1048
+ if (options.user.trim() === "") {
1049
+ return err({
1050
+ code: "EXTRACTION_FAILED",
1051
+ message: "Author username is required",
1052
+ stage: "extraction"
1053
+ });
1054
+ }
1055
+ if (!config.policyEnforcementStage) {
1056
+ return ok({
1057
+ evaluated: false,
1058
+ reason: "policy-stage-disabled",
1059
+ policyMode: config.policyMode
1060
+ });
1061
+ }
1062
+ return executeActionPolicy(action, options, config);
1063
+ }
1015
1064
 
1016
1065
  // src/security/corroboration-validator.ts
1017
1066
  function hasCIPass(sources) {
@@ -1244,10 +1293,31 @@ var HostileInputFirewall = class {
1244
1293
  reputationGate,
1245
1294
  atl,
1246
1295
  policy,
1247
- start
1296
+ start,
1297
+ user: meta.username,
1298
+ context
1248
1299
  })
1249
1300
  );
1250
1301
  }
1302
+ /**
1303
+ * Action-shaped re-entry that evaluates policy for one action against an
1304
+ * already-enforced trust tier (#6310).
1305
+ *
1306
+ * Unlike {@link process}, this does NOT re-run input extraction, sanitization,
1307
+ * trust classification, or reputation gating, and does NOT re-emit the
1308
+ * input-level audit events (`sanitization`, `reputation`, `trust_classification`).
1309
+ * It evaluates the policy stage against the provided tier and context,
1310
+ * recording only the `policy_gate` event to the audit trail.
1311
+ */
1312
+ evaluateAction(action, options) {
1313
+ return evaluateActionPolicy(action, options, {
1314
+ defaultContext: this.context,
1315
+ policyMode: this.policyMode,
1316
+ policyEnforcementStage: this.stages.policyEnforcement,
1317
+ auditTrail: this.auditTrail,
1318
+ auditStage: this.stages.audit
1319
+ });
1320
+ }
1251
1321
  /**
1252
1322
  * Runs the policy checks the call's facts allow — see
1253
1323
  * {@link evaluateFirewallPolicy} (#5380; Rule-of-Two-only since #3198). The
@@ -1299,7 +1369,13 @@ var HostileInputFirewall = class {
1299
1369
  wouldRefuse: blocking && this.policyMode === "audit",
1300
1370
  auditEvents: this.auditTrail.query().map((e) => ({ id: e.id, type: e.type })),
1301
1371
  auditSink: this.auditSink,
1302
- durationMs: Date.now() - parts.start
1372
+ durationMs: Date.now() - parts.start,
1373
+ evaluateAction: (action, evalOptions) => this.evaluateAction(action, {
1374
+ user: parts.user,
1375
+ effectiveTrustTier: parts.effectiveTrustTier,
1376
+ context: evalOptions?.context ?? parts.context,
1377
+ existingLabels: evalOptions?.existingLabels
1378
+ })
1303
1379
  };
1304
1380
  }
1305
1381
  /**
@@ -1581,7 +1657,60 @@ function runUntrustedInputFirewall(input, options) {
1581
1657
  if (!result.ok) return err(asError(result.error));
1582
1658
  return ok(result.value);
1583
1659
  }
1584
- function evaluateActionThroughFirewall(input, options) {
1660
+ function isActionHandleInput(input) {
1661
+ return "evaluateAction" in input && typeof input.evaluateAction === "function";
1662
+ }
1663
+ function logAuditRefusal(actionType, result) {
1664
+ const { policy, effectiveTrustTier } = result;
1665
+ logger4.warn("Untrusted-input firewall would refuse under enforce (audit mode)", {
1666
+ actionType,
1667
+ trustTier: effectiveTrustTier,
1668
+ scope: policy.scope,
1669
+ rules: policy.violations.filter((v) => v.severity === "block").map((v) => v.rule),
1670
+ unmeasured: policy.unmeasured
1671
+ });
1672
+ }
1673
+ function evaluateActionViaHandle(input, options) {
1674
+ const actionResult = input.evaluateAction(options.action, {
1675
+ context: options.context,
1676
+ existingLabels: options.existingLabels
1677
+ });
1678
+ if (!actionResult.ok) {
1679
+ const { code, stage, violations } = actionResult.error;
1680
+ if (code !== "POLICY_REFUSED" || stage !== "policy") return err(asError(actionResult.error));
1681
+ if (violations === void 0 || violations.length === 0)
1682
+ return err(asError(actionResult.error));
1683
+ return ok({ refused: true, allowed: false, violations, policyMode: "enforce" });
1684
+ }
1685
+ if (!actionResult.value.evaluated) {
1686
+ return err(
1687
+ new Error(
1688
+ `Untrusted-input firewall did not evaluate policy for action ${options.action.type} (the policy stage is disabled)`
1689
+ )
1690
+ );
1691
+ }
1692
+ const { policy, policyMode, wouldRefuse, effectiveTrustTier } = actionResult.value;
1693
+ if (effectiveTrustTier !== options.enforcedTier) {
1694
+ return err(
1695
+ new Error(
1696
+ `Untrusted-input firewall enforced tier ${effectiveTrustTier} for action ${options.action.type} but tier ${options.enforcedTier} for the classification`
1697
+ )
1698
+ );
1699
+ }
1700
+ if (wouldRefuse) {
1701
+ logAuditRefusal(options.action.type, actionResult.value);
1702
+ }
1703
+ return ok({
1704
+ refused: false,
1705
+ allowed: policy.allowed,
1706
+ requiresApproval: policy.requiresApproval,
1707
+ violations: policy.violations,
1708
+ effectiveTrustTier,
1709
+ policyMode,
1710
+ wouldRefuse
1711
+ });
1712
+ }
1713
+ function evaluateActionViaProcess(input, options) {
1585
1714
  const { enforcedTier, ...processOptions } = options;
1586
1715
  const result = processAndLog(input, processOptions);
1587
1716
  if (!result.ok) {
@@ -1616,6 +1745,12 @@ function evaluateActionThroughFirewall(input, options) {
1616
1745
  wouldRefuse
1617
1746
  });
1618
1747
  }
1748
+ function evaluateActionThroughFirewall(input, options) {
1749
+ if (isActionHandleInput(input)) {
1750
+ return evaluateActionViaHandle(input, options);
1751
+ }
1752
+ return evaluateActionViaProcess(input, options);
1753
+ }
1619
1754
  function validateActionCorroboration(action) {
1620
1755
  const result = getUntrustedInputFirewall().validateAction(action);
1621
1756
  if (!result.ok) {
@@ -2207,7 +2342,7 @@ var IssueTriage = class {
2207
2342
  const actions = this.generateActions(safeTitle, safeBody, issueResult, enforced);
2208
2343
  const withEscalation = applySafetyActions(actions, gateDecision, reputation, issueResult);
2209
2344
  const validatedActions = validateActionsThroughFirewall(
2210
- firewallInputFor("issue", issueResult),
2345
+ firewall.value,
2211
2346
  { ...this.firewallOptions(reputation), enforcedTier: gateDecision.enforcedTier },
2212
2347
  withEscalation,
2213
2348
  existingLabels
@@ -2515,4 +2650,4 @@ export {
2515
2650
  IssueTriage,
2516
2651
  createIssueTriage
2517
2652
  };
2518
- //# sourceMappingURL=chunk-3EFOVHKF.js.map
2653
+ //# sourceMappingURL=chunk-AKM6ILIM.js.map