nexus-agents 2.149.0 → 2.150.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 (123) hide show
  1. package/dist/{child-mcp-config-VCIEU2KS.js → child-mcp-config-EXXD4NVX.js} +2 -2
  2. package/dist/{chunk-WARUMI7Y.js → chunk-27JU5EIO.js} +8 -8
  3. package/dist/{chunk-JUT4ZQ2N.js → chunk-2Y5UAHBN.js} +4 -4
  4. package/dist/{chunk-2XEAA6YJ.js → chunk-4EDNTMRD.js} +2 -2
  5. package/dist/{chunk-YKKQ6A3R.js → chunk-5AWBRS3R.js} +4 -4
  6. package/dist/{chunk-MJO7ZXJD.js → chunk-6D7NYWDW.js} +2 -2
  7. package/dist/{chunk-LYQVCUAB.js → chunk-76BPE6FB.js} +2 -2
  8. package/dist/{chunk-DXT6CJNI.js → chunk-AFNO7KMH.js} +2 -2
  9. package/dist/{chunk-KCDBE5KF.js → chunk-BOJOJQLH.js} +5 -5
  10. package/dist/{chunk-V3OSYFGM.js → chunk-BX5CYNHE.js} +7 -7
  11. package/dist/{chunk-TLRFRDJ4.js → chunk-FR2YSJC7.js} +4 -4
  12. package/dist/{chunk-ZB5D3WYT.js → chunk-FWEYQX4N.js} +34 -33
  13. package/dist/chunk-FWEYQX4N.js.map +1 -0
  14. package/dist/{chunk-34F5J5QJ.js → chunk-GTEGNTFD.js} +2 -2
  15. package/dist/{chunk-J2XRODBH.js → chunk-GUAG2ADJ.js} +3 -3
  16. package/dist/{chunk-MPRYMYUB.js → chunk-HQL7TF57.js} +129 -75
  17. package/dist/chunk-HQL7TF57.js.map +1 -0
  18. package/dist/{chunk-QJPZ7I6P.js → chunk-HZXJ3JAZ.js} +2 -2
  19. package/dist/{chunk-CVHNT4JY.js → chunk-IJ5JFATI.js} +7 -7
  20. package/dist/{chunk-JJNMM3PJ.js → chunk-J3QSLEHM.js} +2 -2
  21. package/dist/{chunk-26MUMXZM.js → chunk-KIDH3EWN.js} +2 -2
  22. package/dist/{chunk-7KT5JROL.js → chunk-LGSU5C46.js} +34 -34
  23. package/dist/{chunk-DHGHOAFU.js → chunk-MDCSXJWB.js} +2 -2
  24. package/dist/{chunk-Z5EPH7IP.js → chunk-OECO3UIW.js} +3 -3
  25. package/dist/{chunk-P3M6T3LZ.js → chunk-PBNYJR7F.js} +2 -2
  26. package/dist/{chunk-OVSQGQCX.js → chunk-Q42KWK42.js} +3 -3
  27. package/dist/{chunk-ZI3Q6DAG.js → chunk-RKQQEJEU.js} +3 -3
  28. package/dist/{chunk-LHSPDZHM.js → chunk-RLBYREDT.js} +2 -2
  29. package/dist/{chunk-PJVGQJUF.js → chunk-V25VUUPP.js} +5 -5
  30. package/dist/{chunk-23E6C3NL.js → chunk-V2PQVMGE.js} +2 -2
  31. package/dist/{chunk-OE5CRMG4.js → chunk-VGINLUME.js} +12 -3
  32. package/dist/{chunk-OE5CRMG4.js.map → chunk-VGINLUME.js.map} +1 -1
  33. package/dist/{chunk-XMDUYUOV.js → chunk-VPFK7LIK.js} +2 -2
  34. package/dist/{chunk-AZ7YKZZ6.js → chunk-WO4MB65I.js} +3 -3
  35. package/dist/{chunk-AHZZWRCO.js → chunk-WUYXJJTL.js} +24 -22
  36. package/dist/chunk-WUYXJJTL.js.map +1 -0
  37. package/dist/{chunk-QBZGOC37.js → chunk-XA3PKYBR.js} +4 -4
  38. package/dist/{chunk-BC3M23NP.js → chunk-ZGYLWKAZ.js} +2 -2
  39. package/dist/{chunk-FVNQVLUA.js → chunk-ZO2FWH6W.js} +5 -5
  40. package/dist/{cli-circuit-breaker-4UGYIBFK.js → cli-circuit-breaker-CLQKA7NG.js} +4 -4
  41. package/dist/cli.js +41 -41
  42. package/dist/{composite-router-35AMJJXE.js → composite-router-ZIIMWIPS.js} +2 -2
  43. package/dist/{consensus-vote-IFY2O74W.js → consensus-vote-PGPDRVWI.js} +15 -15
  44. package/dist/{context-retriever-6IC6E5QO.js → context-retriever-EMVN6NNW.js} +8 -8
  45. package/dist/{doctor-deep-3JXAKLJM.js → doctor-deep-4VYC4ZFD.js} +3 -3
  46. package/dist/{expert-bridge-QMHEBTU6.js → expert-bridge-D53IE52J.js} +4 -4
  47. package/dist/{factory-PJI2TICN.js → factory-JAVXQI2M.js} +5 -5
  48. package/dist/{factory-ZCVADSOR.js → factory-R6WV357Q.js} +8 -8
  49. package/dist/{improvement-review-OKFIXNIA.js → improvement-review-MJ6A6HFV.js} +5 -5
  50. package/dist/index.d.ts +34 -0
  51. package/dist/index.js +30 -30
  52. package/dist/{init-opencode-POK7JP6T.js → init-opencode-JAFMTL6D.js} +6 -6
  53. package/dist/{issue-triage-OR2CJHH3.js → issue-triage-WJFYACOD.js} +6 -6
  54. package/dist/{pr-reviewer-helpers-TPTE5WDY.js → pr-reviewer-helpers-LX46ZNDN.js} +4 -4
  55. package/dist/{registry-command-ETSNCQRP.js → registry-command-STRBISOJ.js} +2 -2
  56. package/dist/{repo-security-plan-5CY4DBVM.js → repo-security-plan-BAQRQDVT.js} +3 -3
  57. package/dist/{research-helpers-synthesize-2Z7JWXU6.js → research-helpers-synthesize-I7CCPVI5.js} +4 -4
  58. package/dist/{routing-memory-CR3ZTMBE.js → routing-memory-GASTCLCD.js} +2 -2
  59. package/dist/{session-memory-XEOYB6GL.js → session-memory-DMD4LWZF.js} +3 -3
  60. package/dist/{setup-command-I25V532G.js → setup-command-XBER4WR2.js} +11 -11
  61. package/dist/{setup-config-OJI3FA6E.js → setup-config-AVMV3GTY.js} +3 -3
  62. package/dist/{setup-custom-api-AJGCQB72.js → setup-custom-api-3WRO27ZG.js} +3 -3
  63. package/dist/{tool-memory-NN5IDPRO.js → tool-memory-734GCMZM.js} +5 -5
  64. package/dist/{unified-registry-FWBAEWJS.js → unified-registry-STRPR5KB.js} +9 -9
  65. package/dist/{weather-report-BXQROTTH.js → weather-report-3LMA4ZVW.js} +2 -2
  66. package/package.json +1 -1
  67. package/dist/chunk-AHZZWRCO.js.map +0 -1
  68. package/dist/chunk-MPRYMYUB.js.map +0 -1
  69. package/dist/chunk-ZB5D3WYT.js.map +0 -1
  70. /package/dist/{child-mcp-config-VCIEU2KS.js.map → child-mcp-config-EXXD4NVX.js.map} +0 -0
  71. /package/dist/{chunk-WARUMI7Y.js.map → chunk-27JU5EIO.js.map} +0 -0
  72. /package/dist/{chunk-JUT4ZQ2N.js.map → chunk-2Y5UAHBN.js.map} +0 -0
  73. /package/dist/{chunk-2XEAA6YJ.js.map → chunk-4EDNTMRD.js.map} +0 -0
  74. /package/dist/{chunk-YKKQ6A3R.js.map → chunk-5AWBRS3R.js.map} +0 -0
  75. /package/dist/{chunk-MJO7ZXJD.js.map → chunk-6D7NYWDW.js.map} +0 -0
  76. /package/dist/{chunk-LYQVCUAB.js.map → chunk-76BPE6FB.js.map} +0 -0
  77. /package/dist/{chunk-DXT6CJNI.js.map → chunk-AFNO7KMH.js.map} +0 -0
  78. /package/dist/{chunk-KCDBE5KF.js.map → chunk-BOJOJQLH.js.map} +0 -0
  79. /package/dist/{chunk-V3OSYFGM.js.map → chunk-BX5CYNHE.js.map} +0 -0
  80. /package/dist/{chunk-TLRFRDJ4.js.map → chunk-FR2YSJC7.js.map} +0 -0
  81. /package/dist/{chunk-34F5J5QJ.js.map → chunk-GTEGNTFD.js.map} +0 -0
  82. /package/dist/{chunk-J2XRODBH.js.map → chunk-GUAG2ADJ.js.map} +0 -0
  83. /package/dist/{chunk-QJPZ7I6P.js.map → chunk-HZXJ3JAZ.js.map} +0 -0
  84. /package/dist/{chunk-CVHNT4JY.js.map → chunk-IJ5JFATI.js.map} +0 -0
  85. /package/dist/{chunk-JJNMM3PJ.js.map → chunk-J3QSLEHM.js.map} +0 -0
  86. /package/dist/{chunk-26MUMXZM.js.map → chunk-KIDH3EWN.js.map} +0 -0
  87. /package/dist/{chunk-7KT5JROL.js.map → chunk-LGSU5C46.js.map} +0 -0
  88. /package/dist/{chunk-DHGHOAFU.js.map → chunk-MDCSXJWB.js.map} +0 -0
  89. /package/dist/{chunk-Z5EPH7IP.js.map → chunk-OECO3UIW.js.map} +0 -0
  90. /package/dist/{chunk-P3M6T3LZ.js.map → chunk-PBNYJR7F.js.map} +0 -0
  91. /package/dist/{chunk-OVSQGQCX.js.map → chunk-Q42KWK42.js.map} +0 -0
  92. /package/dist/{chunk-ZI3Q6DAG.js.map → chunk-RKQQEJEU.js.map} +0 -0
  93. /package/dist/{chunk-LHSPDZHM.js.map → chunk-RLBYREDT.js.map} +0 -0
  94. /package/dist/{chunk-PJVGQJUF.js.map → chunk-V25VUUPP.js.map} +0 -0
  95. /package/dist/{chunk-23E6C3NL.js.map → chunk-V2PQVMGE.js.map} +0 -0
  96. /package/dist/{chunk-XMDUYUOV.js.map → chunk-VPFK7LIK.js.map} +0 -0
  97. /package/dist/{chunk-AZ7YKZZ6.js.map → chunk-WO4MB65I.js.map} +0 -0
  98. /package/dist/{chunk-QBZGOC37.js.map → chunk-XA3PKYBR.js.map} +0 -0
  99. /package/dist/{chunk-BC3M23NP.js.map → chunk-ZGYLWKAZ.js.map} +0 -0
  100. /package/dist/{chunk-FVNQVLUA.js.map → chunk-ZO2FWH6W.js.map} +0 -0
  101. /package/dist/{cli-circuit-breaker-4UGYIBFK.js.map → cli-circuit-breaker-CLQKA7NG.js.map} +0 -0
  102. /package/dist/{composite-router-35AMJJXE.js.map → composite-router-ZIIMWIPS.js.map} +0 -0
  103. /package/dist/{consensus-vote-IFY2O74W.js.map → consensus-vote-PGPDRVWI.js.map} +0 -0
  104. /package/dist/{context-retriever-6IC6E5QO.js.map → context-retriever-EMVN6NNW.js.map} +0 -0
  105. /package/dist/{doctor-deep-3JXAKLJM.js.map → doctor-deep-4VYC4ZFD.js.map} +0 -0
  106. /package/dist/{expert-bridge-QMHEBTU6.js.map → expert-bridge-D53IE52J.js.map} +0 -0
  107. /package/dist/{factory-PJI2TICN.js.map → factory-JAVXQI2M.js.map} +0 -0
  108. /package/dist/{factory-ZCVADSOR.js.map → factory-R6WV357Q.js.map} +0 -0
  109. /package/dist/{improvement-review-OKFIXNIA.js.map → improvement-review-MJ6A6HFV.js.map} +0 -0
  110. /package/dist/{init-opencode-POK7JP6T.js.map → init-opencode-JAFMTL6D.js.map} +0 -0
  111. /package/dist/{issue-triage-OR2CJHH3.js.map → issue-triage-WJFYACOD.js.map} +0 -0
  112. /package/dist/{pr-reviewer-helpers-TPTE5WDY.js.map → pr-reviewer-helpers-LX46ZNDN.js.map} +0 -0
  113. /package/dist/{registry-command-ETSNCQRP.js.map → registry-command-STRBISOJ.js.map} +0 -0
  114. /package/dist/{repo-security-plan-5CY4DBVM.js.map → repo-security-plan-BAQRQDVT.js.map} +0 -0
  115. /package/dist/{research-helpers-synthesize-2Z7JWXU6.js.map → research-helpers-synthesize-I7CCPVI5.js.map} +0 -0
  116. /package/dist/{routing-memory-CR3ZTMBE.js.map → routing-memory-GASTCLCD.js.map} +0 -0
  117. /package/dist/{session-memory-XEOYB6GL.js.map → session-memory-DMD4LWZF.js.map} +0 -0
  118. /package/dist/{setup-command-I25V532G.js.map → setup-command-XBER4WR2.js.map} +0 -0
  119. /package/dist/{setup-config-OJI3FA6E.js.map → setup-config-AVMV3GTY.js.map} +0 -0
  120. /package/dist/{setup-custom-api-AJGCQB72.js.map → setup-custom-api-3WRO27ZG.js.map} +0 -0
  121. /package/dist/{tool-memory-NN5IDPRO.js.map → tool-memory-734GCMZM.js.map} +0 -0
  122. /package/dist/{unified-registry-FWBAEWJS.js.map → unified-registry-STRPR5KB.js.map} +0 -0
  123. /package/dist/{weather-report-BXQROTTH.js.map → weather-report-3LMA4ZVW.js.map} +0 -0
