nexus-agents 2.131.1 → 2.132.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 (158) hide show
  1. package/README.md +1 -1
  2. package/dist/{child-mcp-config-WREL6AH5.js → child-mcp-config-R67B2KM6.js} +4 -4
  3. package/dist/{chunk-K3CES6CG.js → chunk-27DRQWON.js} +7 -123
  4. package/dist/chunk-27DRQWON.js.map +1 -0
  5. package/dist/{chunk-HM77WNJG.js → chunk-2CLFX73Y.js} +2 -2
  6. package/dist/{chunk-ZLQCJRYK.js → chunk-2JZ55G3X.js} +607 -332
  7. package/dist/chunk-2JZ55G3X.js.map +1 -0
  8. package/dist/{chunk-4SNH5EMQ.js → chunk-4CLBJ2NA.js} +3 -3
  9. package/dist/{chunk-DRYU676G.js → chunk-4DLHM6LI.js} +6 -2
  10. package/dist/{chunk-DRYU676G.js.map → chunk-4DLHM6LI.js.map} +1 -1
  11. package/dist/{chunk-JPBPQN4U.js → chunk-7BONPRR2.js} +2 -2
  12. package/dist/{chunk-O563YLBH.js → chunk-CI5KGCX5.js} +3 -3
  13. package/dist/{chunk-PARI43LB.js → chunk-E4IYX7LD.js} +2 -2
  14. package/dist/{chunk-JSYFPXID.js → chunk-ECDJM6UB.js} +2 -2
  15. package/dist/{chunk-WUJCVZIQ.js → chunk-EFDXX5MC.js} +3 -3
  16. package/dist/{chunk-3P252QNW.js → chunk-FKTLAPXJ.js} +3 -3
  17. package/dist/{chunk-PID22PMZ.js → chunk-FRHC77VK.js} +8 -8
  18. package/dist/{chunk-TRTCKEHS.js → chunk-GET2MTLW.js} +2 -2
  19. package/dist/{chunk-NINNWQ42.js → chunk-GYDO2WOR.js} +13 -5
  20. package/dist/{chunk-NINNWQ42.js.map → chunk-GYDO2WOR.js.map} +1 -1
  21. package/dist/{chunk-DEL26PXS.js → chunk-I2SW34K6.js} +403 -84
  22. package/dist/chunk-I2SW34K6.js.map +1 -0
  23. package/dist/{chunk-3TTMRJUQ.js → chunk-J435FU54.js} +6 -4
  24. package/dist/{chunk-3TTMRJUQ.js.map → chunk-J435FU54.js.map} +1 -1
  25. package/dist/{chunk-IPPWZNTH.js → chunk-K5WBFAR4.js} +4 -4
  26. package/dist/{chunk-KMNAZ5RC.js → chunk-MHIJSCPR.js} +446 -162
  27. package/dist/chunk-MHIJSCPR.js.map +1 -0
  28. package/dist/{chunk-PGGSGUO4.js → chunk-NZGNOXXW.js} +3 -2
  29. package/dist/{chunk-PGGSGUO4.js.map → chunk-NZGNOXXW.js.map} +1 -1
  30. package/dist/{chunk-UZWZ72X7.js → chunk-PM63X3QG.js} +3 -3
  31. package/dist/{chunk-4KBG4ICZ.js → chunk-QJIHSQZX.js} +790 -27
  32. package/dist/chunk-QJIHSQZX.js.map +1 -0
  33. package/dist/{chunk-HS3K2B7Q.js → chunk-QLRH6KOT.js} +2 -2
  34. package/dist/{chunk-DI6SRBCT.js → chunk-QMCHVYZB.js} +2 -2
  35. package/dist/{chunk-GVBEF6LQ.js → chunk-RAWF4JOT.js} +8 -8
  36. package/dist/{chunk-RF7QCPNA.js → chunk-RLYXX3FQ.js} +2 -2
  37. package/dist/{chunk-STIX3VTX.js → chunk-RR7Q2HFH.js} +6 -6
  38. package/dist/{chunk-ZGLIHPGJ.js → chunk-RUSP5PJR.js} +9 -1
  39. package/dist/chunk-RUSP5PJR.js.map +1 -0
  40. package/dist/{chunk-FCPANF6R.js → chunk-S4U3Z6ZS.js} +9 -6
  41. package/dist/{chunk-FCPANF6R.js.map → chunk-S4U3Z6ZS.js.map} +1 -1
  42. package/dist/chunk-TGGR6ST5.js +126 -0
  43. package/dist/chunk-TGGR6ST5.js.map +1 -0
  44. package/dist/{chunk-2QFUW2SP.js → chunk-VZCQRLXT.js} +7 -7
  45. package/dist/{chunk-JTECUWWI.js → chunk-WHZD2W6Q.js} +2 -2
  46. package/dist/{chunk-BDERGLIX.js → chunk-XIFOAZ5B.js} +4 -4
  47. package/dist/{chunk-PR4QN5HX.js → chunk-ZPWHCABL.js} +6 -2
  48. package/dist/{chunk-4DJNJGIB.js → chunk-ZQEQVCIU.js} +2 -2
  49. package/dist/{chunk-VZ3TTUWP.js → chunk-ZTRBMKXK.js} +5 -2
  50. package/dist/{chunk-VZ3TTUWP.js.map → chunk-ZTRBMKXK.js.map} +1 -1
  51. package/dist/cli-circuit-breaker-J6UFONNE.js +13 -0
  52. package/dist/cli.d.ts +1 -1
  53. package/dist/cli.js +258 -150
  54. package/dist/cli.js.map +1 -1
  55. package/dist/{codebase-search-ZFJUVMVR.js → codebase-search-PWMWLU7O.js} +2 -2
  56. package/dist/{composite-router-Y6UCDBDE.js → composite-router-HQUSCJO4.js} +4 -4
  57. package/dist/consensus-vote-E2WJFEIJ.js +37 -0
  58. package/dist/{consensus-vote-types-DdruG9-X.d.ts → consensus-vote-types-CYBHW8vY.d.ts} +99 -2
  59. package/dist/{context-retriever-GRMH7WSS.js → context-retriever-5OVRAWNZ.js} +10 -10
  60. package/dist/{dist-QZLOLGIK.js → dist-A5STUO26.js} +792 -622
  61. package/dist/dist-A5STUO26.js.map +1 -0
  62. package/dist/{dist-OFXI4GYH.js → dist-C4457XNQ.js} +2 -2
  63. package/dist/doctor-deep-HJ3NQ365.js +12 -0
  64. package/dist/expert-bridge-MINXBC73.js +17 -0
  65. package/dist/{expert-config-OIIUMJFB.js → expert-config-53EBA7DT.js} +2 -2
  66. package/dist/factory-KC7BYHAP.js +21 -0
  67. package/dist/factory-ZG2FZYVA.js +14 -0
  68. package/dist/{improvement-review-N2KSQSNW.js → improvement-review-TDC4QH5P.js} +6 -6
  69. package/dist/index.d.ts +731 -339
  70. package/dist/index.js +31 -30
  71. package/dist/index.js.map +1 -1
  72. package/dist/{init-opencode-6K6QNJWF.js → init-opencode-L3NT524E.js} +8 -7
  73. package/dist/{init-opencode-6K6QNJWF.js.map → init-opencode-L3NT524E.js.map} +1 -1
  74. package/dist/issue-triage-CZPFNGB7.js +16 -0
  75. package/dist/{learning-persistence-C737Q6EP.js → learning-persistence-QFCQ5POD.js} +7 -3
  76. package/dist/{outcome-store-adapter-D3UDQFNQ.js → outcome-store-adapter-K4L3RUJE.js} +2 -2
  77. package/dist/{pr-reviewer-helpers-GC6DEIBT.js → pr-reviewer-helpers-PLKDVWYF.js} +6 -6
  78. package/dist/{registry-command-7RRDCDAU.js → registry-command-HPKNLYUL.js} +4 -4
  79. package/dist/{repo-analyze-JZEMBE6R.js → repo-analyze-UJOWFGNM.js} +2 -2
  80. package/dist/{repo-security-plan-5V43DEGA.js → repo-security-plan-HSYGGVEJ.js} +5 -5
  81. package/dist/research-helpers-synthesize-IQHDU27S.js +14 -0
  82. package/dist/{routing-memory-BQ6MUC5Y.js → routing-memory-OGUOL7UF.js} +4 -4
  83. package/dist/{session-memory-MJHN5FXI.js → session-memory-HQWAXH3C.js} +5 -5
  84. package/dist/{setup-command-YAQE2KRH.js → setup-command-CNYIKBY7.js} +13 -13
  85. package/dist/setup-config-HYX3BRSE.js +10 -0
  86. package/dist/{setup-custom-api-3JEENEKA.js → setup-custom-api-W7EDVKWR.js} +5 -5
  87. package/dist/{tool-memory-NKBBVA7O.js → tool-memory-Z2B7CAH7.js} +7 -7
  88. package/dist/unified-registry-UFNSWKZA.js +24 -0
  89. package/dist/{weather-report-7WC3RKE7.js → weather-report-GX7OIUL2.js} +4 -4
  90. package/package.json +12 -12
  91. package/dist/chunk-4KBG4ICZ.js.map +0 -1
  92. package/dist/chunk-DEL26PXS.js.map +0 -1
  93. package/dist/chunk-K3CES6CG.js.map +0 -1
  94. package/dist/chunk-KMNAZ5RC.js.map +0 -1
  95. package/dist/chunk-ZGLIHPGJ.js.map +0 -1
  96. package/dist/chunk-ZLQCJRYK.js.map +0 -1
  97. package/dist/cli-circuit-breaker-WLYICYAZ.js +0 -13
  98. package/dist/consensus-vote-PEWNN4WK.js +0 -36
  99. package/dist/dist-QZLOLGIK.js.map +0 -1
  100. package/dist/doctor-deep-HXKGXUI4.js +0 -12
  101. package/dist/expert-bridge-BW55FRAH.js +0 -17
  102. package/dist/factory-4EV6EDZF.js +0 -21
  103. package/dist/factory-YKXAMYW6.js +0 -14
  104. package/dist/issue-triage-PYHGDQHK.js +0 -16
  105. package/dist/research-helpers-synthesize-EDT6REQJ.js +0 -14
  106. package/dist/setup-config-OFC6SD7H.js +0 -10
  107. package/dist/unified-registry-XXAVF4AQ.js +0 -24
  108. /package/dist/{child-mcp-config-WREL6AH5.js.map → child-mcp-config-R67B2KM6.js.map} +0 -0
  109. /package/dist/{chunk-HM77WNJG.js.map → chunk-2CLFX73Y.js.map} +0 -0
  110. /package/dist/{chunk-4SNH5EMQ.js.map → chunk-4CLBJ2NA.js.map} +0 -0
  111. /package/dist/{chunk-JPBPQN4U.js.map → chunk-7BONPRR2.js.map} +0 -0
  112. /package/dist/{chunk-O563YLBH.js.map → chunk-CI5KGCX5.js.map} +0 -0
  113. /package/dist/{chunk-PARI43LB.js.map → chunk-E4IYX7LD.js.map} +0 -0
  114. /package/dist/{chunk-JSYFPXID.js.map → chunk-ECDJM6UB.js.map} +0 -0
  115. /package/dist/{chunk-WUJCVZIQ.js.map → chunk-EFDXX5MC.js.map} +0 -0
  116. /package/dist/{chunk-3P252QNW.js.map → chunk-FKTLAPXJ.js.map} +0 -0
  117. /package/dist/{chunk-PID22PMZ.js.map → chunk-FRHC77VK.js.map} +0 -0
  118. /package/dist/{chunk-TRTCKEHS.js.map → chunk-GET2MTLW.js.map} +0 -0
  119. /package/dist/{chunk-IPPWZNTH.js.map → chunk-K5WBFAR4.js.map} +0 -0
  120. /package/dist/{chunk-UZWZ72X7.js.map → chunk-PM63X3QG.js.map} +0 -0
  121. /package/dist/{chunk-HS3K2B7Q.js.map → chunk-QLRH6KOT.js.map} +0 -0
  122. /package/dist/{chunk-DI6SRBCT.js.map → chunk-QMCHVYZB.js.map} +0 -0
  123. /package/dist/{chunk-GVBEF6LQ.js.map → chunk-RAWF4JOT.js.map} +0 -0
  124. /package/dist/{chunk-RF7QCPNA.js.map → chunk-RLYXX3FQ.js.map} +0 -0
  125. /package/dist/{chunk-STIX3VTX.js.map → chunk-RR7Q2HFH.js.map} +0 -0
  126. /package/dist/{chunk-2QFUW2SP.js.map → chunk-VZCQRLXT.js.map} +0 -0
  127. /package/dist/{chunk-JTECUWWI.js.map → chunk-WHZD2W6Q.js.map} +0 -0
  128. /package/dist/{chunk-BDERGLIX.js.map → chunk-XIFOAZ5B.js.map} +0 -0
  129. /package/dist/{chunk-PR4QN5HX.js.map → chunk-ZPWHCABL.js.map} +0 -0
  130. /package/dist/{chunk-4DJNJGIB.js.map → chunk-ZQEQVCIU.js.map} +0 -0
  131. /package/dist/{cli-circuit-breaker-WLYICYAZ.js.map → cli-circuit-breaker-J6UFONNE.js.map} +0 -0
  132. /package/dist/{codebase-search-ZFJUVMVR.js.map → codebase-search-PWMWLU7O.js.map} +0 -0
  133. /package/dist/{composite-router-Y6UCDBDE.js.map → composite-router-HQUSCJO4.js.map} +0 -0
  134. /package/dist/{consensus-vote-PEWNN4WK.js.map → consensus-vote-E2WJFEIJ.js.map} +0 -0
  135. /package/dist/{context-retriever-GRMH7WSS.js.map → context-retriever-5OVRAWNZ.js.map} +0 -0
  136. /package/dist/{dist-OFXI4GYH.js.map → dist-C4457XNQ.js.map} +0 -0
  137. /package/dist/{doctor-deep-HXKGXUI4.js.map → doctor-deep-HJ3NQ365.js.map} +0 -0
  138. /package/dist/{expert-bridge-BW55FRAH.js.map → expert-bridge-MINXBC73.js.map} +0 -0
  139. /package/dist/{expert-config-OIIUMJFB.js.map → expert-config-53EBA7DT.js.map} +0 -0
  140. /package/dist/{factory-4EV6EDZF.js.map → factory-KC7BYHAP.js.map} +0 -0
  141. /package/dist/{factory-YKXAMYW6.js.map → factory-ZG2FZYVA.js.map} +0 -0
  142. /package/dist/{improvement-review-N2KSQSNW.js.map → improvement-review-TDC4QH5P.js.map} +0 -0
  143. /package/dist/{issue-triage-PYHGDQHK.js.map → issue-triage-CZPFNGB7.js.map} +0 -0
  144. /package/dist/{learning-persistence-C737Q6EP.js.map → learning-persistence-QFCQ5POD.js.map} +0 -0
  145. /package/dist/{outcome-store-adapter-D3UDQFNQ.js.map → outcome-store-adapter-K4L3RUJE.js.map} +0 -0
  146. /package/dist/{pr-reviewer-helpers-GC6DEIBT.js.map → pr-reviewer-helpers-PLKDVWYF.js.map} +0 -0
  147. /package/dist/{registry-command-7RRDCDAU.js.map → registry-command-HPKNLYUL.js.map} +0 -0
  148. /package/dist/{repo-analyze-JZEMBE6R.js.map → repo-analyze-UJOWFGNM.js.map} +0 -0
  149. /package/dist/{repo-security-plan-5V43DEGA.js.map → repo-security-plan-HSYGGVEJ.js.map} +0 -0
  150. /package/dist/{research-helpers-synthesize-EDT6REQJ.js.map → research-helpers-synthesize-IQHDU27S.js.map} +0 -0
  151. /package/dist/{routing-memory-BQ6MUC5Y.js.map → routing-memory-OGUOL7UF.js.map} +0 -0
  152. /package/dist/{session-memory-MJHN5FXI.js.map → session-memory-HQWAXH3C.js.map} +0 -0
  153. /package/dist/{setup-command-YAQE2KRH.js.map → setup-command-CNYIKBY7.js.map} +0 -0
  154. /package/dist/{setup-config-OFC6SD7H.js.map → setup-config-HYX3BRSE.js.map} +0 -0
  155. /package/dist/{setup-custom-api-3JEENEKA.js.map → setup-custom-api-W7EDVKWR.js.map} +0 -0
  156. /package/dist/{tool-memory-NKBBVA7O.js.map → tool-memory-Z2B7CAH7.js.map} +0 -0
  157. /package/dist/{unified-registry-XXAVF4AQ.js.map → unified-registry-UFNSWKZA.js.map} +0 -0
  158. /package/dist/{weather-report-7WC3RKE7.js.map → weather-report-GX7OIUL2.js.map} +0 -0
