nexus-agents 2.92.4 → 2.93.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 (119) hide show
  1. package/dist/{child-mcp-config-WUHKXBWX.js → child-mcp-config-WNISXFYD.js} +2 -2
  2. package/dist/{chunk-Y7E5ZWRQ.js → chunk-2IBJC2EP.js} +2 -2
  3. package/dist/chunk-2IBJC2EP.js.map +1 -0
  4. package/dist/{chunk-2SMTCNXP.js → chunk-2T4NV6QT.js} +2 -2
  5. package/dist/{chunk-3HTUYAKS.js → chunk-4A4WPM75.js} +10 -126
  6. package/dist/chunk-4A4WPM75.js.map +1 -0
  7. package/dist/{chunk-6Q33PBXC.js → chunk-57OH2O2U.js} +2 -2
  8. package/dist/{chunk-VUVCSWMC.js → chunk-5BTRDVWC.js} +5 -5
  9. package/dist/{chunk-TWAH7VM2.js → chunk-AZP66FIA.js} +3 -3
  10. package/dist/{chunk-X5BQF6HM.js → chunk-BHA6V7GK.js} +4 -4
  11. package/dist/{chunk-E6W4Z6GN.js → chunk-BNHBZRU7.js} +3 -3
  12. package/dist/{chunk-EFHZHCF2.js → chunk-CPH6LKXO.js} +2 -2
  13. package/dist/{chunk-27CNQPQ4.js → chunk-DTFMYM3V.js} +2 -2
  14. package/dist/{chunk-AQTHLUCP.js → chunk-E3QWWP67.js} +2 -2
  15. package/dist/{chunk-7QXEK3O6.js → chunk-FTCU55O6.js} +4 -4
  16. package/dist/{chunk-IHPYT6WU.js → chunk-G5IDRWWI.js} +15 -6
  17. package/dist/chunk-G5IDRWWI.js.map +1 -0
  18. package/dist/{chunk-W5I6L4UT.js → chunk-HKISF2E7.js} +191 -11
  19. package/dist/chunk-HKISF2E7.js.map +1 -0
  20. package/dist/{chunk-4LEUIAYB.js → chunk-IJ2AZZVH.js} +66 -48
  21. package/dist/chunk-IJ2AZZVH.js.map +1 -0
  22. package/dist/{chunk-YEQE7WLP.js → chunk-JCETWDU7.js} +2 -2
  23. package/dist/{chunk-3FVSYMHK.js → chunk-JEBWSHSU.js} +2 -2
  24. package/dist/{chunk-4GOT42ZA.js → chunk-K7VGX37L.js} +3 -3
  25. package/dist/{chunk-JCYCITBK.js → chunk-LJMO5P6O.js} +38 -128
  26. package/dist/chunk-LJMO5P6O.js.map +1 -0
  27. package/dist/chunk-NESW2TTD.js +134 -0
  28. package/dist/chunk-NESW2TTD.js.map +1 -0
  29. package/dist/{chunk-JYIKPBXW.js → chunk-RTUZSR4R.js} +2 -2
  30. package/dist/{chunk-MZFWRU6E.js → chunk-SHSKW5ML.js} +7 -7
  31. package/dist/{chunk-SFZESA5O.js → chunk-SMGH2B3A.js} +2 -2
  32. package/dist/{chunk-PRGNJRID.js → chunk-SORBJPRA.js} +2 -2
  33. package/dist/{chunk-3LKW4IEW.js → chunk-T73G67GT.js} +3 -3
  34. package/dist/{chunk-57HMLBYN.js → chunk-ULBKFMVO.js} +2 -2
  35. package/dist/{chunk-VYNNVUY6.js → chunk-VSG6RSE6.js} +3 -3
  36. package/dist/{chunk-EAT4GTMT.js → chunk-WU3SUA35.js} +2 -2
  37. package/dist/{chunk-S6FXRXYE.js → chunk-XVY3I7JT.js} +7 -7
  38. package/dist/{chunk-CGSVTROC.js → chunk-ZOAU7RE4.js} +6 -4
  39. package/dist/chunk-ZOAU7RE4.js.map +1 -0
  40. package/dist/{chunk-52ACUN6T.js → chunk-ZYHHDPFW.js} +4 -4
  41. package/dist/{cli-circuit-breaker-4SWB6DEB.js → cli-circuit-breaker-6E4E2IU7.js} +4 -4
  42. package/dist/cli.js +109 -38
  43. package/dist/cli.js.map +1 -1
  44. package/dist/{composite-router-NLVKSTA2.js → composite-router-MQOPXLVV.js} +2 -2
  45. package/dist/{consensus-vote-4RIUUEZQ.js → consensus-vote-ZRADOLXH.js} +13 -12
  46. package/dist/{context-retriever-C4CNVKR5.js → context-retriever-TZGIETJO.js} +6 -6
  47. package/dist/{doctor-deep-QSVGAHAO.js → doctor-deep-OU2WC55V.js} +3 -3
  48. package/dist/{expert-bridge-VIWFPPGZ.js → expert-bridge-WP5ZWXFY.js} +4 -4
  49. package/dist/{factory-NNSXCD25.js → factory-2TN2VZTR.js} +5 -5
  50. package/dist/{factory-T3SEZUGW.js → factory-RJTRVII5.js} +5 -5
  51. package/dist/index.d.ts +54 -9
  52. package/dist/index.js +199 -55
  53. package/dist/index.js.map +1 -1
  54. package/dist/{init-opencode-WEKHD7YE.js → init-opencode-AYMNMWU7.js} +5 -5
  55. package/dist/{issue-triage-VB5CVE43.js → issue-triage-QIVZN3PJ.js} +5 -5
  56. package/dist/{pr-reviewer-helpers-CI72F4XM.js → pr-reviewer-helpers-P24OBKVM.js} +4 -4
  57. package/dist/{registry-command-VNFULRTL.js → registry-command-KWWOKJ5C.js} +2 -2
  58. package/dist/{repo-security-plan-5MFY7GGQ.js → repo-security-plan-KZNEXDCI.js} +3 -3
  59. package/dist/{research-helpers-synthesize-CNZ4C3FN.js → research-helpers-synthesize-DH5PPX7A.js} +4 -3
  60. package/dist/{routing-memory-PYO46COZ.js → routing-memory-AGHJQTRH.js} +2 -2
  61. package/dist/{session-memory-HGCDSZ5R.js → session-memory-O24IVZAW.js} +3 -3
  62. package/dist/{setup-command-E35O56BN.js → setup-command-NBXZ4NGV.js} +12 -11
  63. package/dist/{setup-config-QPS4K5QU.js → setup-config-Y4JA5QWO.js} +3 -3
  64. package/dist/{setup-custom-api-SP2ZAVGC.js → setup-custom-api-UNX4OJEX.js} +5 -4
  65. package/dist/{setup-custom-api-SP2ZAVGC.js.map → setup-custom-api-UNX4OJEX.js.map} +1 -1
  66. package/dist/{tool-memory-SDPIAV2S.js → tool-memory-UEQNXIGC.js} +5 -5
  67. package/dist/{weather-report-RWAMQHBL.js → weather-report-S5YXRY7G.js} +2 -2
  68. package/package.json +1 -1
  69. package/dist/chunk-3HTUYAKS.js.map +0 -1
  70. package/dist/chunk-4LEUIAYB.js.map +0 -1
  71. package/dist/chunk-CGSVTROC.js.map +0 -1
  72. package/dist/chunk-IHPYT6WU.js.map +0 -1
  73. package/dist/chunk-JCYCITBK.js.map +0 -1
  74. package/dist/chunk-W5I6L4UT.js.map +0 -1
  75. package/dist/chunk-Y7E5ZWRQ.js.map +0 -1
  76. /package/dist/{child-mcp-config-WUHKXBWX.js.map → child-mcp-config-WNISXFYD.js.map} +0 -0
  77. /package/dist/{chunk-2SMTCNXP.js.map → chunk-2T4NV6QT.js.map} +0 -0
  78. /package/dist/{chunk-6Q33PBXC.js.map → chunk-57OH2O2U.js.map} +0 -0
  79. /package/dist/{chunk-VUVCSWMC.js.map → chunk-5BTRDVWC.js.map} +0 -0
  80. /package/dist/{chunk-TWAH7VM2.js.map → chunk-AZP66FIA.js.map} +0 -0
  81. /package/dist/{chunk-X5BQF6HM.js.map → chunk-BHA6V7GK.js.map} +0 -0
  82. /package/dist/{chunk-E6W4Z6GN.js.map → chunk-BNHBZRU7.js.map} +0 -0
  83. /package/dist/{chunk-EFHZHCF2.js.map → chunk-CPH6LKXO.js.map} +0 -0
  84. /package/dist/{chunk-27CNQPQ4.js.map → chunk-DTFMYM3V.js.map} +0 -0
  85. /package/dist/{chunk-AQTHLUCP.js.map → chunk-E3QWWP67.js.map} +0 -0
  86. /package/dist/{chunk-7QXEK3O6.js.map → chunk-FTCU55O6.js.map} +0 -0
  87. /package/dist/{chunk-YEQE7WLP.js.map → chunk-JCETWDU7.js.map} +0 -0
  88. /package/dist/{chunk-3FVSYMHK.js.map → chunk-JEBWSHSU.js.map} +0 -0
  89. /package/dist/{chunk-4GOT42ZA.js.map → chunk-K7VGX37L.js.map} +0 -0
  90. /package/dist/{chunk-JYIKPBXW.js.map → chunk-RTUZSR4R.js.map} +0 -0
  91. /package/dist/{chunk-MZFWRU6E.js.map → chunk-SHSKW5ML.js.map} +0 -0
  92. /package/dist/{chunk-SFZESA5O.js.map → chunk-SMGH2B3A.js.map} +0 -0
  93. /package/dist/{chunk-PRGNJRID.js.map → chunk-SORBJPRA.js.map} +0 -0
  94. /package/dist/{chunk-3LKW4IEW.js.map → chunk-T73G67GT.js.map} +0 -0
  95. /package/dist/{chunk-57HMLBYN.js.map → chunk-ULBKFMVO.js.map} +0 -0
  96. /package/dist/{chunk-VYNNVUY6.js.map → chunk-VSG6RSE6.js.map} +0 -0
  97. /package/dist/{chunk-EAT4GTMT.js.map → chunk-WU3SUA35.js.map} +0 -0
  98. /package/dist/{chunk-S6FXRXYE.js.map → chunk-XVY3I7JT.js.map} +0 -0
  99. /package/dist/{chunk-52ACUN6T.js.map → chunk-ZYHHDPFW.js.map} +0 -0
  100. /package/dist/{cli-circuit-breaker-4SWB6DEB.js.map → cli-circuit-breaker-6E4E2IU7.js.map} +0 -0
  101. /package/dist/{composite-router-NLVKSTA2.js.map → composite-router-MQOPXLVV.js.map} +0 -0
  102. /package/dist/{consensus-vote-4RIUUEZQ.js.map → consensus-vote-ZRADOLXH.js.map} +0 -0
  103. /package/dist/{context-retriever-C4CNVKR5.js.map → context-retriever-TZGIETJO.js.map} +0 -0
  104. /package/dist/{doctor-deep-QSVGAHAO.js.map → doctor-deep-OU2WC55V.js.map} +0 -0
  105. /package/dist/{expert-bridge-VIWFPPGZ.js.map → expert-bridge-WP5ZWXFY.js.map} +0 -0
  106. /package/dist/{factory-NNSXCD25.js.map → factory-2TN2VZTR.js.map} +0 -0
  107. /package/dist/{factory-T3SEZUGW.js.map → factory-RJTRVII5.js.map} +0 -0
  108. /package/dist/{init-opencode-WEKHD7YE.js.map → init-opencode-AYMNMWU7.js.map} +0 -0
  109. /package/dist/{issue-triage-VB5CVE43.js.map → issue-triage-QIVZN3PJ.js.map} +0 -0
  110. /package/dist/{pr-reviewer-helpers-CI72F4XM.js.map → pr-reviewer-helpers-P24OBKVM.js.map} +0 -0
  111. /package/dist/{registry-command-VNFULRTL.js.map → registry-command-KWWOKJ5C.js.map} +0 -0
  112. /package/dist/{repo-security-plan-5MFY7GGQ.js.map → repo-security-plan-KZNEXDCI.js.map} +0 -0
  113. /package/dist/{research-helpers-synthesize-CNZ4C3FN.js.map → research-helpers-synthesize-DH5PPX7A.js.map} +0 -0
  114. /package/dist/{routing-memory-PYO46COZ.js.map → routing-memory-AGHJQTRH.js.map} +0 -0
  115. /package/dist/{session-memory-HGCDSZ5R.js.map → session-memory-O24IVZAW.js.map} +0 -0
  116. /package/dist/{setup-command-E35O56BN.js.map → setup-command-NBXZ4NGV.js.map} +0 -0
  117. /package/dist/{setup-config-QPS4K5QU.js.map → setup-config-Y4JA5QWO.js.map} +0 -0
  118. /package/dist/{tool-memory-SDPIAV2S.js.map → tool-memory-UEQNXIGC.js.map} +0 -0
  119. /package/dist/{weather-report-RWAMQHBL.js.map → weather-report-S5YXRY7G.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createLogger
3
- } from "./chunk-W5I6L4UT.js";
3
+ } from "./chunk-HKISF2E7.js";
4
4
  import "./chunk-CH7QIDHQ.js";