@@ -2,7 +2,7 @@ import {
2
2
  TASK_CATEGORIES,
3
3
  getAdaptiveBonus,
4
4
  getOutcomeStore
5
- } from "./chunk-OE5CRMG4.js";
5
+ } from "./chunk-VGINLUME.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-XMDUYUOV.js.map
109
+ //# sourceMappingURL=chunk-VPFK7LIK.js.map
@@ -7,7 +7,7 @@ import {
7
7
  toolStructuredError,
8
8
  toolSuccessStructured,
9
9
  wrapToolWithTimeout
10
- } from "./chunk-J2XRODBH.js";
10
+ } from "./chunk-GUAG2ADJ.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-OE5CRMG4.js";
22
+ } from "./chunk-VGINLUME.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-AZ7YKZZ6.js.map
2135
+ //# sourceMappingURL=chunk-WO4MB65I.js.map
@@ -1,18 +1,17 @@
1
1
  import {
2
2
  BaseAdapter,
3
3
  createStream,
4
+ planOptionalParams,
4
5
  requireApiKey,
5
- temperatureUnsupportedForModel,
6
- validateApiKeyPresence,
7
- warnTemperatureDropped
8
- } from "./chunk-MPRYMYUB.js";
6
+ validateApiKeyPresence
7
+ } from "./chunk-HQL7TF57.js";
9
8
  import {
10
9
  ModelCapability,
11
10
  err,
12
11
  getCliModelName,
13
12
  getTokenEstimator,
14
13
  ok
15
- } from "./chunk-OE5CRMG4.js";
14
+ } from "./chunk-VGINLUME.js";
16
15
 
17
16
  // src/adapters/openai-types.ts
