nexus-agents 2.29.0 → 2.29.2

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 (112) hide show
  1. package/dist/adaptive-memory-5VP5WWTE.js +15 -0
  2. package/dist/chunk-5COIDGQJ.js +1585 -0
  3. package/dist/chunk-5COIDGQJ.js.map +1 -0
  4. package/dist/{chunk-HWDBNDUX.js → chunk-63AJLNKU.js} +2 -2
  5. package/dist/chunk-66NNHMVB.js +195 -0
  6. package/dist/chunk-66NNHMVB.js.map +1 -0
  7. package/dist/chunk-AP2FD37C.js +127 -0
  8. package/dist/chunk-AP2FD37C.js.map +1 -0
  9. package/dist/chunk-BC3M4VLP.js +359 -0
  10. package/dist/chunk-BC3M4VLP.js.map +1 -0
  11. package/dist/chunk-BQ4YXGGQ.js +127 -0
  12. package/dist/chunk-BQ4YXGGQ.js.map +1 -0
  13. package/dist/{chunk-ZBZJHXRT.js → chunk-CW2Z773T.js} +19 -347
  14. package/dist/chunk-CW2Z773T.js.map +1 -0
  15. package/dist/chunk-DDQGAVQA.js +944 -0
  16. package/dist/chunk-DDQGAVQA.js.map +1 -0
  17. package/dist/chunk-ED6VQWNG.js +63 -0
  18. package/dist/chunk-ED6VQWNG.js.map +1 -0
  19. package/dist/{chunk-7F6HYUIY.js → chunk-EPMBGZQX.js} +16 -97
  20. package/dist/chunk-EPMBGZQX.js.map +1 -0
  21. package/dist/chunk-GX436VRU.js +931 -0
  22. package/dist/chunk-GX436VRU.js.map +1 -0
  23. package/dist/{chunk-IMWYKX4H.js → chunk-HSOPD265.js} +444 -399
  24. package/dist/chunk-HSOPD265.js.map +1 -0
  25. package/dist/{chunk-S3BKWNST.js → chunk-J245RJGW.js} +680 -1436
  26. package/dist/chunk-J245RJGW.js.map +1 -0
  27. package/dist/{chunk-I6YDS23R.js → chunk-KQIDTE52.js} +2 -2
  28. package/dist/{chunk-POBO4G2P.js → chunk-LDIN2PLV.js} +250 -110
  29. package/dist/chunk-LDIN2PLV.js.map +1 -0
  30. package/dist/{chunk-KGDG6PWZ.js → chunk-LKDHAJJB.js} +2 -2
  31. package/dist/{chunk-T7PU3NPQ.js → chunk-NKGTEJYU.js} +7 -5
  32. package/dist/{chunk-T7PU3NPQ.js.map → chunk-NKGTEJYU.js.map} +1 -1
  33. package/dist/chunk-QGODFK36.js +122 -0
  34. package/dist/chunk-QGODFK36.js.map +1 -0
  35. package/dist/{chunk-DAMRMAM2.js → chunk-QSNAFOE6.js} +12369 -14499
  36. package/dist/chunk-QSNAFOE6.js.map +1 -0
  37. package/dist/chunk-TL2GJMJ5.js +700 -0
  38. package/dist/chunk-TL2GJMJ5.js.map +1 -0
  39. package/dist/{chunk-WSK4VSXP.js → chunk-V6MSPUQF.js} +2 -2
  40. package/dist/chunk-VZ2YOQWU.js +90 -0
  41. package/dist/chunk-VZ2YOQWU.js.map +1 -0
  42. package/dist/{chunk-5VZLXMO7.js → chunk-WSYJN7BI.js} +7 -6
  43. package/dist/chunk-WSYJN7BI.js.map +1 -0
  44. package/dist/chunk-Y477EGI4.js +356 -0
  45. package/dist/chunk-Y477EGI4.js.map +1 -0
  46. package/dist/{chunk-HH5LVGEE.js → chunk-Z4OZ25VS.js} +4 -4
  47. package/dist/cli-circuit-breaker-6EJO3PPU.js +13 -0
  48. package/dist/cli.js +123 -68
  49. package/dist/cli.js.map +1 -1
  50. package/dist/codebase-search-CZUA37RU.js +9 -0
  51. package/dist/{composite-router-YPRWVTRB.js → composite-router-JD7URTC2.js} +2 -2
  52. package/dist/{consensus-vote-DBE6RNZG.js → consensus-vote-COW34Q2Y.js} +7 -5
  53. package/dist/{dist-7PQR2BQB.js → dist-CV74KUT7.js} +1302 -805
  54. package/dist/dist-CV74KUT7.js.map +1 -0
  55. package/dist/{doctor-deep-AWE7SRU6.js → doctor-deep-4A4X5X6U.js} +3 -3
  56. package/dist/expert-bridge-J36C7VES.js +10 -0
  57. package/dist/{expert-config-FHNBQRX2.js → expert-config-MQ5OJE3U.js} +2 -2
  58. package/dist/{factory-O5C7ZBZO.js → factory-4Z4RSUYE.js} +5 -4
  59. package/dist/{factory-PCHGQ3ZG.js → factory-NHORX63J.js} +4 -3
  60. package/dist/index.d.ts +507 -42
  61. package/dist/index.js +331 -78
  62. package/dist/index.js.map +1 -1
  63. package/dist/issue-triage-TIG3RKXF.js +15 -0
  64. package/dist/{mcp-config-AUZQPUBY.js → mcp-config-ETY7GFGW.js} +3 -3
  65. package/dist/mobimem-5PAAMVFR.js +13 -0
  66. package/dist/mobimem-5PAAMVFR.js.map +1 -0
  67. package/dist/repo-analyze-HWMXSK5C.js +24 -0
  68. package/dist/repo-analyze-HWMXSK5C.js.map +1 -0
  69. package/dist/repo-security-plan-KQB3ZJTE.js +17 -0
  70. package/dist/repo-security-plan-KQB3ZJTE.js.map +1 -0
  71. package/dist/research-helpers-synthesize-ZMERZZ5B.js +10 -0
  72. package/dist/research-helpers-synthesize-ZMERZZ5B.js.map +1 -0
  73. package/dist/{routing-memory-QY3XMU2R.js → routing-memory-3ES3OHLM.js} +2 -2
  74. package/dist/routing-memory-3ES3OHLM.js.map +1 -0
  75. package/dist/{session-memory-3MBCE5KS.js → session-memory-E2OE2CYR.js} +3 -3
  76. package/dist/session-memory-E2OE2CYR.js.map +1 -0
  77. package/dist/{setup-command-IQ4MD3FT.js → setup-command-CMCQRBJF.js} +7 -6
  78. package/dist/setup-command-CMCQRBJF.js.map +1 -0
  79. package/dist/{setup-config-5YUPLDXF.js → setup-config-KITOPV7V.js} +3 -3
  80. package/dist/setup-config-KITOPV7V.js.map +1 -0
  81. package/dist/shared-memory-AEO2HJLC.js +8 -0
  82. package/dist/shared-memory-AEO2HJLC.js.map +1 -0
  83. package/dist/symbol-extractor-UEBANFSN.js +10 -0
  84. package/dist/symbol-extractor-UEBANFSN.js.map +1 -0
  85. package/dist/{weather-report-CC2C4KAX.js → weather-report-KUSVNXDZ.js} +2 -2
  86. package/dist/weather-report-KUSVNXDZ.js.map +1 -0
  87. package/package.json +14 -13
  88. package/dist/chunk-5VZLXMO7.js.map +0 -1
  89. package/dist/chunk-7F6HYUIY.js.map +0 -1
  90. package/dist/chunk-DAMRMAM2.js.map +0 -1
  91. package/dist/chunk-IMWYKX4H.js.map +0 -1
  92. package/dist/chunk-POBO4G2P.js.map +0 -1
  93. package/dist/chunk-S3BKWNST.js.map +0 -1
  94. package/dist/chunk-ZBZJHXRT.js.map +0 -1
  95. package/dist/dist-7PQR2BQB.js.map +0 -1
  96. /package/dist/{composite-router-YPRWVTRB.js.map → adaptive-memory-5VP5WWTE.js.map} +0 -0
  97. /package/dist/{chunk-HWDBNDUX.js.map → chunk-63AJLNKU.js.map} +0 -0
  98. /package/dist/{chunk-I6YDS23R.js.map → chunk-KQIDTE52.js.map} +0 -0
  99. /package/dist/{chunk-KGDG6PWZ.js.map → chunk-LKDHAJJB.js.map} +0 -0
  100. /package/dist/{chunk-WSK4VSXP.js.map → chunk-V6MSPUQF.js.map} +0 -0
  101. /package/dist/{chunk-HH5LVGEE.js.map → chunk-Z4OZ25VS.js.map} +0 -0
  102. /package/dist/{consensus-vote-DBE6RNZG.js.map → cli-circuit-breaker-6EJO3PPU.js.map} +0 -0
  103. /package/dist/{doctor-deep-AWE7SRU6.js.map → codebase-search-CZUA37RU.js.map} +0 -0
  104. /package/dist/{expert-config-FHNBQRX2.js.map → composite-router-JD7URTC2.js.map} +0 -0
  105. /package/dist/{factory-O5C7ZBZO.js.map → consensus-vote-COW34Q2Y.js.map} +0 -0
  106. /package/dist/{factory-PCHGQ3ZG.js.map → doctor-deep-4A4X5X6U.js.map} +0 -0
  107. /package/dist/{mcp-config-AUZQPUBY.js.map → expert-bridge-J36C7VES.js.map} +0 -0
  108. /package/dist/{routing-memory-QY3XMU2R.js.map → expert-config-MQ5OJE3U.js.map} +0 -0
  109. /package/dist/{session-memory-3MBCE5KS.js.map → factory-4Z4RSUYE.js.map} +0 -0
  110. /package/dist/{setup-command-IQ4MD3FT.js.map → factory-NHORX63J.js.map} +0 -0
  111. /package/dist/{setup-config-5YUPLDXF.js.map → issue-triage-TIG3RKXF.js.map} +0 -0
  112. /package/dist/{weather-report-CC2C4KAX.js.map → mcp-config-ETY7GFGW.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createLogger
3
- } from "./chunk-IMWYKX4H.js";
3
+ } from "./chunk-HSOPD265.js";
4
4
 