5
5
  import "./chunk-PR4QN5HX.js";
6
6
 
@@ -59,4 +59,4 @@ export {
59
59
  generateMcpConfig,
60
60
  getDefaultAllowedTools
61
61
  };
62
- //# sourceMappingURL=child-mcp-config-WUHKXBWX.js.map
62
+ //# sourceMappingURL=child-mcp-config-WNISXFYD.js.map
@@ -2,7 +2,7 @@ import {
2
2
  ConfigError,
3
3
  err,
4
4
  ok
5
- } from "./chunk-W5I6L4UT.js";
5
+ } from "./chunk-HKISF2E7.js";
6
6
 
7
7
  // src/adapters/sdk/types.ts
8
8
  var PROVIDER_ENV_KEYS = {
@@ -117,4 +117,4 @@ export {
117
117
  CUSTOM_API_ALLOW_PRIVATE_ENV,
118
118
  validateCustomApiBaseUrl
119
119
  };
120
- //# sourceMappingURL=chunk-Y7E5ZWRQ.js.map
120
+ //# sourceMappingURL=chunk-2IBJC2EP.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 { ConfigError, ok, err, type Result } from '../../core/index.js';\nimport { CUSTOM_API_ALLOW_PRIVATE_ENV } from './types.js';\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 * Callers who need that level of defense should add a runtime connect\n * check and validate the socket peer address.\n */\nfunction classifyPrivateHost(hostname: string): RejectionDetail | null {\n // URL.hostname wraps IPv6 literals in brackets (e.g. \"[::1]\"); strip them\n // before the net-module checks, which expect bare forms.\n const stripped =\n hostname.startsWith('[') && hostname.endsWith(']') ? hostname.slice(1, -1) : hostname;\n const normalized = stripped.toLowerCase();\n\n // Literal IPv4 loopback or private-range address\n if (isIPv4(normalized)) {\n return classifyIPv4(normalized);\n }\n\n // Literal IPv6 loopback (::1), link-local (fe80::/10), unique-local (fc00::/7)\n if (isIPv6(normalized)) {\n return classifyIPv6(normalized);\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/** IPv4 ranges the SSRF guard rejects, in order of specificity. */\nconst IPV4_RULES: ReadonlyArray<{\n readonly match: (a: number, b: 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\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] = parts as [number, number, number, number];\n for (const rule of IPV4_RULES) {\n if (rule.match(a, b)) {\n return { reason: rule.reason, message: `${rule.label} (${ip})` };\n }\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 if (lower.startsWith('fe80:'))\n return { reason: 'link_local', message: `IPv6 link-local (${ip})` };\n // Unique-local: fc00::/7 → first byte has high bit set and second-high bit set\n if (/^fc|^fd/.test(lower)) {\n return { reason: 'private_range', message: `IPv6 unique-local (${ip}, fc00::/7)` };\n }\n return null;\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getErrorMessage
3
- } from "./chunk-W5I6L4UT.js";
3
+ } from "./chunk-HKISF2E7.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-2SMTCNXP.js.map
80
+ //# sourceMappingURL=chunk-2T4NV6QT.js.map
@@ -1,3 +1,11 @@
1
+ import {
2
+ createGetCircuitBreakerConfig,
3
+ createGetEnvVarDocumentation,
4
+ createGetRateLimitConfig,
5
+ createGetRetryConfig,
6
+ createGetTimeout,
7
+ createGetToolRateLimit
8
+ } from "./chunk-NESW2TTD.js";
1
9
  import {
2
10
  API_TIMEOUTS,
3
11
  CLI_TIMEOUTS,
@@ -5,131 +13,7 @@ import {
5
13
  MCP_TIMEOUTS,
6
14
  TEST_TIMEOUTS,
7
15
  WORKFLOW_TIMEOUTS
8
- } from "./chunk-W5I6L4UT.js";
9
-
10
- // src/config/defaults-env.ts
11
- function parseIntEnv(envKey, fallback) {
12
- const envValue = process.env[envKey];
13
- if (envValue === void 0) {
14
- return fallback;
15
- }
16
- const parsed = parseInt(envValue, 10);
17
- return isNaN(parsed) || parsed <= 0 ? fallback : parsed;
18
- }
19
- function parseFloatEnv(envKey, fallback) {
20
- const envValue = process.env[envKey];
21
- if (envValue === void 0) {
22
- return fallback;
23
- }
24
- const parsed = parseFloat(envValue);
25
- return isNaN(parsed) || !isFinite(parsed) ? fallback : parsed;
26
- }
27
- function parseBoolEnv(envKey, fallback) {
28
- const envValue = process.env[envKey]?.toLowerCase();
29
- if (envValue === void 0) {
30
- return fallback;
31
- }
32
- if (envValue === "true" || envValue === "1") return true;
33
- if (envValue === "false" || envValue === "0") return false;
34
- return fallback;
35
- }
36
- function createGetTimeout(timeoutDefaults) {
37
- return (key) => {
38
- const envKey = `NEXUS_TIMEOUT_${key.replace(/Ms$/, "").toUpperCase()}`;
39
- return parseIntEnv(envKey, timeoutDefaults[key]);
40
- };
41
- }
42
- function createGetRetryConfig(retryDefaults) {
43
- return () => {
44
- return {
45
- maxRetries: parseIntEnv("NEXUS_RETRY_MAX_RETRIES", retryDefaults.maxRetries),
46
- baseDelayMs: parseIntEnv("NEXUS_RETRY_BASE_DELAY", retryDefaults.baseDelayMs),
47
- maxDelayMs: parseIntEnv("NEXUS_RETRY_MAX_DELAY", retryDefaults.maxDelayMs),
48
- jitterFactor: parseFloatEnv("NEXUS_RETRY_JITTER", retryDefaults.jitterFactor)
49
- };
50
- };
51
- }
52
- function createGetRateLimitConfig(rateLimitDefaults) {
53
- return () => {
54
- return {
55
- requestsPerMinute: parseIntEnv("NEXUS_RATE_LIMIT_RPM", rateLimitDefaults.requestsPerMinute),
56
- enabled: parseBoolEnv("NEXUS_RATE_LIMIT_ENABLED", rateLimitDefaults.enabled),
57
- maxConcurrent: parseIntEnv(
58
- "NEXUS_RATE_LIMIT_MAX_CONCURRENT",
59
- rateLimitDefaults.maxConcurrent
60
- ),
61
- capacity: parseIntEnv("NEXUS_RATE_LIMIT_CAPACITY", rateLimitDefaults.capacity),
62
- refillRate: parseIntEnv("NEXUS_RATE_LIMIT_REFILL_RATE", rateLimitDefaults.refillRate),
63
- refillIntervalMs: parseIntEnv(
64
- "NEXUS_RATE_LIMIT_REFILL_INTERVAL",
65
- rateLimitDefaults.refillIntervalMs
66
- )
67
- };
68
- };
69
- }
70
- function createGetCircuitBreakerConfig(cbDefaults) {
71
- return () => {
72
- return {
73
- failureThreshold: parseIntEnv("NEXUS_CIRCUIT_BREAKER_THRESHOLD", cbDefaults.failureThreshold),
74
- resetTimeoutMs: parseIntEnv("NEXUS_CIRCUIT_BREAKER_RESET_TIMEOUT", cbDefaults.resetTimeoutMs),
75
- halfOpenSuccessThreshold: cbDefaults.halfOpenSuccessThreshold,
76
- countTimeoutsAsFailures: cbDefaults.countTimeoutsAsFailures,
77
- countAuthFailuresAsFailures: cbDefaults.countAuthFailuresAsFailures,
78
- countRateLimitsAsFailures: cbDefaults.countRateLimitsAsFailures,
79
- halfOpenMaxRequests: cbDefaults.halfOpenMaxRequests
80
- };
81
- };
82
- }
83
- function createGetToolRateLimit(toolRateLimits) {
84
- return (tool) => {
85
- return toolRateLimits[tool];
86
- };
87
- }
88
- function createGetEnvVarDocumentation(defaults) {
89
- return () => {
90
- const t = defaults.TIMEOUT_DEFAULTS;
91
- const r = defaults.RATE_LIMIT_DEFAULTS;
92
- const rt = defaults.RETRY_DEFAULTS;
93
- const cb = defaults.CIRCUIT_BREAKER_DEFAULTS;
94
- return `# Environment Variable Overrides
95
-
96
- All defaults can be overridden via environment variables using the NEXUS_ prefix.
97
-
98
- ## Timeouts
99
-
100
- | Variable | Default | Description |
101
- | -------- | ------- | ----------- |
102
- | NEXUS_TIMEOUT_CLI | ${String(t.cliMs)} | CLI execution timeout (ms) |
103
- | NEXUS_TIMEOUT_API | ${String(t.apiMs)} | API request timeout (ms) |
104
- | NEXUS_TIMEOUT_WORKFLOW | ${String(t.workflowMs)} | Workflow timeout (ms) |
105
- | NEXUS_TIMEOUT_MCP | ${String(t.mcpMs)} | MCP operation timeout (ms) |
106
-
107
- ## Rate Limits
108
-
109
- | Variable | Default | Description |
110
- | -------- | ------- | ----------- |
111
- | NEXUS_RATE_LIMIT_RPM | ${String(r.requestsPerMinute)} | Requests per minute |
112
- | NEXUS_RATE_LIMIT_ENABLED | ${String(r.enabled)} | Enable rate limiting |
113
- | NEXUS_RATE_LIMIT_CAPACITY | ${String(r.capacity)} | Token bucket capacity |
114
-
115
- ## Retries
116
-
117
- | Variable | Default | Description |
118
- | -------- | ------- | ----------- |
119
- | NEXUS_RETRY_MAX_RETRIES | ${String(rt.maxRetries)} | Maximum retry attempts |
120
- | NEXUS_RETRY_BASE_DELAY | ${String(rt.baseDelayMs)} | Base delay (ms) |
121
- | NEXUS_RETRY_MAX_DELAY | ${String(rt.maxDelayMs)} | Maximum delay (ms) |
122
- | NEXUS_RETRY_JITTER | ${String(rt.jitterFactor)} | Jitter factor (0-1) |
123
-
124
- ## Circuit Breaker
125
-
126
- | Variable | Default | Description |
127
- | -------- | ------- | ----------- |
128
- | NEXUS_CIRCUIT_BREAKER_THRESHOLD | ${String(cb.failureThreshold)} | Failure threshold |
129
- | NEXUS_CIRCUIT_BREAKER_RESET_TIMEOUT | ${String(cb.resetTimeoutMs)} | Reset timeout (ms) |
130
- `;
131
- };
132
- }
16
+ } from "./chunk-HKISF2E7.js";
133
17
 