18
17
  var OPENAI_MODELS = {
@@ -389,6 +388,7 @@ var OpenAIAdapter = class extends BaseAdapter {
389
388
  const probe = new Error(typeof v.message === "string" ? v.message : "");
390
389
  probe.status = typeof v.status === "number" ? v.status : void 0;
391
390
  probe.code = v.code ?? void 0;
391
+ probe.param = typeof v.param === "string" && v.param !== "" ? v.param : void 0;
392
392
  probe.cause = error;
393
393
  const classified = super.transformError(probe);
394
394
  classified.message = `${this.providerId}/${this.modelId}: ${describeOpenAIApiError(v)}`;
@@ -424,16 +424,16 @@ var OpenAIAdapter = class extends BaseAdapter {
424
424
  * Executes the completion request against the OpenAI API.
425
425
  */
426
426
  async executeCompletion(request) {
427
- const params = this.buildRequestParams(request);
427
+ const { params, dropped } = this.buildRequestParams(request);
428
428
  const response = request.signal !== void 0 ? await this.client.chat.completions.create(params, { signal: request.signal }) : await this.client.chat.completions.create(params);
429
- return this.mapResponse(response);
429
+ return this.mapResponse(response, dropped);
430
430
  }
431
431
  /**
432
432
  * Executes streaming completion and pushes chunks to the controller.
433
433
  */
434
434
  async executeStream(request, controller) {
435
435
  try {
436
- const params = this.buildRequestParams(request);
436
+ const { params } = this.buildRequestParams(request);
437
437
  const stream = await this.client.chat.completions.create({ ...params, stream: true });
438
438
  let contentIndex = 0;
439
439
  let hasStarted = false;
@@ -465,8 +465,8 @@ var OpenAIAdapter = class extends BaseAdapter {
465
465
  messages,
466
466
  max_completion_tokens: request.maxTokens ?? DEFAULT_MAX_TOKENS
467
467
  };
468
- this.addOptionalParams(params, request);
469
- return params;
468
+ const dropped = this.addOptionalParams(params, request);
469
+ return { params, dropped };
470
470
  }
471
471
  /**
472
472
  * Builds the messages array for the request.
@@ -488,12 +488,9 @@ var OpenAIAdapter = class extends BaseAdapter {
488
488
  * Adds optional parameters to the request.
489
489
  */
490
490
  addOptionalParams(params, request) {
491
- if (request.temperature !== void 0) {
492
- if (temperatureUnsupportedForModel(this.resolvedModelId)) {
493
- warnTemperatureDropped(this.resolvedModelId);
494
- } else {
495
- params.temperature = request.temperature;
496
- }
491
+ const plan = planOptionalParams(request, this.resolvedModelId);
492
+ if (plan.temperature !== void 0) {
493
+ params.temperature = plan.temperature;
497
494
  }
498
495
  if (request.stop !== void 0 && request.stop.length > 0) {
499
496
  params.stop = request.stop;
@@ -502,6 +499,7 @@ var OpenAIAdapter = class extends BaseAdapter {
502
499
  params.tools = request.tools.map(mapTool);
503
500
  }
504
501
  this.addResponseFormat(params, request);
502
+ return plan.dropped;
505
503
  }
506
504
  /**
507
505
  * Adds response format to the request if specified.
@@ -525,10 +523,10 @@ var OpenAIAdapter = class extends BaseAdapter {
525
523
  /**
526
524
  * Maps OpenAI API response to our CompletionResponse format.
527
525
  */
528
- mapResponse(response) {
526
+ mapResponse(response, dropped = []) {
529
527
  const firstChoice = response.choices[0];
530
528
  if (firstChoice === void 0) {
531
- return this.createEmptyResponse(response);
529
+ return this.createEmptyResponse(response, dropped);
532
530
  }
533
531
  const content = mapChoiceToContentBlocks(firstChoice);
534
532
  const usage = mapResponseUsage(response);
@@ -536,18 +534,22 @@ var OpenAIAdapter = class extends BaseAdapter {
536
534
  content,
537
535
  usage,
538
536
  stopReason: mapStopReason(firstChoice.finish_reason),
539
- model: response.model
537
+ model: response.model,
538
+ // #4069: surface dropped params (e.g. an omitted temperature). Omitted
539
+ // entirely when nothing was dropped (exactOptionalPropertyTypes).
540
+ ...dropped.length > 0 ? { warnings: dropped } : {}
540
541
  };
541
542
  }
542
543
  /**
543
544
  * Creates an empty response when no choices are returned.
544
545
  */
545
- createEmptyResponse(response) {
546
+ createEmptyResponse(response, dropped = []) {
546
547
  return {
547
548
  content: [{ type: "text", text: "" }],
548
549
  usage: mapResponseUsage(response),
549
550
  stopReason: "end_turn",
550
- model: response.model
551
+ model: response.model,
552
+ ...dropped.length > 0 ? { warnings: dropped } : {}
551
553
  };
552
554
  }
553
555
  /**
@@ -607,4 +609,4 @@ export {
607
609
  OpenAIAdapter,
608
610
  createOpenAIAdapter
609
611
  };
610
- //# sourceMappingURL=chunk-AHZZWRCO.js.map
612
+ //# sourceMappingURL=chunk-WUYXJJTL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/openai-types.ts","../src/adapters/openai-adapter.ts","../src/adapters/openai-mappers.ts"],"sourcesContent":["/**\n * nexus-agents/adapters - OpenAI Type Helpers\n *\n * Type definitions and constants for the OpenAI direct-API SDK adapter.\n *\n * **Architectural boundary (#2200 Child 3):** these constants do NOT live\n * in `config/in-tree-data.ts`. The canonical registry's `cliName`\n * dimension targets CLI tools (`claude` / `gemini` / `codex` / `opencode`)\n * — there is no `openai` CLI binary. Adding `'openai'` to the CLI_NAMES\n * enum would force a fifth case in 4+ exhaustive switches across the\n * codebase, violating the semantic of \"CLI tool name.\"\n *\n * The OpenAI direct adapter is conceptually different from CLI adapters:\n * it talks to the OpenAI HTTPS API directly, not via a subprocess CLI.\n * Its model identifiers are OpenAI's own (`gpt-4o-2024-11-20`,\n * `gpt-3.5-turbo-0125`, etc.) — these are upstream API constants, not\n * versions WE chose. They drift only when OpenAI ships new dated releases.\n *\n * This file is the single source of truth for OpenAI direct-API model\n * identifiers. The model-string drift fitness-guard (#2199) treats it as\n * a documented architectural exception in the allowlist.\n */\n\nimport type { ModelCapability } from '../core/index.js';\nimport { ModelCapability as MC } from '../core/index.js';\nimport { getCliModelName } from '../config/model-config-helpers.js';\n\n/**\n * Supported OpenAI direct-API model identifiers (OpenAI's own dated names).\n *\n * GPT_5_2_CODEX derives from the canonical registry (codex-5.2's cliModelName)\n * because it overlaps with the Codex CLI; the rest are pure-API constants.\n */\nexport const OPENAI_MODELS = {\n GPT_5_2: 'gpt-5.2',\n GPT_5_2_INSTANT: 'gpt-5.2-chat-latest',\n GPT_5_2_PRO: 'gpt-5.2-pro',\n GPT_5_2_CODEX: getCliModelName('codex-5.2'),\n GPT_4O: 'gpt-4o-2024-11-20',\n GPT_4O_MINI: 'gpt-4o-mini-2024-07-18',\n GPT_4_TURBO: 'gpt-4-turbo-2024-04-09',\n GPT_35_TURBO: 'gpt-3.5-turbo-0125',\n} as const;\n\n/**\n * User-friendly OpenAI aliases → dated model identifiers.\n *\n * Identity-only mappings (e.g., `'gpt-5.2-pro' → 'gpt-5.2-pro'`) were\n * removed in #2200 Child 3 — `resolveModelId` already passes unknown ids\n * through unchanged via `?? modelId`. Only entries that translate a\n * shorthand into a dated version remain.\n */\nexport const OPENAI_MODEL_ALIASES: Record<string, string> = {\n 'gpt-5.2-instant': OPENAI_MODELS.GPT_5_2_INSTANT,\n 'gpt-4o': OPENAI_MODELS.GPT_4O,\n 'gpt-4o-mini': OPENAI_MODELS.GPT_4O_MINI,\n 'gpt-4-turbo': OPENAI_MODELS.GPT_4_TURBO,\n 'gpt-3.5-turbo': OPENAI_MODELS.GPT_35_TURBO,\n} as const;\n\n/**\n * Configuration specific to OpenAIAdapter.\n */\nexport interface OpenAIAdapterConfig {\n /** Model ID (e.g., 'gpt-4o' or full model identifier) */\n modelId: string;\n /** API key for OpenAI API (required) */\n apiKey: string;\n /** Base URL for API (optional, defaults to OpenAI's API) */\n baseUrl?: string;\n /** Request timeout in milliseconds (optional) */\n timeout?: number;\n /** Maximum retries for failed requests (optional) */\n maxRetries?: number;\n /** Organization ID (optional) */\n organization?: string;\n}\n\n// Note: Token estimation moved to core/token-estimator.ts (unified TokenEstimator)\n\n/**\n * Default maximum tokens for OpenAI models.\n */\nexport const DEFAULT_MAX_TOKENS = 4096;\n\n/**\n * Tool call type for extracting function info.\n */\nexport interface FunctionToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Type guard for function tool calls.\n * Note: typeof null === 'object' is true, so we need to check tc !== null\n */\nexport function isFunctionToolCall(toolCall: unknown): toolCall is FunctionToolCall {\n if (typeof toolCall !== 'object' || toolCall === null) {\n return false;\n }\n const tc = toolCall as Record<string, unknown>;\n return tc['type'] === 'function' && typeof tc['function'] === 'object' && tc['function'] !== null;\n}\n\n/**\n * Resolves model alias to full model identifier.\n */\nexport function resolveModelId(modelId: string): string {\n return OPENAI_MODEL_ALIASES[modelId] ?? modelId;\n}\n\n/**\n * Determines capabilities based on model ID.\n */\nexport function getModelCapabilities(modelId: string): readonly ModelCapability[] {\n const capabilities: ModelCapability[] = [MC.COMPLETION, MC.STREAMING, MC.TOOL_USE];\n\n const resolvedId = resolveModelId(modelId);\n\n // Vision is available on GPT-4o, GPT-4-turbo, and GPT-5.2 models\n if (\n resolvedId.includes('gpt-4o') ||\n resolvedId.includes('gpt-4-turbo') ||\n resolvedId.includes('gpt-5.2')\n ) {\n capabilities.push(MC.VISION);\n }\n\n // Extended thinking is available on GPT-5.2 models\n if (resolvedId.includes('gpt-5.2')) {\n capabilities.push(MC.EXTENDED_THINKING);\n }\n\n return capabilities;\n}\n","/**\n * nexus-agents/adapters - OpenAI Model Adapter\n *\n * Adapter for OpenAI models (GPT-4o, GPT-4-turbo, GPT-3.5-turbo).\n * Implements the IModelAdapter interface with streaming support, rate limiting,\n * and proper error handling.\n *\n * Verified 2026-01-03: openai@6.15.0 is current stable\n * (Source: npm registry)\n */\n\nimport OpenAI, { APIError } from 'openai';\nimport type { ChatCompletionMessageParam, ChatCompletion } from 'openai/resources/chat/completions';\nimport type {\n Result,\n CompletionRequest,\n CompletionResponse,\n ModelMetadata,\n StreamChunk,\n TokenUsage,\n} from '../core/index.js';\nimport { ok, err, ModelError, ConfigError, getTokenEstimator } from '../core/index.js';\nimport {\n BaseAdapter,\n type BaseAdapterConfig,\n requireApiKey,\n validateApiKeyPresence,\n} from './base-adapter.js';\nimport { createStream } from './streaming.js';\nimport {\n DEFAULT_MAX_TOKENS,\n resolveModelId,\n getModelCapabilities,\n type OpenAIAdapterConfig,\n} from './openai-types.js';\nimport { planOptionalParams, type DroppedParam } from './optional-params.js';\nimport {\n mapMessage,\n mapTool,\n mapStopReason,\n mapChoiceToContentBlocks,\n mapResponseUsage,\n mapStreamChunk,\n} from './openai-mappers.js';\n\n// Re-export types and constants for public API\nexport { OPENAI_MODELS, OPENAI_MODEL_ALIASES, type OpenAIAdapterConfig } from './openai-types.js';\n\n/**\n * OpenAI model adapter.\n *\n * Provides a unified interface for interacting with OpenAI's GPT models.\n * Supports completion, streaming, tool use, and vision capabilities.\n *\n * @example\n * ```typescript\n * const adapter = new OpenAIAdapter({\n * modelId: 'gpt-4o',\n * apiKey: process.env.OPENAI_API_KEY,\n * });\n *\n * const result = await adapter.complete({\n * messages: [{ role: 'user', content: 'Hello!' }],\n * maxTokens: 1024,\n * });\n *\n * if (result.ok) {\n * console.log(result.value.content);\n * }\n * ```\n */\n\n/**\n * Compose a diagnostic string from an OpenAI SDK `APIError`'s real fields\n * (#4047). The SDK's `.message` alone can be as useless as\n * `\"400 status code (no body)\"` for an OpenAI-compatible gateway; this pulls the\n * HTTP status, structured error fields, and the raw body so the actual rejection\n * reason is visible.\n */\n/** Typed structural view of the OpenAI SDK `APIError` fields we read (the SDK's\n * generic `APIError<any,…>` otherwise leaks `any`). */\ninterface ApiErrorView {\n readonly status?: number | null;\n readonly type?: string | null;\n readonly code?: string | null;\n readonly param?: string | null;\n readonly requestID?: string | null;\n readonly error?: unknown;\n readonly message?: string;\n}\n\n/** `key=value` tag, or `''` when the value is absent. */\nfunction kvTag(key: string, val: string | number | null | undefined): string {\n return val === null || val === undefined || val === '' ? '' : `${key}=${String(val)}`;\n}\n\nfunction describeOpenAIApiError(v: ApiErrorView): string {\n const tags = [\n `HTTP ${String(v.status ?? 'unknown')}`,\n kvTag('type', v.type),\n kvTag('code', v.code),\n kvTag('param', v.param),\n kvTag('request_id', v.requestID),\n ].filter((t) => t !== '');\n let body = '';\n if (v.error !== undefined && v.error !== null) {\n try {\n const raw = JSON.stringify(v.error);\n body = ` body=${raw.length > MAX_ERROR_BODY_CHARS ? `${raw.slice(0, MAX_ERROR_BODY_CHARS)}…` : raw}`;\n } catch {\n body = ' body=<unserializable>';\n }\n }\n return `${tags.join(' ')}: ${v.message ?? ''}${body}`;\n}\n\n/** Cap the surfaced gateway error body so a huge response can't bloat logs/messages. */\nconst MAX_ERROR_BODY_CHARS = 600;\n\nexport class OpenAIAdapter extends BaseAdapter {\n private readonly client: OpenAI;\n private readonly resolvedModelId: string;\n\n /**\n * Creates a new OpenAIAdapter instance.\n *\n * @param config - OpenAI adapter configuration\n * @throws {ConfigError} If API key is missing\n */\n constructor(config: OpenAIAdapterConfig) {\n const resolvedModelId = resolveModelId(config.modelId);\n\n // Build baseConfig conditionally to satisfy exactOptionalPropertyTypes\n const baseConfig: BaseAdapterConfig = {\n providerId: 'openai',\n modelId: resolvedModelId,\n capabilities: getModelCapabilities(config.modelId),\n apiKey: config.apiKey,\n };\n\n // Only set optional properties if defined\n if (config.baseUrl !== undefined) {\n baseConfig.baseUrl = config.baseUrl;\n }\n if (config.timeout !== undefined) {\n baseConfig.timeout = config.timeout;\n }\n if (config.maxRetries !== undefined) {\n baseConfig.maxRetries = config.maxRetries;\n }\n\n super(baseConfig);\n\n this.resolvedModelId = resolvedModelId;\n\n // Validate API key presence\n requireApiKey(config.apiKey, 'OpenAI', config.modelId);\n\n this.client = this.createClient(config);\n }\n\n /**\n * Creates the OpenAI client with configuration.\n */\n private createClient(config: OpenAIAdapterConfig): OpenAI {\n const clientOptions: ConstructorParameters<typeof OpenAI>[0] = {\n apiKey: config.apiKey,\n maxRetries: config.maxRetries ?? 2,\n };\n\n if (config.baseUrl !== undefined) {\n clientOptions.baseURL = config.baseUrl;\n }\n if (config.timeout !== undefined) {\n clientOptions.timeout = config.timeout;\n }\n if (config.organization !== undefined) {\n clientOptions.organization = config.organization;\n }\n\n return new OpenAI(clientOptions);\n }\n\n /**\n * Validates adapter configuration.\n * Extends base validation with OpenAI-specific checks.\n */\n override validateConfig(): Result<void, ConfigError> {\n const baseResult = super.validateConfig();\n if (!baseResult.ok) {\n return baseResult;\n }\n\n // Validate API key is present\n const keyResult = validateApiKeyPresence(this.config.apiKey, this.providerId, this.modelId);\n if (!keyResult.ok) return keyResult;\n\n return ok(undefined);\n }\n\n /**\n * Send a completion request to OpenAI.\n *\n * @param request - The completion request\n * @returns Result with response or ModelError\n */\n async complete(request: CompletionRequest): Promise<Result<CompletionResponse, ModelError>> {\n this.logRequest(request);\n\n try {\n const response = await this.executeCompletion(request);\n this.logResponse(response);\n return ok(response);\n } catch (error) {\n return err(this.transformError(error));\n }\n }\n\n /**\n * Surface an OpenAI / OpenAI-compatible gateway's REAL HTTP status + response\n * body in the error (#4047). The OpenAI SDK's default message collapses a\n * gateway rejection to e.g. `\"400 status code (no body)\"`, which hides WHY a\n * litellm-style gateway rejected a request — exactly the wall hit when\n * diagnosing degraded voter panels on a custom gateway. We re-message with the\n * status/type/code/param/request-id/body. Error-code routing is unchanged: we\n * classify on the ORIGINAL signal (`status`/`code`/`message`) via a clean probe\n * error, so the diagnostic `request_id`/`body` can't pollute the message-\n * substring classifier, then re-message the result with the full detail.\n * Applies to direct OpenAI and the compat gateway alike.\n */\n protected override transformError(error: unknown): ModelError {\n if (error instanceof APIError) {\n const v = error as ApiErrorView;\n // Classify on the original SDK message + status/code/param only. #4069: thread\n // `param` so a param-naming 400 classifies as MODEL_PARAMETER_UNSUPPORTED and\n // the param name reaches the error context.\n const probe: Error & {\n status?: number | undefined;\n code?: string | null | undefined;\n param?: string | undefined;\n } = new Error(typeof v.message === 'string' ? v.message : '');\n probe.status = typeof v.status === 'number' ? v.status : undefined;\n probe.code = v.code ?? undefined;\n probe.param = typeof v.param === 'string' && v.param !== '' ? v.param : undefined;\n probe.cause = error;\n const classified = super.transformError(probe);\n // Surface the full diagnostic detail in the final message (code/cause kept).\n classified.message = `${this.providerId}/${this.modelId}: ${describeOpenAIApiError(v)}`;\n return classified;\n }\n return super.transformError(error);\n }\n\n /**\n * Stream a completion request from OpenAI.\n *\n * @param request - The completion request\n * @yields StreamChunk objects as they arrive\n */\n async *stream(request: CompletionRequest): AsyncIterable<StreamChunk> {\n this.logRequest(request);\n\n const [controller, iterable] = createStream<StreamChunk>();\n\n // Start streaming in the background\n this.executeStream(request, controller).catch((error: unknown) => {\n const modelError = this.transformError(error);\n controller.error(modelError);\n });\n\n yield* iterable;\n }\n\n /**\n * Count tokens in text using OpenAI-specific estimation.\n *\n * @param text - Text to count tokens for\n * @returns Approximate token count\n */\n override countTokens(text: string): Promise<number> {\n // Use unified TokenEstimator with OpenAI-specific ratio (~4 chars/token)\n return Promise.resolve(getTokenEstimator().estimateText(text, 'openai'));\n }\n\n /**\n * Executes the completion request against the OpenAI API.\n */\n private async executeCompletion(request: CompletionRequest): Promise<CompletionResponse> {\n const { params, dropped } = this.buildRequestParams(request);\n // #3036: forward AbortSignal into the OpenAI SDK so withWatchdog\n // timeouts cancel the HTTP request instead of leaking it past the\n // Promise.race boundary. Branch on signal presence — vitest 4\n // toHaveBeenCalledWith treats `(params, undefined)` as a distinct\n // call shape from `(params)`.\n const response =\n request.signal !== undefined\n ? await this.client.chat.completions.create(params, { signal: request.signal })\n : await this.client.chat.completions.create(params);\n // #4069: surface params dropped by the seam (e.g. temperature) as warnings.\n return this.mapResponse(response, dropped);\n }\n\n /**\n * Executes streaming completion and pushes chunks to the controller.\n */\n private async executeStream(\n request: CompletionRequest,\n controller: {\n push: (chunk: StreamChunk) => Result<void, Error>;\n complete: () => void;\n error: (error: Error) => void;\n }\n ): Promise<void> {\n try {\n const { params } = this.buildRequestParams(request);\n const stream = await this.client.chat.completions.create({ ...params, stream: true });\n\n let contentIndex = 0;\n let hasStarted = false;\n\n for await (const chunk of stream) {\n const mappedChunks = mapStreamChunk(chunk, contentIndex, hasStarted);\n\n for (const mappedChunk of mappedChunks) {\n if (mappedChunk.type === 'message_start') {\n hasStarted = true;\n }\n if (mappedChunk.type === 'content_block_start') {\n contentIndex++;\n }\n controller.push(mappedChunk);\n }\n }\n\n controller.complete();\n } catch (error) {\n const modelError = this.transformError(error);\n controller.error(modelError);\n }\n }\n\n /**\n * Builds OpenAI API request parameters from our CompletionRequest.\n */\n private buildRequestParams(request: CompletionRequest): {\n params: OpenAI.Chat.ChatCompletionCreateParamsNonStreaming;\n dropped: readonly DroppedParam[];\n } {\n const messages = this.buildMessages(request);\n\n const params: OpenAI.Chat.ChatCompletionCreateParamsNonStreaming = {\n model: this.resolvedModelId,\n messages,\n max_completion_tokens: request.maxTokens ?? DEFAULT_MAX_TOKENS,\n };\n\n const dropped = this.addOptionalParams(params, request);\n return { params, dropped };\n }\n\n /**\n * Builds the messages array for the request.\n */\n private buildMessages(request: CompletionRequest): ChatCompletionMessageParam[] {\n const messages: ChatCompletionMessageParam[] = [];\n\n // Add system prompt if provided explicitly\n if (request.systemPrompt !== undefined && request.systemPrompt !== '') {\n messages.push({ role: 'system', content: request.systemPrompt });\n }\n\n // Map and add all messages (filtering out system if already added via systemPrompt)\n for (const msg of request.messages) {\n if (msg.role === 'system' && request.systemPrompt !== undefined) {\n continue;\n }\n messages.push(mapMessage(msg));\n }\n\n return messages;\n }\n\n /**\n * Adds optional parameters to the request.\n */\n private addOptionalParams(\n params: OpenAI.Chat.ChatCompletionCreateParamsNonStreaming,\n request: CompletionRequest\n ): readonly DroppedParam[] {\n // #4068: the temperature drop-decision (#4061: a gateway routing to a Claude\n // model after Opus 4.6, or an OpenAI reasoning model, rejects a non-1.0\n // temperature with a 400; omit it so a gateway-routed voter panel at the\n // default 0.3 does not 400) is centralized in the shared planOptionalParams\n // seam. NOTE: a gateway that injects its OWN default when the field is absent\n // is outside our control — our contract is only to not SEND a rejected value.\n const plan = planOptionalParams(request, this.resolvedModelId);\n if (plan.temperature !== undefined) {\n params.temperature = plan.temperature;\n }\n\n if (request.stop !== undefined && request.stop.length > 0) {\n params.stop = request.stop;\n }\n\n if (request.tools !== undefined && request.tools.length > 0) {\n params.tools = request.tools.map(mapTool);\n }\n\n this.addResponseFormat(params, request);\n\n // #4069: report dropped params so mapResponse can surface them as warnings.\n return plan.dropped;\n }\n\n /**\n * Adds response format to the request if specified.\n */\n private addResponseFormat(\n params: OpenAI.Chat.ChatCompletionCreateParamsNonStreaming,\n request: CompletionRequest\n ): void {\n if (request.responseFormat === undefined) {\n return;\n }\n\n if (request.responseFormat.type === 'json_object') {\n params.response_format = { type: 'json_object' };\n } else if (request.responseFormat.type === 'json_schema') {\n params.response_format = {\n type: 'json_schema',\n json_schema: {\n name: 'response',\n schema: request.responseFormat.schema,\n },\n };\n }\n }\n\n /**\n * Maps OpenAI API response to our CompletionResponse format.\n */\n private mapResponse(\n response: ChatCompletion,\n dropped: readonly DroppedParam[] = []\n ): CompletionResponse {\n const firstChoice = response.choices[0];\n\n // Handle case where no choices are returned\n if (firstChoice === undefined) {\n return this.createEmptyResponse(response, dropped);\n }\n\n const content = mapChoiceToContentBlocks(firstChoice);\n const usage: TokenUsage = mapResponseUsage(response);\n\n return {\n content,\n usage,\n stopReason: mapStopReason(firstChoice.finish_reason),\n model: response.model,\n // #4069: surface dropped params (e.g. an omitted temperature). Omitted\n // entirely when nothing was dropped (exactOptionalPropertyTypes).\n ...(dropped.length > 0 ? { warnings: dropped } : {}),\n };\n }\n\n /**\n * Creates an empty response when no choices are returned.\n */\n private createEmptyResponse(\n response: ChatCompletion,\n dropped: readonly DroppedParam[] = []\n ): CompletionResponse {\n return {\n content: [{ type: 'text', text: '' }],\n usage: mapResponseUsage(response),\n stopReason: 'end_turn',\n model: response.model,\n ...(dropped.length > 0 ? { warnings: dropped } : {}),\n };\n }\n\n /**\n * (#2529) List models served by this OpenAI-compatible endpoint.\n *\n * Wraps `GET /v1/models`. Result is cached for `LIST_MODELS_TTL_MS`\n * so identity resolution doesn't round-trip on every adapter.\n * Concurrent callers share the in-flight promise.\n *\n * Throws on non-2xx so the harness-side identity resolver knows to\n * fall back to modelId parsing — silent empty-list returns would be\n * indistinguishable from \"this gateway has no models\", which a\n * misconfigured endpoint shouldn't be allowed to claim.\n */\n async listModels(): Promise<readonly ModelMetadata[]> {\n const now = Date.now();\n if (this.modelsCache !== null && now - this.modelsCache.fetchedAt < LIST_MODELS_TTL_MS) {\n return this.modelsCache.value;\n }\n if (this.modelsInFlight !== null) {\n return this.modelsInFlight;\n }\n const inFlight = this.fetchModels();\n this.modelsInFlight = inFlight;\n try {\n const value = await inFlight;\n this.modelsCache = { value, fetchedAt: Date.now() };\n return value;\n } finally {\n this.modelsInFlight = null;\n }\n }\n\n private modelsCache: { value: readonly ModelMetadata[]; fetchedAt: number } | null = null;\n private modelsInFlight: Promise<readonly ModelMetadata[]> | null = null;\n\n private async fetchModels(): Promise<readonly ModelMetadata[]> {\n const list = await this.client.models.list();\n return list.data.map((m): ModelMetadata => {\n const meta: ModelMetadata = { id: m.id };\n if (typeof m.owned_by === 'string') {\n return { ...meta, ownedBy: m.owned_by, createdAt: m.created };\n }\n if (typeof m.created === 'number') {\n return { ...meta, createdAt: m.created };\n }\n return meta;\n });\n }\n}\n\nconst LIST_MODELS_TTL_MS = 5 * 60 * 1000;\n\n/**\n * Creates an OpenAIAdapter with the specified configuration.\n * Factory function for cleaner API.\n *\n * @param config - OpenAI adapter configuration\n * @returns A configured OpenAIAdapter instance\n *\n * @example\n * ```typescript\n * const adapter = createOpenAIAdapter({\n * modelId: 'gpt-4o',\n * apiKey: process.env.OPENAI_API_KEY!,\n * });\n * ```\n */\nexport function createOpenAIAdapter(config: OpenAIAdapterConfig): OpenAIAdapter {\n return new OpenAIAdapter(config);\n}\n","/**\n * nexus-agents/adapters - OpenAI Message Mappers\n *\n * Functions for mapping between Nexus and OpenAI message formats.\n */\n\nimport type OpenAI from 'openai';\nimport type {\n ChatCompletionMessageParam,\n ChatCompletionTool,\n ChatCompletion,\n ChatCompletionChunk,\n} from 'openai/resources/chat/completions';\nimport type {\n ContentBlock,\n Message,\n ToolDefinition,\n TokenUsage,\n StopReason,\n StreamChunk,\n} from '../core/index.js';\nimport { isFunctionToolCall } from './openai-types.js';\n\n/**\n * Maps OpenAI finish reasons to our StopReason type.\n */\nexport function mapStopReason(openaiReason: string | null | undefined): StopReason {\n switch (openaiReason) {\n case 'stop':\n return 'end_turn';\n case 'length':\n return 'max_tokens';\n case 'tool_calls':\n case 'function_call':\n return 'tool_use';\n case 'content_filter':\n return 'end_turn';\n default:\n return 'end_turn';\n }\n}\n\n/**\n * Maps OpenAI choice to our ContentBlock array.\n */\nexport function mapChoiceToContentBlocks(choice: ChatCompletion.Choice): ContentBlock[] {\n const blocks: ContentBlock[] = [];\n const message = choice.message;\n\n // Add text content if present\n if (message.content !== null && message.content !== '') {\n blocks.push({ type: 'text', text: message.content });\n }\n\n // Add tool calls if present\n if (message.tool_calls !== undefined && message.tool_calls.length > 0) {\n for (const toolCall of message.tool_calls) {\n if (isFunctionToolCall(toolCall)) {\n let parsedInput: unknown;\n try {\n parsedInput = JSON.parse(toolCall.function.arguments) as unknown;\n } catch {\n parsedInput = { _raw: toolCall.function.arguments };\n }\n blocks.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: parsedInput,\n });\n }\n }\n }\n\n // If no content at all, return empty text block\n if (blocks.length === 0) {\n blocks.push({ type: 'text', text: '' });\n }\n\n return blocks;\n}\n\n/**\n * Maps our Message format to OpenAI's ChatCompletionMessageParam format.\n */\nexport function mapMessage(message: Message): ChatCompletionMessageParam {\n // Handle system messages\n if (message.role === 'system') {\n return mapSystemMessage(message);\n }\n\n // Handle user messages\n if (message.role === 'user') {\n return mapUserMessage(message);\n }\n\n // Handle assistant messages\n return mapAssistantMessage(message);\n}\n\n/**\n * Maps a system message.\n */\nfunction mapSystemMessage(message: Message): ChatCompletionMessageParam {\n const content =\n typeof message.content === 'string'\n ? message.content\n : message.content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join('\\n');\n return { role: 'system', content };\n}\n\n/**\n * Maps a user message.\n */\nfunction mapUserMessage(message: Message): ChatCompletionMessageParam {\n if (typeof message.content === 'string') {\n return { role: 'user', content: message.content };\n }\n\n // Check for tool results - these need special handling\n const toolResults = message.content.filter(\n (b): b is { type: 'tool_result'; tool_use_id: string; content: string; is_error?: boolean } =>\n b.type === 'tool_result'\n );\n\n if (toolResults.length > 0) {\n // Return first tool result as a tool message\n const firstResult = toolResults[0];\n if (firstResult !== undefined) {\n return {\n role: 'tool',\n tool_call_id: firstResult.tool_use_id,\n content: firstResult.content,\n };\n }\n }\n\n // Map to user message with content array\n const content = message.content.map((block) => {\n if (block.type === 'text') {\n return { type: 'text' as const, text: block.text };\n }\n if (block.type === 'image') {\n return {\n type: 'image_url' as const,\n image_url: {\n url: `data:${block.source.media_type};base64,${block.source.data}`,\n },\n };\n }\n // Fallback for other types\n return { type: 'text' as const, text: '' };\n });\n\n return { role: 'user', content };\n}\n\n/**\n * Maps an assistant message.\n */\nfunction mapAssistantMessage(message: Message): ChatCompletionMessageParam {\n if (typeof message.content === 'string') {\n return { role: 'assistant', content: message.content };\n }\n\n // Check for tool uses in assistant message\n const toolUses = message.content.filter(\n (b): b is { type: 'tool_use'; id: string; name: string; input: unknown } =>\n b.type === 'tool_use'\n );\n\n const textContent = message.content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join('');\n\n if (toolUses.length > 0) {\n const assistantMessage: ChatCompletionMessageParam = {\n role: 'assistant',\n content: textContent !== '' ? textContent : null,\n tool_calls: toolUses.map((tool) => ({\n id: tool.id,\n type: 'function' as const,\n function: {\n name: tool.name,\n arguments: JSON.stringify(tool.input),\n },\n })),\n };\n return assistantMessage;\n }\n\n return { role: 'assistant', content: textContent };\n}\n\n/**\n * Maps our ToolDefinition to OpenAI's tool format.\n */\nexport function mapTool(tool: ToolDefinition): ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n };\n}\n\n/**\n * Maps OpenAI API response to our CompletionResponse format.\n */\nexport function mapResponseUsage(response: ChatCompletion): TokenUsage {\n return {\n inputTokens: response.usage?.prompt_tokens ?? 0,\n outputTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n };\n}\n\n/**\n * Maps content delta from stream chunk.\n */\nfunction mapContentDelta(\n delta: OpenAI.Chat.ChatCompletionChunk.Choice.Delta,\n currentIndex: number,\n hasStarted: boolean\n): StreamChunk[] {\n const chunks: StreamChunk[] = [];\n\n if (delta.content !== undefined && delta.content !== null && delta.content !== '') {\n // Start content block if this is the first content\n if (currentIndex === 0 && !hasStarted) {\n chunks.push({\n type: 'content_block_start',\n index: 0,\n contentBlock: { type: 'text', text: '' },\n });\n }\n\n chunks.push({\n type: 'content_block_delta',\n index: currentIndex,\n delta: { type: 'text_delta', text: delta.content },\n });\n }\n\n return chunks;\n}\n\n/**\n * Maps tool calls from stream chunk delta.\n */\nfunction mapToolCallsDelta(delta: OpenAI.Chat.ChatCompletionChunk.Choice.Delta): StreamChunk[] {\n const chunks: StreamChunk[] = [];\n\n if (delta.tool_calls !== undefined && delta.tool_calls.length > 0) {\n for (const toolCall of delta.tool_calls) {\n if (toolCall.function?.name !== undefined) {\n chunks.push({\n type: 'content_block_start',\n index: toolCall.index,\n contentBlock: {\n type: 'tool_use',\n id: toolCall.id ?? '',\n name: toolCall.function.name,\n input: {},\n },\n });\n }\n }\n }\n\n return chunks;\n}\n\n/**\n * Maps finish reason from stream chunk.\n */\nfunction mapFinishChunks(\n choice: ChatCompletionChunk.Choice,\n chunk: ChatCompletionChunk,\n currentIndex: number\n): StreamChunk[] {\n const chunks: StreamChunk[] = [];\n\n if (choice.finish_reason !== null) {\n // End current content block\n chunks.push({\n type: 'content_block_stop',\n index: currentIndex,\n });\n\n // Emit message_delta with stop reason\n chunks.push({\n type: 'message_delta',\n delta: { stop_reason: mapStopReason(choice.finish_reason) },\n usage: {\n inputTokens: 0,\n outputTokens: chunk.usage?.completion_tokens ?? 0,\n totalTokens: chunk.usage?.total_tokens ?? 0,\n },\n });\n\n // Emit message_stop\n chunks.push({ type: 'message_stop' });\n }\n\n return chunks;\n}\n\n/**\n * Maps OpenAI stream chunks to our StreamChunk format.\n */\nexport function mapStreamChunk(\n chunk: ChatCompletionChunk,\n currentIndex: number,\n hasStarted: boolean\n): StreamChunk[] {\n const chunks: StreamChunk[] = [];\n const choice = chunk.choices[0];\n\n // Emit message_start on first chunk\n if (!hasStarted) {\n chunks.push({\n type: 'message_start',\n message: { model: chunk.model },\n });\n }\n\n if (choice === undefined) {\n return chunks;\n }\n\n const delta = choice.delta;\n\n // Map content delta\n chunks.push(...mapContentDelta(delta, currentIndex, hasStarted));\n\n // Map tool calls\n chunks.push(...mapToolCallsDelta(delta));\n\n // Map finish reason\n chunks.push(...mapFinishChunks(choice, chunk, currentIndex));\n\n return chunks;\n}\n"],"mappings":"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","names":[]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  createAutoAdapter
3
- } from "./chunk-ZB5D3WYT.js";
3
+ } from "./chunk-FWEYQX4N.js";
4
4
  import {
5
5
  mapModelErrorToCategory
6
- } from "./chunk-LYQVCUAB.js";
6
+ } from "./chunk-76BPE6FB.js";
7
7
  import {
8
8
  CLI_NAMES,
9
9
  CircularBuffer,
@@ -24,7 +24,7 @@ import {
24
24
  ok,
25
25
  recordRateLimitEvent,
26
26
  toRateLimitError
27
- } from "./chunk-OE5CRMG4.js";
27
+ } from "./chunk-VGINLUME.js";
28
28
 
29
29
  // src/agents/collaboration/event-bus-helpers.ts
30
30
  import { randomUUID } from "crypto";
@@ -1041,4 +1041,4 @@ export {
1041
1041
  getGlobalRegistry,
1042
1042
  resetGlobalRegistry
1043
1043
  };
1044
- //# sourceMappingURL=chunk-QBZGOC37.js.map
1044
+ //# sourceMappingURL=chunk-XA3PKYBR.js.map
@@ -3,7 +3,7 @@ import {
3
3
  MODEL_IDS,
4
4
  getTimeProvider,
5
5
  resolveModelIdentitySync
6
- } from "./chunk-OE5CRMG4.js";
6
+ } from "./chunk-VGINLUME.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-BC3M23NP.js.map
153
+ //# sourceMappingURL=chunk-ZGYLWKAZ.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-DXT6CJNI.js";
4
+ } from "./chunk-AFNO7KMH.js";
5
5
  import {
6
6
  ROLE_DEFAULT_TRUST,
7
7
  ReputationCache,
@@ -11,17 +11,17 @@ import {
11
11
  gateWithReputation,
12
12
  resolveReputationGatingMode,
13
13
  sanitizeInput
14
- } from "./chunk-2XEAA6YJ.js";
14
+ } from "./chunk-4EDNTMRD.js";
15
15
  import {
16
16
  emitPolicyEvent
17
- } from "./chunk-P3M6T3LZ.js";
17
+ } from "./chunk-PBNYJR7F.js";
18
18
  import {
19
19
  CLI_SUBPROCESS_TIMEOUTS,
20
20
  createLogger,
21
21
  err,
22
22
  getTimeProvider,
23
23
  ok
24
- } from "./chunk-OE5CRMG4.js";
24
+ } from "./chunk-VGINLUME.js";
25
25
 
26
26
  // src/security/trust-classifier.ts
27
27
  function mapAuthorAssociation(association) {
@@ -1211,4 +1211,4 @@ export {
1211
1211
  IssueTriage,
1212
1212
  createIssueTriage
1213
1213
  };
1214
- //# sourceMappingURL=chunk-FVNQVLUA.js.map
1214
+ //# sourceMappingURL=chunk-ZO2FWH6W.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  CliCircuitBreakerIntegration,
3
3
  createCliCircuitBreakerIntegration
4
- } from "./chunk-Z5EPH7IP.js";
5
- import "./chunk-LYQVCUAB.js";
6
- import "./chunk-OE5CRMG4.js";
4
+ } from "./chunk-OECO3UIW.js";
5
+ import "./chunk-76BPE6FB.js";
6
+ import "./chunk-VGINLUME.js";
7
7
  import "./chunk-NL7SZQPW.js";