5
5
  // src/swe-bench/mcp-config.ts
6
6
  import { writeFile, mkdtemp, rm } from "fs/promises";
@@ -58,4 +58,4 @@ export {
58
58
  generateMcpConfig,
59
59
  getDefaultAllowedTools
60
60
  };
61
- //# sourceMappingURL=chunk-KGDG6PWZ.js.map
61
+ //# sourceMappingURL=chunk-LKDHAJJB.js.map
@@ -1,12 +1,14 @@
1
1
  import {
2
- GitHubProvider,
3
- ScmError,
4
2
  resolveToken
5
- } from "./chunk-7F6HYUIY.js";
3
+ } from "./chunk-VZ2YOQWU.js";
4
+ import {
5
+ GitHubProvider,
6
+ ScmError
7
+ } from "./chunk-EPMBGZQX.js";
6
8
  import {
7
9
  err,
8
10
  ok
9
- } from "./chunk-IMWYKX4H.js";
11
+ } from "./chunk-HSOPD265.js";
10
12
 
11
13
  // src/scm/factory.ts
12
14
  async function createScmProvider(config) {
@@ -39,4 +41,4 @@ export {
39
41
  createScmProvider,
40
42
  createGitHubProvider
41
43
  };
42
- //# sourceMappingURL=chunk-T7PU3NPQ.js.map
44
+ //# sourceMappingURL=chunk-NKGTEJYU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/scm/factory.ts"],"sourcesContent":["/**\n * nexus-agents/scm - Provider Factory\n *\n * Creates IScmProvider instances based on platform and configuration.\n * Handles token resolution automatically.\n *\n * @module scm/factory\n * (Source: Issue #1136 — Centralized SCM Provider Module)\n */\n\nimport type { Result } from '../core/index.js';\nimport { ok, err } from '../core/index.js';\nimport type { IScmProvider, ScmPlatform, TokenResolverConfig } from './types.js';\nimport { ScmError } from './types.js';\nimport { GitHubProvider } from './github-provider.js';\nimport { resolveToken } from './token-resolver.js';\n\n/** Configuration for creating an SCM provider. */\nexport interface CreateScmProviderConfig {\n /** Repository in owner/repo format */\n readonly repo: string;\n /** SCM platform (default: github) */\n readonly platform?: ScmPlatform;\n /** Token configuration (env vars checked automatically if omitted) */\n readonly token?: TokenResolverConfig;\n}\n\n/**\n * Creates an SCM provider for the specified repository.\n *\n * Token resolution is automatic — checks env vars and CLI auth.\n * Currently supports GitHub (gh CLI). GitLab/Gitea planned.\n *\n * @param config - Provider configuration\n * @returns SCM provider instance or error\n *\n * @example\n * ```typescript\n * const result = await createScmProvider({ repo: 'owner/repo' });\n * if (!result.ok) { console.error(result.error); return; }\n * const issues = await result.value.listIssues();\n * ```\n */\nexport async function createScmProvider(\n config: CreateScmProviderConfig\n): Promise<Result<IScmProvider, ScmError>> {\n const platform = config.platform ?? 'github';\n\n // Validate token availability (best-effort — gh CLI may work without explicit token)\n const explicitToken = config.token?.token;\n const explicitEnvVar = config.token?.envVar;\n const tokenResult = await resolveToken({\n platform,\n ...(explicitToken !== undefined ? { token: explicitToken } : {}),\n ...(explicitEnvVar !== undefined ? { envVar: explicitEnvVar } : {}),\n });\n\n if (!tokenResult.ok) {\n // gh CLI may work without explicit token (uses stored auth)\n // Log warning but don't fail — the provider will fail on first use if auth is missing\n // This allows gh CLI users who haven't set GITHUB_TOKEN to still work\n }\n\n switch (platform) {\n case 'github':\n return ok(new GitHubProvider(config.repo));\n case 'gitlab':\n return err(new ScmError('GitLab provider not yet implemented', 'gitlab'));\n case 'gitea':\n return err(new ScmError('Gitea provider not yet implemented', 'gitea'));\n default:\n return err(new ScmError(`Unsupported platform: ${String(platform)}`, platform));\n }\n}\n\n/**\n * Creates a GitHub provider directly (convenience shortcut).\n *\n * @param repo - Repository in owner/repo format\n * @returns GitHub provider instance\n */\nexport function createGitHubProvider(repo: string): IScmProvider {\n return new GitHubProvider(repo);\n}\n"],"mappings":";;;;;;;;;;;AA2CA,eAAsB,kBACpB,QACyC;AACzC,QAAM,WAAW,OAAO,YAAY;AAGpC,QAAM,gBAAgB,OAAO,OAAO;AACpC,QAAM,iBAAiB,OAAO,OAAO;AACrC,QAAM,cAAc,MAAM,aAAa;AAAA,IACrC;AAAA,IACA,GAAI,kBAAkB,SAAY,EAAE,OAAO,cAAc,IAAI,CAAC;AAAA,IAC9D,GAAI,mBAAmB,SAAY,EAAE,QAAQ,eAAe,IAAI,CAAC;AAAA,EACnE,CAAC;AAED,MAAI,CAAC,YAAY,IAAI;AAAA,EAIrB;AAEA,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,GAAG,IAAI,eAAe,OAAO,IAAI,CAAC;AAAA,IAC3C,KAAK;AACH,aAAO,IAAI,IAAI,SAAS,uCAAuC,QAAQ,CAAC;AAAA,IAC1E,KAAK;AACH,aAAO,IAAI,IAAI,SAAS,sCAAsC,OAAO,CAAC;AAAA,IACxE;AACE,aAAO,IAAI,IAAI,SAAS,yBAAyB,OAAO,QAAQ,CAAC,IAAI,QAAQ,CAAC;AAAA,EAClF;AACF;AAQO,SAAS,qBAAqB,MAA4B;AAC/D,SAAO,IAAI,eAAe,IAAI;AAChC;","names":[]}
1
+ {"version":3,"sources":["../src/scm/factory.ts"],"sourcesContent":["/**\n * nexus-agents/scm - Provider Factory\n *\n * Creates IScmProvider instances based on platform and configuration.\n * Handles token resolution automatically.\n *\n * @module scm/factory\n * (Source: Issue #1136 — Centralized SCM Provider Module)\n */\n\nimport type { Result } from '../core/index.js';\nimport { ok, err } from '../core/index.js';\nimport type { IScmProvider, ScmPlatform, TokenResolverConfig } from './types.js';\nimport { ScmError } from './types.js';\nimport { GitHubProvider } from './github-provider.js';\nimport { resolveToken } from './token-resolver.js';\n\n/** Configuration for creating an SCM provider. */\nexport interface CreateScmProviderConfig {\n /** Repository in owner/repo format */\n readonly repo: string;\n /** SCM platform (default: github) */\n readonly platform?: ScmPlatform;\n /** Token configuration (env vars checked automatically if omitted) */\n readonly token?: TokenResolverConfig;\n}\n\n/**\n * Creates an SCM provider for the specified repository.\n *\n * Token resolution is automatic — checks env vars and CLI auth.\n * Currently supports GitHub (gh CLI). GitLab/Gitea planned.\n *\n * @param config - Provider configuration\n * @returns SCM provider instance or error\n *\n * @example\n * ```typescript\n * const result = await createScmProvider({ repo: 'owner/repo' });\n * if (!result.ok) { console.error(result.error); return; }\n * const issues = await result.value.listIssues();\n * ```\n */\nexport async function createScmProvider(\n config: CreateScmProviderConfig\n): Promise<Result<IScmProvider, ScmError>> {\n const platform = config.platform ?? 'github';\n\n // Validate token availability (best-effort — gh CLI may work without explicit token)\n const explicitToken = config.token?.token;\n const explicitEnvVar = config.token?.envVar;\n const tokenResult = await resolveToken({\n platform,\n ...(explicitToken !== undefined ? { token: explicitToken } : {}),\n ...(explicitEnvVar !== undefined ? { envVar: explicitEnvVar } : {}),\n });\n\n if (!tokenResult.ok) {\n // gh CLI may work without explicit token (uses stored auth)\n // Log warning but don't fail — the provider will fail on first use if auth is missing\n // This allows gh CLI users who haven't set GITHUB_TOKEN to still work\n }\n\n switch (platform) {\n case 'github':\n return ok(new GitHubProvider(config.repo));\n case 'gitlab':\n return err(new ScmError('GitLab provider not yet implemented', 'gitlab'));\n case 'gitea':\n return err(new ScmError('Gitea provider not yet implemented', 'gitea'));\n default:\n return err(new ScmError(`Unsupported platform: ${String(platform)}`, platform));\n }\n}\n\n/**\n * Creates a GitHub provider directly (convenience shortcut).\n *\n * @param repo - Repository in owner/repo format\n * @returns GitHub provider instance\n */\nexport function createGitHubProvider(repo: string): IScmProvider {\n return new GitHubProvider(repo);\n}\n"],"mappings":";;;;;;;;;;;;;AA2CA,eAAsB,kBACpB,QACyC;AACzC,QAAM,WAAW,OAAO,YAAY;AAGpC,QAAM,gBAAgB,OAAO,OAAO;AACpC,QAAM,iBAAiB,OAAO,OAAO;AACrC,QAAM,cAAc,MAAM,aAAa;AAAA,IACrC;AAAA,IACA,GAAI,kBAAkB,SAAY,EAAE,OAAO,cAAc,IAAI,CAAC;AAAA,IAC9D,GAAI,mBAAmB,SAAY,EAAE,QAAQ,eAAe,IAAI,CAAC;AAAA,EACnE,CAAC;AAED,MAAI,CAAC,YAAY,IAAI;AAAA,EAIrB;AAEA,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,GAAG,IAAI,eAAe,OAAO,IAAI,CAAC;AAAA,IAC3C,KAAK;AACH,aAAO,IAAI,IAAI,SAAS,uCAAuC,QAAQ,CAAC;AAAA,IAC1E,KAAK;AACH,aAAO,IAAI,IAAI,SAAS,sCAAsC,OAAO,CAAC;AAAA,IACxE;AACE,aAAO,IAAI,IAAI,SAAS,yBAAyB,OAAO,QAAQ,CAAC,IAAI,QAAQ,CAAC;AAAA,EAClF;AACF;AAQO,SAAS,qBAAqB,MAA4B;AAC/D,SAAO,IAAI,eAAe,IAAI;AAChC;","names":[]}
@@ -0,0 +1,122 @@
1
+ import {
2
+ createLogger,
3
+ getTimeProvider,
4
+ isRateLimitText
5
+ } from "./chunk-HSOPD265.js";
6
+
7
+ // src/pipeline/expert-bridge.ts
8
+ var logger = createLogger({ component: "expert-bridge" });
9
+ var RATE_LIMIT_BASE_DELAY_MS = 3e3;
10
+ var cachedRouter = null;
11
+ var cachedMcpConfigPath = null;
12
+ async function getMcpConfigPath() {
13
+ if (cachedMcpConfigPath !== null) return cachedMcpConfigPath;
14
+ try {
15
+ const { generateMcpConfig } = await import("./mcp-config-ETY7GFGW.js");
16
+ const config = await generateMcpConfig();
17
+ cachedMcpConfigPath = config.configPath;
18
+ return cachedMcpConfigPath;
19
+ } catch {
20
+ return null;
21
+ }
22
+ }
23
+ var cachedCircuitBreaker = null;
24
+ async function getRouter() {
25
+ if (cachedRouter !== null) return cachedRouter;
26
+ const { createAllAdapters } = await import("./factory-NHORX63J.js");
27
+ const { createCompositeRouter } = await import("./composite-router-JD7URTC2.js");
28
+ const adapters = createAllAdapters();
29
+ if (adapters.size === 0) return null;
30
+ cachedRouter = createCompositeRouter(adapters);
31
+ try {
32
+ const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-6EJO3PPU.js");
33
+ cachedCircuitBreaker = createCliCircuitBreakerIntegration([...adapters.values()]);
34
+ } catch {
35
+ }
36
+ return cachedRouter;
37
+ }
38
+ function checkCircuitHealth() {
39
+ if (cachedCircuitBreaker === null) return { healthy: true, message: "" };
40
+ const status = cachedCircuitBreaker.getHealthStatus();
41
+ if (!status.systemHealthy) {
42
+ return {
43
+ healthy: false,
44
+ message: `All CLI circuits open (${String(status.healthyCount)}/${String(status.clis.length)} healthy)`
45
+ };
46
+ }
47
+ return { healthy: true, message: "" };
48
+ }
49
+ async function dispatchWithRateLimitRetry(router, task, expertType, start) {
50
+ const maxAttempts = 3;
51
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
52
+ const result = await router.executeTask(task);
53
+ const durationMs = getTimeProvider().now() - start;
54
+ if (result.ok) {
55
+ logger.info("Expert executed successfully", { expertType, durationMs });
56
+ return { success: true, text: result.value.text, expertType, durationMs };
57
+ }
58
+ const isRateLimit = isRateLimitText(result.error.message);
59
+ if (isRateLimit && attempt < maxAttempts - 1) {
60
+ const backoffMs = RATE_LIMIT_BASE_DELAY_MS * (attempt + 1);
61
+ logger.warn("Expert rate limited, retrying", { expertType, attempt: attempt + 1, backoffMs });
62
+ await new Promise((resolve) => setTimeout(resolve, backoffMs));
63
+ continue;
64
+ }
65
+ logger.warn("Expert execution failed", { expertType, error: result.error.message });
66
+ return { success: false, text: "", expertType, durationMs, error: result.error.message };
67
+ }
68
+ return {
69
+ success: false,
70
+ text: "",
71
+ expertType,
72
+ durationMs: getTimeProvider().now() - start,
73
+ error: "Max retry attempts exceeded"
74
+ };
75
+ }
76
+ async function executeExpert(expertType, prompt) {
77
+ const start = getTimeProvider().now();
78
+ try {
79
+ const { BUILT_IN_EXPERTS } = await import("./expert-config-MQ5OJE3U.js");
80
+ const config = BUILT_IN_EXPERTS[expertType];
81
+ const fullPrompt = `${config.systemPrompt}
82
+
83
+ ${prompt}`;
84
+ const router = await getRouter();
85
+ if (router === null) {
86
+ return {
87
+ success: false,
88
+ text: `[No adapters] ${prompt}`,
89
+ expertType,
90
+ durationMs: getTimeProvider().now() - start,
91
+ error: "No CLI adapters available"
92
+ };
93
+ }
94
+ const health = checkCircuitHealth();
95
+ if (!health.healthy) {
96
+ logger.warn("Circuit breaker: all CLIs unavailable", { expertType, reason: health.message });
97
+ return {
98
+ success: false,
99
+ text: "",
100
+ expertType,
101
+ durationMs: getTimeProvider().now() - start,
102
+ error: health.message
103
+ };
104
+ }
105
+ const mcpConfigPath = await getMcpConfigPath();
106
+ const task = {
107
+ content: fullPrompt
108
+ };
109
+ if (mcpConfigPath !== null) task.options = { mcpConfigPath };
110
+ return await dispatchWithRateLimitRetry(router, task, expertType, start);
111
+ } catch (error) {
112
+ const durationMs = getTimeProvider().now() - start;
113
+ const msg = error instanceof Error ? error.message : String(error);
114
+ logger.warn("Expert bridge error", { expertType, error: msg });
115
+ return { success: false, text: "", expertType, durationMs, error: msg };
116
+ }
117
+ }
118
+
119
+ export {
120
+ executeExpert
121
+ };
122
+ //# sourceMappingURL=chunk-QGODFK36.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pipeline/expert-bridge.ts"],"sourcesContent":["/**\n * Expert Bridge — Programmatic access to the execute_expert pipeline (#1693)\n *\n * Provides a clean wrapper for calling experts with the full pipeline:\n * timeout, fallback cascade, degradation detection, heartbeat, outcome recording.\n *\n * DRY: reuses createBuiltInExpert + CompositeRouter instead of reimplementing.\n *\n * @module pipeline/expert-bridge\n */\n\nimport { createLogger, getTimeProvider } from '../core/index.js';\nimport type { BuiltInExpertType } from '../agents/experts/expert-config.js';\nimport { isRateLimitText } from '../adapters/rate-limit-detector.js';\n\nconst logger = createLogger({ component: 'expert-bridge' });\n\n/** Base delay for rate limit retry backoff (ms). Scales linearly: 3s, 6s, 9s. */\nconst RATE_LIMIT_BASE_DELAY_MS = 3000;\n\n/** Result of an expert execution. */\nexport interface ExpertBridgeResult {\n readonly success: boolean;\n readonly text: string;\n readonly expertType: BuiltInExpertType;\n readonly durationMs: number;\n readonly error?: string;\n}\n\n/**\n * Execute an expert task with the full nexus-agents expert pipeline.\n *\n * Creates a built-in expert, executes via CompositeRouter (for intelligent\n * CLI routing), and records outcomes. Falls back gracefully on failure.\n *\n * @param expertType - Built-in expert type (code, architecture, security, qa, etc.)\n * @param prompt - Task prompt for the expert\n * @returns Expert result with text output\n */\n/** Minimal router interface for the bridge. */\ninterface RouterLike {\n executeTask(task: {\n content: string;\n options?: Record<string, unknown> | undefined;\n }): Promise<{ ok: boolean; value: { text: string }; error: { message: string } }>;\n}\n\n// Cached router — lazily initialized, reused across calls within a session\nlet cachedRouter: RouterLike | null = null;\n\n// Cached MCP config — generated once, reused across expert calls (#1708)\nlet cachedMcpConfigPath: string | null = null;\n\n/** Get or create cached MCP config path for expert CLI sessions (#1708). */\nasync function getMcpConfigPath(): Promise<string | null> {\n if (cachedMcpConfigPath !== null) return cachedMcpConfigPath;\n try {\n const { generateMcpConfig } = await import('../swe-bench/mcp-config.js');\n const config = await generateMcpConfig();\n cachedMcpConfigPath = config.configPath;\n return cachedMcpConfigPath;\n } catch {\n return null; // MCP config not available — experts run without tools\n }\n}\n\n/** Cached circuit breaker for health monitoring (#1766). */\nlet cachedCircuitBreaker: {\n getHealthStatus(): {\n systemHealthy: boolean;\n healthyCount: number;\n clis: ReadonlyArray<{ name: string; healthy: boolean }>;\n };\n} | null = null;\n\n/** Get or create a cached CompositeRouter with circuit breaker monitoring. */\nasync function getRouter(): Promise<RouterLike | null> {\n if (cachedRouter !== null) return cachedRouter;\n const { createAllAdapters } = await import('../cli-adapters/factory.js');\n const { createCompositeRouter } = await import('../cli-adapters/composite-router.js');\n const adapters = createAllAdapters();\n if (adapters.size === 0) return null;\n cachedRouter = createCompositeRouter(adapters) as unknown as RouterLike;\n\n // Initialize circuit breaker monitoring (#1766)\n try {\n const { createCliCircuitBreakerIntegration } =\n await import('../cli-adapters/cli-circuit-breaker.js');\n cachedCircuitBreaker = createCliCircuitBreakerIntegration([...adapters.values()]);\n } catch {\n // Circuit breaker not available — continue without it\n }\n\n return cachedRouter;\n}\n\n/** Check CLI health before dispatch (#1766). */\nfunction checkCircuitHealth(): { healthy: boolean; message: string } {\n if (cachedCircuitBreaker === null) return { healthy: true, message: '' };\n const status = cachedCircuitBreaker.getHealthStatus();\n if (!status.systemHealthy) {\n return {\n healthy: false,\n message: `All CLI circuits open (${String(status.healthyCount)}/${String(status.clis.length)} healthy)`,\n };\n }\n return { healthy: true, message: '' };\n}\n\n/** Dispatch task to router with rate limit retry (#1802). */\nasync function dispatchWithRateLimitRetry(\n router: RouterLike,\n task: { content: string; options?: Record<string, unknown> | undefined },\n expertType: BuiltInExpertType,\n start: number\n): Promise<ExpertBridgeResult> {\n const maxAttempts = 3;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const result = await router.executeTask(task);\n const durationMs = getTimeProvider().now() - start;\n\n if (result.ok) {\n logger.info('Expert executed successfully', { expertType, durationMs });\n return { success: true, text: result.value.text, expertType, durationMs };\n }\n\n const isRateLimit = isRateLimitText(result.error.message);\n if (isRateLimit && attempt < maxAttempts - 1) {\n const backoffMs = RATE_LIMIT_BASE_DELAY_MS * (attempt + 1);\n logger.warn('Expert rate limited, retrying', { expertType, attempt: attempt + 1, backoffMs });\n await new Promise((resolve) => setTimeout(resolve, backoffMs));\n continue;\n }\n\n logger.warn('Expert execution failed', { expertType, error: result.error.message });\n return { success: false, text: '', expertType, durationMs, error: result.error.message };\n }\n\n return {\n success: false,\n text: '',\n expertType,\n durationMs: getTimeProvider().now() - start,\n error: 'Max retry attempts exceeded',\n };\n}\n\nexport async function executeExpert(\n expertType: BuiltInExpertType,\n prompt: string\n): Promise<ExpertBridgeResult> {\n const start = getTimeProvider().now();\n try {\n const { BUILT_IN_EXPERTS } = await import('../agents/experts/expert-config.js');\n const config = BUILT_IN_EXPERTS[expertType];\n const fullPrompt = `${config.systemPrompt}\\n\\n${prompt}`;\n\n const router = await getRouter();\n if (router === null) {\n return {\n success: false,\n text: `[No adapters] ${prompt}`,\n expertType,\n durationMs: getTimeProvider().now() - start,\n error: 'No CLI adapters available',\n };\n }\n\n // Check circuit breaker health before dispatch (#1766)\n const health = checkCircuitHealth();\n if (!health.healthy) {\n logger.warn('Circuit breaker: all CLIs unavailable', { expertType, reason: health.message });\n return {\n success: false,\n text: '',\n expertType,\n durationMs: getTimeProvider().now() - start,\n error: health.message,\n };\n }\n\n // Pass MCP config so CLI experts can call nexus-agents tools (#1708)\n const mcpConfigPath = await getMcpConfigPath();\n const task: { content: string; options?: Record<string, unknown> | undefined } = {\n content: fullPrompt,\n };\n if (mcpConfigPath !== null) task.options = { mcpConfigPath };\n\n return await dispatchWithRateLimitRetry(router, task, expertType, start);\n } catch (error) {\n const durationMs = getTimeProvider().now() - start;\n const msg = error instanceof Error ? error.message : String(error);\n logger.warn('Expert bridge error', { expertType, error: msg });\n return { success: false, text: '', expertType, durationMs, error: msg };\n }\n}\n"],"mappings":"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","names":[]}