134
18
  // src/config/defaults.ts
135
19
  var CUSTOM_API_DEFAULT_MODEL = "gpt-4o";
@@ -348,4 +232,4 @@ export {
348
232
  CUSTOM_API_DEFAULT_MODEL,
349
233
  DEFAULTS
350
234
  };
351
- //# sourceMappingURL=chunk-3HTUYAKS.js.map
235
+ //# sourceMappingURL=chunk-4A4WPM75.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/defaults.ts"],"sourcesContent":["/**\n * Central Configuration Defaults\n *\n * Consolidates common default values used across the codebase.\n * This prevents scattered magic numbers and ensures consistency.\n *\n * Usage:\n * import { DEFAULTS, getTimeout, TIMEOUT_PROFILES } from '../config/defaults.js';\n * const timeout = options.timeout ?? DEFAULTS.TIMEOUT_DEFAULTS.cliMs;\n * const cliTimeout = getTimeoutForCli('claude', 'complex');\n *\n * Environment overrides can be added via NEXUS_* environment variables.\n *\n * @module config/defaults\n * (Source: Central config consolidation initiative)\n */\n\n// Re-export types from defaults-types\nexport type {\n TaskComplexity,\n TimeoutProfile,\n KnownCliName,\n TimeoutDefaults,\n RateLimitDefaults,\n ToolRateLimitConfig,\n RetryDefaults,\n CircuitBreakerDefaults,\n} from './defaults-types.js';\n\nexport { isTaskComplexity, isKnownCliName } from './defaults-types.js';\n\n// Re-export timeout profiles (delegates to config/timeouts.ts)\nexport {\n TIMEOUT_PROFILES,\n getTimeoutProfile,\n getTimeoutForCli,\n} from './defaults-timeout-profiles.js';\n\n// Re-export canonical timeout modules (Issue #984)\nexport {\n CLI_TIMEOUTS,\n VOTE_TIMEOUTS,\n MCP_TIMEOUTS,\n WORKFLOW_TIMEOUTS,\n GRAPH_TIMEOUTS,\n PER_CLI_TASK_TIMEOUTS,\n API_TIMEOUTS,\n INTERNAL_TIMEOUTS,\n TEST_TIMEOUTS,\n TIMEOUT_ENV_VARS,\n getCliTimeoutProfile,\n getCliTimeout,\n resolveVoteTimeout,\n resolveEnvTimeout,\n validateTimeout,\n BACKOFF_CONFIG,\n AGENT_ROUTER_TIMEOUTS,\n CODEX_MCP_TIMEOUTS,\n} from './timeouts.js';\n\n// Re-export env helpers (internal use)\nexport { parseIntEnv, parseFloatEnv, parseBoolEnv } from './defaults-env.js';\n\nimport {\n createGetTimeout,\n createGetRetryConfig,\n createGetRateLimitConfig,\n createGetCircuitBreakerConfig,\n createGetToolRateLimit,\n createGetEnvVarDocumentation,\n} from './defaults-env.js';\nimport {\n API_TIMEOUTS as _API,\n WORKFLOW_TIMEOUTS as _WF,\n MCP_TIMEOUTS as _MCP,\n INTERNAL_TIMEOUTS as _INT,\n TEST_TIMEOUTS as _TEST,\n CLI_TIMEOUTS as _CLI,\n} from './timeouts.js';\n\n// ============================================================================\n// Default Model IDs (#2200 Child 4)\n// ============================================================================\n\n/**\n * Default model identifier for the custom OpenAI-compatible API gateway.\n *\n * Used by both `cli/setup-custom-api.ts` (write to nexus-agents.yaml) and\n * `adapters/auto-adapter.ts` (NEXUS_CUSTOM_MODEL env-var fallback). Single\n * source of truth so changes flow through all consumers.\n *\n * `gpt-4o` is widely supported across OpenAI-compatible gateways (vLLM,\n * LiteLLM, Together AI, etc.) — a pragmatic baseline rather than the\n * cheapest or most capable. Operators are expected to override.\n */\nexport const CUSTOM_API_DEFAULT_MODEL = 'gpt-4o';\n\n// ============================================================================\n// Central Defaults Object\n// ============================================================================\n\n/**\n * Central defaults object containing all configuration categories.\n */\nexport const DEFAULTS = {\n /**\n * Default timeout settings in milliseconds.\n * Values sourced from config/timeouts.ts (Issue #984).\n */\n TIMEOUT_DEFAULTS: {\n /** CLI tool execution timeout in milliseconds. */\n cliMs: _CLI.default.standard,\n /** Simple CLI task timeout (single function, quick query). */\n cliSimpleMs: _CLI.default.simple,\n /** Complex CLI task timeout (codebase-wide, deep analysis). */\n cliComplexMs: _CLI.default.complex,\n /** API request timeout in milliseconds. */\n apiMs: _API.defaultMs,\n /** Maximum API timeout in milliseconds. */\n apiMaxMs: _API.maxMs,\n /** Workflow-level timeout in milliseconds (5 minutes). */\n workflowMs: _WF.workflowMs,\n /** Maximum workflow timeout in milliseconds (30 minutes). */\n workflowMaxMs: _WF.workflowMaxMs,\n /** Step-level timeout in milliseconds. */\n stepMs: _INT.selfEvalMs,\n /** MCP operation default timeout in milliseconds (generic, not per-tool). */\n mcpMs: _API.defaultMs,\n /** MCP operation maximum timeout in milliseconds. */\n mcpMaxMs: _MCP.maxMs,\n /** Health check timeout in milliseconds. */\n healthCheckMs: _INT.healthCheckMs,\n /** Global test run timeout in milliseconds (10 minutes). */\n testGlobalMs: _TEST.globalMs,\n /** Per-task test timeout in milliseconds. */\n testTaskMs: _TEST.taskMs,\n /** Circuit breaker reset timeout in milliseconds. */\n circuitBreakerResetMs: _INT.circuitBreakerResetMs,\n },\n\n /**\n * Default rate limit settings for outbound operations.\n */\n RATE_LIMIT_DEFAULTS: {\n /** Global requests per minute. */\n requestsPerMinute: 60,\n /** Whether rate limiting is enabled by default. */\n enabled: true,\n /** Maximum number of concurrent requests. */\n maxConcurrent: 4,\n /** Token bucket capacity. */\n capacity: 100,\n /** Token bucket refill rate per second. */\n refillRate: 10,\n /** Refill interval in milliseconds. */\n refillIntervalMs: 100,\n },\n\n /**\n * Per-tool rate limit defaults for MCP tools.\n * (Source: Issue #274 Phase 2 - per-tool rate limits)\n */\n TOOL_RATE_LIMITS: {\n orchestrate: { capacity: 10, refillRate: 10, refillIntervalMs: 60_000 },\n delegate: { capacity: 20, refillRate: 20, refillIntervalMs: 60_000 },\n workflow: { capacity: 5, refillRate: 5, refillIntervalMs: 60_000 },\n expert: { capacity: 30, refillRate: 30, refillIntervalMs: 60_000 },\n },\n\n /**\n * Default retry strategy settings for transient failures.\n */\n RETRY_DEFAULTS: {\n /** Maximum retry attempts before failing. */\n maxRetries: 3,\n /** Base delay between retries in milliseconds. */\n baseDelayMs: 1_000,\n /** Maximum delay between retries in milliseconds. */\n maxDelayMs: 30_000,\n /** Jitter factor (0-1) to randomize retry delays. */\n jitterFactor: 0.1,\n },\n\n /**\n * Workflow-specific retry defaults.\n */\n WORKFLOW_RETRY_DEFAULTS: {\n /** Maximum retry attempts for workflow steps. */\n maxRetries: 2,\n /** Base delay for workflow retries in milliseconds. */\n baseDelayMs: 2_000,\n /** Maximum delay for workflow retries in milliseconds. */\n maxDelayMs: 60_000,\n /** Jitter factor for workflow retries. */\n jitterFactor: 0.15,\n },\n\n /**\n * CLI-specific retry defaults.\n */\n CLI_RETRY_DEFAULTS: {\n /** Maximum retry attempts for CLI operations. */\n maxRetries: 2,\n /** Base delay for CLI retries in milliseconds. */\n baseDelayMs: 5_000,\n /** Maximum delay for CLI retries in milliseconds. */\n maxDelayMs: 60_000,\n /** Jitter factor for CLI retries. */\n jitterFactor: 0.2,\n },\n\n /**\n * Test framework retry defaults.\n */\n TEST_RETRY_DEFAULTS: {\n /** Maximum retries per test task. */\n maxRetries: 2,\n /** Whether to retry failed tasks by default. */\n retryFailedTasks: true,\n },\n\n /**\n * Default buffer sizing for batching and chunked processing.\n */\n BUFFER_DEFAULTS: {\n /** Preferred batch size for bulk operations. */\n batchSize: 100,\n /** Chunk size for streaming or segmented processing. */\n chunkSize: 256,\n /** Maximum items allowed in a buffer. */\n maxItems: 1_000,\n /** Maximum memory size in bytes (10 MB). */\n maxMemoryBytes: 10 * 1024 * 1024,\n /** Log buffer flush interval in milliseconds. */\n logFlushIntervalMs: 5_000,\n },\n\n // WORKER_DEFAULTS removed in #2977 — the eight settings under this category\n // (maxWorkers, poolSize, idleTimeoutMs, workflowMaxParallel, testParallelism,\n // evaluationMaxWorkers, eventBusMaxHistory, swarmObserverMaxEvents) had zero\n // production consumers. `getWorkerConfig()` was never called from anywhere\n // in src/, and the matching NEXUS_WORKERS_* env vars were silent no-ops.\n // Silent config rot is worse than missing knobs; re-add when a concrete\n // consumer exists.\n\n /**\n * Default circuit breaker settings.\n * (Source: Issue #81 - Circuit breaker for CLI failures)\n */\n CIRCUIT_BREAKER_DEFAULTS: {\n /** Failure threshold to open circuit. */\n failureThreshold: 5,\n /** Reset timeout in milliseconds. */\n resetTimeoutMs: 30_000,\n /** Success threshold to close circuit in half-open state. */\n halfOpenSuccessThreshold: 2,\n /** Whether to count timeouts as failures. */\n countTimeoutsAsFailures: true,\n /** Whether to count auth failures as failures. */\n countAuthFailuresAsFailures: false,\n /** Whether to count rate limit errors as failures (#1529). */\n countRateLimitsAsFailures: true,\n /** Maximum requests allowed in half-open state. */\n halfOpenMaxRequests: 3,\n },\n\n /**\n * Default context/memory settings.\n */\n CONTEXT_DEFAULTS: {\n /** Maximum context tokens. */\n maxTokens: 100_000,\n /** Token budget warning threshold (80%). */\n warningThreshold: 0.8,\n /** Token budget critical threshold (95%). */\n criticalThreshold: 0.95,\n /** Maximum history entries to retain. */\n maxHistoryEntries: 1_000,\n },\n\n /**\n * Default provider/model settings.\n */\n PROVIDER_DEFAULTS: {\n /** Default timeout for provider API calls in ms. */\n timeout: 30_000,\n /** Maximum retries for provider requests. */\n maxRetries: 3,\n /** Default model tier. */\n defaultTier: 'balanced' as const,\n /** Default temperature. */\n temperatureDefault: 0.3,\n /** Minimum temperature. */\n temperatureMin: 0,\n /** Maximum temperature. */\n temperatureMax: 1,\n /** Billing mode: 'plan' (monthly subscription) or 'api' (pay-per-token). Env: NEXUS_BILLING_MODE */\n billingMode: 'plan' as const,\n },\n\n /**\n * Security-related defaults.\n */\n SECURITY_DEFAULTS: {\n /** Maximum system prompt length in characters. */\n maxSystemPromptLength: 4_000,\n /** Default policy execution mode. */\n policyDefaultMode: 'read-only' as const,\n /** Default policy mode. */\n policyMode: 'enforce' as const,\n /** Default sandbox mode. */\n sandboxMode: 'policy' as const,\n /** Whether to fall back to policy mode if container unavailable. */\n sandboxFallbackToPolicy: true,\n /** Whether network is enabled in container mode. */\n sandboxNetworkEnabled: false,\n },\n} as const;\n\n// ============================================================================\n// Type Exports for DEFAULTS\n// ============================================================================\n\n/** Type for the DEFAULTS object (readonly/const). */\nexport type DefaultsConfig = typeof DEFAULTS;\n\n/** Type for timeout defaults (readonly/const). */\nexport type TimeoutDefaultsConst = typeof DEFAULTS.TIMEOUT_DEFAULTS;\n\n/** Type for rate limit defaults (readonly/const). */\nexport type RateLimitDefaultsConst = typeof DEFAULTS.RATE_LIMIT_DEFAULTS;\n\n/** Type for retry defaults (readonly/const). */\nexport type RetryDefaultsConst = typeof DEFAULTS.RETRY_DEFAULTS;\n\n/** Type for buffer defaults (readonly/const). */\nexport type BufferDefaults = typeof DEFAULTS.BUFFER_DEFAULTS;\n\n/** Type for circuit breaker defaults (readonly/const). */\nexport type CircuitBreakerDefaultsConst = typeof DEFAULTS.CIRCUIT_BREAKER_DEFAULTS;\n\n/** Type for context defaults (readonly/const). */\nexport type ContextDefaults = typeof DEFAULTS.CONTEXT_DEFAULTS;\n\n/** Type for provider defaults (readonly/const). */\nexport type ProviderDefaults = typeof DEFAULTS.PROVIDER_DEFAULTS;\n\n/** Type for security defaults (readonly/const). */\nexport type SecurityDefaults = typeof DEFAULTS.SECURITY_DEFAULTS;\n\n// ============================================================================\n// Environment Override Functions (bound to DEFAULTS)\n// ============================================================================\n\n/**\n * Get timeout with environment override support.\n *\n * @param key - Timeout key (e.g., 'cliMs', 'apiMs')\n * @returns Timeout value in milliseconds\n */\nexport const getTimeout = createGetTimeout(DEFAULTS.TIMEOUT_DEFAULTS);\n\n/**\n * Get retry config with environment override support.\n *\n * @returns Retry configuration\n */\nexport const getRetryConfig = createGetRetryConfig(DEFAULTS.RETRY_DEFAULTS);\n\n/**\n * Get rate limit config with environment override support.\n *\n * @returns Rate limit configuration\n */\nexport const getRateLimitConfig = createGetRateLimitConfig(DEFAULTS.RATE_LIMIT_DEFAULTS);\n\n/**\n * Gets the circuit breaker configuration.\n *\n * @returns Circuit breaker configuration\n */\nexport const getCircuitBreakerConfig = createGetCircuitBreakerConfig(\n DEFAULTS.CIRCUIT_BREAKER_DEFAULTS\n);\n\n/**\n * Gets the tool rate limit configuration for a specific tool category.\n *\n * @param tool - Tool category (orchestrate, delegate, workflow, expert)\n * @returns Rate limit configuration\n */\nexport const getToolRateLimit = createGetToolRateLimit(DEFAULTS.TOOL_RATE_LIMITS);\n\n// ============================================================================\n// Documentation Helper\n// ============================================================================\n\n/**\n * Returns documentation for all environment variable overrides.\n *\n * @returns Markdown documentation string\n */\nexport const getEnvVarDocumentation = createGetEnvVarDocumentation(DEFAULTS);\n"],"mappings":";;;;;;;;;;;;;;;;;;AA+FO,IAAM,2BAA2B;AASjC,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtB,kBAAkB;AAAA;AAAA,IAEhB,OAAO,aAAK,QAAQ;AAAA;AAAA,IAEpB,aAAa,aAAK,QAAQ;AAAA;AAAA,IAE1B,cAAc,aAAK,QAAQ;AAAA;AAAA,IAE3B,OAAO,aAAK;AAAA;AAAA,IAEZ,UAAU,aAAK;AAAA;AAAA,IAEf,YAAY,kBAAI;AAAA;AAAA,IAEhB,eAAe,kBAAI;AAAA;AAAA,IAEnB,QAAQ,kBAAK;AAAA;AAAA,IAEb,OAAO,aAAK;AAAA;AAAA,IAEZ,UAAU,aAAK;AAAA;AAAA,IAEf,eAAe,kBAAK;AAAA;AAAA,IAEpB,cAAc,cAAM;AAAA;AAAA,IAEpB,YAAY,cAAM;AAAA;AAAA,IAElB,uBAAuB,kBAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB;AAAA;AAAA,IAEnB,mBAAmB;AAAA;AAAA,IAEnB,SAAS;AAAA;AAAA,IAET,eAAe;AAAA;AAAA,IAEf,UAAU;AAAA;AAAA,IAEV,YAAY;AAAA;AAAA,IAEZ,kBAAkB;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB;AAAA,IAChB,aAAa,EAAE,UAAU,IAAI,YAAY,IAAI,kBAAkB,IAAO;AAAA,IACtE,UAAU,EAAE,UAAU,IAAI,YAAY,IAAI,kBAAkB,IAAO;AAAA,IACnE,UAAU,EAAE,UAAU,GAAG,YAAY,GAAG,kBAAkB,IAAO;AAAA,IACjE,QAAQ,EAAE,UAAU,IAAI,YAAY,IAAI,kBAAkB,IAAO;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AAAA;AAAA,IAEd,YAAY;AAAA;AAAA,IAEZ,aAAa;AAAA;AAAA,IAEb,YAAY;AAAA;AAAA,IAEZ,cAAc;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB;AAAA;AAAA,IAEvB,YAAY;AAAA;AAAA,IAEZ,aAAa;AAAA;AAAA,IAEb,YAAY;AAAA;AAAA,IAEZ,cAAc;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB;AAAA;AAAA,IAElB,YAAY;AAAA;AAAA,IAEZ,aAAa;AAAA;AAAA,IAEb,YAAY;AAAA;AAAA,IAEZ,cAAc;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB;AAAA;AAAA,IAEnB,YAAY;AAAA;AAAA,IAEZ,kBAAkB;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AAAA;AAAA,IAEf,WAAW;AAAA;AAAA,IAEX,WAAW;AAAA;AAAA,IAEX,UAAU;AAAA;AAAA,IAEV,gBAAgB,KAAK,OAAO;AAAA;AAAA,IAE5B,oBAAoB;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,0BAA0B;AAAA;AAAA,IAExB,kBAAkB;AAAA;AAAA,IAElB,gBAAgB;AAAA;AAAA,IAEhB,0BAA0B;AAAA;AAAA,IAE1B,yBAAyB;AAAA;AAAA,IAEzB,6BAA6B;AAAA;AAAA,IAE7B,2BAA2B;AAAA;AAAA,IAE3B,qBAAqB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB;AAAA;AAAA,IAEhB,WAAW;AAAA;AAAA,IAEX,kBAAkB;AAAA;AAAA,IAElB,mBAAmB;AAAA;AAAA,IAEnB,mBAAmB;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB;AAAA;AAAA,IAEjB,SAAS;AAAA;AAAA,IAET,YAAY;AAAA;AAAA,IAEZ,aAAa;AAAA;AAAA,IAEb,oBAAoB;AAAA;AAAA,IAEpB,gBAAgB;AAAA;AAAA,IAEhB,gBAAgB;AAAA;AAAA,IAEhB,aAAa;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB;AAAA;AAAA,IAEjB,uBAAuB;AAAA;AAAA,IAEvB,mBAAmB;AAAA;AAAA,IAEnB,YAAY;AAAA;AAAA,IAEZ,aAAa;AAAA;AAAA,IAEb,yBAAyB;AAAA;AAAA,IAEzB,uBAAuB;AAAA,EACzB;AACF;AA2CO,IAAM,aAAa,iBAAiB,SAAS,gBAAgB;AAO7D,IAAM,iBAAiB,qBAAqB,SAAS,cAAc;AAOnE,IAAM,qBAAqB,yBAAyB,SAAS,mBAAmB;AAOhF,IAAM,0BAA0B;AAAA,EACrC,SAAS;AACX;AAQO,IAAM,mBAAmB,uBAAuB,SAAS,gBAAgB;AAWzE,IAAM,yBAAyB,6BAA6B,QAAQ;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createLogger
3
- } from "./chunk-W5I6L4UT.js";
3
+ } from "./chunk-HKISF2E7.js";
4
4
 