8
8
  import "./chunk-DHVMSIT5.js";
9
9
  import "./chunk-ZPWHCABL.js";
@@ -11,4 +11,4 @@ export {
11
11
  CliCircuitBreakerIntegration,
12
12
  createCliCircuitBreakerIntegration
13
13
  };
14
- //# sourceMappingURL=cli-circuit-breaker-4UGYIBFK.js.map
14
+ //# sourceMappingURL=cli-circuit-breaker-CLQKA7NG.js.map
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  buildOpenAICompatAdapters,
4
4
  readOpenAICompatEnv
5
- } from "./chunk-TLRFRDJ4.js";
5
+ } from "./chunk-FR2YSJC7.js";
6
6
  import {
7
7
  calculateConsensus,
8
8
  countByCategory,
@@ -17,13 +17,13 @@ import {
17
17
  generateSummary,
18
18
  parseFindings,
19
19
  sumFindings
20
- } from "./chunk-OVSQGQCX.js";
21
- import "./chunk-XMDUYUOV.js";
20
+ } from "./chunk-Q42KWK42.js";
21
+ import "./chunk-VPFK7LIK.js";
22
22
  import {
23
23
  setupCommandAsync,
24
24
  verifyCommand
25
- } from "./chunk-PJVGQJUF.js";
26
- import "./chunk-34F5J5QJ.js";
25
+ } from "./chunk-V25VUUPP.js";
26
+ import "./chunk-GTEGNTFD.js";
27
27
  import {
28
28
  AuthHandler,
29
29
  DEFAULT_EXPERTS,
@@ -142,9 +142,9 @@ import {
142
142
  validateCommand,
143
143
  validateWorkflow,
144
144
  wrapInMarkdownFence
145
- } from "./chunk-7KT5JROL.js";
146
- import "./chunk-AHZZWRCO.js";
147
- import "./chunk-MJO7ZXJD.js";
145
+ } from "./chunk-LGSU5C46.js";
146
+ import "./chunk-WUYXJJTL.js";
147
+ import "./chunk-6D7NYWDW.js";
148
148
  import "./chunk-HFOQKCD2.js";
