nexus-agents 2.83.0 → 2.83.1

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 (106) hide show
  1. package/dist/{child-mcp-config-XVPIO5HV.js → child-mcp-config-3ZW2UPKZ.js} +2 -2
  2. package/dist/{chunk-AINOJRZX.js → chunk-4XSCU4B3.js} +8 -8
  3. package/dist/{chunk-BZUEUD4G.js → chunk-5QJPM5CB.js} +3 -3
  4. package/dist/{chunk-633WH2ML.js → chunk-6T3EPABN.js} +1 -1
  5. package/dist/chunk-6T3EPABN.js.map +1 -0
  6. package/dist/{chunk-RXVH52UI.js → chunk-6UI4NKT4.js} +2 -2
  7. package/dist/{chunk-ZIWEEVMI.js → chunk-6XRNFLPI.js} +2 -2
  8. package/dist/{chunk-YO27YAEX.js → chunk-7V367KT4.js} +4 -4
  9. package/dist/{chunk-6WDJ3IE4.js → chunk-A6WC5I7V.js} +3 -3
  10. package/dist/{chunk-2W4QJ27D.js → chunk-BICIQYET.js} +3 -3
  11. package/dist/{chunk-WJFUTRHX.js → chunk-BUXXAN6V.js} +2 -2
  12. package/dist/{chunk-ZM5JKJHI.js → chunk-DWOSFYI2.js} +2 -2
  13. package/dist/{chunk-FHGDJKCZ.js → chunk-ELRNVADA.js} +3 -3
  14. package/dist/{chunk-AFPHR72D.js → chunk-FHY7I736.js} +2 -2
  15. package/dist/{chunk-3GJAAENS.js → chunk-HGPIHDC4.js} +3 -3
  16. package/dist/{chunk-WGSRH5EQ.js → chunk-IM2B3FK2.js} +3 -3
  17. package/dist/{chunk-PMLVZXAE.js → chunk-J4ZBKE4B.js} +129 -190
  18. package/dist/chunk-J4ZBKE4B.js.map +1 -0
  19. package/dist/{chunk-54UXPJVM.js → chunk-JA6ON2RP.js} +2 -2
  20. package/dist/{chunk-5T6SYCH2.js → chunk-LM2S2QWO.js} +2 -2
  21. package/dist/{chunk-5T6SYCH2.js.map → chunk-LM2S2QWO.js.map} +1 -1
  22. package/dist/{chunk-3ASED5PR.js → chunk-MATFDJRW.js} +4 -4
  23. package/dist/{chunk-FI77TGBY.js → chunk-O3XJLOEX.js} +2 -2
  24. package/dist/{chunk-4BXQ2OZY.js → chunk-ODKIRXN7.js} +9 -36
  25. package/dist/chunk-ODKIRXN7.js.map +1 -0
  26. package/dist/{chunk-NLPMYBIV.js → chunk-SZZS57X7.js} +7 -7
  27. package/dist/{chunk-RVRXKNND.js → chunk-TKGVRHEI.js} +2 -2
  28. package/dist/{chunk-U6LDVJS7.js → chunk-UFUR6RBP.js} +2 -2
  29. package/dist/{chunk-Q6PZMGLU.js → chunk-VXIHHHLQ.js} +2 -2
  30. package/dist/{chunk-3WUVWZUC.js → chunk-W6MLS2UL.js} +2 -2
  31. package/dist/{chunk-Z64MSLEK.js → chunk-XODXYOFN.js} +2 -2
  32. package/dist/{chunk-PPBZQKRP.js → chunk-ZA6AZ7LK.js} +5 -5
  33. package/dist/{chunk-L362KRSU.js → chunk-ZLGU7T6J.js} +2 -2
  34. package/dist/{cli-circuit-breaker-Y26NPPNO.js → cli-circuit-breaker-LC4NZUGD.js} +4 -4
  35. package/dist/cli.js +33 -33
  36. package/dist/{composite-router-X2ZYIEHH.js → composite-router-GXQ25DO4.js} +2 -2
  37. package/dist/{consensus-vote-KZ6UURUI.js → consensus-vote-MTLP6E72.js} +12 -12
  38. package/dist/{context-retriever-QY4FNTDZ.js → context-retriever-GQRC2MVM.js} +6 -6
  39. package/dist/{doctor-deep-2E2GBMYR.js → doctor-deep-T3UUJX2E.js} +3 -3
  40. package/dist/{expert-bridge-FHPWDFJX.js → expert-bridge-7LPGCPPR.js} +4 -4
  41. package/dist/{factory-W6KROBFN.js → factory-3XB5CAAA.js} +5 -5
  42. package/dist/{factory-STNVY3Y3.js → factory-OKNCTJO6.js} +4 -4
  43. package/dist/index.d.ts +3 -143
  44. package/dist/index.js +28 -126
  45. package/dist/index.js.map +1 -1
  46. package/dist/{init-opencode-6LVZ4CAQ.js → init-opencode-KDTBKLXS.js} +5 -5
  47. package/dist/{issue-triage-Y77JI7WF.js → issue-triage-MURMDN2G.js} +4 -4
  48. package/dist/{registry-command-P5VIAEOL.js → registry-command-D56ROMFJ.js} +2 -2
  49. package/dist/{repo-security-plan-RHSLO7H6.js → repo-security-plan-N3CDMW6L.js} +3 -3
  50. package/dist/{research-helpers-synthesize-PVP6JRZV.js → research-helpers-synthesize-36QBOKII.js} +3 -3
  51. package/dist/{routing-memory-QRIJPRVD.js → routing-memory-6IEPJ3EP.js} +2 -2
  52. package/dist/{session-memory-WARRGYY7.js → session-memory-X6SCDFER.js} +3 -3
  53. package/dist/{setup-command-GMP5FI7F.js → setup-command-5AEO5A4Z.js} +11 -11
  54. package/dist/{setup-config-G3KKZM7O.js → setup-config-RPSVIQJO.js} +3 -3
  55. package/dist/{setup-custom-api-B63X7ISD.js → setup-custom-api-RBOJT3SS.js} +4 -4
  56. package/dist/{tool-memory-E7JW4YLT.js → tool-memory-EEHITQRJ.js} +5 -5
  57. package/dist/{weather-report-RACZWJQL.js → weather-report-6BC3JK5H.js} +2 -2
  58. package/package.json +1 -1
  59. package/dist/chunk-4BXQ2OZY.js.map +0 -1
  60. package/dist/chunk-633WH2ML.js.map +0 -1
  61. package/dist/chunk-PMLVZXAE.js.map +0 -1
  62. /package/dist/{child-mcp-config-XVPIO5HV.js.map → child-mcp-config-3ZW2UPKZ.js.map} +0 -0
  63. /package/dist/{chunk-AINOJRZX.js.map → chunk-4XSCU4B3.js.map} +0 -0
  64. /package/dist/{chunk-BZUEUD4G.js.map → chunk-5QJPM5CB.js.map} +0 -0
  65. /package/dist/{chunk-RXVH52UI.js.map → chunk-6UI4NKT4.js.map} +0 -0
  66. /package/dist/{chunk-ZIWEEVMI.js.map → chunk-6XRNFLPI.js.map} +0 -0
  67. /package/dist/{chunk-YO27YAEX.js.map → chunk-7V367KT4.js.map} +0 -0
  68. /package/dist/{chunk-6WDJ3IE4.js.map → chunk-A6WC5I7V.js.map} +0 -0
  69. /package/dist/{chunk-2W4QJ27D.js.map → chunk-BICIQYET.js.map} +0 -0
  70. /package/dist/{chunk-WJFUTRHX.js.map → chunk-BUXXAN6V.js.map} +0 -0
  71. /package/dist/{chunk-ZM5JKJHI.js.map → chunk-DWOSFYI2.js.map} +0 -0
  72. /package/dist/{chunk-FHGDJKCZ.js.map → chunk-ELRNVADA.js.map} +0 -0
  73. /package/dist/{chunk-AFPHR72D.js.map → chunk-FHY7I736.js.map} +0 -0
  74. /package/dist/{chunk-3GJAAENS.js.map → chunk-HGPIHDC4.js.map} +0 -0
  75. /package/dist/{chunk-WGSRH5EQ.js.map → chunk-IM2B3FK2.js.map} +0 -0
  76. /package/dist/{chunk-54UXPJVM.js.map → chunk-JA6ON2RP.js.map} +0 -0
  77. /package/dist/{chunk-3ASED5PR.js.map → chunk-MATFDJRW.js.map} +0 -0
  78. /package/dist/{chunk-FI77TGBY.js.map → chunk-O3XJLOEX.js.map} +0 -0
  79. /package/dist/{chunk-NLPMYBIV.js.map → chunk-SZZS57X7.js.map} +0 -0
  80. /package/dist/{chunk-RVRXKNND.js.map → chunk-TKGVRHEI.js.map} +0 -0
  81. /package/dist/{chunk-U6LDVJS7.js.map → chunk-UFUR6RBP.js.map} +0 -0
  82. /package/dist/{chunk-Q6PZMGLU.js.map → chunk-VXIHHHLQ.js.map} +0 -0
  83. /package/dist/{chunk-3WUVWZUC.js.map → chunk-W6MLS2UL.js.map} +0 -0
  84. /package/dist/{chunk-Z64MSLEK.js.map → chunk-XODXYOFN.js.map} +0 -0
  85. /package/dist/{chunk-PPBZQKRP.js.map → chunk-ZA6AZ7LK.js.map} +0 -0
  86. /package/dist/{chunk-L362KRSU.js.map → chunk-ZLGU7T6J.js.map} +0 -0
  87. /package/dist/{cli-circuit-breaker-Y26NPPNO.js.map → cli-circuit-breaker-LC4NZUGD.js.map} +0 -0
  88. /package/dist/{composite-router-X2ZYIEHH.js.map → composite-router-GXQ25DO4.js.map} +0 -0
  89. /package/dist/{consensus-vote-KZ6UURUI.js.map → consensus-vote-MTLP6E72.js.map} +0 -0
  90. /package/dist/{context-retriever-QY4FNTDZ.js.map → context-retriever-GQRC2MVM.js.map} +0 -0
  91. /package/dist/{doctor-deep-2E2GBMYR.js.map → doctor-deep-T3UUJX2E.js.map} +0 -0
  92. /package/dist/{expert-bridge-FHPWDFJX.js.map → expert-bridge-7LPGCPPR.js.map} +0 -0
  93. /package/dist/{factory-STNVY3Y3.js.map → factory-3XB5CAAA.js.map} +0 -0
  94. /package/dist/{factory-W6KROBFN.js.map → factory-OKNCTJO6.js.map} +0 -0
  95. /package/dist/{init-opencode-6LVZ4CAQ.js.map → init-opencode-KDTBKLXS.js.map} +0 -0
  96. /package/dist/{issue-triage-Y77JI7WF.js.map → issue-triage-MURMDN2G.js.map} +0 -0
  97. /package/dist/{registry-command-P5VIAEOL.js.map → registry-command-D56ROMFJ.js.map} +0 -0
  98. /package/dist/{repo-security-plan-RHSLO7H6.js.map → repo-security-plan-N3CDMW6L.js.map} +0 -0
  99. /package/dist/{research-helpers-synthesize-PVP6JRZV.js.map → research-helpers-synthesize-36QBOKII.js.map} +0 -0
  100. /package/dist/{routing-memory-QRIJPRVD.js.map → routing-memory-6IEPJ3EP.js.map} +0 -0
  101. /package/dist/{session-memory-WARRGYY7.js.map → session-memory-X6SCDFER.js.map} +0 -0
  102. /package/dist/{setup-command-GMP5FI7F.js.map → setup-command-5AEO5A4Z.js.map} +0 -0
  103. /package/dist/{setup-config-G3KKZM7O.js.map → setup-config-RPSVIQJO.js.map} +0 -0
  104. /package/dist/{setup-custom-api-B63X7ISD.js.map → setup-custom-api-RBOJT3SS.js.map} +0 -0
  105. /package/dist/{tool-memory-E7JW4YLT.js.map → tool-memory-EEHITQRJ.js.map} +0 -0
  106. /package/dist/{weather-report-RACZWJQL.js.map → weather-report-6BC3JK5H.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createLogger
3
- } from "./chunk-RXVH52UI.js";
3
+ } from "./chunk-6UI4NKT4.js";
4
4
  import "./chunk-I2HMWH4R.js";