@@ -1,14 +1,15 @@
1
1
  import {
2
2
  discoverModels,
3
3
  readOpencodeGateway
4
- } from "./chunk-K3CES6CG.js";
5
- import "./chunk-UZWZ72X7.js";
6
- import "./chunk-JSYFPXID.js";
4
+ } from "./chunk-27DRQWON.js";
5
+ import "./chunk-PM63X3QG.js";
6
+ import "./chunk-TGGR6ST5.js";
7
+ import "./chunk-ECDJM6UB.js";
7
8
  import {
8
9
  createLogger
9
- } from "./chunk-4KBG4ICZ.js";
10
- import "./chunk-ZGLIHPGJ.js";
11
- import "./chunk-PR4QN5HX.js";
10
+ } from "./chunk-QJIHSQZX.js";
11
+ import "./chunk-RUSP5PJR.js";
12
+ import "./chunk-ZPWHCABL.js";
12
13
 
13
14
  // src/cli/init-opencode.ts
14
15
  import { existsSync, readFileSync, writeFileSync } from "fs";
@@ -174,4 +175,4 @@ export {
174
175
  runInitOpencode,
175
176
  runOpencodeValidate
176
177
  };
177
- //# sourceMappingURL=init-opencode-6K6QNJWF.js.map
178
+ //# sourceMappingURL=init-opencode-L3NT524E.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/init-opencode.ts"],"sourcesContent":["/**\n * `nexus-agents init --opencode <path>` setup helper (#2504, child 4 of #2500).\n *\n * Injects the nexus-agents MCP block + recommended environment into an\n * existing `opencode.json` without overwriting other operator-set keys.\n * Pairs with the existing `init --portable --mcp-config` (which targets\n * Claude Code's `.mcp.json`). Different harness, same merge-not-overwrite\n * pattern.\n *\n * Behaviour:\n * - File exists → merge `mcp.nexus-agents` into the existing JSON.\n * Preserve every other key the operator has set (provider config,\n * model lists, theme, …). Idempotent: re-running produces the same\n * final file.\n * - File missing → write a minimal template with the nexus-agents MCP\n * block + a stubbed `providers.openai-compat` shell the operator\n * fills in (placeholder baseURL + `{env:WORKSPACE_PROXY_KEY}`).\n * - `--dry-run` → print the diff (proposed vs existing) without writing.\n * - `--validate` → after merge (or alongside dry-run), probe\n * `providers.openai-compat.options.baseURL/v1/models` with the\n * resolved apiKey, exit non-zero if unreachable.\n *\n * @module cli/init-opencode\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { createLogger } from '../core/index.js';\nimport { readOpencodeGateway } from '../config/opencode-bridge.js';\nimport { discoverModels } from '../adapters/openai-compat-adapter.js';\n\nconst logger = createLogger({ component: 'init-opencode' });\n\nexport interface InitOpencodeOptions {\n /** Absolute or relative path to opencode.json. */\n readonly path: string;\n /** Path to the nexus-agents CLI binary that the MCP block will spawn. */\n readonly cliPath: string;\n /** Sandbox flavor written to NEXUS_SANDBOX in the MCP environment. */\n readonly sandboxFlavor?: string;\n /** Print the diff without writing. */\n readonly dryRun?: boolean;\n}\n\nexport interface InitOpencodeResult {\n readonly path: string;\n readonly action: 'created' | 'updated' | 'unchanged' | 'dry-run';\n readonly diff: string;\n}\n\ninterface OpencodeMcpBlock {\n type: 'local';\n command: string[];\n enabled: boolean;\n environment: Record<string, string>;\n}\n\ninterface OpencodeFile {\n $schema?: string;\n providers?: Record<string, unknown>;\n mcp?: Record<string, unknown>;\n permission?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Conservative default OpenCode `permission` block (#2658). OpenCode\n * evaluates a glob map with **last-matching-rule-winning**, so the broad\n * `\"*\"` rule is listed first and the hard `deny` patterns last.\n *\n * - `edit` — everything `ask`s; secrets, keys, and `.git/` are hard-denied\n * regardless of operator confirmation. The deny patterns come after\n * `\"*\"` so last-match-wins makes them stick.\n * - `bash` — `ask` unconditionally. Shell is the highest-risk surface.\n * - `skill` — `allow`. Skills are trusted, in-repo, CI-validated content.\n *\n * Emitted only when the operator has not already set their own\n * `permission` block — never overwrites operator config.\n */\nexport function buildDefaultPermissionBlock(): Record<string, unknown> {\n return {\n edit: {\n '*': 'ask',\n '**/.env': 'deny',\n '**/.env.*': 'deny',\n '**/*.pem': 'deny',\n '**/*.key': 'deny',\n '**/id_rsa*': 'deny',\n '**/secrets/**': 'deny',\n '**/.git/**': 'deny',\n },\n bash: 'ask',\n skill: 'allow',\n };\n}\n\n/**\n * Build the canonical nexus-agents MCP block. Mirrors what\n * `Dockerfile.sandbox` writes today plus the env vars from #2501 + #2503.\n */\nexport function buildNexusMcpBlock(opts: {\n readonly cliPath: string;\n readonly sandboxFlavor?: string;\n readonly opencodeConfigPath: string;\n}): OpencodeMcpBlock {\n const env: Record<string, string> = {\n NEXUS_DATA_DIR: '{env:NEXUS_DATA_DIR}',\n NEXUS_OPENCODE_CONFIG: opts.opencodeConfigPath,\n };\n if (opts.sandboxFlavor !== undefined && opts.sandboxFlavor !== '') {\n env['NEXUS_SANDBOX'] = opts.sandboxFlavor;\n }\n return {\n type: 'local',\n command: ['node', opts.cliPath, '--mode=server'],\n enabled: true,\n environment: env,\n };\n}\n\n/**\n * Execute the merge. Pure with respect to `opts.dryRun: true` — no fs\n * writes. Returns the final-or-proposed JSON + a diff string suitable\n * for printing.\n */\nexport function runInitOpencode(opts: InitOpencodeOptions): InitOpencodeResult {\n const existing = readExisting(opts.path);\n const merged = mergeNexusBlock(existing, opts);\n const before = existing === null ? '' : `${JSON.stringify(existing, null, 2)}\\n`;\n const after = `${JSON.stringify(merged, null, 2)}\\n`;\n const diff = simpleDiff(before, after);\n\n if (opts.dryRun === true) {\n return { path: opts.path, action: 'dry-run', diff };\n }\n\n if (existing !== null && before === after) {\n return { path: opts.path, action: 'unchanged', diff };\n }\n\n writeFileSync(opts.path, after, 'utf8');\n return { path: opts.path, action: existing === null ? 'created' : 'updated', diff };\n}\n\nfunction readExisting(path: string): OpencodeFile | null {\n if (!existsSync(path)) return null;\n try {\n const raw = readFileSync(path, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('opencode.json root must be an object');\n }\n return parsed as OpencodeFile;\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to parse opencode.json at ${path}: ${msg}`);\n }\n}\n\nfunction mergeNexusBlock(existing: OpencodeFile | null, opts: InitOpencodeOptions): OpencodeFile {\n const block = buildNexusMcpBlock({\n cliPath: opts.cliPath,\n ...(opts.sandboxFlavor !== undefined && { sandboxFlavor: opts.sandboxFlavor }),\n opencodeConfigPath: opts.path,\n });\n\n if (existing === null) {\n return {\n $schema: 'https://opencode.ai/config.json',\n providers: { 'openai-compat': stubOpenaiCompatProvider() },\n permission: buildDefaultPermissionBlock(),\n mcp: { 'nexus-agents': block },\n };\n }\n\n // Idempotent merge: preserve user-customised fields if they exist on the\n // current MCP block (e.g. `enabled: false`). Update anything else.\n const existingMcp: Record<string, unknown> = existing.mcp ?? {};\n const rawNexus = existingMcp['nexus-agents'];\n const existingNexus: Partial<OpencodeMcpBlock> =\n typeof rawNexus === 'object' && rawNexus !== null ? rawNexus : {};\n const mergedBlock: OpencodeMcpBlock = {\n type: 'local',\n command: block.command,\n enabled: existingNexus.enabled ?? block.enabled,\n environment: { ...block.environment, ...(existingNexus.environment ?? {}) },\n };\n\n // Add the default permission block only when the operator has not set\n // their own — never overwrite an existing `permission` key.\n const permission = existing.permission ?? buildDefaultPermissionBlock();\n\n return {\n ...existing,\n permission,\n mcp: { ...existingMcp, 'nexus-agents': mergedBlock },\n };\n}\n\n/**\n * Stub for `providers.openai-compat`. Operators replace the placeholder\n * baseURL + key with their workspace-proxy values. Empty by design — we\n * never overwrite an existing provider block (see `mergeNexusBlock`).\n */\nfunction stubOpenaiCompatProvider(): Record<string, unknown> {\n return {\n npm: '@ai-sdk/openai-compatible',\n options: {\n baseURL: '<replace with workspace proxy URL>',\n apiKey: '{env:WORKSPACE_PROXY_KEY}',\n },\n };\n}\n\n/**\n * Cheap line-based diff. Three-line context, +/- prefixes. Good enough\n * for an operator preview; not a unified-diff replacement.\n */\nfunction simpleDiff(before: string, after: string): string {\n if (before === after) return '(no changes)';\n const beforeLines = before.split('\\n');\n const afterLines = after.split('\\n');\n const out: string[] = [];\n const max = Math.max(beforeLines.length, afterLines.length);\n for (let i = 0; i < max; i += 1) {\n const b = beforeLines[i];\n const a = afterLines[i];\n if (b === a) {\n out.push(` ${b ?? ''}`);\n } else {\n if (b !== undefined) out.push(`- ${b}`);\n if (a !== undefined) out.push(`+ ${a}`);\n }\n }\n return out.join('\\n');\n}\n\nexport function ensureOpencodeDirExists(path: string): void {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n throw new Error(\n `Parent directory does not exist: ${dir}. Create it first or pass a path under an existing dir.`\n );\n }\n logger.debug('opencode.json target directory exists', { dir });\n}\n\n/**\n * --validate flow for `init --opencode` (follow-up to #2504).\n *\n * After the merge step writes the file, optionally probe the gateway it\n * points at. Reuses the same opencode-bridge loader (#2503) that the\n * runtime uses, so what we validate is exactly what the server will see\n * at boot.\n *\n * Returns:\n * - `{ ok: true, models }` when the gateway is reachable and returns ≥1 model\n * - `{ ok: false, reason }` for every failure path (config missing,\n * probe failed, zero models)\n *\n * Caller (cli-commands-handlers) maps to exit codes + stderr / stdout.\n * The API key never reaches the returned object — only model IDs +\n * baseURL appear in the success payload.\n */\nexport interface OpencodeValidateResult {\n readonly ok: boolean;\n readonly baseURL?: string;\n readonly models?: readonly string[];\n readonly reason?: string;\n}\n\nexport async function runOpencodeValidate(opencodePath: string): Promise<OpencodeValidateResult> {\n const config = readOpencodeGateway(opencodePath);\n if (config === null) {\n return {\n ok: false,\n reason:\n 'opencode.json does not resolve a usable gateway. Check that providers.openai-compat.options.{baseURL, apiKey} are set and that any {env:VAR} interpolation references are exported.',\n };\n }\n const result = await discoverModels({ baseUrl: config.baseURL, apiKey: config.apiKey });\n if (!result.ok) {\n return { ok: false, baseURL: config.baseURL, reason: result.error.message };\n }\n if (result.value.length === 0) {\n return {\n ok: false,\n baseURL: config.baseURL,\n reason: 'gateway returned 0 models. Check upstream provider quotas / list filters.',\n };\n }\n return {\n ok: true,\n baseURL: config.baseURL,\n models: result.value.map((m) => m.id),\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli/init-opencode.ts"],"sourcesContent":["/**\n * `nexus-agents init --opencode <path>` setup helper (#2504, child 4 of #2500).\n *\n * Injects the nexus-agents MCP block + recommended environment into an\n * existing `opencode.json` without overwriting other operator-set keys.\n * Pairs with the existing `init --portable --mcp-config` (which targets\n * Claude Code's `.mcp.json`). Different harness, same merge-not-overwrite\n * pattern.\n *\n * Behaviour:\n * - File exists → merge `mcp.nexus-agents` into the existing JSON.\n * Preserve every other key the operator has set (provider config,\n * model lists, theme, …). Idempotent: re-running produces the same\n * final file.\n * - File missing → write a minimal template with the nexus-agents MCP\n * block + a stubbed `providers.openai-compat` shell the operator\n * fills in (placeholder baseURL + `{env:WORKSPACE_PROXY_KEY}`).\n * - `--dry-run` → print the diff (proposed vs existing) without writing.\n * - `--validate` → after merge (or alongside dry-run), probe\n * `providers.openai-compat.options.baseURL/v1/models` with the\n * resolved apiKey, exit non-zero if unreachable.\n *\n * @module cli/init-opencode\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { createLogger } from '../core/index.js';\nimport { readOpencodeGateway } from '../config/opencode-bridge.js';\nimport { discoverModels } from '../adapters/openai-compat-adapter.js';\n\nconst logger = createLogger({ component: 'init-opencode' });\n\nexport interface InitOpencodeOptions {\n /** Absolute or relative path to opencode.json. */\n readonly path: string;\n /** Path to the nexus-agents CLI binary that the MCP block will spawn. */\n readonly cliPath: string;\n /** Sandbox flavor written to NEXUS_SANDBOX in the MCP environment. */\n readonly sandboxFlavor?: string;\n /** Print the diff without writing. */\n readonly dryRun?: boolean;\n}\n\nexport interface InitOpencodeResult {\n readonly path: string;\n readonly action: 'created' | 'updated' | 'unchanged' | 'dry-run';\n readonly diff: string;\n}\n\ninterface OpencodeMcpBlock {\n type: 'local';\n command: string[];\n enabled: boolean;\n environment: Record<string, string>;\n}\n\ninterface OpencodeFile {\n $schema?: string;\n providers?: Record<string, unknown>;\n mcp?: Record<string, unknown>;\n permission?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Conservative default OpenCode `permission` block (#2658). OpenCode\n * evaluates a glob map with **last-matching-rule-winning**, so the broad\n * `\"*\"` rule is listed first and the hard `deny` patterns last.\n *\n * - `edit` — everything `ask`s; secrets, keys, and `.git/` are hard-denied\n * regardless of operator confirmation. The deny patterns come after\n * `\"*\"` so last-match-wins makes them stick.\n * - `bash` — `ask` unconditionally. Shell is the highest-risk surface.\n * - `skill` — `allow`. Skills are trusted, in-repo, CI-validated content.\n *\n * Emitted only when the operator has not already set their own\n * `permission` block — never overwrites operator config.\n */\nexport function buildDefaultPermissionBlock(): Record<string, unknown> {\n return {\n edit: {\n '*': 'ask',\n '**/.env': 'deny',\n '**/.env.*': 'deny',\n '**/*.pem': 'deny',\n '**/*.key': 'deny',\n '**/id_rsa*': 'deny',\n '**/secrets/**': 'deny',\n '**/.git/**': 'deny',\n },\n bash: 'ask',\n skill: 'allow',\n };\n}\n\n/**\n * Build the canonical nexus-agents MCP block. Mirrors what\n * `Dockerfile.sandbox` writes today plus the env vars from #2501 + #2503.\n */\nexport function buildNexusMcpBlock(opts: {\n readonly cliPath: string;\n readonly sandboxFlavor?: string;\n readonly opencodeConfigPath: string;\n}): OpencodeMcpBlock {\n const env: Record<string, string> = {\n NEXUS_DATA_DIR: '{env:NEXUS_DATA_DIR}',\n NEXUS_OPENCODE_CONFIG: opts.opencodeConfigPath,\n };\n if (opts.sandboxFlavor !== undefined && opts.sandboxFlavor !== '') {\n env['NEXUS_SANDBOX'] = opts.sandboxFlavor;\n }\n return {\n type: 'local',\n command: ['node', opts.cliPath, '--mode=server'],\n enabled: true,\n environment: env,\n };\n}\n\n/**\n * Execute the merge. Pure with respect to `opts.dryRun: true` — no fs\n * writes. Returns the final-or-proposed JSON + a diff string suitable\n * for printing.\n */\nexport function runInitOpencode(opts: InitOpencodeOptions): InitOpencodeResult {\n const existing = readExisting(opts.path);\n const merged = mergeNexusBlock(existing, opts);\n const before = existing === null ? '' : `${JSON.stringify(existing, null, 2)}\\n`;\n const after = `${JSON.stringify(merged, null, 2)}\\n`;\n const diff = simpleDiff(before, after);\n\n if (opts.dryRun === true) {\n return { path: opts.path, action: 'dry-run', diff };\n }\n\n if (existing !== null && before === after) {\n return { path: opts.path, action: 'unchanged', diff };\n }\n\n writeFileSync(opts.path, after, 'utf8');\n return { path: opts.path, action: existing === null ? 'created' : 'updated', diff };\n}\n\nfunction readExisting(path: string): OpencodeFile | null {\n if (!existsSync(path)) return null;\n try {\n const raw = readFileSync(path, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('opencode.json root must be an object');\n }\n return parsed as OpencodeFile;\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to parse opencode.json at ${path}: ${msg}`);\n }\n}\n\nfunction mergeNexusBlock(existing: OpencodeFile | null, opts: InitOpencodeOptions): OpencodeFile {\n const block = buildNexusMcpBlock({\n cliPath: opts.cliPath,\n ...(opts.sandboxFlavor !== undefined && { sandboxFlavor: opts.sandboxFlavor }),\n opencodeConfigPath: opts.path,\n });\n\n if (existing === null) {\n return {\n $schema: 'https://opencode.ai/config.json',\n providers: { 'openai-compat': stubOpenaiCompatProvider() },\n permission: buildDefaultPermissionBlock(),\n mcp: { 'nexus-agents': block },\n };\n }\n\n // Idempotent merge: preserve user-customised fields if they exist on the\n // current MCP block (e.g. `enabled: false`). Update anything else.\n const existingMcp: Record<string, unknown> = existing.mcp ?? {};\n const rawNexus = existingMcp['nexus-agents'];\n const existingNexus: Partial<OpencodeMcpBlock> =\n typeof rawNexus === 'object' && rawNexus !== null ? rawNexus : {};\n const mergedBlock: OpencodeMcpBlock = {\n type: 'local',\n command: block.command,\n enabled: existingNexus.enabled ?? block.enabled,\n environment: { ...block.environment, ...(existingNexus.environment ?? {}) },\n };\n\n // Add the default permission block only when the operator has not set\n // their own — never overwrite an existing `permission` key.\n const permission = existing.permission ?? buildDefaultPermissionBlock();\n\n return {\n ...existing,\n permission,\n mcp: { ...existingMcp, 'nexus-agents': mergedBlock },\n };\n}\n\n/**\n * Stub for `providers.openai-compat`. Operators replace the placeholder\n * baseURL + key with their workspace-proxy values. Empty by design — we\n * never overwrite an existing provider block (see `mergeNexusBlock`).\n */\nfunction stubOpenaiCompatProvider(): Record<string, unknown> {\n return {\n npm: '@ai-sdk/openai-compatible',\n options: {\n baseURL: '<replace with workspace proxy URL>',\n apiKey: '{env:WORKSPACE_PROXY_KEY}',\n },\n };\n}\n\n/**\n * Cheap line-based diff. Three-line context, +/- prefixes. Good enough\n * for an operator preview; not a unified-diff replacement.\n */\nfunction simpleDiff(before: string, after: string): string {\n if (before === after) return '(no changes)';\n const beforeLines = before.split('\\n');\n const afterLines = after.split('\\n');\n const out: string[] = [];\n const max = Math.max(beforeLines.length, afterLines.length);\n for (let i = 0; i < max; i += 1) {\n const b = beforeLines[i];\n const a = afterLines[i];\n if (b === a) {\n out.push(` ${b ?? ''}`);\n } else {\n if (b !== undefined) out.push(`- ${b}`);\n if (a !== undefined) out.push(`+ ${a}`);\n }\n }\n return out.join('\\n');\n}\n\nexport function ensureOpencodeDirExists(path: string): void {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n throw new Error(\n `Parent directory does not exist: ${dir}. Create it first or pass a path under an existing dir.`\n );\n }\n logger.debug('opencode.json target directory exists', { dir });\n}\n\n/**\n * --validate flow for `init --opencode` (follow-up to #2504).\n *\n * After the merge step writes the file, optionally probe the gateway it\n * points at. Reuses the same opencode-bridge loader (#2503) that the\n * runtime uses, so what we validate is exactly what the server will see\n * at boot.\n *\n * Returns:\n * - `{ ok: true, models }` when the gateway is reachable and returns ≥1 model\n * - `{ ok: false, reason }` for every failure path (config missing,\n * probe failed, zero models)\n *\n * Caller (cli-commands-handlers) maps to exit codes + stderr / stdout.\n * The API key never reaches the returned object — only model IDs +\n * baseURL appear in the success payload.\n */\nexport interface OpencodeValidateResult {\n readonly ok: boolean;\n readonly baseURL?: string;\n readonly models?: readonly string[];\n readonly reason?: string;\n}\n\nexport async function runOpencodeValidate(opencodePath: string): Promise<OpencodeValidateResult> {\n const config = readOpencodeGateway(opencodePath);\n if (config === null) {\n return {\n ok: false,\n reason:\n 'opencode.json does not resolve a usable gateway. Check that providers.openai-compat.options.{baseURL, apiKey} are set and that any {env:VAR} interpolation references are exported.',\n };\n }\n const result = await discoverModels({ baseUrl: config.baseURL, apiKey: config.apiKey });\n if (!result.ok) {\n return { ok: false, baseURL: config.baseURL, reason: result.error.message };\n }\n if (result.value.length === 0) {\n return {\n ok: false,\n baseURL: config.baseURL,\n reason: 'gateway returned 0 models. Check upstream provider quotas / list filters.',\n };\n }\n return {\n ok: true,\n baseURL: config.baseURL,\n models: result.value.map((m) => m.id),\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,16 @@
1
+ import {
2
+ IssueTriage,
3
+ createIssueTriage,
4
+ formatTriageComment
5
+ } from "./chunk-J435FU54.js";
6
+ import "./chunk-4DLHM6LI.js";
7
+ import "./chunk-QMCHVYZB.js";
8
+ import "./chunk-QJIHSQZX.js";
9
+ import "./chunk-RUSP5PJR.js";
10
+ import "./chunk-ZPWHCABL.js";
11
+ export {
12
+ IssueTriage,
13
+ createIssueTriage,
14
+ formatTriageComment
15
+ };
16
+ //# sourceMappingURL=issue-triage-CZPFNGB7.js.map
@@ -1,18 +1,22 @@
1
1
  import {
2
2
  ensureLearningDir,
3
+ getDecisionCostFile,
3
4
  getLearningDir,
4
5
  getMetaOutcomesFile,
5
6
  getOutcomesFile,
7
+ getPrReviewEvalFile,
6
8
  getRulesFile,
7
9
  isPersistenceEnabled
8
- } from "./chunk-ZGLIHPGJ.js";
9
- import "./chunk-PR4QN5HX.js";
10
+ } from "./chunk-RUSP5PJR.js";
11
+ import "./chunk-ZPWHCABL.js";
10
12
  export {
11
13
  ensureLearningDir,
14
+ getDecisionCostFile,
12
15
  getLearningDir,
13
16
  getMetaOutcomesFile,
14
17
  getOutcomesFile,
18
+ getPrReviewEvalFile,
15
19
  getRulesFile,
16
20
  isPersistenceEnabled
17
21
  };
