nexus-agents 4.14.2 → 4.14.4

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 (121) hide show
  1. package/dist/{child-mcp-config-FNVCS5MQ.js → child-mcp-config-PUH4BWWV.js} +2 -2
  2. package/dist/{chunk-WCRXZJRW.js → chunk-34MDEYMO.js} +35 -35
  3. package/dist/{chunk-VE3PAJ5M.js → chunk-3GMSD7QD.js} +2 -2
  4. package/dist/{chunk-FFMDYBGA.js → chunk-3MQPNK7A.js} +2 -2
  5. package/dist/{chunk-EEJFMRHJ.js → chunk-3QK3NL2A.js} +2 -2
  6. package/dist/{chunk-GT5B35X3.js → chunk-4EMTJ747.js} +2 -2
  7. package/dist/{chunk-H7LRUN27.js → chunk-4KL5VYS5.js} +4 -4
  8. package/dist/{chunk-VLDYF7EQ.js → chunk-4SBTLUBH.js} +2 -2
  9. package/dist/{chunk-6JEPV4XW.js → chunk-7PW4O3ES.js} +2 -2
  10. package/dist/{chunk-CHRJKE7S.js → chunk-B6MD66KN.js} +2 -2
  11. package/dist/{chunk-JD4HTIMG.js → chunk-CW2NCLQE.js} +7 -7
  12. package/dist/{chunk-JPA3GAWT.js → chunk-DRBDJI52.js} +2 -2
  13. package/dist/{chunk-GEOALLHA.js → chunk-DUARRP4H.js} +3 -3
  14. package/dist/{chunk-GFCCNGI7.js → chunk-E3G7VHE4.js} +8 -8
  15. package/dist/{chunk-LLVEIPOZ.js → chunk-EGUVF5UR.js} +7 -7
  16. package/dist/chunk-EGUVF5UR.js.map +1 -0
  17. package/dist/{chunk-BLJY4YKP.js → chunk-HS76VMIM.js} +3 -3
  18. package/dist/{chunk-ED47MBY5.js → chunk-IBOAFI5I.js} +4 -4
  19. package/dist/{chunk-E536V52C.js → chunk-IGCNQFTF.js} +2 -2
  20. package/dist/{chunk-SQUEE5ZA.js → chunk-JZLCKWFX.js} +3 -3
  21. package/dist/{chunk-T5WQAYX2.js → chunk-KMCSSHM2.js} +2 -2
  22. package/dist/{chunk-UZRVS7MK.js → chunk-KYOUTMHF.js} +5 -5
  23. package/dist/{chunk-2RSNO5SP.js → chunk-LLOA4BJC.js} +3 -3
  24. package/dist/{chunk-NX5VK5NW.js → chunk-OOMSRNWC.js} +45 -12
  25. package/dist/chunk-OOMSRNWC.js.map +1 -0
  26. package/dist/{chunk-CPRPZPX7.js → chunk-OW7EDMRI.js} +2 -2
  27. package/dist/{chunk-MU7J7D5Q.js → chunk-P2ZLNRAY.js} +2 -2
  28. package/dist/{chunk-VFGP57F5.js → chunk-P4GNAWFP.js} +2 -2
  29. package/dist/{chunk-LWR2K2VM.js → chunk-PDJYEEDT.js} +2 -2
  30. package/dist/{chunk-XT4J7QAO.js → chunk-PFGDOY3E.js} +8 -8
  31. package/dist/{chunk-WMSWVHFZ.js → chunk-PZXOE4T4.js} +7 -7
  32. package/dist/{chunk-HJK5RZBX.js → chunk-VRR2P2RZ.js} +6 -6
  33. package/dist/{chunk-NOROX25U.js → chunk-WDEYLEYM.js} +4 -4
  34. package/dist/{chunk-L6QLJ4VK.js → chunk-WGTTKU7Q.js} +2 -2
  35. package/dist/{chunk-WHOODKBB.js → chunk-Y2M7ZFJV.js} +3 -3
  36. package/dist/{cli-circuit-breaker-A7GM4LXS.js → cli-circuit-breaker-H2SNPFLT.js} +3 -3
  37. package/dist/cli.js +40 -40
  38. package/dist/{composite-router-SVZA4OCQ.js → composite-router-MAPZI6UI.js} +2 -2
  39. package/dist/{consensus-vote-7HGSTZKF.js → consensus-vote-OVTUGDCR.js} +16 -16
  40. package/dist/{context-retriever-QTASR42L.js → context-retriever-4REWEFLR.js} +8 -8
  41. package/dist/{doctor-deep-NBDOSO4E.js → doctor-deep-NQ65BXFO.js} +3 -3
  42. package/dist/{doctor-live-HZWIMIT6.js → doctor-live-4W33VSGH.js} +9 -9
  43. package/dist/{expert-bridge-GY7RL4DF.js → expert-bridge-66WOTNQH.js} +4 -4
  44. package/dist/{factory-4FZ5FPZW.js → factory-4TMS4XW6.js} +5 -5
  45. package/dist/{factory-73NHOTVL.js → factory-SIKYCUNR.js} +9 -9
  46. package/dist/{improvement-review-ZF3VHZEG.js → improvement-review-VRTOAOE7.js} +5 -5
  47. package/dist/index.js +30 -30
  48. package/dist/{init-opencode-EOCW7P4L.js → init-opencode-HCXILEU5.js} +6 -6
  49. package/dist/issue-triage-VQESU3EZ.js +17 -0
  50. package/dist/{pr-reviewer-helpers-KOE3X72Y.js → pr-reviewer-helpers-VVE3VB7N.js} +4 -4
  51. package/dist/{registry-command-7ZENMDK4.js → registry-command-ALJSLMJM.js} +2 -2
  52. package/dist/{repo-security-plan-PCHVMGHX.js → repo-security-plan-S55LYI32.js} +3 -3
  53. package/dist/{research-helpers-synthesize-KTVQVLII.js → research-helpers-synthesize-IFLQQR66.js} +4 -4
  54. package/dist/{routing-memory-QTBLYGMC.js → routing-memory-AZJGKBKY.js} +2 -2
  55. package/dist/{session-memory-S7L4K5R5.js → session-memory-CTP4KZ7Z.js} +3 -3
  56. package/dist/{setup-config-7SWEJXN4.js → setup-config-VJ3VMHSH.js} +3 -3
  57. package/dist/{setup-custom-api-WYXYQMQF.js → setup-custom-api-AANCSCUJ.js} +4 -4
  58. package/dist/setup-data-dir-JLGQJWCZ.js +28 -0
  59. package/dist/{tool-memory-PSQQ4NYD.js → tool-memory-EOBZXBNG.js} +5 -5
  60. package/dist/{unified-registry-UEDZXMH3.js → unified-registry-GV3556TC.js} +10 -10
  61. package/dist/{weather-report-CKEPMK5R.js → weather-report-27ILYGAK.js} +2 -2
  62. package/package.json +1 -1
  63. package/dist/chunk-LLVEIPOZ.js.map +0 -1
  64. package/dist/chunk-NX5VK5NW.js.map +0 -1
  65. package/dist/issue-triage-L6UDFHF4.js +0 -17
  66. package/dist/setup-data-dir-EMXRXEFQ.js +0 -28
  67. /package/dist/{child-mcp-config-FNVCS5MQ.js.map → child-mcp-config-PUH4BWWV.js.map} +0 -0
  68. /package/dist/{chunk-WCRXZJRW.js.map → chunk-34MDEYMO.js.map} +0 -0
  69. /package/dist/{chunk-VE3PAJ5M.js.map → chunk-3GMSD7QD.js.map} +0 -0
  70. /package/dist/{chunk-FFMDYBGA.js.map → chunk-3MQPNK7A.js.map} +0 -0
  71. /package/dist/{chunk-EEJFMRHJ.js.map → chunk-3QK3NL2A.js.map} +0 -0
  72. /package/dist/{chunk-GT5B35X3.js.map → chunk-4EMTJ747.js.map} +0 -0
  73. /package/dist/{chunk-H7LRUN27.js.map → chunk-4KL5VYS5.js.map} +0 -0
  74. /package/dist/{chunk-VLDYF7EQ.js.map → chunk-4SBTLUBH.js.map} +0 -0
  75. /package/dist/{chunk-6JEPV4XW.js.map → chunk-7PW4O3ES.js.map} +0 -0
  76. /package/dist/{chunk-CHRJKE7S.js.map → chunk-B6MD66KN.js.map} +0 -0
  77. /package/dist/{chunk-JD4HTIMG.js.map → chunk-CW2NCLQE.js.map} +0 -0
  78. /package/dist/{chunk-JPA3GAWT.js.map → chunk-DRBDJI52.js.map} +0 -0
  79. /package/dist/{chunk-GEOALLHA.js.map → chunk-DUARRP4H.js.map} +0 -0
  80. /package/dist/{chunk-GFCCNGI7.js.map → chunk-E3G7VHE4.js.map} +0 -0
  81. /package/dist/{chunk-BLJY4YKP.js.map → chunk-HS76VMIM.js.map} +0 -0
  82. /package/dist/{chunk-ED47MBY5.js.map → chunk-IBOAFI5I.js.map} +0 -0
  83. /package/dist/{chunk-E536V52C.js.map → chunk-IGCNQFTF.js.map} +0 -0
  84. /package/dist/{chunk-SQUEE5ZA.js.map → chunk-JZLCKWFX.js.map} +0 -0
  85. /package/dist/{chunk-T5WQAYX2.js.map → chunk-KMCSSHM2.js.map} +0 -0
  86. /package/dist/{chunk-UZRVS7MK.js.map → chunk-KYOUTMHF.js.map} +0 -0
  87. /package/dist/{chunk-2RSNO5SP.js.map → chunk-LLOA4BJC.js.map} +0 -0
  88. /package/dist/{chunk-CPRPZPX7.js.map → chunk-OW7EDMRI.js.map} +0 -0
  89. /package/dist/{chunk-MU7J7D5Q.js.map → chunk-P2ZLNRAY.js.map} +0 -0
  90. /package/dist/{chunk-VFGP57F5.js.map → chunk-P4GNAWFP.js.map} +0 -0
  91. /package/dist/{chunk-LWR2K2VM.js.map → chunk-PDJYEEDT.js.map} +0 -0
  92. /package/dist/{chunk-XT4J7QAO.js.map → chunk-PFGDOY3E.js.map} +0 -0
  93. /package/dist/{chunk-WMSWVHFZ.js.map → chunk-PZXOE4T4.js.map} +0 -0
  94. /package/dist/{chunk-HJK5RZBX.js.map → chunk-VRR2P2RZ.js.map} +0 -0
  95. /package/dist/{chunk-NOROX25U.js.map → chunk-WDEYLEYM.js.map} +0 -0
  96. /package/dist/{chunk-L6QLJ4VK.js.map → chunk-WGTTKU7Q.js.map} +0 -0
  97. /package/dist/{chunk-WHOODKBB.js.map → chunk-Y2M7ZFJV.js.map} +0 -0
  98. /package/dist/{cli-circuit-breaker-A7GM4LXS.js.map → cli-circuit-breaker-H2SNPFLT.js.map} +0 -0
  99. /package/dist/{composite-router-SVZA4OCQ.js.map → composite-router-MAPZI6UI.js.map} +0 -0
  100. /package/dist/{consensus-vote-7HGSTZKF.js.map → consensus-vote-OVTUGDCR.js.map} +0 -0
  101. /package/dist/{context-retriever-QTASR42L.js.map → context-retriever-4REWEFLR.js.map} +0 -0
  102. /package/dist/{doctor-deep-NBDOSO4E.js.map → doctor-deep-NQ65BXFO.js.map} +0 -0
  103. /package/dist/{doctor-live-HZWIMIT6.js.map → doctor-live-4W33VSGH.js.map} +0 -0
  104. /package/dist/{expert-bridge-GY7RL4DF.js.map → expert-bridge-66WOTNQH.js.map} +0 -0
  105. /package/dist/{factory-4FZ5FPZW.js.map → factory-4TMS4XW6.js.map} +0 -0
  106. /package/dist/{factory-73NHOTVL.js.map → factory-SIKYCUNR.js.map} +0 -0
  107. /package/dist/{improvement-review-ZF3VHZEG.js.map → improvement-review-VRTOAOE7.js.map} +0 -0
  108. /package/dist/{init-opencode-EOCW7P4L.js.map → init-opencode-HCXILEU5.js.map} +0 -0
  109. /package/dist/{issue-triage-L6UDFHF4.js.map → issue-triage-VQESU3EZ.js.map} +0 -0
  110. /package/dist/{pr-reviewer-helpers-KOE3X72Y.js.map → pr-reviewer-helpers-VVE3VB7N.js.map} +0 -0
  111. /package/dist/{registry-command-7ZENMDK4.js.map → registry-command-ALJSLMJM.js.map} +0 -0
  112. /package/dist/{repo-security-plan-PCHVMGHX.js.map → repo-security-plan-S55LYI32.js.map} +0 -0
  113. /package/dist/{research-helpers-synthesize-KTVQVLII.js.map → research-helpers-synthesize-IFLQQR66.js.map} +0 -0
  114. /package/dist/{routing-memory-QTBLYGMC.js.map → routing-memory-AZJGKBKY.js.map} +0 -0
  115. /package/dist/{session-memory-S7L4K5R5.js.map → session-memory-CTP4KZ7Z.js.map} +0 -0
  116. /package/dist/{setup-config-7SWEJXN4.js.map → setup-config-VJ3VMHSH.js.map} +0 -0
  117. /package/dist/{setup-custom-api-WYXYQMQF.js.map → setup-custom-api-AANCSCUJ.js.map} +0 -0
  118. /package/dist/{setup-data-dir-EMXRXEFQ.js.map → setup-data-dir-JLGQJWCZ.js.map} +0 -0
  119. /package/dist/{tool-memory-PSQQ4NYD.js.map → tool-memory-EOBZXBNG.js.map} +0 -0
  120. /package/dist/{unified-registry-UEDZXMH3.js.map → unified-registry-GV3556TC.js.map} +0 -0
  121. /package/dist/{weather-report-CKEPMK5R.js.map → weather-report-27ILYGAK.js.map} +0 -0