5
5
  import "./chunk-PR4QN5HX.js";
6
6
 
@@ -59,4 +59,4 @@ export {
59
59
  generateMcpConfig,
60
60
  getDefaultAllowedTools
61
61
  };
62
- //# sourceMappingURL=child-mcp-config-XVPIO5HV.js.map
62
+ //# sourceMappingURL=child-mcp-config-3ZW2UPKZ.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  DEFAULTS
3
- } from "./chunk-ZM5JKJHI.js";
3
+ } from "./chunk-DWOSFYI2.js";
4
4
  import {
5
5
  resolveInsideRoot
6
6
  } from "./chunk-NUBSJGQZ.js";
7
7
  import {
8
8
  capitalize
9
- } from "./chunk-633WH2ML.js";
9
+ } from "./chunk-6T3EPABN.js";
10
10
  import {
11
11
  createAllAdapters,
12
12
  probeCli
13
- } from "./chunk-FHGDJKCZ.js";
13
+ } from "./chunk-ELRNVADA.js";
14
14
  import {
15
15
  CliNameSchema,
16
16
  DEFAULT_CAPABILITIES,
@@ -26,7 +26,7 @@ import {
26
26
  ok,
27
27
  symbols,
28
28
  writeLine
29
- } from "./chunk-RXVH52UI.js";
29
+ } from "./chunk-6UI4NKT4.js";
30
30
  import {
31
31
  detectSandbox,
32
32
  getLearningDir,
@@ -40,7 +40,7 @@ import {
40
40
  } from "./chunk-I2HMWH4R.js";
41
41
 
42
42
  // src/version.ts
43
- var VERSION = true ? "2.83.0" : "dev";
43
+ var VERSION = true ? "2.83.1" : "dev";
44
44
 
45
45
  // src/config/schemas-core.ts
46
46
  import { z } from "zod";
@@ -2096,7 +2096,7 @@ async function runDoctorFix(result) {
2096
2096
  writeLine2("\u2500".repeat(40));
2097
2097
  let fixCount = 0;
2098
2098
  if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
2099
- const { runSetup } = await import("./setup-command-GMP5FI7F.js");
2099
+ const { runSetup } = await import("./setup-command-5AEO5A4Z.js");
2100
2100
  const setupResult = runSetup({
2101
2101
  skipMcp: true,
2102
2102
  skipRules: true,
@@ -2110,7 +2110,7 @@ async function runDoctorFix(result) {
2110
2110
  }
2111
2111
  }
2112
2112
  if (!result.configFile.found) {
2113
- const { runConfigInitSync } = await import("./setup-config-G3KKZM7O.js");
2113
+ const { runConfigInitSync } = await import("./setup-config-RPSVIQJO.js");
2114
2114
  const configResult = runConfigInitSync(process.cwd(), false, false);
2115
2115
  if (configResult.success && configResult.created) {
2116
2116
  writeLine2(`\u2713 Generated config: ${configResult.path}`);
@@ -2208,4 +2208,4 @@ export {
2208
2208
  startStdioServer,
2209
2209
  closeServer
2210
2210
  };
2211
- //# sourceMappingURL=chunk-AINOJRZX.js.map
2211
+ //# sourceMappingURL=chunk-4XSCU4B3.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  GitHubProvider,
3
3
  ScmError
4
- } from "./chunk-L362KRSU.js";
4
+ } from "./chunk-ZLGU7T6J.js";
5
5
  import {
6
6
  CACHE_TIMEOUTS,
7
7
  createLogger,
8
8
  err,
9
9
  getTimeProvider,
10
10
  ok
11
- } from "./chunk-RXVH52UI.js";
11
+ } from "./chunk-6UI4NKT4.js";
12
12
 
13
13
  // src/security/trust-types.ts
14
14
  import { z } from "zod";
@@ -1656,4 +1656,4 @@ export {
1656
1656
  IssueTriage,
1657
1657
  createIssueTriage
1658
1658
  };
1659
- //# sourceMappingURL=chunk-BZUEUD4G.js.map
1659
+ //# sourceMappingURL=chunk-5QJPM5CB.js.map
@@ -124,4 +124,4 @@ export {
124
124
  truncateWithInfo,
125
125
  truncateSentence
126
126
  };
127
- //# sourceMappingURL=chunk-633WH2ML.js.map
127
+ //# sourceMappingURL=chunk-6T3EPABN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/text-utils.ts"],"sourcesContent":["/**\n * nexus-agents/utils - Text Processing Utilities\n *\n * Shared utility functions for text tokenization and processing.\n * Consolidates duplicate code from multiple modules per ADR-0013.\n *\n * Used by:\n * - context/agentic-memory-extraction.ts\n * - context/adaptive-memory-helpers.ts\n * - cli-adapters/agreement-cascade-helpers.ts\n *\n * @module utils/text-utils\n * @see docs/adr/0013-memory-helpers-consolidation.md\n */\n\n// ============================================================================\n// Stopwords\n// ============================================================================\n\n/**\n * Common English stopwords to filter from keyword extraction.\n */\nexport const STOPWORDS = new Set([\n 'a',\n 'an',\n 'and',\n 'are',\n 'as',\n 'at',\n 'be',\n 'by',\n 'for',\n 'from',\n 'has',\n 'he',\n 'in',\n 'is',\n 'it',\n 'its',\n 'of',\n 'on',\n 'or',\n 'that',\n 'the',\n 'to',\n 'was',\n 'were',\n 'will',\n 'with',\n 'this',\n 'but',\n 'they',\n 'have',\n 'had',\n 'what',\n 'when',\n 'where',\n 'who',\n 'which',\n 'why',\n 'how',\n 'all',\n 'each',\n 'every',\n 'both',\n 'few',\n 'more',\n 'most',\n 'other',\n 'some',\n 'such',\n 'no',\n 'nor',\n 'not',\n 'only',\n 'own',\n 'same',\n 'so',\n 'than',\n 'too',\n 'very',\n 'can',\n 'just',\n 'should',\n 'now',\n 'i',\n 'you',\n 'we',\n 'me',\n 'my',\n 'your',\n 'our',\n 'their',\n 'him',\n 'her',\n 'them',\n 'his',\n 'hers',\n 'able',\n]);\n\n// ============================================================================\n// Tokenization\n// ============================================================================\n\n/**\n * Tokenize text into normalized words.\n *\n * Process:\n * 1. Convert to lowercase\n * 2. Replace non-alphanumeric characters with spaces\n * 3. Split on whitespace\n * 4. Filter tokens by minimum length\n *\n * @param text - Input text to tokenize\n * @param minLength - Minimum token length (default: 2)\n * @returns Array of normalized tokens\n */\nexport function tokenize(text: string, minLength = 2): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length >= minLength);\n}\n\n/**\n * Tokenize text and return as a Set for fast lookups.\n *\n * @param text - Input text to tokenize\n * @param minLength - Minimum token length (default: 2)\n * @returns Set of normalized tokens\n */\nexport function tokenizeToSet(text: string, minLength = 2): Set<string> {\n return new Set(tokenize(text, minLength));\n}\n\n/**\n * Tokenize text with stopword filtering.\n *\n * @param text - Input text to tokenize\n * @param minLength - Minimum token length (default: 2)\n * @returns Array of tokens with stopwords removed\n */\nexport function tokenizeFiltered(text: string, minLength = 2): string[] {\n return tokenize(text, minLength).filter((t) => !STOPWORDS.has(t));\n}\n\n// ============================================================================\n// Value Stringification\n// ============================================================================\n\n/**\n * Convert a value to string for text processing.\n *\n * @param value - Value to stringify\n * @returns String representation\n */\nexport function stringifyValue(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value === null || value === undefined) return '';\n return JSON.stringify(value);\n}\n\n// ============================================================================\n// String Capitalization\n// ============================================================================\n\n/**\n * Capitalize the first character of a string.\n *\n * @param str - Input string\n * @returns String with first character uppercased\n * @example capitalize('hello') // 'Hello'\n */\nexport function capitalize(str: string): string {\n if (str.length === 0) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Capitalize the first character of each word in a string.\n *\n * @param str - Input string\n * @returns String with each word capitalized\n * @example capitalizeWords('hello world') // 'Hello World'\n */\nexport function capitalizeWords(str: string): string {\n return str\n .split(' ')\n .map((word) => capitalize(word))\n .join(' ');\n}\n\n/**\n * Convert a kebab-case string to Title Case.\n *\n * @param str - Kebab-case string\n * @returns Title Case string with hyphens replaced by spaces\n * @example capitalizeKebab('hello-world') // 'Hello World'\n */\nexport function capitalizeKebab(str: string): string {\n return str\n .split('-')\n .map((word) => capitalize(word))\n .join(' ');\n}\n\n// ============================================================================\n// Text Truncation\n// ============================================================================\n\n/**\n * Truncate text to a maximum length with a suffix.\n *\n * @param text - Input text\n * @param maxLength - Maximum length including suffix\n * @param suffix - Suffix to append when truncated (default: '...')\n * @returns Truncated text with suffix if needed\n * @example truncateText('hello world', 8) // 'hello...'\n */\nexport function truncateText(text: string, maxLength: number, suffix = '...'): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength - suffix.length) + suffix;\n}\n\n/**\n * Truncate text and include byte count information.\n * Commonly used for output truncation in CLI tools.\n *\n * @param text - Input text\n * @param maxLength - Maximum length before truncation marker\n * @returns Truncated text with byte count info\n * @example truncateWithInfo('hello world...', 5) // 'hello\\n... [truncated 9 bytes]'\n */\nexport function truncateWithInfo(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n const truncatedBytes = text.length - maxLength;\n return `${text.slice(0, maxLength)}\\n... [truncated ${String(truncatedBytes)} bytes]`;\n}\n\n/**\n * Truncate to the first sentence or a maximum length.\n * Useful for extracting descriptions from longer text.\n *\n * @param text - Input text\n * @param maxLength - Maximum length (default: 150)\n * @returns First sentence or truncated text\n * @example truncateSentence('Hello world. More text.', 150) // 'Hello world.'\n */\nexport function truncateSentence(text: string, maxLength = 150): string {\n // Find first sentence ending\n const sentenceEnd = text.search(/[.!?](?:\\s|$)/);\n if (sentenceEnd !== -1 && sentenceEnd < maxLength) {\n return text.slice(0, sentenceEnd + 1).trim();\n }\n // Fall back to truncation\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength).trim() + '...';\n}\n\n// ============================================================================\n// Line Splitting\n// ============================================================================\n\n/**\n * Split text into lines.\n * Handles both Unix (\\n) and Windows (\\r\\n) line endings.\n *\n * @param text - Input text to split\n * @returns Array of lines (may include empty strings)\n * @example splitLines('a\\nb\\nc') // ['a', 'b', 'c']\n * @example splitLines('a\\n\\nb') // ['a', '', 'b']\n */\nexport function splitLines(text: string): string[] {\n return text.split(/\\r?\\n/);\n}\n\n/**\n * Split text into non-empty lines.\n * Filters out empty lines and whitespace-only lines.\n *\n * @param text - Input text to split\n * @returns Array of non-empty lines\n * @example splitNonEmptyLines('a\\n\\nb\\n \\nc') // ['a', 'b', 'c']\n */\nexport function splitNonEmptyLines(text: string): string[] {\n return text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n}\n\n/**\n * Split text into trimmed lines, preserving empty lines.\n * Trims each line but keeps empty lines in the output.\n *\n * @param text - Input text to split\n * @returns Array of trimmed lines\n * @example splitTrimmedLines(' a \\n\\n b ') // ['a', '', 'b']\n */\nexport function splitTrimmedLines(text: string): string[] {\n return text.split(/\\r?\\n/).map((line) => line.trim());\n}\n\n// ============================================================================\n// Sentence/Word Splitting\n// ============================================================================\n\n/**\n * Count the number of sentences in text.\n * Counts sentence-ending punctuation followed by space or end of string.\n *\n * @param text - Input text\n * @returns Number of sentences\n * @example countSentences('Hello world. How are you?') // 2\n */\nexport function countSentences(text: string): number {\n const matches = text.match(/[.!?]+(?:\\s|$)/g);\n return matches !== null ? matches.length : 0;\n}\n\n/**\n * Split text into sentences.\n * Splits on sentence-ending punctuation followed by space.\n *\n * @param text - Input text\n * @returns Array of sentences (trimmed)\n * @example splitSentences('Hello world. How are you?') // ['Hello world.', 'How are you?']\n */\nexport function splitSentences(text: string): string[] {\n // Split on sentence endings followed by space, keeping the punctuation\n return text\n .split(/(?<=[.!?])\\s+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\n/**\n * Count the number of words in text.\n * Splits on whitespace and counts non-empty tokens.\n *\n * @param text - Input text\n * @returns Number of words\n * @example countWords('Hello world') // 2\n */\nexport function countWords(text: string): number {\n return text\n .trim()\n .split(/\\s+/)\n .filter((w) => w.length > 0).length;\n}\n"],"mappings":";AAsBO,IAAM,YAAY,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAmBM,SAAS,SAAS,MAAc,YAAY,GAAa;AAC9D,SAAO,KACJ,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS;AACxC;AAoBO,SAAS,iBAAiB,MAAc,YAAY,GAAa;AACtE,SAAO,SAAS,MAAM,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;AAClE;AAYO,SAAS,eAAe,OAAwB;AACrD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,SAAO,KAAK,UAAU,KAAK;AAC7B;AAaO,SAAS,WAAW,KAAqB;AAC9C,MAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAClD;AASO,SAAS,gBAAgB,KAAqB;AACnD,SAAO,IACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,WAAW,IAAI,CAAC,EAC9B,KAAK,GAAG;AACb;AASO,SAAS,gBAAgB,KAAqB;AACnD,SAAO,IACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,WAAW,IAAI,CAAC,EAC9B,KAAK,GAAG;AACb;AA6BO,SAAS,iBAAiB,MAAc,WAA2B;AACxE,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,QAAM,iBAAiB,KAAK,SAAS;AACrC,SAAO,GAAG,KAAK,MAAM,GAAG,SAAS,CAAC;AAAA,iBAAoB,OAAO,cAAc,CAAC;AAC9E;AAWO,SAAS,iBAAiB,MAAc,YAAY,KAAa;AAEtE,QAAM,cAAc,KAAK,OAAO,eAAe;AAC/C,MAAI,gBAAgB,MAAM,cAAc,WAAW;AACjD,WAAO,KAAK,MAAM,GAAG,cAAc,CAAC,EAAE,KAAK;AAAA,EAC7C;AAEA,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,SAAO,KAAK,MAAM,GAAG,SAAS,EAAE,KAAK,IAAI;AAC3C;","names":[]}
@@ -10997,7 +10997,7 @@ var CompositeRouter = class _CompositeRouter {
10997
10997
  */
10998
10998
  async consultUnifiedContext(task) {
10999
10999
  try {
11000
- const { getContextForTask, inferTaskCategory } = await import("./context-retriever-QY4FNTDZ.js");
11000
+ const { getContextForTask, inferTaskCategory } = await import("./context-retriever-GQRC2MVM.js");
11001
11001
  const ctx = await getContextForTask({
11002
11002
  task: task.content,
11003
11003
  category: inferTaskCategory(task.content),
@@ -12295,4 +12295,4 @@ export {
12295
12295
  ParseError,
12296
12296
  OrchestratorError
12297
12297
  };
12298
- //# sourceMappingURL=chunk-RXVH52UI.js.map
12298
+ //# sourceMappingURL=chunk-6UI4NKT4.js.map
@@ -2,7 +2,7 @@ import {
2
2
  ConfigError,
3
3
  err,
4
4
  ok
5
- } from "./chunk-RXVH52UI.js";
5
+ } from "./chunk-6UI4NKT4.js";
6
6
 
7
7
  // src/adapters/sdk/types.ts
8
8
  var PROVIDER_ENV_KEYS = {
@@ -117,4 +117,4 @@ export {
117
117
  CUSTOM_API_ALLOW_PRIVATE_ENV,
118
118
  validateCustomApiBaseUrl
119
119
  };
120
- //# sourceMappingURL=chunk-ZIWEEVMI.js.map
120
+ //# sourceMappingURL=chunk-6XRNFLPI.js.map
@@ -2,13 +2,13 @@ import {
2
2
  stringifyValue,
3
3
  tokenize,
4
4
  tokenizeFiltered
5
- } from "./chunk-633WH2ML.js";
5
+ } from "./chunk-6T3EPABN.js";
6
6
  import {
7
7
  getMemoryRegistry
8
8
  } from "./chunk-PQHVC4BD.js";
9
9
  import {
10
10
  SessionMemory
11
- } from "./chunk-U6LDVJS7.js";
11
+ } from "./chunk-UFUR6RBP.js";
12
12
  import {
13
13
  ErrorCode,
14
14
  NexusError,
@@ -22,7 +22,7 @@ import {
22
22
  getTimeProvider,
23
23
  ok,
24
24
  setSharedMobiMemDbPathResolver
25
- } from "./chunk-RXVH52UI.js";
25
+ } from "./chunk-6UI4NKT4.js";
26
26
  import {
27
27
  nexusDataPath
28
28
  } from "./chunk-I2HMWH4R.js";
@@ -5578,4 +5578,4 @@ export {
5578
5578
  reinitializeMemoryBackends,
5579
5579
  ToolMemoryManager
5580
5580
  };
5581
- //# sourceMappingURL=chunk-YO27YAEX.js.map
5581
+ //# sourceMappingURL=chunk-7V367KT4.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  OpenAIAdapter
3
- } from "./chunk-WGSRH5EQ.js";
3
+ } from "./chunk-IM2B3FK2.js";
4
4
  import {
5
5
  ConfigError,
6
6
  createLogger,
@@ -9,7 +9,7 @@ import {
9
9
  getTimeProvider,
10
10
  lookupInTreeCapability,
11
11
  ok
12
- } from "./chunk-RXVH52UI.js";
12
+ } from "./chunk-6UI4NKT4.js";
13
13
  import {
14
14
  getNexusDataDir
15
15
  } from "./chunk-I2HMWH4R.js";
@@ -307,4 +307,4 @@ export {
307
307
  discoverModels,
308
308
  buildOpenAICompatAdapters
309
309
  };
310
- //# sourceMappingURL=chunk-6WDJ3IE4.js.map
310
+ //# sourceMappingURL=chunk-A6WC5I7V.js.map
@@ -2,14 +2,14 @@ import {
2
2
  CircuitBreakerRegistry,
3
3
  CircuitError,
4
4
  mapCliErrorToCategory
5
- } from "./chunk-5T6SYCH2.js";
5
+ } from "./chunk-LM2S2QWO.js";
6
6
  import {
7
7
  createLogger,
8
8
  err,
9
9
  getFallbackChainForCategory,
10
10
  getTimeProvider,
11
11
  ok
12
- } from "./chunk-RXVH52UI.js";
12
+ } from "./chunk-6UI4NKT4.js";
13
13
 
14
14
  // src/cli-adapters/cli-circuit-breaker.ts
15
15
  var CATEGORY_TO_FALLBACK = {
@@ -152,4 +152,4 @@ export {
152
152
  CliCircuitBreakerIntegration,
153
153
  createCliCircuitBreakerIntegration
154
154
  };
155
- //# sourceMappingURL=chunk-2W4QJ27D.js.map
155
+ //# sourceMappingURL=chunk-BICIQYET.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getErrorMessage
3
- } from "./chunk-RXVH52UI.js";
3
+ } from "./chunk-6UI4NKT4.js";
4
4
 
