nexus-agents 8.85.2 → 8.86.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 (138) hide show
  1. package/dist/{ast-rule-runner-GDCEI7BW.js → ast-rule-runner-USLLC3XL.js} +4 -4
  2. package/dist/{child-mcp-config-HAXDNULH.js → child-mcp-config-K563PP6S.js} +3 -3
  3. package/dist/{chunk-QLYONNVR.js → chunk-2SQO4FET.js} +2 -2
  4. package/dist/{chunk-L3PGHZH7.js → chunk-4Q753QZM.js} +3 -3
  5. package/dist/{chunk-WIBR5HMY.js → chunk-5U4XTYAB.js} +2 -2
  6. package/dist/{chunk-YGOTLETF.js → chunk-64IJKT4I.js} +537 -402
  7. package/dist/chunk-64IJKT4I.js.map +1 -0
  8. package/dist/{chunk-CDHUCQ44.js → chunk-C4YTAB6K.js} +43 -22
  9. package/dist/chunk-C4YTAB6K.js.map +1 -0
  10. package/dist/{chunk-TYHKIUUX.js → chunk-CBZAMHBA.js} +2 -2
  11. package/dist/{chunk-FOODF33L.js → chunk-DSVMQVJZ.js} +4 -4
  12. package/dist/{chunk-XLYTLQAT.js → chunk-EVYZZL7J.js} +2 -2
  13. package/dist/{chunk-7NLTUPYN.js → chunk-FNL4J77P.js} +2 -2
  14. package/dist/chunk-FNL4J77P.js.map +1 -0
  15. package/dist/{chunk-GFFQHVSC.js → chunk-GKLTEUFU.js} +2 -2
  16. package/dist/{chunk-JHNS5FYV.js → chunk-IXKFIO6O.js} +2 -2
  17. package/dist/{chunk-4RHGZLKP.js → chunk-J6GIJFV4.js} +2 -2
  18. package/dist/{chunk-HSMW4KIV.js → chunk-KX7A23JM.js} +2 -2
  19. package/dist/{chunk-PB4SXWBA.js → chunk-KXFPJOPL.js} +2 -2
  20. package/dist/{chunk-Y2ARXXPF.js → chunk-NNYVXSQF.js} +2 -2
  21. package/dist/{chunk-K6VACGLH.js → chunk-NQA77WXP.js} +3 -3
  22. package/dist/{chunk-7L6KI365.js → chunk-O24ENDHN.js} +3 -3
  23. package/dist/{chunk-M6U6UHFA.js → chunk-OOIZ3IQD.js} +2 -2
  24. package/dist/{chunk-U33OOJOK.js → chunk-P6D7S7CY.js} +2 -2
  25. package/dist/{chunk-B3PR26HR.js → chunk-Q75P5CVJ.js} +2 -2
  26. package/dist/{chunk-P5BZ3DNM.js → chunk-QCDYJYGB.js} +7 -7
  27. package/dist/{chunk-WZRXZ6P2.js → chunk-QW6J2UV4.js} +43 -9
  28. package/dist/chunk-QW6J2UV4.js.map +1 -0
  29. package/dist/{chunk-4UHDDCRB.js → chunk-RQLIPUQK.js} +5 -1
  30. package/dist/{chunk-4UHDDCRB.js.map → chunk-RQLIPUQK.js.map} +1 -1
  31. package/dist/{chunk-3EK4V5JS.js → chunk-S6MNVNQB.js} +2 -2
  32. package/dist/{chunk-IKLDY3HI.js → chunk-SQ4M3JHW.js} +41 -39
  33. package/dist/chunk-SQ4M3JHW.js.map +1 -0
  34. package/dist/{chunk-Z33AE45S.js → chunk-V66MMBO4.js} +5 -5
  35. package/dist/{chunk-WKZSEYV7.js → chunk-XARB7ITD.js} +8 -8
  36. package/dist/{chunk-PBXABL7H.js → chunk-XNNNDQLK.js} +2 -2
  37. package/dist/{chunk-VYZRGIY5.js → chunk-XWPZZEBX.js} +4 -4
  38. package/dist/{chunk-ILGHDIYO.js → chunk-YG73EH43.js} +2 -2
  39. package/dist/{chunk-23DTC2UV.js → chunk-YPJRVA2H.js} +4 -4
  40. package/dist/{chunk-NL7I35TJ.js → chunk-ZE73MT66.js} +5 -5
  41. package/dist/chunk-ZE73MT66.js.map +1 -0
  42. package/dist/{chunk-ARWTQGSY.js → chunk-ZEOHUE2N.js} +10 -10
  43. package/dist/{chunk-KC3AZWVQ.js → chunk-ZSFRB2S4.js} +3 -3
  44. package/dist/{cli-circuit-breaker-TOE7GRYI.js → cli-circuit-breaker-4ASNTBDP.js} +4 -4
  45. package/dist/cli.js +43 -43
  46. package/dist/{composite-router-UD3FGSSS.js → composite-router-V45AK6WD.js} +3 -3
  47. package/dist/{consensus-vote-YW6LAIH7.js → consensus-vote-N2Z7FX3D.js} +17 -17
  48. package/dist/{context-retriever-CH3GEH2Z.js → context-retriever-NZOSGG6S.js} +9 -9
  49. package/dist/{doctor-deep-LMEUFKDA.js → doctor-deep-JRY3D7BP.js} +4 -4
  50. package/dist/{doctor-live-O25NTC5D.js → doctor-live-NSRHMHMG.js} +11 -11
  51. package/dist/{expert-bridge-ZQSYVUC2.js → expert-bridge-Q4SEPVTE.js} +5 -5
  52. package/dist/factory-JBK45P7G.js +15 -0
  53. package/dist/{factory-O4U4BJFT.js → factory-ZV4MR3VM.js} +10 -10
  54. package/dist/{improvement-review-RL6VHCCY.js → improvement-review-KHTIDV4R.js} +6 -6
  55. package/dist/index.d.ts +56 -6
  56. package/dist/index.js +31 -31
  57. package/dist/{init-opencode-RMMHBIQ2.js → init-opencode-6WGN5J6J.js} +6 -6
  58. package/dist/issue-triage-XVDXOZRW.js +16 -0
  59. package/dist/{learning-persistence-7BEPQEGN.js → learning-persistence-ER7E5Q6T.js} +6 -4
  60. package/dist/model-registry.generated.json +2949 -3961
  61. package/dist/{pr-reviewer-helpers-S53B7TYK.js → pr-reviewer-helpers-UMNMOUAO.js} +5 -5
  62. package/dist/{registry-command-TWHRKWDB.js → registry-command-QRBAKWRK.js} +3 -3
  63. package/dist/{repo-security-plan-HYJ7HTOS.js → repo-security-plan-UM6WX5PN.js} +4 -4
  64. package/dist/research-helpers-synthesize-DUOVXI5V.js +14 -0
  65. package/dist/{routing-memory-HQTEZF2S.js → routing-memory-OKYSDPXT.js} +3 -3
  66. package/dist/{session-memory-M5MEGJJZ.js → session-memory-ONUSRMYV.js} +4 -4
  67. package/dist/setup-config-BAZRBFN3.js +11 -0
  68. package/dist/{setup-custom-api-LRL6J7RN.js → setup-custom-api-LSMLWGKW.js} +5 -5
  69. package/dist/setup-data-dir-7PDX3R3Y.js +32 -0
  70. package/dist/{tool-memory-24PMDECK.js → tool-memory-Q5UWNVN3.js} +6 -6
  71. package/dist/{unified-registry-NODUOBMA.js → unified-registry-Y327PN6R.js} +11 -11
  72. package/dist/{weather-report-IGEXNIWL.js → weather-report-C2VIAC2Q.js} +3 -3
  73. package/package.json +1 -1
  74. package/dist/chunk-7NLTUPYN.js.map +0 -1
  75. package/dist/chunk-CDHUCQ44.js.map +0 -1
  76. package/dist/chunk-IKLDY3HI.js.map +0 -1
  77. package/dist/chunk-NL7I35TJ.js.map +0 -1
  78. package/dist/chunk-WZRXZ6P2.js.map +0 -1
  79. package/dist/chunk-YGOTLETF.js.map +0 -1
  80. package/dist/factory-ZOM2QJPC.js +0 -15
  81. package/dist/issue-triage-DQAOBZEP.js +0 -16
  82. package/dist/research-helpers-synthesize-G3WV7AHW.js +0 -14
  83. package/dist/setup-config-L5QGPDH6.js +0 -11
  84. package/dist/setup-data-dir-WZXMTSDN.js +0 -32
  85. /package/dist/{ast-rule-runner-GDCEI7BW.js.map → ast-rule-runner-USLLC3XL.js.map} +0 -0
  86. /package/dist/{child-mcp-config-HAXDNULH.js.map → child-mcp-config-K563PP6S.js.map} +0 -0
  87. /package/dist/{chunk-QLYONNVR.js.map → chunk-2SQO4FET.js.map} +0 -0
  88. /package/dist/{chunk-L3PGHZH7.js.map → chunk-4Q753QZM.js.map} +0 -0
  89. /package/dist/{chunk-WIBR5HMY.js.map → chunk-5U4XTYAB.js.map} +0 -0
  90. /package/dist/{chunk-TYHKIUUX.js.map → chunk-CBZAMHBA.js.map} +0 -0
  91. /package/dist/{chunk-FOODF33L.js.map → chunk-DSVMQVJZ.js.map} +0 -0
  92. /package/dist/{chunk-XLYTLQAT.js.map → chunk-EVYZZL7J.js.map} +0 -0
  93. /package/dist/{chunk-GFFQHVSC.js.map → chunk-GKLTEUFU.js.map} +0 -0
  94. /package/dist/{chunk-JHNS5FYV.js.map → chunk-IXKFIO6O.js.map} +0 -0
  95. /package/dist/{chunk-4RHGZLKP.js.map → chunk-J6GIJFV4.js.map} +0 -0
  96. /package/dist/{chunk-HSMW4KIV.js.map → chunk-KX7A23JM.js.map} +0 -0
  97. /package/dist/{chunk-PB4SXWBA.js.map → chunk-KXFPJOPL.js.map} +0 -0
  98. /package/dist/{chunk-Y2ARXXPF.js.map → chunk-NNYVXSQF.js.map} +0 -0
  99. /package/dist/{chunk-K6VACGLH.js.map → chunk-NQA77WXP.js.map} +0 -0
  100. /package/dist/{chunk-7L6KI365.js.map → chunk-O24ENDHN.js.map} +0 -0
  101. /package/dist/{chunk-M6U6UHFA.js.map → chunk-OOIZ3IQD.js.map} +0 -0
  102. /package/dist/{chunk-U33OOJOK.js.map → chunk-P6D7S7CY.js.map} +0 -0
  103. /package/dist/{chunk-B3PR26HR.js.map → chunk-Q75P5CVJ.js.map} +0 -0
  104. /package/dist/{chunk-P5BZ3DNM.js.map → chunk-QCDYJYGB.js.map} +0 -0
  105. /package/dist/{chunk-3EK4V5JS.js.map → chunk-S6MNVNQB.js.map} +0 -0
  106. /package/dist/{chunk-Z33AE45S.js.map → chunk-V66MMBO4.js.map} +0 -0
  107. /package/dist/{chunk-WKZSEYV7.js.map → chunk-XARB7ITD.js.map} +0 -0
  108. /package/dist/{chunk-PBXABL7H.js.map → chunk-XNNNDQLK.js.map} +0 -0
  109. /package/dist/{chunk-VYZRGIY5.js.map → chunk-XWPZZEBX.js.map} +0 -0
  110. /package/dist/{chunk-ILGHDIYO.js.map → chunk-YG73EH43.js.map} +0 -0
  111. /package/dist/{chunk-23DTC2UV.js.map → chunk-YPJRVA2H.js.map} +0 -0
  112. /package/dist/{chunk-ARWTQGSY.js.map → chunk-ZEOHUE2N.js.map} +0 -0
  113. /package/dist/{chunk-KC3AZWVQ.js.map → chunk-ZSFRB2S4.js.map} +0 -0
  114. /package/dist/{cli-circuit-breaker-TOE7GRYI.js.map → cli-circuit-breaker-4ASNTBDP.js.map} +0 -0
  115. /package/dist/{composite-router-UD3FGSSS.js.map → composite-router-V45AK6WD.js.map} +0 -0
  116. /package/dist/{consensus-vote-YW6LAIH7.js.map → consensus-vote-N2Z7FX3D.js.map} +0 -0
  117. /package/dist/{context-retriever-CH3GEH2Z.js.map → context-retriever-NZOSGG6S.js.map} +0 -0
  118. /package/dist/{doctor-deep-LMEUFKDA.js.map → doctor-deep-JRY3D7BP.js.map} +0 -0
  119. /package/dist/{doctor-live-O25NTC5D.js.map → doctor-live-NSRHMHMG.js.map} +0 -0
  120. /package/dist/{expert-bridge-ZQSYVUC2.js.map → expert-bridge-Q4SEPVTE.js.map} +0 -0
  121. /package/dist/{factory-O4U4BJFT.js.map → factory-JBK45P7G.js.map} +0 -0
  122. /package/dist/{factory-ZOM2QJPC.js.map → factory-ZV4MR3VM.js.map} +0 -0
  123. /package/dist/{improvement-review-RL6VHCCY.js.map → improvement-review-KHTIDV4R.js.map} +0 -0
  124. /package/dist/{init-opencode-RMMHBIQ2.js.map → init-opencode-6WGN5J6J.js.map} +0 -0
  125. /package/dist/{issue-triage-DQAOBZEP.js.map → issue-triage-XVDXOZRW.js.map} +0 -0
  126. /package/dist/{learning-persistence-7BEPQEGN.js.map → learning-persistence-ER7E5Q6T.js.map} +0 -0
  127. /package/dist/{pr-reviewer-helpers-S53B7TYK.js.map → pr-reviewer-helpers-UMNMOUAO.js.map} +0 -0
  128. /package/dist/{registry-command-TWHRKWDB.js.map → registry-command-QRBAKWRK.js.map} +0 -0
  129. /package/dist/{repo-security-plan-HYJ7HTOS.js.map → repo-security-plan-UM6WX5PN.js.map} +0 -0
  130. /package/dist/{research-helpers-synthesize-G3WV7AHW.js.map → research-helpers-synthesize-DUOVXI5V.js.map} +0 -0
  131. /package/dist/{routing-memory-HQTEZF2S.js.map → routing-memory-OKYSDPXT.js.map} +0 -0
  132. /package/dist/{session-memory-M5MEGJJZ.js.map → session-memory-ONUSRMYV.js.map} +0 -0
  133. /package/dist/{setup-config-L5QGPDH6.js.map → setup-config-BAZRBFN3.js.map} +0 -0
  134. /package/dist/{setup-custom-api-LRL6J7RN.js.map → setup-custom-api-LSMLWGKW.js.map} +0 -0
  135. /package/dist/{setup-data-dir-WZXMTSDN.js.map → setup-data-dir-7PDX3R3Y.js.map} +0 -0
  136. /package/dist/{tool-memory-24PMDECK.js.map → tool-memory-Q5UWNVN3.js.map} +0 -0
  137. /package/dist/{unified-registry-NODUOBMA.js.map → unified-registry-Y327PN6R.js.map} +0 -0
  138. /package/dist/{weather-report-IGEXNIWL.js.map → weather-report-C2VIAC2Q.js.map} +0 -0