@@ -12,11 +12,11 @@ import {
12
12
  gateWithReputation,
13
13
  resolveReputationGatingMode,
14
14
  sanitizeInput
15
- } from "./chunk-MU7J7D5Q.js";
15
+ } from "./chunk-P2ZLNRAY.js";
16
16
  import {
17
17
  createLogger,
18
18
  getTimeProvider
19
- } from "./chunk-2RSNO5SP.js";
19
+ } from "./chunk-LLOA4BJC.js";
20
20
 
21
21
  // src/dogfooding/pr-reviewer-helpers.ts
22
22
  import { randomUUID } from "crypto";
@@ -291,4 +291,4 @@ export {
291
291
  formatReviewComment,
292
292
  createFailedReview
293
293
  };
294
- //# sourceMappingURL=chunk-BLJY4YKP.js.map
294
+ //# sourceMappingURL=chunk-HS76VMIM.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createAutoAdapter
3
- } from "./chunk-GFCCNGI7.js";
3
+ } from "./chunk-E3G7VHE4.js";
4
4
  import {
5
5
  getDefaultCliCircuitBreakerRegistry,
6
6
  mapModelErrorToCategory
7
- } from "./chunk-E536V52C.js";
7
+ } from "./chunk-IGCNQFTF.js";
8
8
  import {
9
9
  CLI_NAMES,
10
10
  CircularBuffer,
@@ -22,7 +22,7 @@ import {
22
22
  ok,
23
23
  recordRateLimitEvent,
24
24
  toRateLimitError
25
- } from "./chunk-2RSNO5SP.js";
25
+ } from "./chunk-LLOA4BJC.js";
26
26
 