5
5
  // src/config/available-models-cache.ts
6
6
  var logger = createLogger({ component: "available-models-cache" });
@@ -150,4 +150,4 @@ export {
150
150
  getDefaultAvailableModelsCache,
151
151
  setDefaultAvailableModelsCache
152
152
  };
153
- //# sourceMappingURL=chunk-6Q33PBXC.js.map
153
+ //# sourceMappingURL=chunk-57OH2O2U.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runConfigInitSync
3
- } from "./chunk-2SMTCNXP.js";
3
+ } from "./chunk-2T4NV6QT.js";
4
4
  import {
5
5
  VERSION,
6
6
  checkApiKeys,
@@ -8,10 +8,10 @@ import {
8
8
  checkSqlite,
9
9
  defaultConfig,
10
10
  initDataDirectories
11
- } from "./chunk-MZFWRU6E.js";
11
+ } from "./chunk-SHSKW5ML.js";
12
12
  import {
13
13
  probeAllClis
14
- } from "./chunk-X5BQF6HM.js";
14
+ } from "./chunk-BHA6V7GK.js";
15
15
  import {
16
16
  BUILT_IN_EXPERTS
17
17
  } from "./chunk-ZM4O442V.js";
@@ -25,7 +25,7 @@ import {
25
25
  getErrorMessage,
26
26
  getTimeProvider,
27
27
  symbols
28
- } from "./chunk-W5I6L4UT.js";
28
+ } from "./chunk-HKISF2E7.js";
29
29
  import {
30
30
  ensureGitignored,
31
31
  findRepoRoot
@@ -1987,4 +1987,4 @@ export {
1987
1987
  setupCommand,
1988
1988
  setupCommandAsync
1989
1989
  };
1990
- //# sourceMappingURL=chunk-VUVCSWMC.js.map
1990
+ //# sourceMappingURL=chunk-5BTRDVWC.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  OpenAIAdapter
3
- } from "./chunk-E6W4Z6GN.js";
3
+ } from "./chunk-BNHBZRU7.js";
4
4
  import {
5
5
  ConfigError,
6
6
  createLogger,
@@ -9,7 +9,7 @@ import {
9
9
  getTimeProvider,
10
10
  lookupInTreeCapability,
11
11
  ok
12
- } from "./chunk-W5I6L4UT.js";
12
+ } from "./chunk-HKISF2E7.js";
13
13
  import {
14
14
  getNexusDataDir
15
15
  } from "./chunk-CH7QIDHQ.js";