149
149
  import "./chunk-3ACDP4E6.js";
150
150
  import {
@@ -170,11 +170,11 @@ import {
170
170
  loadConfig,
171
171
  runDoctor,
172
172
  validateNexusEnv
173
- } from "./chunk-CVHNT4JY.js";
174
- import "./chunk-Z5EPH7IP.js";
173
+ } from "./chunk-IJ5JFATI.js";
174
+ import "./chunk-OECO3UIW.js";
175
175
  import {
176
176
  shutdownExpertBridge
177
- } from "./chunk-V3OSYFGM.js";
177
+ } from "./chunk-BX5CYNHE.js";
178
178
  import {
179
179
  ConsensusVoteInputSchema,
180
180
  DEFAULT_VOTE_TIMEOUT_MS,
@@ -183,25 +183,25 @@ import {
183
183
  VoteThresholdSchema,
184
184
  executeVoting,
185
185
  registerConsensusVoteTool
186
- } from "./chunk-WARUMI7Y.js";
186
+ } from "./chunk-27JU5EIO.js";
187
187
  import {
188
188
  loadUsageEvents,
189
189
  rollupByModel
190
- } from "./chunk-DHGHOAFU.js";
190
+ } from "./chunk-MDCSXJWB.js";
191
191
  import {
192
192
  synthesizeResearch
193
- } from "./chunk-ZI3Q6DAG.js";
193
+ } from "./chunk-RKQQEJEU.js";
194
194
  import {
195
195
  classifyTrust,
196
196
  createFullGitHubProvider,
197
197
  evaluatePolicy,
198
198
  parsePRUrl
199
- } from "./chunk-FVNQVLUA.js";
200
- import "./chunk-DXT6CJNI.js";
199
+ } from "./chunk-ZO2FWH6W.js";
200
+ import "./chunk-AFNO7KMH.js";
201
201
  import {
202
202
  ReputationCache,
203
203
  sanitizeInput
204
- } from "./chunk-2XEAA6YJ.js";
204
+ } from "./chunk-4EDNTMRD.js";
205
205
  import {
206
206
  ImprovementReviewInputSchema,
207
207
  calculateFitnessScore,
@@ -215,11 +215,11 @@ import {
215
215
  registerImprovementReviewTool,
216
216
  runImprovementReview,
217
217
  scanForSecrets
218
- } from "./chunk-AZ7YKZZ6.js";
218
+ } from "./chunk-WO4MB65I.js";
219
219
  import {
220
220
  createDefaultPolicyFirewall
221
- } from "./chunk-J2XRODBH.js";
222
- import "./chunk-P3M6T3LZ.js";
221
+ } from "./chunk-GUAG2ADJ.js";
222
+ import "./chunk-PBNYJR7F.js";
223
223
  import {
224
224
  PaperStatusSchema,
225
225
  createResearchIssue,
@@ -242,32 +242,32 @@ import {
242
242
  loadSourcesRegistry,
243
243
  rankDiscoveredItems,
244
244
  saveSourcesRegistry
245
- } from "./chunk-KCDBE5KF.js";
245
+ } from "./chunk-BOJOJQLH.js";
246
246
  import {
247
247
  resolveToken
248
- } from "./chunk-QJPZ7I6P.js";
248
+ } from "./chunk-HZXJ3JAZ.js";
249
249
  import {
250
250
  loadPapersRegistry,
251
251
  loadTechniquesRegistry,
252
252
  savePapersRegistry
253
- } from "./chunk-23E6C3NL.js";
253
+ } from "./chunk-V2PQVMGE.js";
254
254
  import "./chunk-NUBSJGQZ.js";