18
- //# sourceMappingURL=learning-persistence-C737Q6EP.js.map
22
+ //# sourceMappingURL=learning-persistence-QFCQ5POD.js.map
@@ -1,4 +1,4 @@
1
- import "./chunk-PR4QN5HX.js";
1
+ import "./chunk-ZPWHCABL.js";
2
2
 
3
3
  // src/orchestration/outcomes/outcome-store-adapter.ts
4
4
  var OutcomeStoreAdapter = class {
@@ -54,4 +54,4 @@ var OutcomeStoreAdapter = class {
54
54
  export {
55
55
  OutcomeStoreAdapter
56
56
  };
57
- //# sourceMappingURL=outcome-store-adapter-D3UDQFNQ.js.map
57
+ //# sourceMappingURL=outcome-store-adapter-K4L3RUJE.js.map
@@ -17,12 +17,12 @@ import {
17
17
  parseFindings,
18
18
  parseSeverity,
19
19
  sumFindings
20
- } from "./chunk-3P252QNW.js";
20
+ } from "./chunk-FKTLAPXJ.js";
21
21
  import "./chunk-WAYGXUSM.js";
22
- import "./chunk-DI6SRBCT.js";
23
- import "./chunk-4KBG4ICZ.js";
24
- import "./chunk-ZGLIHPGJ.js";
25
- import "./chunk-PR4QN5HX.js";
22
+ import "./chunk-QMCHVYZB.js";
23
+ import "./chunk-QJIHSQZX.js";
24
+ import "./chunk-RUSP5PJR.js";
25
+ import "./chunk-ZPWHCABL.js";
26
26
  export {
27
27
  assessPRReputation,
28
28
  buildPRTrustAssessment,
@@ -43,4 +43,4 @@ export {
43
43
  parseSeverity,
44
44
  sumFindings
45
45
  };
46
- //# sourceMappingURL=pr-reviewer-helpers-GC6DEIBT.js.map
46
+ //# sourceMappingURL=pr-reviewer-helpers-PLKDVWYF.js.map
@@ -7,11 +7,11 @@ import {
7
7
  loadGeneratedRegistryEntries,
8
8
  loadUserManifestOverlay,
9
9
  reloadDefaultRegistry
10
- } from "./chunk-4KBG4ICZ.js";
10
+ } from "./chunk-QJIHSQZX.js";
11
11
  import {
12
12
  nexusDataPath
13
- } from "./chunk-ZGLIHPGJ.js";
14
- import "./chunk-PR4QN5HX.js";
13
+ } from "./chunk-RUSP5PJR.js";
14
+ import "./chunk-ZPWHCABL.js";
15
15
 