5
5
  // src/cli/setup-config.ts
6
6
  import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "fs";
@@ -77,4 +77,4 @@ function ensureBackup(outputPath) {
77
77
  export {
78
78
  runConfigInitSync
79
79
  };
80
- //# sourceMappingURL=chunk-WJFUTRHX.js.map
80
+ //# sourceMappingURL=chunk-BUXXAN6V.js.map
@@ -5,7 +5,7 @@ import {
5
5
  MCP_TIMEOUTS,
6
6
  TEST_TIMEOUTS,
7
7
  WORKFLOW_TIMEOUTS
8
- } from "./chunk-RXVH52UI.js";
8
+ } from "./chunk-6UI4NKT4.js";
9
9
 
10
10
  // src/config/defaults-env.ts
11
11
  function parseIntEnv(envKey, fallback) {
@@ -348,4 +348,4 @@ export {
348
348
  CUSTOM_API_DEFAULT_MODEL,
349
349
  DEFAULTS
350
350
  };
351
- //# sourceMappingURL=chunk-ZM5JKJHI.js.map
351
+ //# sourceMappingURL=chunk-DWOSFYI2.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  CliCircuitBreaker,
3
3
  DEFAULT_CIRCUIT_BREAKER_CONFIG
4
- } from "./chunk-5T6SYCH2.js";
4
+ } from "./chunk-LM2S2QWO.js";
5
5
  import {
6
6
  CLI_SUBPROCESS_TIMEOUTS,
7
7
  CLI_TIMEOUTS,
@@ -24,7 +24,7 @@ import {
24
24
  getTimeProvider,
25
25
  isRateLimitText,
26
26
  ok
27
- } from "./chunk-RXVH52UI.js";
27
+ } from "./chunk-6UI4NKT4.js";
28
28
 