@@ -307,4 +307,4 @@ export {
307
307
  discoverModels,
308
308
  buildOpenAICompatAdapters
309
309
  };
310
- //# sourceMappingURL=chunk-TWAH7VM2.js.map
310
+ //# sourceMappingURL=chunk-AZP66FIA.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  CliCircuitBreaker,
3
3
  DEFAULT_CIRCUIT_BREAKER_CONFIG
4
- } from "./chunk-JYIKPBXW.js";
4
+ } from "./chunk-RTUZSR4R.js";
5
5
  import {
6
6
  generateHyphenId
7
- } from "./chunk-PRGNJRID.js";
7
+ } from "./chunk-SORBJPRA.js";
8
8
  import {
9
9
  CLI_SUBPROCESS_TIMEOUTS,
10
10
  CLI_TIMEOUTS,
@@ -27,7 +27,7 @@ import {
27
27
  getTimeProvider,
28
28
  isRateLimitText,
29
29
  ok
30
- } from "./chunk-W5I6L4UT.js";
30
+ } from "./chunk-HKISF2E7.js";
31
31
 
32
32
  // src/cli-adapters/subprocess-adapter.ts
33
33
  import { spawn } from "child_process";
@@ -3291,4 +3291,4 @@ export {
3291
3291
  isCliAvailable,
3292
3292
  getAvailableClis
3293
3293
  };