@@ -31,6 +31,9 @@ var DIR_MODE = 448;
31
31
  function isPersistenceEnabled() {
32
32
  return parseBoolEnv("NEXUS_PERSIST_LEARNING", true);
33
33
  }
34
+ function isStrategyDistillationEnabled() {
35
+ return parseBoolEnv("NEXUS_STRATEGY_DISTILLATION", true);
36
+ }
34
37
  function ensureLearningDir(dir) {
35
38
  mkdirSync(dir ?? getLearningDir(), { recursive: true, mode: DIR_MODE });
36
39
  }
@@ -44,6 +47,7 @@ export {
44
47
  getMetaOutcomesFile,
45
48
  getModelSelectionShadowFile,
46
49
  isPersistenceEnabled,
50
+ isStrategyDistillationEnabled,
47
51
  ensureLearningDir
48
52
  };
49
- //# sourceMappingURL=chunk-4UHDDCRB.js.map
53
+ //# sourceMappingURL=chunk-RQLIPUQK.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/learning-persistence.ts"],"sourcesContent":["/**\n * Shared configuration for cross-session learning persistence.\n *\n * Controls where learning data (outcomes, distilled rules) is stored\n * on disk and whether persistence is enabled via feature flag.\n *\n * @module config/learning-persistence\n * (Source: Issue #1009 — Cross-session persistence)\n */\n\nimport { mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { getNexusDataDir } from './nexus-data-dir.js';\nimport { parseBoolEnv } from './defaults-env.js';\n\n// ============================================================================\n// Path resolution (#2316: must read NEXUS_DATA_DIR at call time, not import)\n// ============================================================================\n\n/**\n * Base directory for learning persistence data. Resolved at call time so\n * `NEXUS_DATA_DIR` overrides take effect — the const-at-import-time\n * pattern this replaces was the bug discovered while dogfooding v2.63.0\n * (#2316). Outcome counts on a fresh portable workspace were leaking\n * the host home directory's outcome history.\n */\nexport function getLearningDir(): string {\n return join(getNexusDataDir(), 'learning');\n}\n\n/** JSONL file for persisted task outcomes. */\nexport function getOutcomesFile(): string {\n return join(getLearningDir(), 'outcomes.jsonl');\n}\n\n/** JSON file for persisted distilled rules. */\nexport function getRulesFile(): string {\n return join(getLearningDir(), 'rules.json');\n}\n\n/**\n * JSONL file for per-voter pr_review eval verdicts (#3848).\n *\n * Stores ONLY rubric-scored per-voter TP/FP/FN tallies vs ground truth — never\n * raw diffs, prompts, or model outputs. Lets per-voter precision/recall accrue\n * across runs so a chronically-noisy-voter demotion (Epic D / ADR-0017) has\n * citable evidence.\n */\nexport function getPrReviewEvalFile(): string {\n return join(getLearningDir(), 'pr-review-eval.jsonl');\n}\n\n/**\n * JSONL file for per-decision cost rollups (#3855).\n *\n * Stores ONLY the per-decision cost summary (per-voter / per-model token + USD\n * totals) for a governed `consensus_vote` / `pr_review` run — never raw\n * proposals, diffs, prompts, or model outputs. Lets \"what did this governed\n * decision cost?\" be answered from recorded data (epic #3854; feeds Epic G's\n * weather_report + manifest cost profiles in #3856).\n */\nexport function getDecisionCostFile(): string {\n return join(getLearningDir(), 'decision-costs.jsonl');\n}\n\n/**\n * JSONL file for the MetaOrchestrator shadow selector's training outcomes\n * (#3593). Stores ONLY numeric/categorical bandit-feature values + a boolean\n * success flag — never raw task text. Lets the shadow selector learn across\n * processes by replaying past outcomes on construction.\n */\nexport function getMetaOutcomesFile(): string {\n return join(getLearningDir(), 'meta-outcomes.jsonl');\n}\n\n/**\n * JSONL file for route-time model-selection shadow comparisons (#4197).\n *\n * Stores ONLY the sanitized comparison — CLI slot, difficulty tier, the model\n * actually used vs the model `resolveModelForTier` WOULD have picked, agreement,\n * outcome success, and (where measured) costUsd — never task content, prompts,\n * or model outputs. A DEDICATED log (mirroring `meta-outcomes.jsonl`, #3593)\n * rather than extra OutcomeStore fields, so the shadow eval never re-reads the\n * OutcomeStore that weather + LinUCB warm-start already replay (the pre-existing\n * double-counting boundary excluded from #4194).\n */\nexport function getModelSelectionShadowFile(): string {\n return join(getLearningDir(), 'model-selection-shadow.jsonl');\n}\n\n// Note: previous LEARNING_DIR / OUTCOMES_FILE / RULES_FILE exports were\n// removed in #2316 — they were evaluated at module import time and ignored\n// `NEXUS_DATA_DIR`. All callers must use the getter functions above.\n\n/** Directory mode: owner-only (rwx------). */\nconst DIR_MODE = 0o700;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Check whether learning persistence is enabled via feature flag.\n *\n * Defaults to true — cross-session LinUCB routing data persists to\n * `~/.nexus-agents/learning/` unless explicitly disabled.\n * Only routing metadata is stored (model, success, duration, category).\n * No user prompts, API keys, or model outputs are persisted.\n *\n * Set NEXUS_PERSIST_LEARNING to `false`/`0` to disable — the one accept-set\n * every NEXUS_* boolean shares (#5464, wave 2 of #5155).\n */\nexport function isPersistenceEnabled(): boolean {\n return parseBoolEnv('NEXUS_PERSIST_LEARNING', true);\n}\n\n/** Ensure the learning data directory exists. */\nexport function ensureLearningDir(dir?: string): void {\n mkdirSync(dir ?? getLearningDir(), { recursive: true, mode: DIR_MODE });\n}\n"],"mappings":";;;;;;AAUA,SAAS,iBAAiB;AAC1B,SAAS,YAAY;AAed,SAAS,iBAAyB;AACvC,SAAO,KAAK,gBAAgB,GAAG,UAAU;AAC3C;AAGO,SAAS,kBAA0B;AACxC,SAAO,KAAK,eAAe,GAAG,gBAAgB;AAChD;AAGO,SAAS,eAAuB;AACrC,SAAO,KAAK,eAAe,GAAG,YAAY;AAC5C;AAUO,SAAS,sBAA8B;AAC5C,SAAO,KAAK,eAAe,GAAG,sBAAsB;AACtD;AAWO,SAAS,sBAA8B;AAC5C,SAAO,KAAK,eAAe,GAAG,sBAAsB;AACtD;AAQO,SAAS,sBAA8B;AAC5C,SAAO,KAAK,eAAe,GAAG,qBAAqB;AACrD;AAaO,SAAS,8BAAsC;AACpD,SAAO,KAAK,eAAe,GAAG,8BAA8B;AAC9D;AAOA,IAAM,WAAW;AAiBV,SAAS,uBAAgC;AAC9C,SAAO,aAAa,0BAA0B,IAAI;AACpD;AAGO,SAAS,kBAAkB,KAAoB;AACpD,YAAU,OAAO,eAAe,GAAG,EAAE,WAAW,MAAM,MAAM,SAAS,CAAC;AACxE;","names":[]}
1
+ {"version":3,"sources":["../src/config/learning-persistence.ts"],"sourcesContent":["/**\n * Shared configuration for cross-session learning persistence.\n *\n * Controls where learning data (outcomes, distilled rules) is stored\n * on disk and whether persistence is enabled via feature flag.\n *\n * @module config/learning-persistence\n * (Source: Issue #1009 — Cross-session persistence)\n */\n\nimport { mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { getNexusDataDir } from './nexus-data-dir.js';\nimport { parseBoolEnv } from './defaults-env.js';\n\n// ============================================================================\n// Path resolution (#2316: must read NEXUS_DATA_DIR at call time, not import)\n// ============================================================================\n\n/**\n * Base directory for learning persistence data. Resolved at call time so\n * `NEXUS_DATA_DIR` overrides take effect — the const-at-import-time\n * pattern this replaces was the bug discovered while dogfooding v2.63.0\n * (#2316). Outcome counts on a fresh portable workspace were leaking\n * the host home directory's outcome history.\n */\nexport function getLearningDir(): string {\n return join(getNexusDataDir(), 'learning');\n}\n\n/** JSONL file for persisted task outcomes. */\nexport function getOutcomesFile(): string {\n return join(getLearningDir(), 'outcomes.jsonl');\n}\n\n/** JSON file for persisted distilled rules. */\nexport function getRulesFile(): string {\n return join(getLearningDir(), 'rules.json');\n}\n\n/**\n * JSONL file for per-voter pr_review eval verdicts (#3848).\n *\n * Stores ONLY rubric-scored per-voter TP/FP/FN tallies vs ground truth — never\n * raw diffs, prompts, or model outputs. Lets per-voter precision/recall accrue\n * across runs so a chronically-noisy-voter demotion (Epic D / ADR-0017) has\n * citable evidence.\n */\nexport function getPrReviewEvalFile(): string {\n return join(getLearningDir(), 'pr-review-eval.jsonl');\n}\n\n/**\n * JSONL file for per-decision cost rollups (#3855).\n *\n * Stores ONLY the per-decision cost summary (per-voter / per-model token + USD\n * totals) for a governed `consensus_vote` / `pr_review` run — never raw\n * proposals, diffs, prompts, or model outputs. Lets \"what did this governed\n * decision cost?\" be answered from recorded data (epic #3854; feeds Epic G's\n * weather_report + manifest cost profiles in #3856).\n */\nexport function getDecisionCostFile(): string {\n return join(getLearningDir(), 'decision-costs.jsonl');\n}\n\n/**\n * JSONL file for the MetaOrchestrator shadow selector's training outcomes\n * (#3593). Stores ONLY numeric/categorical bandit-feature values + a boolean\n * success flag — never raw task text. Lets the shadow selector learn across\n * processes by replaying past outcomes on construction.\n */\nexport function getMetaOutcomesFile(): string {\n return join(getLearningDir(), 'meta-outcomes.jsonl');\n}\n\n/**\n * JSONL file for route-time model-selection shadow comparisons (#4197).\n *\n * Stores ONLY the sanitized comparison — CLI slot, difficulty tier, the model\n * actually used vs the model `resolveModelForTier` WOULD have picked, agreement,\n * outcome success, and (where measured) costUsd — never task content, prompts,\n * or model outputs. A DEDICATED log (mirroring `meta-outcomes.jsonl`, #3593)\n * rather than extra OutcomeStore fields, so the shadow eval never re-reads the\n * OutcomeStore that weather + LinUCB warm-start already replay (the pre-existing\n * double-counting boundary excluded from #4194).\n */\nexport function getModelSelectionShadowFile(): string {\n return join(getLearningDir(), 'model-selection-shadow.jsonl');\n}\n\n// Note: previous LEARNING_DIR / OUTCOMES_FILE / RULES_FILE exports were\n// removed in #2316 — they were evaluated at module import time and ignored\n// `NEXUS_DATA_DIR`. All callers must use the getter functions above.\n\n/** Directory mode: owner-only (rwx------). */\nconst DIR_MODE = 0o700;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Check whether learning persistence is enabled via feature flag.\n *\n * Defaults to true — cross-session LinUCB routing data persists to\n * `~/.nexus-agents/learning/` unless explicitly disabled.\n * Only routing metadata is stored (model, success, duration, category).\n * No user prompts, API keys, or model outputs are persisted.\n *\n * Set NEXUS_PERSIST_LEARNING to `false`/`0` to disable — the one accept-set\n * every NEXUS_* boolean shares (#5464, wave 2 of #5155).\n */\nexport function isPersistenceEnabled(): boolean {\n return parseBoolEnv('NEXUS_PERSIST_LEARNING', true);\n}\n\n/**\n * Off switch for strategy distillation alone (#6512 review I1). Defaults ON,\n * matching the default-on learning loop. `NEXUS_STRATEGY_DISTILLATION=false`/`0`\n * stops the router from distilling or applying distilled rules without also\n * turning off outcome persistence, which `NEXUS_PERSIST_LEARNING` would. It\n * overrides a config that enables `strategyDistillation`.\n */\nexport function isStrategyDistillationEnabled(): boolean {\n return parseBoolEnv('NEXUS_STRATEGY_DISTILLATION', true);\n}\n\n/** Ensure the learning data directory exists. */\nexport function ensureLearningDir(dir?: string): void {\n mkdirSync(dir ?? getLearningDir(), { recursive: true, mode: DIR_MODE });\n}\n"],"mappings":";;;;;;AAUA,SAAS,iBAAiB;AAC1B,SAAS,YAAY;AAed,SAAS,iBAAyB;AACvC,SAAO,KAAK,gBAAgB,GAAG,UAAU;AAC3C;AAGO,SAAS,kBAA0B;AACxC,SAAO,KAAK,eAAe,GAAG,gBAAgB;AAChD;AAGO,SAAS,eAAuB;AACrC,SAAO,KAAK,eAAe,GAAG,YAAY;AAC5C;AAUO,SAAS,sBAA8B;AAC5C,SAAO,KAAK,eAAe,GAAG,sBAAsB;AACtD;AAWO,SAAS,sBAA8B;AAC5C,SAAO,KAAK,eAAe,GAAG,sBAAsB;AACtD;AAQO,SAAS,sBAA8B;AAC5C,SAAO,KAAK,eAAe,GAAG,qBAAqB;AACrD;AAaO,SAAS,8BAAsC;AACpD,SAAO,KAAK,eAAe,GAAG,8BAA8B;AAC9D;AAOA,IAAM,WAAW;AAiBV,SAAS,uBAAgC;AAC9C,SAAO,aAAa,0BAA0B,IAAI;AACpD;AASO,SAAS,gCAAyC;AACvD,SAAO,aAAa,+BAA+B,IAAI;AACzD;AAGO,SAAS,kBAAkB,KAAoB;AACpD,YAAU,OAAO,eAAe,GAAG,EAAE,WAAW,MAAM,MAAM,SAAS,CAAC;AACxE;","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  createLogger,
6
6
  getTimeProvider
7
- } from "./chunk-YGOTLETF.js";
7
+ } from "./chunk-64IJKT4I.js";
8
8
 
