nexus-agents 2.77.3 → 2.77.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/{chunk-KGB67HII.js → chunk-AFGRQB4H.js} +5 -3
  2. package/dist/{chunk-KGB67HII.js.map → chunk-AFGRQB4H.js.map} +1 -1
  3. package/dist/{chunk-CPPZCNAS.js → chunk-EEW7VFFF.js} +3 -3
  4. package/dist/{chunk-X3BU5MIG.js → chunk-FYAQBYHM.js} +2 -2
  5. package/dist/{chunk-LTUUW3FN.js → chunk-LIY6WZNR.js} +24 -212
  6. package/dist/chunk-LIY6WZNR.js.map +1 -0
  7. package/dist/{chunk-VEF6DCQU.js → chunk-MV4R2ZIJ.js} +204 -4
  8. package/dist/chunk-MV4R2ZIJ.js.map +1 -0
  9. package/dist/{chunk-K446R3BC.js → chunk-S6MEYRYZ.js} +7 -7
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +26 -13
  12. package/dist/cli.js.map +1 -1
  13. package/dist/{consensus-vote-UR3JU7RI.js → consensus-vote-AWBFYF5S.js} +3 -3
  14. package/dist/{expert-bridge-DWBO2HXZ.js → expert-bridge-NX2MGOBQ.js} +2 -2
  15. package/dist/{factory-LXOVC44K.js → factory-JI6PSWGR.js} +2 -2
  16. package/dist/index.js +6 -6
  17. package/dist/{setup-command-XG7R4PR4.js → setup-command-DB3DOE6K.js} +4 -4
  18. package/package.json +1 -1
  19. package/dist/chunk-LTUUW3FN.js.map +0 -1
  20. package/dist/chunk-VEF6DCQU.js.map +0 -1
  21. /package/dist/{chunk-CPPZCNAS.js.map → chunk-EEW7VFFF.js.map} +0 -0
  22. /package/dist/{chunk-X3BU5MIG.js.map → chunk-FYAQBYHM.js.map} +0 -0
  23. /package/dist/{chunk-K446R3BC.js.map → chunk-S6MEYRYZ.js.map} +0 -0
  24. /package/dist/{consensus-vote-UR3JU7RI.js.map → consensus-vote-AWBFYF5S.js.map} +0 -0
  25. /package/dist/{expert-bridge-DWBO2HXZ.js.map → expert-bridge-NX2MGOBQ.js.map} +0 -0
  26. /package/dist/{factory-LXOVC44K.js.map → factory-JI6PSWGR.js.map} +0 -0
  27. /package/dist/{setup-command-XG7R4PR4.js.map → setup-command-DB3DOE6K.js.map} +0 -0
@@ -23,7 +23,7 @@ import {
23
23
  getAvailableClis,
24
24
  isCliAvailable,
25
25
  withTimeout
26
- } from "./chunk-VEF6DCQU.js";
26
+ } from "./chunk-MV4R2ZIJ.js";
27
27
  import {
28
28
  SessionMemory
29
29
  } from "./chunk-3VWMM6UF.js";