27
27
  // src/agents/collaboration/event-bus-helpers.ts
28
28
  import { randomUUID } from "crypto";
@@ -863,4 +863,4 @@ export {
863
863
  getGlobalRegistry,
864
864
  resetGlobalRegistry
865
865
  };
866
- //# sourceMappingURL=chunk-ED47MBY5.js.map
866
+ //# sourceMappingURL=chunk-IBOAFI5I.js.map
@@ -8,7 +8,7 @@ import {
8
8
  getTimeProvider,
9
9
  isRateLimitText,
10
10
  ok
11
- } from "./chunk-2RSNO5SP.js";
11
+ } from "./chunk-LLOA4BJC.js";
12
12
 
13
13
  // src/cli-adapters/circuit-breaker-types.ts
14
14
  var CircuitErrorCode = {
@@ -540,4 +540,4 @@ export {
540
540
  CliCircuitBreakerIntegration,
541
541
  createCliCircuitBreakerIntegration
542
542
  };
543
- //# sourceMappingURL=chunk-E536V52C.js.map
543
+ //# sourceMappingURL=chunk-IGCNQFTF.js.map
@@ -7,7 +7,7 @@ import {
7
7
  toolStructuredError,
8
8
  toolSuccessStructured,
9
9
  wrapToolWithTimeout
10
- } from "./chunk-GEOALLHA.js";
10
+ } from "./chunk-DUARRP4H.js";
11
11
  import {
12
12
  JsonlStore,
13
13
  SECURITY_KEYWORDS,
@@ -19,7 +19,7 @@ import {
19
19
  getPipelineEventBus,
20
20
  getTimeProvider,
21
21
  isDeclaredNeverDeprecate
22
- } from "./chunk-2RSNO5SP.js";
22
+ } from "./chunk-LLOA4BJC.js";
23
23
  import {
24
24
  getNexusDataDir,
25
25
  nexusDataPath
@@ -2132,4 +2132,4 @@ export {
2132
2132
  runImprovementReview,
2133
2133
  registerImprovementReviewTool
2134
2134
  };
2135
- //# sourceMappingURL=chunk-SQUEE5ZA.js.map
2135
+ //# sourceMappingURL=chunk-JZLCKWFX.js.map
@@ -3,7 +3,7 @@ import {
3
3
  MODEL_IDS,
4
4
  getTimeProvider,
5
5
  resolveModelIdentitySync
6
- } from "./chunk-2RSNO5SP.js";
6
+ } from "./chunk-LLOA4BJC.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-T5WQAYX2.js.map
153
+ //# sourceMappingURL=chunk-KMCSSHM2.js.map
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  computeCostDetail,
3
3
  recordUsageEvent
4
- } from "./chunk-FFMDYBGA.js";
4
+ } from "./chunk-3MQPNK7A.js";
5
5
  import {
6
6
  BaseAdapter,
7
7
  createStream,
8
8
  planOptionalParams,
9
9
  requireApiKey,
10
10
  validateApiKeyPresence
11
- } from "./chunk-JPA3GAWT.js";
11
+ } from "./chunk-DRBDJI52.js";
12
12
  import {
13
13
  assertCustomApiHostResolvesPublic
14
- } from "./chunk-NX5VK5NW.js";
14
+ } from "./chunk-OOMSRNWC.js";
15
15
  import {
16
16
  ConfigError,
17
17
  ModelCapability,
@@ -22,7 +22,7 @@ import {
22
22
  getTimeProvider,
23
23
  getTokenEstimator,
24
24
  ok
25
- } from "./chunk-2RSNO5SP.js";
25
+ } from "./chunk-LLOA4BJC.js";
26
26
 
27
27
  // src/adapters/openai-types.ts