255
255
  import {
256
256
  MemoryError,
257
257
  shutdownToolMemory
258
- } from "./chunk-YKKQ6A3R.js";
258
+ } from "./chunk-5AWBRS3R.js";
259
259
  import {
260
260
  capitalize,
261
261
  capitalizeKebab,
262
262
  truncateSentence
263
263
  } from "./chunk-6T3EPABN.js";
264
- import "./chunk-JJNMM3PJ.js";
264
+ import "./chunk-J3QSLEHM.js";
265
265
  import "./chunk-ZM4O442V.js";
266
266
  import "./chunk-PINS44XA.js";
267
267
  import "./chunk-KSQSWEFH.js";
268
268
  import {
269
269
  createUnifiedRegistry
270
- } from "./chunk-QBZGOC37.js";
270
+ } from "./chunk-XA3PKYBR.js";
271
271
  import {
272
272
  NEXUS_SUBPROCESS_DEPTH_ENV,
273
273
  createAllAdapters,
@@ -275,14 +275,14 @@ import {
275
275
  isRecord,
276
276
  probeAllClis,
277
277
  readSubprocessDepth
278
- } from "./chunk-ZB5D3WYT.js";
279
- import "./chunk-MPRYMYUB.js";
278
+ } from "./chunk-FWEYQX4N.js";
279
+ import "./chunk-HQL7TF57.js";
280
280
  import {
281
281
  DEFAULTS
282
- } from "./chunk-26MUMXZM.js";
283
- import "./chunk-LYQVCUAB.js";
284
- import "./chunk-BC3M23NP.js";
285
- import "./chunk-LHSPDZHM.js";
282
+ } from "./chunk-KIDH3EWN.js";
283
+ import "./chunk-76BPE6FB.js";
284
+ import "./chunk-ZGYLWKAZ.js";
285
+ import "./chunk-RLBYREDT.js";
286
286
  import {
287
287
  API_TIMEOUTS,
288
288
  AgentCapability,
@@ -356,7 +356,7 @@ import {
356
356
  validateTimeout,
357
357
  writeEmptyLine,
358
358
  writeLine
359
- } from "./chunk-OE5CRMG4.js";
359
+ } from "./chunk-VGINLUME.js";
360
360
  import "./chunk-NL7SZQPW.js";