@@ -12993,7 +12993,7 @@ async function processVotesWithCascade(engineVotes, opts) {
12993
12993
  var CONTRARIAN_ESCALATION_THRESHOLD = 0.8;
12994
12994
  async function runContrarianCheck(proposal, log) {
12995
12995
  try {
12996
- const { executeExpert } = await import("./expert-bridge-DWBO2HXZ.js");
12996
+ const { executeExpert } = await import("./expert-bridge-NX2MGOBQ.js");
12997
12997
  const prompt = [
12998
12998
  "You are a contrarian analyst. Your job is to find reasons this proposal should be REJECTED.",
12999
12999
  "Look for: YAGNI (not needed), MISALIGNED (wrong tech/architecture), SECURITY_RISK, SCOPE_CREEP.",
@@ -13415,4 +13415,4 @@ export {
13415
13415
  CONSENSUS_VOTE_OUTPUT_SCHEMA,
13416
13416
  registerConsensusVoteTool
13417
13417
  };
13418
- //# sourceMappingURL=chunk-CPPZCNAS.js.map
13418
+ //# sourceMappingURL=chunk-EEW7VFFF.js.map
@@ -38,7 +38,7 @@ function adaptCompositeRouter(compositeRouter) {
38
38
  }
39
39
  async function getRouter() {
40
40
  if (cachedRouter !== null) return cachedRouter;
41
- const { createAllAdapters } = await import("./factory-LXOVC44K.js");
41
+ const { createAllAdapters } = await import("./factory-JI6PSWGR.js");
42
42
  const { createCompositeRouter } = await import("./composite-router-S6E26BCI.js");
43
43
  const adapters = createAllAdapters();
44
44
  if (adapters.size === 0) return null;
@@ -136,4 +136,4 @@ ${prompt}`;
136
136
  export {
137
137
  executeExpert
138
138
  };
139
- //# sourceMappingURL=chunk-X3BU5MIG.js.map
139
+ //# sourceMappingURL=chunk-FYAQBYHM.js.map
@@ -5,13 +5,13 @@ import {
5
5
  resolveInsideRoot
6
6
  } from "./chunk-NUBSJGQZ.js";
7
7
  import {
8
- createAllAdapters
9
- } from "./chunk-VEF6DCQU.js";
8
+ createAllAdapters,
9
+ probeCli
10
+ } from "./chunk-MV4R2ZIJ.js";
10
11
  import {
11
12
  capitalize
12
13
  } from "./chunk-633WH2ML.js";
13
14
  import {
14
- CLI_SUBPROCESS_TIMEOUTS,
15
15
  CliNameSchema,
16
16
  DEFAULT_CAPABILITIES,
17
17
  DEFAULT_COMPOSITE_CONFIG,
@@ -40,7 +40,7 @@ import {
40
40
  } from "./chunk-GOT7OAL5.js";
41
41
 
42
42
  // src/version.ts
43
- var VERSION = true ? "2.77.3" : "dev";
43
+ var VERSION = true ? "2.77.4" : "dev";
44
44
 
45
45
  // src/config/schemas-core.ts
46
46
  import { z } from "zod";
@@ -1297,18 +1297,18 @@ function getConfig(options) {
1297
1297
  }
1298
1298
 
1299
1299
  // src/cli/setup-data-dir.ts
1300
- import { mkdirSync, existsSync as existsSync4 } from "fs";
1301
- import { join as join4 } from "path";
1300
+ import { mkdirSync, existsSync as existsSync3 } from "fs";
1301
+ import { join as join3 } from "path";
1302
1302
 
1303
1303
  // src/cli/doctor.ts
1304
1304
  import {
1305
- existsSync as existsSync3,
1306
- readFileSync as readFileSync3,
1305
+ existsSync as existsSync2,
1306
+ readFileSync as readFileSync2,
1307
1307
  readdirSync,
1308
1308
  accessSync,
1309
1309
  constants as fsConstants
1310
1310
  } from "fs";
1311
- import { join as join3 } from "path";
1311
+ import { join as join2 } from "path";
1312
1312
 
1313
1313
  // src/mcp/server.ts
1314
1314
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -1773,193 +1773,6 @@ function printDoctorResults(result) {
1773
1773
  printDoctorSummary(result);
1774
1774
  }
1775
1775
 
1776
- // src/cli/cli-auth-probe.ts
1777
- import { execFile } from "child_process";
1778
- import { promisify } from "util";
1779
- import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
1780
- import { homedir } from "os";
1781
- import { join as join2 } from "path";
1782
- var execFileAsync = promisify(execFile);
1783
- var HOME = homedir();
1784
- function claudeNeedsLogin(reason) {
1785
- return {
1786
- cli: "claude",
1787
- state: "needs-login",
1788
- reason,
1789
- fixCommand: "claude /login",
1790
- envFallback: "ANTHROPIC_API_KEY",
1791
- fixUrl: "https://console.anthropic.com/account/keys"
1792
- };
1793
- }
1794
- function probeClaude() {
1795
- if (process.env["ANTHROPIC_API_KEY"] !== void 0 && process.env["ANTHROPIC_API_KEY"] !== "") {
1796
- return { cli: "claude", state: "authenticated", via: "env-var" };
1797
- }
1798
- const credPath = join2(HOME, ".claude", ".credentials.json");
1799
- if (!existsSync2(credPath)) {
1800
- return claudeNeedsLogin(
1801
- "No credentials at ~/.claude/.credentials.json and ANTHROPIC_API_KEY is not set"
1802
- );
1803
- }
1804
- try {
1805
- const parsed = JSON.parse(readFileSync2(credPath, "utf-8"));
1806
- if (!isClaudeCredsShape(parsed)) {
1807
- return claudeNeedsLogin(
1808
- "Credentials file present but not in expected shape (missing claudeAiOauth.accessToken)"
1809
- );
1810
- }
1811
- const expiresAt = parsed.claudeAiOauth.expiresAt;
1812
- if (typeof expiresAt === "number" && expiresAt < Date.now()) {
1813
- return claudeNeedsLogin(`OAuth token expired ${new Date(expiresAt).toISOString()}`);
1814
- }
1815
- return {
1816
- cli: "claude",
1817
- state: "authenticated",
1818
- via: "cli-credentials",
1819
- ...typeof expiresAt === "number" ? { meta: { expiresAt } } : {}
1820
- };
1821
- } catch (e) {
1822
- return {
1823
- cli: "claude",
1824
- state: "error",
1825
- reason: `Failed to read claude credentials: ${e instanceof Error ? e.message : String(e)}`
1826
- };
1827
- }
1828
- }
1829
- function codexNeedsLogin(reason) {
1830
- return {
1831
- cli: "codex",
1832
- state: "needs-login",
1833
- reason,
1834
- fixCommand: "codex login",
1835
- envFallback: "OPENAI_API_KEY",
1836
- fixUrl: "https://platform.openai.com/api-keys"
1837
- };
1838
- }
1839
- function classifyCodexStdout(stdout) {
1840
- if (/not logged/i.test(stdout) || /no.*token/i.test(stdout)) {
1841
- return codexNeedsLogin(stdout.trim().split("\n")[0] ?? "Not logged in");
1842
- }
1843
- return { cli: "codex", state: "authenticated", via: "cli-credentials" };
1844
- }
1845
- async function probeCodex() {
1846
- if (process.env["OPENAI_API_KEY"] !== void 0 && process.env["OPENAI_API_KEY"] !== "") {
1847
- return { cli: "codex", state: "authenticated", via: "env-var" };
1848
- }
1849
- try {
1850
- const { stdout } = await execFileAsync("codex", ["login", "status"], {
1851
- timeout: CLI_SUBPROCESS_TIMEOUTS.spawnMs
1852
- });
1853
- return classifyCodexStdout(stdout);
1854
- } catch (e) {
1855
- const msg = e instanceof Error ? e.message : String(e);
1856
- if (/ENOENT|not found/i.test(msg)) {
1857
- return { cli: "codex", state: "not-installed", reason: "codex binary not on PATH" };
1858
- }
1859
- return codexNeedsLogin("Not logged in (codex login status returned non-zero)");
1860
- }
1861
- }
1862
- function geminiNeedsLogin(reason) {
1863
- return {
1864
- cli: "gemini",
1865
- state: "needs-login",
1866
- reason,
1867
- fixCommand: "gemini",
1868
- envFallback: "GOOGLE_AI_API_KEY",
1869
- fixUrl: "https://aistudio.google.com/apikey"
1870
- };
1871
- }
1872
- function classifyGeminiCreds(parsed) {
1873
- if (!isGeminiCredsShape(parsed)) {
1874
- return geminiNeedsLogin("OAuth credentials file present but not in expected shape");
1875
- }
1876
- if (typeof parsed.expiry_date === "number" && parsed.expiry_date < Date.now()) {
1877
- return geminiNeedsLogin(
1878
- `OAuth access token expired ${new Date(parsed.expiry_date).toISOString()} (refresh may still work)`
1879
- );
1880
- }
1881
- return {
1882
- cli: "gemini",
1883
- state: "authenticated",
1884
- via: "cli-credentials",
1885
- ...typeof parsed.expiry_date === "number" ? { meta: { expiresAt: parsed.expiry_date } } : {}
1886
- };
1887
- }
1888
- function probeGemini() {
1889
- const env = process.env["GOOGLE_AI_API_KEY"] ?? process.env["GEMINI_API_KEY"];
1890
- if (env !== void 0 && env !== "") {
1891
- return { cli: "gemini", state: "authenticated", via: "env-var" };
1892
- }
1893
- const credPath = join2(HOME, ".gemini", "oauth_creds.json");
1894
- if (!existsSync2(credPath)) {
1895
- return geminiNeedsLogin(
1896
- "No OAuth credentials at ~/.gemini/oauth_creds.json and GOOGLE_AI_API_KEY/GEMINI_API_KEY are not set"
1897
- );
1898
- }
1899
- try {
1900
- return classifyGeminiCreds(JSON.parse(readFileSync2(credPath, "utf-8")));
1901
- } catch (e) {
1902
- return {
1903
- cli: "gemini",
1904
- state: "error",
1905
- reason: `Failed to read gemini credentials: ${e instanceof Error ? e.message : String(e)}`
1906
- };
1907
- }
1908
- }
1909
- async function probeOpencode() {
1910
- try {
1911
- const { stdout } = await execFileAsync("opencode", ["auth", "list"], {
1912
- timeout: CLI_SUBPROCESS_TIMEOUTS.spawnMs
1913
- });
1914
- if (/0 credentials/i.test(stdout)) {
1915
- return {
1916
- cli: "opencode",
1917
- state: "needs-login",
1918
- reason: "No providers configured in opencode",
1919
- fixCommand: "opencode auth login",
1920
- fixUrl: "https://opencode.ai/docs/config"
1921
- };
1922
- }
1923
- return { cli: "opencode", state: "authenticated", via: "cli-credentials" };
1924
- } catch (e) {
1925
- const msg = e instanceof Error ? e.message : String(e);
1926
- if (/ENOENT|not found/i.test(msg)) {
1927
- return { cli: "opencode", state: "not-installed", reason: "opencode binary not on PATH" };
1928
- }
1929
- return {
1930
- cli: "opencode",
1931
- state: "error",
1932
- reason: msg.split("\n")[0] ?? "opencode auth list failed"
1933
- };
1934
- }
1935
- }
1936
- function isClaudeCredsShape(v) {
1937
- if (typeof v !== "object" || v === null) return false;
1938
- const oauth = v.claudeAiOauth;
1939
- if (typeof oauth !== "object" || oauth === null) return false;
1940
- return typeof oauth.accessToken === "string";
1941
- }
1942
- function isGeminiCredsShape(v) {
1943
- if (typeof v !== "object" || v === null) return false;
1944
- return typeof v.access_token === "string";
1945
- }
1946
- async function probeCli(cli) {
1947
- switch (cli) {
1948
- case "claude":
1949
- return Promise.resolve(probeClaude());
1950
- case "codex":
1951
- return probeCodex();
1952
- case "gemini":
1953
- return Promise.resolve(probeGemini());
1954
- case "opencode":
1955
- return probeOpencode();
1956
- }
1957
- }
1958
- async function probeAllClis() {
1959
- const clis = ["claude", "gemini", "codex", "opencode"];
1960
- return Promise.all(clis.map((c) => probeCli(c)));
1961
- }
1962
-
1963
1776
  // src/cli/doctor.ts
1964
1777
  var REQUIRED_NODE_MAJOR2 = 22;
1965
1778
  var API_KEY_VARS = ["ANTHROPIC_API_KEY", "OPENAI_API_KEY", "GOOGLE_AI_API_KEY"];
@@ -2088,7 +1901,7 @@ function checkApiKeys() {
2088
1901
  }
2089
1902
  function checkConfigFile() {
2090
1903
  for (const configPath of CONFIG_FILE_PATHS) {
2091
- if (existsSync3(configPath)) {
1904
+ if (existsSync2(configPath)) {
2092
1905
  return { found: true, path: configPath };
2093
1906
  }
2094
1907
  }
@@ -2129,11 +1942,11 @@ function buildRegistryAdvisory(cliResults) {
2129
1942
  function hasPriorUsage() {
2130
1943
  try {
2131
1944
  const root = getNexusDataDir();
2132
- if (!existsSync3(root)) return false;
1945
+ if (!existsSync2(root)) return false;
2133
1946
  for (const sub of ["audit", "learning", "sessions", "voting"]) {
2134
1947
  const p = `${root}/${sub}`;
2135
1948
  try {
2136
- if (existsSync3(p) && readdirSync(p).length > 0) return true;
1949
+ if (existsSync2(p) && readdirSync(p).length > 0) return true;
2137
1950
  } catch {
2138
1951
  }
2139
1952
  }
@@ -2143,13 +1956,13 @@ function hasPriorUsage() {
2143
1956
  }
2144
1957
  }
2145
1958
  function countJsonlLines(filePath) {
2146
- if (!existsSync3(filePath)) return 0;
2147
- return readFileSync3(filePath, "utf-8").split("\n").filter((l) => l.trim().length > 0).length;
1959
+ if (!existsSync2(filePath)) return 0;
1960
+ return readFileSync2(filePath, "utf-8").split("\n").filter((l) => l.trim().length > 0).length;
2148
1961
  }
2149
1962
  function readRulesMetadata(filePath) {
2150
- if (!existsSync3(filePath)) return { count: 0, savedAt: null };
1963
+ if (!existsSync2(filePath)) return { count: 0, savedAt: null };
2151
1964
  try {
2152
- const raw = JSON.parse(readFileSync3(filePath, "utf-8"));
1965
+ const raw = JSON.parse(readFileSync2(filePath, "utf-8"));
2153
1966
  const rules = raw["rules"];
2154
1967
  const saved = raw["savedAt"];
2155
1968
  return {
@@ -2161,7 +1974,7 @@ function readRulesMetadata(filePath) {
2161
1974
  }
2162
1975
  }
2163
1976
  function checkDirAccess(dir) {
2164
- const exists = existsSync3(dir);
1977
+ const exists = existsSync2(dir);
2165
1978
  if (!exists) return { exists: false, writable: false };
2166
1979
  try {
2167
1980
  accessSync(dir, fsConstants.W_OK);
@@ -2221,10 +2034,10 @@ async function checkSqlite() {
2221
2034
  }
2222
2035
  function checkDataDirectory() {
2223
2036
  const rootPath = getNexusDataDir();
2224
- const rootExists = existsSync3(rootPath);
2037
+ const rootExists = existsSync2(rootPath);
2225
2038
  const subdirectories = DATA_SUBDIRECTORIES.map((name) => {
2226
- const fullPath = join3(rootPath, name);
2227
- const exists = existsSync3(fullPath);
2039
+ const fullPath = join2(rootPath, name);
2040
+ const exists = existsSync2(fullPath);
2228
2041
  return { name, path: fullPath, exists, writable: exists && isWritable(fullPath) };
2229
2042
  });
2230
2043
  return { rootExists, rootPath, subdirectories };
@@ -2308,7 +2121,7 @@ async function runDoctorFix(result) {
2308
2121
  writeLine2("\u2500".repeat(40));
2309
2122
  let fixCount = 0;
2310
2123
  if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
2311
- const { runSetup } = await import("./setup-command-XG7R4PR4.js");
2124
+ const { runSetup } = await import("./setup-command-DB3DOE6K.js");
2312
2125
  const setupResult = runSetup({
2313
2126
  skipMcp: true,
2314
2127
  skipRules: true,
@@ -2355,7 +2168,7 @@ function initDataDirectories(dryRun = false) {
2355
2168
  ensureDir(NEXUS_DATA_DIR, dryRun, created, alreadyExisted);
2356
2169
  for (const subdir of DATA_SUBDIRECTORIES) {
2357
2170
  const mode = RESTRICTED_DIRS.has(subdir) ? 448 : void 0;
2358
- ensureDir(join4(NEXUS_DATA_DIR, subdir), dryRun, created, alreadyExisted, mode);
2171
+ ensureDir(join3(NEXUS_DATA_DIR, subdir), dryRun, created, alreadyExisted, mode);
2359
2172
  }
2360
2173
  return { success: true, rootPath: NEXUS_DATA_DIR, created, alreadyExisted, error: null };
2361
2174
  } catch (error) {
@@ -2364,7 +2177,7 @@ function initDataDirectories(dryRun = false) {
2364
2177
  }
2365
2178
  }
2366
2179
  function ensureDir(dirPath, dryRun, created, alreadyExisted, mode) {
2367
- if (existsSync4(dirPath)) {
2180
+ if (existsSync3(dirPath)) {
2368
2181
  alreadyExisted.push(dirPath);
2369
2182
  return;
2370
2183
  }
@@ -2406,7 +2219,6 @@ export {
2406
2219
  filterAvailableModels,
2407
2220
  DEFAULT_TASK_TTL_MS,
2408
2221
  clampTaskTtl,
2409
- probeAllClis,
2410
2222
  DATA_SUBDIRECTORIES,
2411
2223
  checkApiKeys,
2412
2224
  checkSqlite,
@@ -2419,4 +2231,4 @@ export {
2419
2231
  startStdioServer,
2420
2232
  closeServer
2421
2233
  };
2422
- //# sourceMappingURL=chunk-LTUUW3FN.js.map
2234
+ //# sourceMappingURL=chunk-LIY6WZNR.js.map