9
9
  // src/mcp/tools/scanner-registry-fetcher.ts
10
10
  import { z } from "zod";
@@ -740,4 +740,4 @@ export {
740
740
  generateSecurityPlan,
741
741
  buildPlanFromAnalysis
742
742
  };
743
- //# sourceMappingURL=chunk-3EK4V5JS.js.map
743
+ //# sourceMappingURL=chunk-S6MNVNQB.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  generateSecurityPlan
3
- } from "./chunk-3EK4V5JS.js";
3
+ } from "./chunk-S6MNVNQB.js";
4
4
  import {
5
5
  analyzeGitHubRepo
6
6
  } from "./chunk-4GDMHCKX.js";
@@ -21,10 +21,10 @@ import {
21
21
  import {
22
22
  DEFAULT_TASK_TTL_MS,
23
23
  clampTaskTtl
24
- } from "./chunk-CDHUCQ44.js";
24
+ } from "./chunk-C4YTAB6K.js";
25
25
  import {
26
26
  executeExpert
27
- } from "./chunk-P5BZ3DNM.js";
27
+ } from "./chunk-QCDYJYGB.js";
28
28
  import {
29
29
  DEPRECATED_MODE_ALIAS_INPUT,
30
30
  JobStatusSchema,
@@ -72,7 +72,7 @@ import {
72
72
  updateStage,
73
73
  withWarnings,
74
74
  writeJobCancelled
75
- } from "./chunk-ARWTQGSY.js";
75
+ } from "./chunk-ZEOHUE2N.js";
76
76
  import {
77
77
  allOf,
78
78
  anyOf
@@ -80,7 +80,7 @@ import {
80
80
  import {
81
81
  normalizeTopicToCanonical,
82
82
  synthesizeResearch
83
- } from "./chunk-KC3AZWVQ.js";
83
+ } from "./chunk-ZSFRB2S4.js";
84
84
  import {
85
85
  IssueTriage,
86
86
  createAuditTrail,
@@ -89,13 +89,13 @@ import {
89
89
  createGraphAuditBridge,
90
90
  emitPipelinePolicyEvent,
91
91
  readActionRefusal
92
- } from "./chunk-Z33AE45S.js";
92
+ } from "./chunk-V66MMBO4.js";
93
93
  import {
94
94
  sanitizeInput
95
- } from "./chunk-PB4SXWBA.js";
95
+ } from "./chunk-KXFPJOPL.js";
96
96
  import {
97
97
  withPrerequisite
98
- } from "./chunk-L3PGHZH7.js";
98
+ } from "./chunk-4Q753QZM.js";
99
99
  import {
100
100
  NOOP_NOTIFIER,
101
101
  RateLimiter,
@@ -120,14 +120,14 @@ import {
120
120
  toolSuccessStructured,
121
121
  withProgressHeartbeat,
122
122
  wrapToolWithTimeout
123
- } from "./chunk-K6VACGLH.js";
123
+ } from "./chunk-NQA77WXP.js";
124
124
  import {
125
125
  EventTopics,
126
126
  UNRESOLVED_MODEL_ID,
127
127
  createEvent,
128
128
  getGlobalEventBus,
129
129
  getGlobalRegistry
130
- } from "./chunk-FOODF33L.js";
130
+ } from "./chunk-DSVMQVJZ.js";
131
131
  import {
132
132
  IDENTIFIER_RE,
133
133
  LANG_VALUES,
@@ -160,7 +160,7 @@ import {
160
160
  parseRegistry,
161
161
  sourceExistsInRegistry,
162
162
  summarizeContextForPrompt
163
- } from "./chunk-WZRXZ6P2.js";
163
+ } from "./chunk-QW6J2UV4.js";
164
164
  import {
165
165
  REGISTRY_PATH,
166
166
  getProjectRoot,
@@ -168,25 +168,25 @@ import {
168
168
  loadTechniquesRegistry,
169
169
  resolveInsideRoot,
170
170
  resolveRegistryRoot
171
- } from "./chunk-U33OOJOK.js";
171
+ } from "./chunk-P6D7S7CY.js";
172
172
  import {
173
173
  getTokenEnvVars,
174
174
  resolveToken
175
- } from "./chunk-WIBR5HMY.js";
175
+ } from "./chunk-5U4XTYAB.js";
176
176
  import {
177
177
  DEFAULT_RELEVANCE_CONFIG,
178
178
  MemoryImportance,
179
179
  MemoryType,
180
180
  calculateTextJaccardSimilarity,
181
181
  getToolMemory
182
- } from "./chunk-VYZRGIY5.js";
182
+ } from "./chunk-XWPZZEBX.js";
183
183
  import {
184
184
  STOPWORDS,
185
185
  truncateWithInfo
186
186
  } from "./chunk-7LP6VJRP.js";