28
28
  var OPENAI_MODELS = {
@@ -833,4 +833,4 @@ export {
833
833
  discoverModels,
834
834
  buildOpenAICompatAdapters
835
835
  };
836
- //# sourceMappingURL=chunk-UZRVS7MK.js.map
836
+ //# sourceMappingURL=chunk-KYOUTMHF.js.map
@@ -2623,7 +2623,7 @@ function setDefaultRegistry(registry) {
2623
2623
  }
2624
2624
  async function reloadDefaultRegistry() {
2625
2625
  globalRegistry = buildDefaultRegistry();
2626
- const { resetGlobalRegistry } = await import("./unified-registry-UEDZXMH3.js");
2626
+ const { resetGlobalRegistry } = await import("./unified-registry-GV3556TC.js");
2627
2627
  resetGlobalRegistry();
2628
2628
  return globalRegistry;
2629
2629
  }
@@ -15079,7 +15079,7 @@ var CompositeRouter = class _CompositeRouter {
15079
15079
  */
15080
15080
  async consultUnifiedContext(task) {
15081
15081
  try {
15082
- const { getContextForTask, inferTaskCategory } = await import("./context-retriever-QTASR42L.js");
15082
+ const { getContextForTask, inferTaskCategory } = await import("./context-retriever-4REWEFLR.js");
15083
15083
  const ctx = await getContextForTask({
15084
15084
  task: task.content,
15085
15085
  category: inferTaskCategory(task.content),
@@ -16670,4 +16670,4 @@ export {
16670
16670
  AgentCapability,
16671
16671
  OrchestratorError
16672
16672
  };
16673
- //# sourceMappingURL=chunk-2RSNO5SP.js.map
16673
+ //# sourceMappingURL=chunk-LLOA4BJC.js.map
@@ -3,7 +3,7 @@ import {
3
3
  createLogger,
4
4
  err,
5
5
  ok
6
- } from "./chunk-2RSNO5SP.js";
6
+ } from "./chunk-LLOA4BJC.js";
7
7
 
8
8
  // src/adapters/sdk/types.ts
9
9
  var PROVIDER_ENV_KEYS = {
@@ -147,14 +147,35 @@ var IPV4_RULES = [
147
147
  reason: "link_local",
148
148
  label: "IPv4 link-local (169.254/16 \u2014 AWS IMDS)"
149
149
  },
150
- { match: (a) => a === 0, reason: "reserved", label: "IPv4 reserved (0/8)" }
150
+ { match: (a) => a === 0, reason: "reserved", label: "IPv4 reserved (0/8)" },
151
+ {
152
+ match: (a, b) => a === 100 && b >= 64 && b <= 127,
153
+ reason: "private_range",
154
+ label: "IPv4 shared address space (100.64/10 \u2014 CGNAT, Alibaba metadata)"
155
+ },
156
+ {
157
+ match: (a, b, c) => a === 192 && b === 0 && c === 0,
158
+ reason: "reserved",
159
+ label: "IPv4 IETF protocol assignments (192.0.0/24 \u2014 legacy Oracle metadata)"
160
+ },
161
+ {
162
+ match: (a, b) => a === 198 && (b === 18 || b === 19),
163
+ reason: "reserved",
164
+ label: "IPv4 benchmarking (198.18/15)"
165
+ },
166
+ { match: (a) => a >= 224 && a <= 239, reason: "reserved", label: "IPv4 multicast (224/4)" },
167
+ {
168
+ match: (a) => a >= 240,
169
+ reason: "reserved",
170
+ label: "IPv4 reserved (240/4, includes 255.255.255.255 broadcast)"
171
+ }
151
172
  ];
152
173
  function classifyIPv4(ip) {
153
174
  const parts = ip.split(".").map((p) => Number.parseInt(p, 10));
154
175
  if (parts.length !== 4 || parts.some((n) => Number.isNaN(n))) return null;
155
- const [a, b] = parts;
176
+ const [a, b, c] = parts;
156
177
  for (const rule of IPV4_RULES) {
157
- if (rule.match(a, b)) {
178
+ if (rule.match(a, b, c)) {
158
179
  return { reason: rule.reason, message: `${rule.label} (${ip})` };
159
180
  }
160
181
  }
@@ -182,6 +203,7 @@ function toHextets(ip) {
182
203
  return out.some((n) => Number.isNaN(n) || n < 0 || n > 65535) ? null : out;
183
204
  }
184
205
  function embeddedIPv4(g) {
206
+ if (g[0] === 8194) return hextetPairToDotted(g[1] ?? 0, g[2] ?? 0);
185
207
  const top = g.slice(0, 6);
186
208
  const prefixes = [
187
209
  [0, 0, 0, 0, 0, 65535],
@@ -198,19 +220,30 @@ function embeddedIPv4(g) {
198
220
  const g6 = g[6] ?? 0;
199
221
  const g7 = g[7] ?? 0;
200
222
  if (top.every((v) => v === 0) && g6 === 0 && g7 <= 1) return null;
201
- const octets = [g6 >> 8 & 255, g6 & 255, g7 >> 8 & 255, g7 & 255];
202
- return octets.join(".");
223
+ return hextetPairToDotted(g6, g7);
224
+ }
225
+ function hextetPairToDotted(hi, lo) {
226
+ return [hi >> 8 & 255, hi & 255, lo >> 8 & 255, lo & 255].join(".");
227
+ }
228
+ function classifyIPv6Prefix(first, ip) {
229
+ if (first >= 64512 && first <= 65023) {
230
+ return { reason: "private_range", message: `IPv6 unique-local (${ip}, fc00::/7)` };
231
+ }
232
+ if (first >= 65152 && first <= 65215) {
233
+ return { reason: "link_local", message: `IPv6 link-local (${ip}, fe80::/10)` };
234
+ }
235
+ if (first >= 65216 && first <= 65279) {
236
+ return { reason: "private_range", message: `IPv6 site-local (${ip}, fec0::/10)` };
237
+ }
238
+ return null;
203
239
  }
204
240
  function classifyIPv6(ip) {
205
241
  const lower = ip.toLowerCase();
206
242
  if (lower === "::1") return { reason: "loopback", message: `IPv6 loopback (${ip})` };
207
- if (lower.startsWith("fe80:"))
208
- return { reason: "link_local", message: `IPv6 link-local (${ip})` };
209
- if (/^fc|^fd/.test(lower)) {
210
- return { reason: "private_range", message: `IPv6 unique-local (${ip}, fc00::/7)` };
211
- }
212
243
  const groups = toHextets(lower);
213
244
  if (groups === null) return null;
245
+ const prefixDetail = classifyIPv6Prefix(groups[0] ?? 0, ip);
246
+ if (prefixDetail !== null) return prefixDetail;
214
247
  if (groups.every((n) => n === 0)) {
215
248
  return { reason: "reserved", message: `IPv6 unspecified (${ip}) \u2014 routes to localhost` };
216
249
  }
@@ -227,4 +260,4 @@ export {
227
260
  validateCustomApiBaseUrl,
228
261
  assertCustomApiHostResolvesPublic
229
262
  };
230
- //# sourceMappingURL=chunk-NX5VK5NW.js.map
263
+ //# sourceMappingURL=chunk-OOMSRNWC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/sdk/types.ts","../src/adapters/sdk/custom-api-validation.ts"],"sourcesContent":["/**\n * nexus-agents/adapters/sdk - Shared Types\n *\n * Type definitions for AI SDK adapter layer.\n *\n * @module adapters/sdk/types\n * (Source: Issue #1123 — AI SDK provider layer)\n */\n\n/**\n * Supported AI SDK provider identifiers.\n *\n * `custom-openai` is for OpenAI-compatible gateways (multi-vendor proxies,\n * self-hosted LLM servers, corporate model gateways) — uses the same\n * @ai-sdk/openai package but with a configurable `baseURL`.\n */\nexport type SdkProviderId = 'anthropic' | 'openai' | 'google' | 'custom-openai';\n\n/**\n * Configuration for creating an AI SDK adapter.\n */\nexport interface SdkAdapterConfig {\n /** Provider identifier */\n providerId: SdkProviderId;\n /** Model to use (e.g., 'claude-sonnet-4-6', 'gpt-4o') */\n modelId: string;\n /** API key (falls back to environment variable) */\n apiKey?: string;\n /**\n * Base URL for OpenAI-compatible gateways. Required when\n * `providerId === 'custom-openai'`, ignored otherwise. Falls back to\n * the `NEXUS_CUSTOM_API_BASE_URL` environment variable.\n */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Maximum retries on transient failures */\n maxRetries?: number;\n}\n\n/**\n * Maps provider IDs to their environment variable names.\n */\nexport const PROVIDER_ENV_KEYS: Record<SdkProviderId, string> = {\n anthropic: 'ANTHROPIC_API_KEY',\n openai: 'OPENAI_API_KEY',\n google: 'GOOGLE_AI_API_KEY',\n 'custom-openai': 'NEXUS_CUSTOM_API_KEY',\n};\n\n/**\n * Environment variable name for the custom gateway base URL.\n * Keep in sync with `SdkAdapterConfig.baseUrl`.\n */\nexport const CUSTOM_API_BASE_URL_ENV = 'NEXUS_CUSTOM_API_BASE_URL';\n\n/**\n * Escape hatch: set to `1`/`true` to allow the custom gateway base URL to\n * resolve to a loopback or RFC 1918 private address. Default is DENY —\n * SSRF defense. Only disable this when you know the gateway runs on a\n * trusted internal host and you accept the risk.\n */\nexport const CUSTOM_API_ALLOW_PRIVATE_ENV = 'NEXUS_CUSTOM_API_ALLOW_PRIVATE';\n","/**\n * Validation for the `custom-openai` SDK adapter's gateway URL.\n *\n * The base URL is user-provided, so without validation the adapter becomes\n * an SSRF vector: a malicious prompt that reshaped env vars, or a typo in\n * the config, could point nexus-agents at `http://169.254.169.254/` (AWS\n * metadata) or `http://localhost:5432/` (internal services). This module\n * rejects such URLs unless the user explicitly opts in via\n * `NEXUS_CUSTOM_API_ALLOW_PRIVATE=1`.\n *\n * Called out in the #2119 consensus vote by the Security Engineer role.\n *\n * @module adapters/sdk/custom-api-validation\n */\n\nimport { isIPv4, isIPv6 } from 'node:net';\nimport { lookup as dnsLookup } from 'node:dns/promises';\nimport { ConfigError, ok, err, createLogger, type Result } from '../../core/index.js';\nimport { CUSTOM_API_ALLOW_PRIVATE_ENV } from './types.js';\n\nconst logger = createLogger({ module: 'custom-api-validation' });\n\n/**\n * Why a given URL was rejected. Machine-readable so error messages can\n * distinguish root causes in downstream tooling.\n */\nexport type BaseUrlRejectionReason =\n | 'empty'\n | 'not_a_url'\n | 'not_http_https'\n | 'loopback'\n | 'link_local'\n | 'private_range'\n | 'reserved';\n\ninterface RejectionDetail {\n readonly reason: BaseUrlRejectionReason;\n readonly message: string;\n}\n\n/**\n * Validates a user-provided custom-gateway base URL. Returns the URL as an\n * `ok` Result if it passes, or a `ConfigError` with a machine-readable\n * reason if it fails.\n *\n * Pass `{ allowPrivate: true }` (or set the env var) to bypass the SSRF\n * checks — use this only when the gateway is on a trusted internal host\n * and you accept the risk.\n */\nexport function validateCustomApiBaseUrl(\n raw: string | undefined,\n opts: { readonly allowPrivate?: boolean } = {}\n): Result<URL, ConfigError> {\n if (raw === undefined || raw.trim() === '') {\n return err(\n new ConfigError(\n 'Custom API base URL is required but missing. Set NEXUS_CUSTOM_API_BASE_URL or pass `baseUrl` in config.'\n )\n );\n }\n\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n return err(new ConfigError(`Custom API base URL is not a valid URL: ${raw}`));\n }\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return err(\n new ConfigError(`Custom API base URL must use http or https, got \"${url.protocol}\" in ${raw}`)\n );\n }\n\n const allowPrivate = opts.allowPrivate === true || resolveAllowPrivateFromEnv();\n if (!allowPrivate) {\n const rejection = classifyPrivateHost(url.hostname);\n if (rejection !== null) {\n return err(\n new ConfigError(\n `Custom API base URL rejected (SSRF guard, reason=\"${rejection.reason}\"): ${rejection.message}. ` +\n `Set ${CUSTOM_API_ALLOW_PRIVATE_ENV}=1 to bypass if the gateway runs on a trusted internal host.`\n )\n );\n }\n }\n\n return ok(url);\n}\n\nfunction resolveAllowPrivateFromEnv(): boolean {\n // Deliberately strict (case-sensitive, not parseBoolEnv): this disables an\n // SSRF guard, so we don't want extra case variants (e.g. `TRUE`) to loosen\n // the control. Fail-closed on anything but exact `1`/`true` (#3297).\n const v = process.env[CUSTOM_API_ALLOW_PRIVATE_ENV];\n return v === '1' || v === 'true';\n}\n\n/**\n * Returns a rejection reason if the hostname resolves (by string form) to\n * a loopback, link-local, or RFC 1918 private address; `null` otherwise.\n *\n * Note: this is a string-level check. It does NOT perform DNS resolution,\n * so a public DNS name that secretly resolves to a private IP will pass.\n * For that level of defense, callers should additionally run\n * {@link assertCustomApiHostResolvesPublic}, which performs a DNS lookup\n * and classifies each resolved address with the same range tables below.\n */\nfunction classifyPrivateHost(hostname: string): RejectionDetail | null {\n const normalized = normalizeHost(hostname);\n\n // Literal IP addresses — classify directly against the range tables.\n const literal = classifyIpAddress(normalized);\n if (literal !== 'not_an_ip') {\n return literal;\n }\n\n // Hostname literals that resolve to loopback without needing DNS\n if (\n normalized === 'localhost' ||\n normalized.endsWith('.localhost') ||\n normalized.endsWith('.local') // mDNS\n ) {\n return {\n reason: 'loopback',\n message: `hostname \"${hostname}\" resolves to loopback/mDNS`,\n };\n }\n\n return null;\n}\n\n/**\n * Strips IPv6 bracket wrapping (URL.hostname yields \"[::1]\") and lowercases,\n * giving the bare form the `node:net` checks expect. Shared by the sync and\n * async guards so the normalization rule lives in one place.\n */\nfunction normalizeHost(hostname: string): string {\n const stripped =\n hostname.startsWith('[') && hostname.endsWith(']') ? hostname.slice(1, -1) : hostname;\n return stripped.toLowerCase();\n}\n\n/**\n * Classifies a single (already normalized, bracket-stripped) address string.\n * Returns:\n * - a {@link RejectionDetail} if it is a private/loopback/link-local/reserved IP,\n * - `null` if it is a public IP literal (safe),\n * - the sentinel `'not_an_ip'` if the string is not an IP literal at all.\n *\n * This is the shared per-address classifier reused by both the sync\n * string-level guard ({@link classifyPrivateHost}) and the async\n * DNS-resolve-time guard ({@link assertCustomApiHostResolvesPublic}), so the\n * IPv4/IPv6 range tables live in exactly one place.\n */\nfunction classifyIpAddress(normalized: string): RejectionDetail | null | 'not_an_ip' {\n if (isIPv4(normalized)) {\n return classifyIPv4(normalized);\n }\n if (isIPv6(normalized)) {\n return classifyIPv6(normalized);\n }\n return 'not_an_ip';\n}\n\n/** Verdict for a host that is already an IP literal — no DNS required. */\nfunction classifyLiteral(hostname: string, normalized: string): Result<void, ConfigError> {\n const literal = classifyIpAddress(normalized);\n if (literal === null || literal === 'not_an_ip') return ok(undefined);\n return err(\n new ConfigError(\n `Custom API host '${hostname}' is a ${literal.reason} address: ${literal.message}`\n )\n );\n}\n\n/**\n * DNS-resolve-time SSRF guard for the custom-openai gateway.\n *\n * The sync {@link validateCustomApiBaseUrl} only inspects the hostname as a\n * string, so a PUBLIC DNS name that resolves to a PRIVATE/loopback/link-local\n * IP (e.g. an attacker-controlled `gateway.evil.test` pointing at\n * `169.254.169.254`) slips past it. This function closes that gap: it resolves\n * the hostname and runs the EXISTING IP classification against every returned\n * address, failing closed if ANY of them is private.\n *\n * Behaviour:\n * - `allowPrivate` (opt or env) → bypass, returns `ok` (matches the sync guard).\n * - hostname is already an IP literal → no DNS needed; the sync guard already\n * classified literals at construction, so return `ok`.\n * - otherwise `dns.lookup(hostname, { all: true })` and classify each address.\n * If ANY resolves private → `err(ConfigError)`.\n * - on a `dns.lookup` THROW (transient/NXDOMAIN/network error) → log debug and\n * return `ok`. Failing closed here is too aggressive: it would break legit\n * gateways on a flaky resolver, and this is additive defense-in-depth layered\n * on top of the sync string guard that already ran at construction. We only\n * REJECT on a SUCCESSFUL resolution to a private address.\n *\n * Residual risk (TOCTOU): this is RESOLVE-time, not socket-connect-time. A name\n * that passes here could rebind to a private IP before the actual connect\n * (DNS rebinding). A full fix needs a custom `fetch` `lookup` hook validating\n * the peer address at the socket layer — out of scope for this LOW\n * defense-in-depth pass (#3426).\n */\nexport async function assertCustomApiHostResolvesPublic(\n hostname: string,\n opts: { readonly allowPrivate?: boolean } = {}\n): Promise<Result<void, ConfigError>> {\n const allowPrivate = opts.allowPrivate === true || resolveAllowPrivateFromEnv();\n if (allowPrivate) {\n return ok(undefined);\n }\n\n const normalized = normalizeHost(hostname);\n\n // A literal needs no DNS, but it is still classified HERE rather than\n // assumed handled elsewhere. This used to return ok for any literal on the\n // grounds that the sync guard had classified it at construction — but\n // `discoverModels` calls only this guard, never the sync one, so on that\n // path each deferred to the other and neither ran. `http://169.254.169.254/`\n // reached IMDS, from a base URL that can come from a file rather than from\n // operator intent.\n if (isIPv4(normalized) || isIPv6(normalized)) {\n return classifyLiteral(hostname, normalized);\n }\n\n // Only `address` is read; the resolver's `family` is intentionally NOT\n // trusted — `classifyIpAddress` re-derives v4/v6 from the address string, so\n // a mislabeled family in the lookup result cannot let a private IP slip past.\n let addresses: ReadonlyArray<{ readonly address: string }>;\n try {\n addresses = await dnsLookup(hostname, { all: true });\n } catch (error) {\n // Fail OPEN: transient/NXDOMAIN/network errors must not break legit\n // gateways. The sync string guard already ran; this is additive only.\n logger.debug('custom-api SSRF resolve check: DNS lookup failed, skipping (fail-open)', {\n hostname,\n error: error instanceof Error ? error.message : String(error),\n });\n return ok(undefined);\n }\n\n const rejection = firstPrivateAddress(addresses);\n if (rejection !== null) {\n return err(\n new ConfigError(\n `Custom API base URL rejected (SSRF resolve guard, reason=\"${rejection.reason}\"): ` +\n `hostname \"${hostname}\" resolved to ${rejection.message}. ` +\n `Set ${CUSTOM_API_ALLOW_PRIVATE_ENV}=1 to bypass if the gateway runs on a trusted internal host.`\n )\n );\n }\n\n return ok(undefined);\n}\n\n/**\n * Returns the {@link RejectionDetail} for the first resolved address that\n * classifies as private/loopback/link-local/reserved, or `null` if every\n * address is public. Fail-closed: any single private hit trips the guard.\n */\nfunction firstPrivateAddress(\n addresses: ReadonlyArray<{ readonly address: string }>\n): RejectionDetail | null {\n for (const { address } of addresses) {\n const rejection = classifyIpAddress(address.toLowerCase());\n if (rejection !== null && rejection !== 'not_an_ip') {\n return rejection;\n }\n }\n return null;\n}\n\n/**\n * IPv4 ranges the SSRF guard rejects, in order of specificity.\n *\n * \"Not RFC1918\" is not the same as \"public\". The blocks below RFC1918 are\n * here because each is reachable from a host and serves something: 100.64/10\n * carries Alibaba Cloud's metadata endpoint, 192.0.0/24 carries a legacy\n * Oracle Cloud one, and multicast/reserved/broadcast reach the local segment\n * rather than the internet (second pass over #4884).\n */\nconst IPV4_RULES: ReadonlyArray<{\n readonly match: (a: number, b: number, c: number) => boolean;\n readonly reason: BaseUrlRejectionReason;\n readonly label: string;\n}> = [\n { match: (a) => a === 127, reason: 'loopback', label: 'IPv4 loopback' },\n { match: (a) => a === 10, reason: 'private_range', label: 'IPv4 private (10/8)' },\n {\n match: (a, b) => a === 172 && b >= 16 && b <= 31,\n reason: 'private_range',\n label: 'IPv4 private (172.16/12)',\n },\n {\n match: (a, b) => a === 192 && b === 168,\n reason: 'private_range',\n label: 'IPv4 private (192.168/16)',\n },\n {\n match: (a, b) => a === 169 && b === 254,\n reason: 'link_local',\n label: 'IPv4 link-local (169.254/16 — AWS IMDS)',\n },\n { match: (a) => a === 0, reason: 'reserved', label: 'IPv4 reserved (0/8)' },\n {\n match: (a, b) => a === 100 && b >= 64 && b <= 127,\n reason: 'private_range',\n label: 'IPv4 shared address space (100.64/10 — CGNAT, Alibaba metadata)',\n },\n {\n match: (a, b, c) => a === 192 && b === 0 && c === 0,\n reason: 'reserved',\n label: 'IPv4 IETF protocol assignments (192.0.0/24 — legacy Oracle metadata)',\n },\n {\n match: (a, b) => a === 198 && (b === 18 || b === 19),\n reason: 'reserved',\n label: 'IPv4 benchmarking (198.18/15)',\n },\n { match: (a) => a >= 224 && a <= 239, reason: 'reserved', label: 'IPv4 multicast (224/4)' },\n {\n match: (a) => a >= 240,\n reason: 'reserved',\n label: 'IPv4 reserved (240/4, includes 255.255.255.255 broadcast)',\n },\n];\n\nfunction classifyIPv4(ip: string): RejectionDetail | null {\n const parts = ip.split('.').map((p) => Number.parseInt(p, 10));\n if (parts.length !== 4 || parts.some((n) => Number.isNaN(n))) return null;\n const [a, b, c] = parts as [number, number, number, number];\n for (const rule of IPV4_RULES) {\n if (rule.match(a, b, c)) {\n return { reason: rule.reason, message: `${rule.label} (${ip})` };\n }\n }\n return null;\n}\n\n/**\n * Expand an IPv6 literal to its eight 16-bit groups, or null if unparseable.\n *\n * A trailing dotted quad (`::ffff:1.2.3.4`) is folded into two groups first,\n * so callers see one representation regardless of spelling.\n */\nfunction foldTrailingQuad(s: string): string | null {\n const dotted = /(?:^|:)((?:\\d{1,3}\\.){3}\\d{1,3})$/.exec(s);\n if (dotted?.[1] === undefined) return s;\n const q = dotted[1].split('.').map((n) => Number.parseInt(n, 10));\n if (q.length !== 4 || q.some((n) => Number.isNaN(n) || n < 0 || n > 255)) return null;\n const hi = (((q[0] ?? 0) << 8) | (q[1] ?? 0)).toString(16);\n const lo = (((q[2] ?? 0) << 8) | (q[3] ?? 0)).toString(16);\n return `${s.slice(0, s.length - dotted[1].length)}${hi}:${lo}`;\n}\n\nfunction toHextets(ip: string): number[] | null {\n const s = foldTrailingQuad(ip.toLowerCase());\n if (s === null) return null;\n const halves = s.split('::');\n if (halves.length > 2) return null;\n const head = halves[0] === '' || halves[0] === undefined ? [] : halves[0].split(':');\n const tail = halves[1] === '' || halves[1] === undefined ? [] : halves[1].split(':');\n const groups =\n halves.length === 1\n ? head\n : [...head, ...Array<string>(8 - head.length - tail.length).fill('0'), ...tail];\n if (groups.length !== 8) return null;\n const out = groups.map((g) => Number.parseInt(g === '' ? '0' : g, 16));\n return out.some((n) => Number.isNaN(n) || n < 0 || n > 0xffff) ? null : out;\n}\n\n/**\n * The IPv4 address embedded in an IPv6 literal, in dotted form, or null.\n *\n * Covers every prefix that carries a routable IPv4 payload: IPv4-mapped\n * (`::ffff:0:0/96`), IPv4-translated (`::ffff:0:0:0/96`), the NAT64\n * well-known prefix (`64:ff9b::/96`), 6to4 (`2002::/16`), and the deprecated\n * IPv4-compatible form (`::a.b.c.d`). Each is the same destination under a\n * different spelling, and the IPv4 rules must apply to all of them.\n */\nfunction embeddedIPv4(g: readonly number[]): string | null {\n // 6to4 is the odd one out: the payload sits in hextets 1-2, not 6-7, so it\n // cannot share the trailing-quad extraction below.\n if (g[0] === 0x2002) return hextetPairToDotted(g[1] ?? 0, g[2] ?? 0);\n const top = g.slice(0, 6);\n const prefixes: ReadonlyArray<readonly number[]> = [\n [0, 0, 0, 0, 0, 0xffff], // ::ffff:0:0/96 — IPv4-mapped\n [0, 0, 0, 0, 0xffff, 0], // ::ffff:0:0:0/96 — IPv4-translated\n [0x64, 0xff9b, 0, 0, 0, 0], // 64:ff9b::/96 — NAT64 well-known\n [0, 0, 0, 0, 0, 0], // ::a.b.c.d — deprecated IPv4-compatible\n ];\n const matched = prefixes.some((p) => p.every((v, i) => top[i] === v));\n if (!matched) return null;\n const g6 = g[6] ?? 0;\n const g7 = g[7] ?? 0;\n // `::` and `::1` are their own addresses, not embedded IPv4.\n if (top.every((v) => v === 0) && g6 === 0 && g7 <= 1) return null;\n return hextetPairToDotted(g6, g7);\n}\n\n/** The dotted IPv4 address carried by two consecutive 16-bit hextets. */\nfunction hextetPairToDotted(hi: number, lo: number): string {\n return [(hi >> 8) & 255, hi & 255, (lo >> 8) & 255, lo & 255].join('.');\n}\n\n/**\n * Classify an IPv6 address by its first hextet, or null if it is not in a\n * non-global prefix.\n *\n * Numeric rather than a string prefix test. The previous `startsWith('fe80:')`\n * covered 1/64th of fe80::/10 — `febf::1` is equally link-local and was\n * allowed — and site-local fec0::/10 had no check at all (second pass over #4884).\n */\nfunction classifyIPv6Prefix(first: number, ip: string): RejectionDetail | null {\n if (first >= 0xfc00 && first <= 0xfdff) {\n return { reason: 'private_range', message: `IPv6 unique-local (${ip}, fc00::/7)` };\n }\n if (first >= 0xfe80 && first <= 0xfebf) {\n return { reason: 'link_local', message: `IPv6 link-local (${ip}, fe80::/10)` };\n }\n if (first >= 0xfec0 && first <= 0xfeff) {\n return { reason: 'private_range', message: `IPv6 site-local (${ip}, fec0::/10)` };\n }\n return null;\n}\n\nfunction classifyIPv6(ip: string): RejectionDetail | null {\n const lower = ip.toLowerCase();\n if (lower === '::1') return { reason: 'loopback', message: `IPv6 loopback (${ip})` };\n\n const groups = toHextets(lower);\n if (groups === null) return null;\n\n const prefixDetail = classifyIPv6Prefix(groups[0] ?? 0, ip);\n if (prefixDetail !== null) return prefixDetail;\n\n if (groups.every((n) => n === 0)) {\n return { reason: 'reserved', message: `IPv6 unspecified (${ip}) — routes to localhost` };\n }\n\n // An IPv4 address written in IPv6 form is still that IPv4 address, and\n // `isIPv6` is true for it so it never reached the IPv4 rules — IMDS,\n // loopback and RFC1918 were all reachable this way. Note the URL parser\n // normalises the dotted spelling to hex, so the hex form is the one that\n // actually arrives.\n const v4 = embeddedIPv4(groups);\n if (v4 === null) return null;\n const detail = classifyIPv4(v4);\n return detail === null\n ? null\n : { reason: detail.reason, message: `${detail.message} via IPv6 (${ip})` };\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getTimeProvider
3
- } from "./chunk-2RSNO5SP.js";
3
+ } from "./chunk-LLOA4BJC.js";
4
4
 
5
5
  // src/security/audit-trail.ts
6
6
  var MAX_EVENTS = 1e4;
@@ -205,4 +205,4 @@ export {
205
205
  createGraphAuditBridge,
206
206
  createAuditTrail
207
207
  };
208
- //# sourceMappingURL=chunk-CPRPZPX7.js.map
208
+ //# sourceMappingURL=chunk-OW7EDMRI.js.map
@@ -2,7 +2,7 @@ import {
2
2
  CACHE_TIMEOUTS,
3
3
  createLogger,
4
4
  getTimeProvider
5
- } from "./chunk-2RSNO5SP.js";
5
+ } from "./chunk-LLOA4BJC.js";
6
6
 
7
7
  // src/security/trust-types.ts
8
8
  import { z } from "zod";
@@ -560,4 +560,4 @@ export {
560
560
  resolveReputationGatingMode,
561
561
  gateWithReputation
562
562
  };
563
- //# sourceMappingURL=chunk-MU7J7D5Q.js.map
563
+ //# sourceMappingURL=chunk-P2ZLNRAY.js.map
@@ -4,7 +4,7 @@ import {
4
4
  getErrorMessage,
5
5
  getTimeProvider,
6
6
  ok
7
- } from "./chunk-2RSNO5SP.js";
7
+ } from "./chunk-LLOA4BJC.js";
8
8
 
9
9
  // src/context/session-memory.ts
10
10
  import * as fs from "fs";
@@ -352,4 +352,4 @@ export {
352
352
  SessionMemory,
353
353
  createSessionMemory
354
354
  };
355
- //# sourceMappingURL=chunk-VFGP57F5.js.map
355
+ //# sourceMappingURL=chunk-P4GNAWFP.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getErrorMessage
3
- } from "./chunk-2RSNO5SP.js";
3
+ } from "./chunk-LLOA4BJC.js";
4
4
 
5
5
  // src/cli/setup-config.ts
6
6
  import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "fs";
@@ -77,4 +77,4 @@ function ensureBackup(outputPath) {
77
77
  export {
78
78
  runConfigInitSync
79
79
  };
80
- //# sourceMappingURL=chunk-LWR2K2VM.js.map
80
+ //# sourceMappingURL=chunk-PDJYEEDT.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  computeCostDetail,
3
3
  priceBasisOf
4
- } from "./chunk-FFMDYBGA.js";
4
+ } from "./chunk-3MQPNK7A.js";
5
5
  import {
6
6
  allOf
7
7
  } from "./chunk-OQB3XC5O.js";
@@ -22,20 +22,20 @@ import {
22
22
  toolSuccess,
23
23
  withProgressHeartbeat,
24
24
  wrapToolWithTimeout
25
- } from "./chunk-GEOALLHA.js";
25
+ } from "./chunk-DUARRP4H.js";
26
26
  import {
27
27
  createEvent,
28
28
  getGlobalRegistry
29
- } from "./chunk-ED47MBY5.js";
29
+ } from "./chunk-IBOAFI5I.js";
30
30
  import {
31
31
  getToolMemory
32
- } from "./chunk-H7LRUN27.js";
32
+ } from "./chunk-4KL5VYS5.js";
33
33
  import {
34
34
  authRemediation,
35
35
  delay,
36
36
  getAvailableClis,
37
37
  withTimeout
38
- } from "./chunk-GFCCNGI7.js";
38
+ } from "./chunk-E3G7VHE4.js";
39
39
  import {
40
40
  AgentError,
41
41
  CLI_NAMES,
@@ -64,7 +64,7 @@ import {
64
64
  resolveClassGuardMs,
65
65
  resolveModelIdentitySync,
66
66
  resolveVoteTimeout
67
- } from "./chunk-2RSNO5SP.js";
67
+ } from "./chunk-LLOA4BJC.js";
68
68
  import {
69
69
  ensureLearningDir,
70
70
  getOutcomesFile
@@ -6162,7 +6162,7 @@ async function processVotesWithCascade(engineVotes, opts) {
6162
6162
  var CONTRARIAN_ESCALATION_THRESHOLD = 0.8;
6163
6163
  async function runContrarianCheck(proposal, log) {
6164
6164
  try {
6165
- const { executeExpert } = await import("./expert-bridge-GY7RL4DF.js");
6165
+ const { executeExpert } = await import("./expert-bridge-66WOTNQH.js");
6166
6166
  const prompt = [
6167
6167
  "You are a contrarian analyst. Your job is to find reasons this proposal should be REJECTED.",
6168
6168
  "Look for: YAGNI (not needed), MISALIGNED (wrong tech/architecture), SECURITY_RISK, SCOPE_CREEP.",
@@ -6728,4 +6728,4 @@ export {
6728
6728
  CONSENSUS_VOTE_TOOL_SCHEMA,
6729
6729
  registerConsensusVoteTool
6730
6730
  };
6731
- //# sourceMappingURL=chunk-XT4J7QAO.js.map
6731
+ //# sourceMappingURL=chunk-PFGDOY3E.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  readOpenAICompatEnv
3
- } from "./chunk-UZRVS7MK.js";
3
+ } from "./chunk-KYOUTMHF.js";
4
4
  import {
5
5
  allOf
6
6
  } from "./chunk-OQB3XC5O.js";
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  createAllAdapters,
12
12
  probeCli
13
- } from "./chunk-GFCCNGI7.js";
13
+ } from "./chunk-E3G7VHE4.js";
14
14
  import {
15
15
  getNexusTmpDir
16
16
  } from "./chunk-RQV5ZUXT.js";
@@ -25,7 +25,7 @@ import {
25
25
  ok,
26
26
  symbols,
27
27
  writeLine
28
- } from "./chunk-2RSNO5SP.js";
28
+ } from "./chunk-LLOA4BJC.js";
29
29
  import {
30
30
  getLearningDir,
31
31
  getOutcomesFile,
@@ -170,7 +170,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
170
170
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
171
171
 
172
172
  // src/version.ts
173
- var VERSION = true ? "4.14.2" : "dev";
173
+ var VERSION = true ? "4.14.4" : "dev";
174
174
 
175
175
  // src/mcp/task-store.ts
176
176
  import { InMemoryTaskStore } from "@modelcontextprotocol/sdk/experimental/tasks";
@@ -1134,13 +1134,13 @@ async function runDoctorFix(result) {
1134
1134
  writeLine2("\u2500".repeat(40));
1135
1135
  let fixCount = 0;
1136
1136
  if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
1137
- const { initDataDirectories: initDataDirectories2, describeDataDirFix: describeDataDirFix2 } = await import("./setup-data-dir-EMXRXEFQ.js");
1137
+ const { initDataDirectories: initDataDirectories2, describeDataDirFix: describeDataDirFix2 } = await import("./setup-data-dir-JLGQJWCZ.js");
1138
1138
  const outcome = describeDataDirFix2(initDataDirectories2());
1139
1139
  writeLine2(outcome.line);
1140
1140
  if (outcome.counted) fixCount++;
1141
1141
  }
1142
1142
  if (!result.configFile.found) {
1143
- const { runConfigInitSync } = await import("./setup-config-7SWEJXN4.js");
1143
+ const { runConfigInitSync } = await import("./setup-config-VJ3VMHSH.js");
1144
1144
  const configResult = runConfigInitSync(process.cwd(), false, false);
1145
1145
  if (configResult.success && configResult.created) {
1146
1146
  writeLine2(`\u2713 Generated config: ${configResult.path}`);
@@ -1237,4 +1237,4 @@ export {
1237
1237
  startStdioServer,
1238
1238
  closeServer
1239
1239
  };
1240
- //# sourceMappingURL=chunk-WMSWVHFZ.js.map
1240
+ //# sourceMappingURL=chunk-PZXOE4T4.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-CHRJKE7S.js";
4
+ } from "./chunk-B6MD66KN.js";
5
5
  import {
6
6
  ROLE_DEFAULT_TRUST,
7
7
  ReputationCache,
@@ -11,20 +11,20 @@ import {
11
11
  gateWithReputation,
12
12
  resolveReputationGatingMode,
13
13
  sanitizeInput
14
- } from "./chunk-MU7J7D5Q.js";
14
+ } from "./chunk-P2ZLNRAY.js";
15
15
  import {
16
16
  emitPolicyEvent
17
- } from "./chunk-CPRPZPX7.js";
17
+ } from "./chunk-OW7EDMRI.js";
18
18
  import {
19
19
  hasToken
20
- } from "./chunk-GT5B35X3.js";
20
+ } from "./chunk-4EMTJ747.js";
21
21
  import {
22
22
  CLI_SUBPROCESS_TIMEOUTS,
23
23
  createLogger,
24
24
  err,
25
25
  getTimeProvider,
26
26
  ok
27
- } from "./chunk-2RSNO5SP.js";
27
+ } from "./chunk-LLOA4BJC.js";
28
28
 