3294
- //# sourceMappingURL=chunk-X5BQF6HM.js.map
3294
+ //# sourceMappingURL=chunk-BHA6V7GK.js.map
@@ -3,14 +3,14 @@ import {
3
3
  createStream,
4
4
  requireApiKey,
5
5
  validateApiKeyPresence
6
- } from "./chunk-3FVSYMHK.js";
6
+ } from "./chunk-JEBWSHSU.js";
7
7
  import {
8
8
  ModelCapability,
9
9
  err,
10
10
  getCliModelName,
11
11
  getTokenEstimator,
12
12
  ok
13
- } from "./chunk-W5I6L4UT.js";
13
+ } from "./chunk-HKISF2E7.js";
14
14
 
15
15
  // src/adapters/openai-types.ts
16
16
  var OPENAI_MODELS = {
@@ -553,4 +553,4 @@ export {
553
553
  OpenAIAdapter,
554
554
  createOpenAIAdapter
555
555
  };
556
- //# sourceMappingURL=chunk-E6W4Z6GN.js.map
556
+ //# sourceMappingURL=chunk-BNHBZRU7.js.map
@@ -3,7 +3,7 @@ import {
3
3
  err,
4
4
  getErrorMessage,
5
5
  ok
6
- } from "./chunk-W5I6L4UT.js";
6
+ } from "./chunk-HKISF2E7.js";
7
7
 