187
187
  import {
188
188
  createSessionMemory
189
- } from "./chunk-QLYONNVR.js";
189
+ } from "./chunk-2SQO4FET.js";
190
190
  import {
191
191
  BUILT_IN_EXPERTS,
192
192
  BuiltInExpertTypeSchema,
@@ -204,24 +204,24 @@ import {
204
204
  getAvailableClis,
205
205
  sleep,
206
206
  withTimeout
207
- } from "./chunk-WKZSEYV7.js";
207
+ } from "./chunk-XARB7ITD.js";
208
208
  import {
209
209
  BaseAdapter,
210
210
  createStream,
211
211
  requireApiKey,
212
212
  validateApiKeyPresence
213
- } from "./chunk-7NLTUPYN.js";
213
+ } from "./chunk-FNL4J77P.js";
214
214
  import {
215
215
  DEFAULTS
216
- } from "./chunk-Y2ARXXPF.js";
216
+ } from "./chunk-NNYVXSQF.js";
217
217
  import {
218
218
  resolveGatewayEnv
219
- } from "./chunk-B3PR26HR.js";
219
+ } from "./chunk-Q75P5CVJ.js";
220
220
  import {
221
221
  getAvailabilityCache,
222
222
  getCliForModelId,
223
223
  resolveFallback
224
- } from "./chunk-PBXABL7H.js";
224
+ } from "./chunk-XNNNDQLK.js";
225
225
  import {
226
226
  sanitizeErrorDetails
227
227
  } from "./chunk-2NDA4DHW.js";