29
29
  // src/security/trust-classifier.ts
30
30
  function mapAuthorAssociation(association) {
@@ -1247,4 +1247,4 @@ export {
1247
1247
  IssueTriage,
1248
1248
  createIssueTriage
1249
1249
  };
1250
- //# sourceMappingURL=chunk-HJK5RZBX.js.map
1250
+ //# sourceMappingURL=chunk-VRR2P2RZ.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-CHRJKE7S.js";
4
+ } from "./chunk-B6MD66KN.js";
5
5
  import {
6
6
  resolveToken
7
- } from "./chunk-GT5B35X3.js";
7
+ } from "./chunk-4EMTJ747.js";
8
8
  import {
9
9
  err,
10
10
  ok
11
- } from "./chunk-2RSNO5SP.js";
11
+ } from "./chunk-LLOA4BJC.js";
12
12
 
13
13
  // src/scm/factory.ts
14
14
  async function createScmProvider(config) {
@@ -41,4 +41,4 @@ export {
41
41
  createScmProvider,
42
42
  createGitHubProvider
43
43
  };
44
- //# sourceMappingURL=chunk-NOROX25U.js.map
44
+ //# sourceMappingURL=chunk-WDEYLEYM.js.map
@@ -2,7 +2,7 @@ import {
2
2
  TASK_CATEGORIES,
3
3
  getAdaptiveBonus,
4
4
  getOutcomeStore
5
- } from "./chunk-2RSNO5SP.js";
5
+ } from "./chunk-LLOA4BJC.js";
6
6
 