16
16
  // src/cli/registry-command.ts
17
17
  import { createHash } from "crypto";
@@ -248,4 +248,4 @@ export {
248
248
  isValidRegistrySubcommand,
249
249
  registryCommand
250
250
  };
251
- //# sourceMappingURL=registry-command-7RRDCDAU.js.map
251
+ //# sourceMappingURL=registry-command-HPKNLYUL.js.map
@@ -9,7 +9,7 @@ import {
9
9
  identifyGaps,
10
10
  normalizeRepoId
11
11
  } from "./chunk-HFOQKCD2.js";
12
- import "./chunk-PR4QN5HX.js";
12
+ import "./chunk-ZPWHCABL.js";
13
13
  export {
14
14
  analyzeGitHubRepo,
15
15
  analyzeRepo,
@@ -21,4 +21,4 @@ export {
21
21
  identifyGaps,
22
22
  normalizeRepoId
23
23
  };
24
- //# sourceMappingURL=repo-analyze-JZEMBE6R.js.map
24
+ //# sourceMappingURL=repo-analyze-UJOWFGNM.js.map
@@ -3,15 +3,15 @@ import {
3
3
  buildPlanFromAnalysis,
4
4
  generateSecurityPlan,
5
5
  resolveScannerData
6
- } from "./chunk-TRTCKEHS.js";
6
+ } from "./chunk-GET2MTLW.js";
7
7
  import "./chunk-HFOQKCD2.js";