361
361
  import {
362
362
  applyPortableMode,
@@ -4030,7 +4030,7 @@ ${file.patch}
4030
4030
  violations: policyResult.violations
4031
4031
  });
4032
4032
  }
4033
- const { formatReviewComment: formatReviewComment2 } = await import("./pr-reviewer-helpers-TPTE5WDY.js");
4033
+ const { formatReviewComment: formatReviewComment2 } = await import("./pr-reviewer-helpers-LX46ZNDN.js");
4034
4034
  const body = formatReviewComment2(result);
4035
4035
  const postResult = await provider.createReview(pr.prNumber, body, result.decision);
4036
4036
  if (!postResult.ok) {
@@ -17830,7 +17830,7 @@ function startImprovementReviewScheduler(options) {
17830
17830
  let running = false;
17831
17831
  const runOnce = async () => {
17832
17832
  try {
17833
- const { runImprovementReview: runImprovementReview2, ImprovementReviewInputSchema: ImprovementReviewInputSchema2 } = await import("./improvement-review-OKFIXNIA.js");
17833
+ const { runImprovementReview: runImprovementReview2, ImprovementReviewInputSchema: ImprovementReviewInputSchema2 } = await import("./improvement-review-MJ6A6HFV.js");
17834
17834
  const input = ImprovementReviewInputSchema2.parse({ fileIssues });
17835
17835
  const result = await runImprovementReview2(input, { logger: logger19 });
17836
17836
  logger19.info("Scheduled improvement_review complete", {
@@ -19869,7 +19869,7 @@ function adaptConfigToLibrary(config) {
19869
19869
  }
19870
19870
  function createBeliefPromoter() {
19871
19871
  return async (event) => {
19872
- const { getToolMemory } = await import("./tool-memory-NN5IDPRO.js");
19872
+ const { getToolMemory } = await import("./tool-memory-734GCMZM.js");
19873
19873
  const tm = getToolMemory();
19874
19874
  await tm.recordBelief(
19875
19875
  `skill:${event.name}`,
@@ -20727,7 +20727,7 @@ async function handleResearchCommand(args) {
20727
20727
  }
20728
20728
  }
20729
20729
  async function handleRegistryCommand(args) {
20730
- const { registryCommand, isValidRegistrySubcommand, formatRegistryUsage } = await import("./registry-command-ETSNCQRP.js");
20730
+ const { registryCommand, isValidRegistrySubcommand, formatRegistryUsage } = await import("./registry-command-STRBISOJ.js");
20731
20731
  const subcommand = args.subcommand;
20732
20732
  if (!isValidRegistrySubcommand(subcommand)) {
20733
20733
  process.stdout.write(`${formatRegistryUsage()}
@@ -20775,7 +20775,7 @@ async function handleVerifyCommand(args) {
20775
20775
  async function handleDoctorCommand(args) {
20776
20776
  const exitCode = await doctorCommand({ fix: args.options.fix });
20777
20777
  if (args.options.deep) {
20778
- const { runDeepDiagnostics: runDeepDiagnostics2, formatDeepDiagnostics: formatDeepDiagnostics2 } = await import("./doctor-deep-3JXAKLJM.js");
20778
+ const { runDeepDiagnostics: runDeepDiagnostics2, formatDeepDiagnostics: formatDeepDiagnostics2 } = await import("./doctor-deep-4VYC4ZFD.js");
20779
20779
  const diag = runDeepDiagnostics2();
20780
20780
  process.stdout.write(formatDeepDiagnostics2(diag) + "\n");
20781
20781
  }
@@ -20825,7 +20825,7 @@ async function runInitPortableFlow(args) {
20825
20825
  return cliExit(result.success ? EXIT_CODES.SUCCESS : EXIT_CODES.SERVER_START_FAILED);
20826
20826
  }
20827
20827
  async function runInitOpencodeFlow(args) {
20828
- const { runInitOpencode } = await import("./init-opencode-POK7JP6T.js");
20828
+ const { runInitOpencode } = await import("./init-opencode-JAFMTL6D.js");
20829
20829
  const opencodePath = args.options.opencode;
20830
20830
  if (opencodePath === void 0 || opencodePath === "") {
20831
20831
  process.stderr.write("Error: --opencode requires a path argument.\n");
@@ -20851,7 +20851,7 @@ async function runInitOpencodeFlow(args) {
20851
20851
  return cliExit(EXIT_CODES.SUCCESS);
20852
20852
  }
20853
20853
  async function renderOpencodeValidate(opencodePath) {
20854
- const { runOpencodeValidate } = await import("./init-opencode-POK7JP6T.js");
20854
+ const { runOpencodeValidate } = await import("./init-opencode-JAFMTL6D.js");
20855
20855
  const result = await runOpencodeValidate(opencodePath);
20856
20856
  if (!result.ok) {
20857
20857
  process.stderr.write(`init --opencode --validate: ${result.reason ?? "failed"}
@@ -20890,7 +20890,7 @@ async function handleSetupCommandAsync(args) {
20890
20890
  return cliExitFromStatus(exitCode);
20891
20891
  }
20892
20892
  async function runCustomApiSetup(args) {
20893
- const { configureCustomApi } = await import("./setup-custom-api-AJGCQB72.js");
20893
+ const { configureCustomApi } = await import("./setup-custom-api-3WRO27ZG.js");
20894
20894
  const baseUrl = args.options.customApi;
20895
20895
  if (baseUrl === void 0) return EXIT_CODES.SERVER_START_FAILED;
20896
20896
  const input = {
@@ -4,7 +4,7 @@ import {
4
4
  CompositeRoutingError,
5
5
  DEFAULT_COMPOSITE_CONFIG,
6
6
  createCompositeRouter
7
- } from "./chunk-OE5CRMG4.js";
7
+ } from "./chunk-VGINLUME.js";
8
8
  import "./chunk-NL7SZQPW.js";
9
9
  import "./chunk-DHVMSIT5.js";
10
10
  import "./chunk-ZPWHCABL.js";
@@ -15,4 +15,4 @@ export {
15
15
  DEFAULT_COMPOSITE_CONFIG,
16
16
  createCompositeRouter
17
17
  };
18
- //# sourceMappingURL=composite-router-35AMJJXE.js.map
18
+ //# sourceMappingURL=composite-router-ZIIMWIPS.js.map