7
7
  // src/cli/doctor-deep.ts
8
8
  var CLI_NAMES = ["claude", "gemini", "codex", "opencode"];
@@ -106,4 +106,4 @@ export {
106
106
  runDeepDiagnostics,
107
107
  formatDeepDiagnostics
108
108
  };
109
- //# sourceMappingURL=chunk-L6QLJ4VK.js.map
109
+ //# sourceMappingURL=chunk-WGTTKU7Q.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  loadPapersRegistry
3
- } from "./chunk-VE3PAJ5M.js";
3
+ } from "./chunk-3GMSD7QD.js";
4
4
  import {
5
5
  getErrorMessage
6
- } from "./chunk-2RSNO5SP.js";
6
+ } from "./chunk-LLOA4BJC.js";
7
7
 
8
8
  // src/cli/research-helpers-synthesize.ts
9
9
  import { z } from "zod";
@@ -876,4 +876,4 @@ export {
876
876
  AttributedInsightSchema,
877
877
  synthesizeResearch
878
878
  };
879
- //# sourceMappingURL=chunk-WHOODKBB.js.map
879
+ //# sourceMappingURL=chunk-Y2M7ZFJV.js.map
@@ -3,8 +3,8 @@ import {
3
3
  createCliCircuitBreakerIntegration,
4
4
  getCliCircuitBreakerSnapshot,
5
5
  getDefaultCliCircuitBreakerRegistry
6
- } from "./chunk-E536V52C.js";
7
- import "./chunk-2RSNO5SP.js";
6
+ } from "./chunk-IGCNQFTF.js";
7
+ import "./chunk-LLOA4BJC.js";
8
8
  import "./chunk-HHLCAWAV.js";
9
9
  import "./chunk-NBMWONHE.js";
10
10
  import "./chunk-ZPWHCABL.js";
@@ -14,4 +14,4 @@ export {
14
14
  getCliCircuitBreakerSnapshot,
15
15
  getDefaultCliCircuitBreakerRegistry
16
16
  };
17
- //# sourceMappingURL=cli-circuit-breaker-A7GM4LXS.js.map
17
+ //# sourceMappingURL=cli-circuit-breaker-H2SNPFLT.js.map