29
29
  // src/cli-adapters/subprocess-adapter.ts
30
30
  import { spawn } from "child_process";
@@ -3183,4 +3183,4 @@ export {
3183
3183
  isCliAvailable,
3184
3184
  getAvailableClis
3185
3185
  };
3186
- //# sourceMappingURL=chunk-FHGDJKCZ.js.map
3186
+ //# sourceMappingURL=chunk-ELRNVADA.js.map
@@ -7,7 +7,7 @@ import {
7
7
  err,
8
8
  getErrorMessage,
9
9
  ok
10
- } from "./chunk-RXVH52UI.js";
10
+ } from "./chunk-6UI4NKT4.js";
11
11
 
12
12
  // src/cli/research-helpers-synthesize.ts
13
13
  import { z } from "zod";
@@ -1015,4 +1015,4 @@ export {
1015
1015
  AttributedInsightSchema,
1016
1016
  synthesizeResearch
1017
1017
  };
1018
- //# sourceMappingURL=chunk-AFPHR72D.js.map
1018
+ //# sourceMappingURL=chunk-FHY7I736.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  getToolMemory
3
- } from "./chunk-YO27YAEX.js";
3
+ } from "./chunk-7V367KT4.js";
4
4
  import {
5
5
  CLI_NAMES,
6
6
  StrategyDistiller,
7
7
  createLogger,
8
8
  getOutcomeStore,
9
9
  registerPersistentDistillerFactory
10
- } from "./chunk-RXVH52UI.js";
10
+ } from "./chunk-6UI4NKT4.js";
11
11
  import {
12
12
  ensureLearningDir,
13
13
  getRulesFile
@@ -273,4 +273,4 @@ export {
273
273
  inferTaskCategory,
274
274
  summarizeContextForPrompt
275
275
  };
276
- //# sourceMappingURL=chunk-3GJAAENS.js.map
276
+ //# sourceMappingURL=chunk-HGPIHDC4.js.map
@@ -3,14 +3,14 @@ import {
3
3
  createStream,
4
4
  requireApiKey,
5
5
  validateApiKeyPresence
6
- } from "./chunk-54UXPJVM.js";
6
+ } from "./chunk-JA6ON2RP.js";
7
7
  import {
8
8
  ModelCapability,
9
9
  err,
10
10
  getCliModelName,
11
11
  getTokenEstimator,
12
12
  ok
13
- } from "./chunk-RXVH52UI.js";
13
+ } from "./chunk-6UI4NKT4.js";
14
14
 
15
15
  // src/adapters/openai-types.ts
16
16
  var OPENAI_MODELS = {
@@ -553,4 +553,4 @@ export {
553
553
  OpenAIAdapter,
554
554
  createOpenAIAdapter
555
555
  };
556
- //# sourceMappingURL=chunk-WGSRH5EQ.js.map
556
+ //# sourceMappingURL=chunk-IM2B3FK2.js.map