8
- import "./chunk-4KBG4ICZ.js";
9
- import "./chunk-ZGLIHPGJ.js";
10
- import "./chunk-PR4QN5HX.js";
8
+ import "./chunk-QJIHSQZX.js";
9
+ import "./chunk-RUSP5PJR.js";
10
+ import "./chunk-ZPWHCABL.js";
11
11
  export {
12
12
  FALLBACK_SCANNER_DATA,
13
13
  buildPlanFromAnalysis,
14
14
  generateSecurityPlan,
15
15
  resolveScannerData
16
16
  };
17
- //# sourceMappingURL=repo-security-plan-5V43DEGA.js.map
17
+ //# sourceMappingURL=repo-security-plan-HSYGGVEJ.js.map
@@ -0,0 +1,14 @@
1
+ import {
2
+ AttributedInsightSchema,
3
+ synthesizeResearch
4
+ } from "./chunk-EFDXX5MC.js";
5
+ import "./chunk-2CLFX73Y.js";
6
+ import "./chunk-NUBSJGQZ.js";
7
+ import "./chunk-QJIHSQZX.js";
8
+ import "./chunk-RUSP5PJR.js";
9
+ import "./chunk-ZPWHCABL.js";
10
+ export {
11
+ AttributedInsightSchema,
12
+ synthesizeResearch
13
+ };
14
+ //# sourceMappingURL=research-helpers-synthesize-IQHDU27S.js.map
@@ -2,12 +2,12 @@ import {
2
2
  DEFAULT_ROUTING_MEMORY_CONFIG,
3
3
  RoutingMemory,
4
4
  createRoutingMemory
5
- } from "./chunk-4KBG4ICZ.js";
6
- import "./chunk-ZGLIHPGJ.js";
7
- import "./chunk-PR4QN5HX.js";
5
+ } from "./chunk-QJIHSQZX.js";
6
+ import "./chunk-RUSP5PJR.js";
7
+ import "./chunk-ZPWHCABL.js";
8
8
  export {
9
9
  DEFAULT_ROUTING_MEMORY_CONFIG,
10
10
  RoutingMemory,
11
11
  createRoutingMemory
12
12
  };