@@ -233,7 +233,7 @@ import {
233
233
  import {
234
234
  generateHyphenId,
235
235
  generateUUID
236
- } from "./chunk-TYHKIUUX.js";
236
+ } from "./chunk-CBZAMHBA.js";
237
237
  import {
238
238
  AGENT_ROUTER_TIMEOUTS,
239
239
  API_TIMEOUTS,
@@ -349,12 +349,12 @@ import {
349
349
  selectStrategyByManifest,
350
350
  toExpertTaskAnalysisResult,
351
351
  withStep
352
- } from "./chunk-YGOTLETF.js";
352
+ } from "./chunk-64IJKT4I.js";
353
353
  import {
354
354
  ensureLearningDir,
355
355
  getMetaOutcomesFile,
356
356
  isPersistenceEnabled
357
- } from "./chunk-4UHDDCRB.js";
357
+ } from "./chunk-RQLIPUQK.js";
358
358
  import {
359
359
  findRepoRoot,
360
360
  getNexusDataDir,
@@ -940,6 +940,8 @@ var NexusEnvSchema = z10.object({
940
940
  NEXUS_LOG_LEVEL: z10.enum(["trace", "debug", "info", "warn", "error", "fatal", "silent"]).optional(),
941
941
  // --- Features ---
942
942
  NEXUS_PERSIST_LEARNING: boolLooseStr.optional(),
943
+ // #6512: off switch for strategy distillation only (read by isStrategyDistillationEnabled).
944
+ NEXUS_STRATEGY_DISTILLATION: boolLooseStr.optional(),
943
945
  NEXUS_REFLECTIVE_MEMORY: z10.enum(["true", "false", "shadow"]).optional(),
944
946
  NEXUS_EVENTBUS_ENABLED: boolStr.optional(),
945
947
  // NEXUS_EVENTBUS_MAX_HISTORY removed in #2977 — silent no-op (no production reader).
@@ -30305,7 +30307,7 @@ function execIdFields(executionId) {
30305
30307
  async function populateUnifiedContextOnState(state, options) {
30306
30308
  const taskCandidate = state["task"];
30307
30309
  if (typeof taskCandidate !== "string" || taskCandidate === "") return;
30308
- const { getContextForTask: getContextForTask2, inferTaskCategory: inferTaskCategory2 } = await import("./context-retriever-CH3GEH2Z.js");
30310
+ const { getContextForTask: getContextForTask2, inferTaskCategory: inferTaskCategory2 } = await import("./context-retriever-NZOSGG6S.js");
30309
30311
  const category = inferTaskCategory2(taskCandidate);
30310
30312
  const executionId = options?.executionId;
30311
30313
  const execFields = execIdFields(executionId);
@@ -45732,7 +45734,7 @@ async function tryIssueTriage(task) {
45732
45734
  try {
45733
45735
  const issueMatch = task.match(/github\.com\/([^/]+\/[^/]+)\/issues\/(\d+)/);
45734
45736
  if (issueMatch === null) return null;
45735
- const { createIssueTriage } = await import("./issue-triage-DQAOBZEP.js");
45737
+ const { createIssueTriage } = await import("./issue-triage-XVDXOZRW.js");
45736
45738
  const triage = createIssueTriage();
45737
45739
  const owner = issueMatch[1] ?? "";
45738
45740
  const num2 = issueMatch[2] ?? "";
@@ -45760,7 +45762,7 @@ var VALID_TEMPLATES = /* @__PURE__ */ new Set([
45760
45762
  ]);
45761
45763
  async function classifyWithLLM(task) {
45762
45764
  try {
45763
- const { executeExpert: executeExpert2 } = await import("./expert-bridge-ZQSYVUC2.js");
45765
+ const { executeExpert: executeExpert2 } = await import("./expert-bridge-Q4SEPVTE.js");
45764
45766
  const prompt = [
45765
45767
  "Classify this task into exactly one pipeline template.",
45766
45768
  "Templates: dev (implementation/bug fix/refactor), research (investigate/evaluate/compare),",
@@ -46134,7 +46136,7 @@ function buildVotingInput(plan, config) {
46134
46136
  }
46135
46137
  async function executeSingleVote(plan, config, log) {
46136
46138
  try {
46137
- const { executeVoting } = await import("./consensus-vote-YW6LAIH7.js");
46139
+ const { executeVoting } = await import("./consensus-vote-N2Z7FX3D.js");
46138
46140
  const input = buildVotingInput(plan, config);
46139
46141
  const result = await executeVoting(input, log);
46140
46142
  return parseVotingResult(result);
@@ -46838,8 +46840,8 @@ var memoryInitPromise = null;
46838
46840
  async function initPipelineMemory() {
46839
46841
  if (cachedMemory !== null) return cachedMemory;
46840
46842
  try {
46841
- const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-M5MEGJJZ.js");
46842
- const { getLearningDir } = await import("./learning-persistence-7BEPQEGN.js");
46843
+ const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-ONUSRMYV.js");
46844
+ const { getLearningDir } = await import("./learning-persistence-ER7E5Q6T.js");
46843
46845
  const mem = createSessionMemory2(getLearningDir());
46844
46846
  mem.startSession(`pipeline-${String(getTimeProvider().now())}`);
46845
46847
  cachedMemory = {
@@ -46900,7 +46902,7 @@ function recordRoutingExperience(category, success, durationMs, tokensUsed = 0,
46900
46902
  callRecord(routingMemoryCache);
46901
46903
  return;
46902
46904
  }
46903
- routingMemoryInitPromise ??= import("./routing-memory-HQTEZF2S.js").then(({ createRoutingMemory }) => {
46905
+ routingMemoryInitPromise ??= import("./routing-memory-OKYSDPXT.js").then(({ createRoutingMemory }) => {
46904
46906
  routingMemoryCache ??= createRoutingMemory();
46905
46907
  return routingMemoryCache;
46906
46908
  }).catch((error) => {
@@ -47057,7 +47059,7 @@ function createVoteStage({ config, startStage }) {
47057
47059
  const strategy = config.votingStrategy ?? "higher_order";
47058
47060
  await postProgress(config, "Vote", `Running consensus with ${strategy} strategy...`);
47059
47061
  try {
47060
- const { executeVoting } = await import("./consensus-vote-YW6LAIH7.js");
47062
+ const { executeVoting } = await import("./consensus-vote-N2Z7FX3D.js");
47061
47063
  const votingResult = await executeVoting(
47062
47064
  {
47063
47065
  proposal: buildVoteProposal(plan, research),
@@ -47816,7 +47818,7 @@ ${text}` : "";
47816
47818
  }
47817
47819
  async function getWeatherContext() {
47818
47820
  try {
47819
- const { generateWeatherReport: generateWeatherReport2 } = await import("./weather-report-IGEXNIWL.js");
47821
+ const { generateWeatherReport: generateWeatherReport2 } = await import("./weather-report-C2VIAC2Q.js");
47820
47822
  const report = generateWeatherReport2({ includeAdaptive: true });
47821
47823
  const mappings = "recommendedMappings" in report ? report.recommendedMappings : [];
47822
47824
  if (!Array.isArray(mappings) || mappings.length === 0) return "";
@@ -47834,8 +47836,8 @@ ${lines}
47834
47836
  }
47835
47837
  async function getMemoryContext(task) {
47836
47838
  try {
47837
- const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-M5MEGJJZ.js");
47838
- const { getLearningDir } = await import("./learning-persistence-7BEPQEGN.js");
47839
+ const { createSessionMemory: createSessionMemory2 } = await import("./session-memory-ONUSRMYV.js");
47840
+ const { getLearningDir } = await import("./learning-persistence-ER7E5Q6T.js");
47839
47841
  const memory = createSessionMemory2(getLearningDir(), { maxLearningsInContext: 10 });
47840
47842
  const learnings = memory.searchLearnings(task.slice(0, 200));
47841
47843
  if (learnings.length === 0) return "";
@@ -48401,7 +48403,7 @@ async function searchCodebaseForTask(task) {
48401
48403
  }
48402
48404
  async function queryResearchRegistry(task) {
48403
48405
  try {
48404
- const { synthesizeResearch: synthesizeResearch2 } = await import("./research-helpers-synthesize-G3WV7AHW.js");
48406
+ const { synthesizeResearch: synthesizeResearch2 } = await import("./research-helpers-synthesize-DUOVXI5V.js");
48405
48407
  const topic = task.split(/[.!?\n]/).filter((s) => s.trim().length > 10)[0]?.trim();
48406
48408
  if (topic === void 0) return null;
48407
48409
  const result = await synthesizeResearch2(topic.slice(0, 50));
@@ -48472,7 +48474,7 @@ function createScanStageWrapper() {
48472
48474
  try {
48473
48475
  const slug = ctx.task.match(/([a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+)/)?.[1];
48474
48476
  if (slug !== void 0) {
48475
- const { generateSecurityPlan: generateSecurityPlan2 } = await import("./repo-security-plan-HYJ7HTOS.js");
48477
+ const { generateSecurityPlan: generateSecurityPlan2 } = await import("./repo-security-plan-UM6WX5PN.js");
48476
48478
  const plan = await generateSecurityPlan2({ repo: slug, maxScanners: 10 });
48477
48479
  const recs = plan.recommendations.slice(0, 5).map((r) => `${r.priority}: ${r.displayName} (${r.category})`).join("; ");
48478
48480
  return output(PIPELINE_STATE_KEYS.FINDINGS, recs, getTimeProvider().now() - start, true);
@@ -52216,7 +52218,7 @@ var GitHubTaskTracker = class {
52216
52218
  cachedProvider = null;
52217
52219
  async getProvider() {
52218
52220
  if (this.cachedProvider !== null) return this.cachedProvider;
52219
- const { createScmProvider } = await import("./factory-ZOM2QJPC.js");
52221
+ const { createScmProvider } = await import("./factory-JBK45P7G.js");
52220
52222
  const result = await createScmProvider({ repo: this.config.repo ?? "" });
52221
52223
  if (!result.ok) throw new Error(`SCM provider error: ${result.error.message}`);
52222
52224
  this.cachedProvider = result.value;
@@ -53183,7 +53185,7 @@ async function probeSource(source, includeModelIds) {
53183
53185
  }
53184
53186
  }
53185
53187
  async function defaultSources(includeOpenRouter) {
53186
- const { createAllAdapters: createAllAdapters2 } = await import("./factory-O4U4BJFT.js");
53188
+ const { createAllAdapters: createAllAdapters2 } = await import("./factory-ZV4MR3VM.js");
53187
53189
  const adapters = createAllAdapters2();
53188
53190
  return buildDefaultModelSources(adapters, { includeOpenRouter });
53189
53191
  }
@@ -56508,4 +56510,4 @@ export {
56508
56510
  startPipelineEventBridge,
56509
56511
  shutdownPipelineEventBridge
56510
56512
  };
56511
- //# sourceMappingURL=chunk-IKLDY3HI.js.map
56513
+ //# sourceMappingURL=chunk-SQ4M3JHW.js.map