8
8
  // src/scm/types.ts
9
9
  var ScmError = class extends Error {
@@ -258,4 +258,4 @@ export {
258
258
  ScmError,
259
259
  GitHubProvider
260
260
  };
261
- //# sourceMappingURL=chunk-EFHZHCF2.js.map
261
+ //# sourceMappingURL=chunk-CPH6LKXO.js.map
@@ -2,7 +2,7 @@ import {
2
2
  CACHE_TIMEOUTS,
3
3
  createLogger,
4
4
  getTimeProvider
5
- } from "./chunk-W5I6L4UT.js";
5
+ } from "./chunk-HKISF2E7.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-27CNQPQ4.js.map
563
+ //# sourceMappingURL=chunk-DTFMYM3V.js.map
@@ -2,7 +2,7 @@ import {
2
2
  TASK_CATEGORIES,
3
3
  getAdaptiveBonus,
4
4
  getOutcomeStore
5
- } from "./chunk-W5I6L4UT.js";
5
+ } from "./chunk-HKISF2E7.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-AQTHLUCP.js.map
109
+ //# sourceMappingURL=chunk-E3QWWP67.js.map
@@ -5,13 +5,13 @@ import {
5
5
  } from "./chunk-6T3EPABN.js";
6
6
  import {
7
7
  generateId
8
- } from "./chunk-PRGNJRID.js";
8
+ } from "./chunk-SORBJPRA.js";
9
9
  import {
10
10
  getMemoryRegistry
11
11
  } from "./chunk-PQHVC4BD.js";