13
- //# sourceMappingURL=routing-memory-BQ6MUC5Y.js.map
13
+ //# sourceMappingURL=routing-memory-OGUOL7UF.js.map
@@ -6,10 +6,10 @@ import {
6
6
  SessionMemory,
7
7
  SessionMemoryError,
8
8
  createSessionMemory
9
- } from "./chunk-PGGSGUO4.js";
10
- import "./chunk-4KBG4ICZ.js";
11
- import "./chunk-ZGLIHPGJ.js";
12
- import "./chunk-PR4QN5HX.js";
9
+ } from "./chunk-NZGNOXXW.js";
10
+ import "./chunk-QJIHSQZX.js";
11
+ import "./chunk-RUSP5PJR.js";
12
+ import "./chunk-ZPWHCABL.js";
13
13
  export {
14
14
  CompletedTaskSchema,
15
15
  ResolvedErrorSchema,
@@ -19,4 +19,4 @@ export {
19
19
  SessionMemoryError,
20
20
  createSessionMemory
21
21
  };
22
- //# sourceMappingURL=session-memory-MJHN5FXI.js.map
22
+ //# sourceMappingURL=session-memory-HQWAXH3C.js.map
@@ -8,21 +8,21 @@ import {
8
8
  runWizard,
9
9
  setupCommand,
10
10
  setupCommandAsync
11
- } from "./chunk-STIX3VTX.js";
12
- import "./chunk-HS3K2B7Q.js";
13
- import "./chunk-PID22PMZ.js";
11
+ } from "./chunk-RR7Q2HFH.js";
12
+ import "./chunk-QLRH6KOT.js";
13
+ import "./chunk-FRHC77VK.js";
14
14
  import "./chunk-NUBSJGQZ.js";
15
15
  import "./chunk-6T3EPABN.js";
16
16
  import "./chunk-ZM4O442V.js";
17
- import "./chunk-2QFUW2SP.js";
18
- import "./chunk-JTECUWWI.js";
19
- import "./chunk-JSYFPXID.js";
20
- import "./chunk-VZ3TTUWP.js";
21
- import "./chunk-JPBPQN4U.js";
22
- import "./chunk-PARI43LB.js";
23
- import "./chunk-4KBG4ICZ.js";
24
- import "./chunk-ZGLIHPGJ.js";
25
- import "./chunk-PR4QN5HX.js";
17
+ import "./chunk-VZCQRLXT.js";
18
+ import "./chunk-WHZD2W6Q.js";
19
+ import "./chunk-ECDJM6UB.js";
20
+ import "./chunk-ZTRBMKXK.js";
21
+ import "./chunk-7BONPRR2.js";
22
+ import "./chunk-E4IYX7LD.js";
23
+ import "./chunk-QJIHSQZX.js";
24
+ import "./chunk-RUSP5PJR.js";
25
+ import "./chunk-ZPWHCABL.js";
26
26
  export {
27
27
  detectEnvironment,
28
28
  ensureRepoGitignoredAndHint,
@@ -34,4 +34,4 @@ export {
34
34
  setupCommand,
35
35
  setupCommandAsync
36
36
  };
37
- //# sourceMappingURL=setup-command-YAQE2KRH.js.map
37
+ //# sourceMappingURL=setup-command-CNYIKBY7.js.map
@@ -0,0 +1,10 @@
1
+ import {
2
+ runConfigInitSync
3
+ } from "./chunk-QLRH6KOT.js";
4
+ import "./chunk-QJIHSQZX.js";
5
+ import "./chunk-RUSP5PJR.js";
6
+ import "./chunk-ZPWHCABL.js";
7
+ export {
8
+ runConfigInitSync
9
+ };
10
+ //# sourceMappingURL=setup-config-HYX3BRSE.js.map
@@ -3,13 +3,13 @@ import {
3
3
  CUSTOM_API_BASE_URL_ENV,
4
4
  CUSTOM_API_DEFAULT_MODEL,
5
5
  validateCustomApiBaseUrl
6
- } from "./chunk-JTECUWWI.js";
6
+ } from "./chunk-WHZD2W6Q.js";
7
7
  import {
8
8
  err,
9
9
  ok
10
- } from "./chunk-4KBG4ICZ.js";
11
- import "./chunk-ZGLIHPGJ.js";
12
- import "./chunk-PR4QN5HX.js";
10
+ } from "./chunk-QJIHSQZX.js";
11
+ import "./chunk-RUSP5PJR.js";
12
+ import "./chunk-ZPWHCABL.js";
13
13
 