12
12
  import {
13
13
  SessionMemory
14
- } from "./chunk-YEQE7WLP.js";
14
+ } from "./chunk-JCETWDU7.js";
15
15
  import {
16
16
  ErrorCode,
17
17
  NexusError,
@@ -24,7 +24,7 @@ import {
24
24
  getTimeProvider,
25
25
  ok,
26
26
  setSharedMobiMemDbPathResolver
27
- } from "./chunk-W5I6L4UT.js";
27
+ } from "./chunk-HKISF2E7.js";
28
28
  import {
29
29
  nexusDataPath
30
30
  } from "./chunk-CH7QIDHQ.js";
@@ -5612,4 +5612,4 @@ export {
5612
5612
  reinitializeMemoryBackends,
5613
5613
  ToolMemoryManager
5614
5614
  };
5615
- //# sourceMappingURL=chunk-7QXEK3O6.js.map
5615
+ //# sourceMappingURL=chunk-FTCU55O6.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-EFHZHCF2.js";
4
+ } from "./chunk-CPH6LKXO.js";
5
5
  import {
6
6
  ROLE_DEFAULT_TRUST,
7
7
  ReputationCache,
@@ -11,13 +11,13 @@ import {
11
11
  gateWithReputation,
12
12
  resolveReputationGatingMode,
13
13
  sanitizeInput
14
- } from "./chunk-27CNQPQ4.js";
14
+ } from "./chunk-DTFMYM3V.js";
15
15
  import {
16
16
  createLogger,
17
17
  err,
18
18
  getTimeProvider,
19
19
  ok
20
- } from "./chunk-W5I6L4UT.js";
20
+ } from "./chunk-HKISF2E7.js";
21
21
 
22
22
  // src/security/trust-classifier.ts
23
23
  function mapAuthorAssociation(association) {
@@ -257,6 +257,9 @@ function requiresCitation(actionType) {
257
257
  var MAX_EVENTS = 1e4;
258
258
  var MAX_STRIPPED_ELEMENTS_PER_EVENT = 20;
259
259
  var AuditTrail = class {
260
+ constructor(durableSink) {
261
+ this.durableSink = durableSink;
262
+ }
260
263
  events = [];
261
264
  nextId = 1;
262
265
  /** Appends an event to the trail. Returns the assigned event ID. */
@@ -269,6 +272,12 @@ var AuditTrail = class {
269
272
  };
270
273
  this.events.push(fullEvent);
271
274
  this.enforceLimit();
275
+ if (this.durableSink !== void 0) {
276
+ try {
277
+ this.durableSink(fullEvent);
278
+ } catch {
279
+ }
280
+ }
272
281
  return id;
273
282
  }
274
283
  /** Queries events matching the given filter. */
@@ -392,8 +401,8 @@ function formatGraphEventDetail(event) {
392
401
  return event.type;
393
402
  }
394
403
  }
395
- function createAuditTrail() {
396
- return new AuditTrail();
404
+ function createAuditTrail(durableSink) {
405
+ return new AuditTrail(durableSink);
397
406
  }
398
407
 
399
408
  // src/security/policy-gate.ts
@@ -1359,4 +1368,4 @@ export {
1359
1368
  IssueTriage,
1360
1369
  createIssueTriage
1361
1370
  };
1362
- //# sourceMappingURL=chunk-IHPYT6WU.js.map
1371
+ //# sourceMappingURL=chunk-G5IDRWWI.js.map