14
14
  // src/cli/setup-custom-api.ts
15
15
  import { createInterface } from "readline";
@@ -104,4 +104,4 @@ function buildShellFragment(params) {
104
104
  export {
105
105
  configureCustomApi
106
106
  };
107
- //# sourceMappingURL=setup-custom-api-3JEENEKA.js.map
107
+ //# sourceMappingURL=setup-custom-api-W7EDVKWR.js.map
@@ -3,18 +3,18 @@ import {
3
3
  getToolMemory,
4
4
  reinitializeMemoryBackends,
5
5
  shutdownToolMemory
6
- } from "./chunk-NINNWQ42.js";
7
- import "./chunk-PGGSGUO4.js";
6
+ } from "./chunk-GYDO2WOR.js";
7
+ import "./chunk-NZGNOXXW.js";
8
8
  import "./chunk-6T3EPABN.js";
9
9
  import "./chunk-PQHVC4BD.js";
10
- import "./chunk-PARI43LB.js";
11
- import "./chunk-4KBG4ICZ.js";
12
- import "./chunk-ZGLIHPGJ.js";
13
- import "./chunk-PR4QN5HX.js";
10
+ import "./chunk-E4IYX7LD.js";
11
+ import "./chunk-QJIHSQZX.js";
12
+ import "./chunk-RUSP5PJR.js";
13
+ import "./chunk-ZPWHCABL.js";
14
14
  export {
15
15
  ToolMemoryManager,
16
16
  getToolMemory,
17
17
  reinitializeMemoryBackends,
18
18
  shutdownToolMemory
19
19
  };
20
- //# sourceMappingURL=tool-memory-NKBBVA7O.js.map
20
+ //# sourceMappingURL=tool-memory-Z2B7CAH7.js.map
@@ -0,0 +1,24 @@
1
+ import {
2
+ UnifiedAdapterRegistry,
3
+ createUnifiedRegistry,
4
+ getGlobalRegistry,
5
+ resetGlobalRegistry,
6
+ withDefaultOnRetirement
7
+ } from "./chunk-XIFOAZ5B.js";
8
+ import "./chunk-VZCQRLXT.js";
9
+ import "./chunk-WHZD2W6Q.js";
10
+ import "./chunk-ECDJM6UB.js";
11
+ import "./chunk-ZTRBMKXK.js";
12
+ import "./chunk-7BONPRR2.js";
13
+ import "./chunk-E4IYX7LD.js";
14
+ import "./chunk-QJIHSQZX.js";
15
+ import "./chunk-RUSP5PJR.js";
16
+ import "./chunk-ZPWHCABL.js";
17
+ export {
18
+ UnifiedAdapterRegistry,
19
+ createUnifiedRegistry,
20
+ getGlobalRegistry,
21
+ resetGlobalRegistry,
22
+ withDefaultOnRetirement
23
+ };
24
+ //# sourceMappingURL=unified-registry-UFNSWKZA.js.map
@@ -3,13 +3,13 @@ import {
3
3
  getAdaptiveBonus,
4
4
  queryWithLookback,
5
5
  shouldExplore
6
- } from "./chunk-4KBG4ICZ.js";
7
- import "./chunk-ZGLIHPGJ.js";
8
- import "./chunk-PR4QN5HX.js";
6
+ } from "./chunk-QJIHSQZX.js";
7
+ import "./chunk-RUSP5PJR.js";
8
+ import "./chunk-ZPWHCABL.js";
9
9
  export {
10
10
  generateWeatherReport,
11
11
  getAdaptiveBonus,
12
12
  queryWithLookback,
13
13
  shouldExplore
14
14
  };
15
- //# sourceMappingURL=weather-report-7WC3RKE7.js.map
15
+ //# sourceMappingURL=weather-report-GX7OIUL2.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nexus-agents",
3
- "version": "2.131.1",
4
- "description": "Governance substrate for AI coding agents — adversarial PR review, drift-detected rules, immutable audit, and closed-loop outcome routing for Claude, Codex, Gemini, and OpenCode",
3
+ "version": "2.132.0",
4
+ "description": "Governance substrate for AI coding agents — adversarial PR review, drift-detected rules, tamper-evident audit, and closed-loop outcome routing for Claude, Codex, Gemini, and OpenCode",
5
5
  "mcpName": "io.github.nexus-substrate/nexus-agents",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -59,17 +59,17 @@
59
59
  "node": ">=22.0.0"
60
60
  },
61
61
  "optionalDependencies": {
62
- "@atproto/api": "^0.20.9"
62
+ "@atproto/api": "^0.20.15"
63
63
  },
64
64
  "dependencies": {
65
- "@anthropic-ai/sdk": "^0.102.0",
65
+ "@anthropic-ai/sdk": "^0.104.1",
66
66
  "@google/genai": "^1.52.0",
67
67
  "@modelcontextprotocol/sdk": "^1.29.0",
68
- "better-sqlite3": "^12.10.0",
68
+ "better-sqlite3": "^12.10.1",
69
69
  "jsonc-parser": "^3.3.1",
70
70
  "ollama": "^0.6.3",
71
71
  "openai": "^6.42.0",
72
- "semver": "^7.8.2",
72
+ "semver": "^7.8.4",
73
73
  "tiktoken": "^1.0.22",
74
74
  "ts-morph": "^27.0.2",
75
75
  "typescript": "^6.0.3",
@@ -77,19 +77,19 @@
77
77
  "zod": "^4.4.3"
78
78
  },
79
79
  "devDependencies": {
80
- "@ai-sdk/anthropic": "^3.0.81",
81
- "@ai-sdk/google": "^3.0.80",
82
- "@ai-sdk/openai": "^3.0.68",
80
+ "@ai-sdk/anthropic": "^3.0.84",
81
+ "@ai-sdk/google": "^3.0.82",
82
+ "@ai-sdk/openai": "^3.0.71",
83
83
  "@types/better-sqlite3": "^7.6.13",
84
84
  "@types/semver": "^7.7.1",
85
- "@vitest/coverage-v8": "4.1.8",
86
- "ai": "^6.0.197",
85
+ "@vitest/coverage-v8": "4.1.9",
86
+ "ai": "^6.0.205",
87
87
  "fast-check": "^4.8.0",
88
88
  "tsup": "^8.5.1",
89
89
  "typedoc": "0.28.19",
90
90
  "typedoc-plugin-frontmatter": "1.3.1",
91
91
  "typedoc-plugin-markdown": "4.12.0",
92
- "vitest": "4.1.8",
92
+ "vitest": "4.1.9",
93
93
  "nexus-memory": "0.1.2"
94
94
  },
95
95
  "peerDependencies": {