0xray 2.1.3 → 2.2.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 (178) hide show
  1. package/.opencode/codex.codex +1 -1
  2. package/.opencode/commands/dependency-audit.md +3 -3
  3. package/.opencode/enforcer-config.json +2 -2
  4. package/README.md +3 -3
  5. package/dist/CHANGELOG.md +43 -0
  6. package/dist/README.md +3 -3
  7. package/dist/analytics/routing-refiner.js +1 -1
  8. package/dist/cli/commands/govern.d.ts +29 -0
  9. package/dist/cli/commands/govern.js +152 -0
  10. package/dist/cli/index.js +29 -216
  11. package/dist/core/boot-orchestrator.js +1 -1
  12. package/dist/core/features-config.js +1 -1
  13. package/dist/core/framework-logger.js +30 -1
  14. package/dist/delegation/index.d.ts +1 -2
  15. package/dist/delegation/index.js +1 -2
  16. package/dist/enforcement/enforcer-tools.js +1 -1
  17. package/dist/execution/proposal-applier.d.ts +1 -9
  18. package/dist/execution/proposal-applier.js +18 -173
  19. package/dist/governance/codex-policy.service.d.ts +7 -25
  20. package/dist/governance/codex-policy.service.js +8 -26
  21. package/dist/governance/governance-core.d.ts +22 -28
  22. package/dist/governance/governance-core.js +31 -101
  23. package/dist/governance/governance-service.d.ts +1 -0
  24. package/dist/governance/governance-service.js +67 -4
  25. package/dist/governance/governance-types.d.ts +5 -2
  26. package/dist/inference/index.d.ts +3 -4
  27. package/dist/inference/inference-accumulator.js +1 -1
  28. package/dist/inference/inference-cycle.d.ts +12 -18
  29. package/dist/inference/inference-cycle.js +120 -335
  30. package/dist/integrations/base/index.d.ts +0 -1
  31. package/dist/integrations/base/index.js +0 -2
  32. package/dist/integrations/grok/hooks/pre-tool-use.js +4 -18
  33. package/dist/integrations/hermes-agent/bridge.mjs +10 -1
  34. package/dist/mcps/config/server-config-registry.js +1 -1
  35. package/dist/mcps/governance.server.js +4 -5
  36. package/dist/mcps/knowledge-skills/api-design.server.js +10 -0
  37. package/dist/mcps/knowledge-skills/architecture-patterns.server.js +10 -0
  38. package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +10 -0
  39. package/dist/mcps/knowledge-skills/code-analyzer.server.js +10 -0
  40. package/dist/mcps/knowledge-skills/code-review.server.js +10 -0
  41. package/dist/mcps/knowledge-skills/content-creator.server.js +10 -0
  42. package/dist/mcps/knowledge-skills/database-design.server.js +10 -0
  43. package/dist/mcps/knowledge-skills/devops-deployment.server.js +10 -0
  44. package/dist/mcps/knowledge-skills/git-workflow.server.js +10 -0
  45. package/dist/mcps/knowledge-skills/growth-strategist.server.js +10 -0
  46. package/dist/mcps/knowledge-skills/log-monitor.server.js +10 -0
  47. package/dist/mcps/knowledge-skills/mobile-development.server.js +10 -0
  48. package/dist/mcps/knowledge-skills/multimodal-looker.server.js +10 -0
  49. package/dist/mcps/knowledge-skills/performance-optimization.server.js +10 -0
  50. package/dist/mcps/knowledge-skills/project-analysis.server.js +10 -0
  51. package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +10 -0
  52. package/dist/mcps/knowledge-skills/security-audit.server.js +10 -0
  53. package/dist/mcps/knowledge-skills/seo-consultant.server.js +10 -0
  54. package/dist/mcps/knowledge-skills/skill-invocation.server.d.ts +4 -0
  55. package/dist/mcps/knowledge-skills/skill-invocation.server.js +33 -14
  56. package/dist/mcps/knowledge-skills/strategist.server.js +10 -0
  57. package/dist/mcps/knowledge-skills/tech-writer.server.js +11 -1
  58. package/dist/mcps/knowledge-skills/testing-strategy.server.js +10 -0
  59. package/dist/mcps/knowledge-skills/ui-ux-design.server.js +10 -0
  60. package/dist/mcps/registry.json +1 -1
  61. package/dist/metrics/agent-metrics.d.ts +2 -1
  62. package/dist/nucleus/govern-http.d.ts +59 -0
  63. package/dist/nucleus/govern-http.js +172 -0
  64. package/dist/nucleus/index.d.ts +14 -0
  65. package/dist/nucleus/index.js +9 -0
  66. package/dist/nucleus/kernel.d.ts +51 -0
  67. package/dist/nucleus/kernel.js +62 -0
  68. package/dist/nucleus/plugin-registry.d.ts +104 -0
  69. package/dist/nucleus/plugin-registry.js +147 -0
  70. package/dist/orchestrator/orchestrator.d.ts +0 -1
  71. package/dist/orchestrator/orchestrator.js +0 -21
  72. package/dist/postprocessor/PostProcessor.d.ts +13 -1
  73. package/dist/postprocessor/PostProcessor.js +41 -1
  74. package/dist/postprocessor/autofix/AutoFixEngine.d.ts +0 -8
  75. package/dist/postprocessor/autofix/AutoFixEngine.js +0 -54
  76. package/dist/postprocessor/metamorphosis/MetamorphosisEngine.d.ts +25 -0
  77. package/dist/postprocessor/metamorphosis/MetamorphosisEngine.js +10 -0
  78. package/dist/postprocessor/metamorphosis/SelfProposalEngine.d.ts +68 -0
  79. package/dist/postprocessor/metamorphosis/SelfProposalEngine.js +371 -0
  80. package/dist/skills/orchestrator/SKILL.md +1 -1
  81. package/dist/skills/registry.json +1 -1
  82. package/dist/state/index.d.ts +0 -2
  83. package/package.json +4 -3
  84. package/scripts/node/universal-version-manager.js +3 -3
  85. package/src/mcps/config/__tests__/server-config-registry.test.ts +6 -15
  86. package/src/mcps/config/server-config-registry.ts +1 -1
  87. package/src/mcps/governance.server.ts +4 -6
  88. package/src/mcps/knowledge-skills/api-design.server.ts +9 -0
  89. package/src/mcps/knowledge-skills/architecture-patterns.server.ts +9 -0
  90. package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +9 -0
  91. package/src/mcps/knowledge-skills/code-analyzer.server.ts +9 -0
  92. package/src/mcps/knowledge-skills/code-review.server.ts +9 -0
  93. package/src/mcps/knowledge-skills/content-creator.server.ts +9 -0
  94. package/src/mcps/knowledge-skills/database-design.server.ts +9 -0
  95. package/src/mcps/knowledge-skills/devops-deployment.server.ts +9 -0
  96. package/src/mcps/knowledge-skills/git-workflow.server.ts +9 -0
  97. package/src/mcps/knowledge-skills/growth-strategist.server.ts +9 -0
  98. package/src/mcps/knowledge-skills/log-monitor.server.ts +9 -0
  99. package/src/mcps/knowledge-skills/mobile-development.server.ts +9 -0
  100. package/src/mcps/knowledge-skills/multimodal-looker.server.ts +9 -0
  101. package/src/mcps/knowledge-skills/performance-optimization.server.ts +9 -0
  102. package/src/mcps/knowledge-skills/project-analysis.server.ts +9 -0
  103. package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +9 -0
  104. package/src/mcps/knowledge-skills/security-audit.server.ts +9 -0
  105. package/src/mcps/knowledge-skills/seo-consultant.server.ts +9 -0
  106. package/src/mcps/knowledge-skills/session-management.server.ts +1 -0
  107. package/src/mcps/knowledge-skills/skill-invocation.server.ts +44 -29
  108. package/src/mcps/knowledge-skills/strategist.server.ts +9 -0
  109. package/src/mcps/knowledge-skills/tech-writer.server.ts +10 -1
  110. package/src/mcps/knowledge-skills/testing-strategy.server.ts +9 -0
  111. package/src/mcps/knowledge-skills/ui-ux-design.server.ts +9 -0
  112. package/src/mcps/registry.json +1 -1
  113. package/src/opencode/codex.codex +1 -1
  114. package/src/opencode/commands/dependency-audit.md +3 -3
  115. package/src/opencode/enforcer-config.json +2 -2
  116. package/src/skills/orchestrator/SKILL.md +1 -1
  117. package/src/skills/registry.json +1 -1
  118. package/xray/codex.json +1 -1
  119. package/xray/config.json +1 -1
  120. package/xray/features.json +1 -1
  121. package/xray/integrations.json +3 -3
  122. package/.opencode/agents/testing-best-practices.yml +0 -12
  123. package/dist/analytics/consent-manager.d.ts +0 -93
  124. package/dist/analytics/consent-manager.js +0 -258
  125. package/dist/analytics/simple-pattern-analyzer.d.ts +0 -80
  126. package/dist/analytics/simple-pattern-analyzer.js +0 -297
  127. package/dist/cli/commands/analytics-disable.d.ts +0 -9
  128. package/dist/cli/commands/analytics-disable.js +0 -72
  129. package/dist/cli/commands/analytics-enable-action.d.ts +0 -8
  130. package/dist/cli/commands/analytics-enable-action.js +0 -82
  131. package/dist/cli/commands/analytics-preview.d.ts +0 -9
  132. package/dist/cli/commands/analytics-preview.js +0 -106
  133. package/dist/cli/commands/analytics-status.d.ts +0 -9
  134. package/dist/cli/commands/analytics-status.js +0 -68
  135. package/dist/cli/server.d.ts +0 -1
  136. package/dist/cli/server.js +0 -147
  137. package/dist/core/errors.d.ts +0 -3
  138. package/dist/core/errors.js +0 -10
  139. package/dist/core/logging-config.d.ts +0 -11
  140. package/dist/core/logging-config.js +0 -43
  141. package/dist/core/trace-context.d.ts +0 -12
  142. package/dist/core/trace-context.js +0 -33
  143. package/dist/delegation/voting-coordinator.d.ts +0 -49
  144. package/dist/delegation/voting-coordinator.js +0 -375
  145. package/dist/enforcement/test-auto-healing.d.ts +0 -83
  146. package/dist/enforcement/test-auto-healing.js +0 -325
  147. package/dist/integrations/base/ExampleIntegration.d.ts +0 -47
  148. package/dist/integrations/base/ExampleIntegration.js +0 -181
  149. package/dist/mcps/knowledge-skills/testing-best-practices.server.d.ts +0 -34
  150. package/dist/mcps/knowledge-skills/testing-best-practices.server.js +0 -831
  151. package/dist/mcps/orchestrator.server.d.ts +0 -10
  152. package/dist/mcps/orchestrator.server.js +0 -19
  153. package/dist/orchestrator/self-direction-activation.d.ts +0 -109
  154. package/dist/orchestrator/self-direction-activation.js +0 -245
  155. package/dist/orchestrator/universal-librarian-consultation.d.ts +0 -98
  156. package/dist/orchestrator/universal-librarian-consultation.js +0 -216
  157. package/dist/orchestrator/universal-registry-bridge.d.ts +0 -85
  158. package/dist/orchestrator/universal-registry-bridge.js +0 -247
  159. package/dist/performance/performance-budget-enforcer.d.ts +0 -158
  160. package/dist/performance/performance-budget-enforcer.js +0 -434
  161. package/dist/performance/performance-regression-tester.d.ts +0 -108
  162. package/dist/performance/performance-regression-tester.js +0 -342
  163. package/dist/skills/testing-best-practices/SKILL.md +0 -37
  164. package/dist/state/context-providers.d.ts +0 -4
  165. package/dist/state/context-providers.js +0 -1
  166. package/dist/state/state-types.d.ts +0 -5
  167. package/dist/state/state-types.js +0 -1
  168. package/dist/utils/batch-operations.d.ts +0 -25
  169. package/dist/utils/batch-operations.js +0 -292
  170. package/dist/utils/test-template-generator.d.ts +0 -25
  171. package/dist/utils/test-template-generator.js +0 -178
  172. package/dist/utils/token-manager.d.ts +0 -48
  173. package/dist/utils/token-manager.js +0 -163
  174. package/src/mcps/knowledge-skills/testing-best-practices.server.test.ts +0 -136
  175. package/src/mcps/knowledge-skills/testing-best-practices.server.ts +0 -1183
  176. package/src/mcps/orchestrator.server.ts +0 -34
  177. package/src/opencode/agents/testing-best-practices.yml +0 -12
  178. package/src/skills/testing-best-practices/SKILL.md +0 -37
@@ -17,8 +17,9 @@
17
17
  */
18
18
  import { mcpClientManager } from '../mcps/mcp-client.js';
19
19
  import { callInProcessSkill } from '../mcps/in-process-skill-registry.js';
20
+ import { pluginRegistry } from '../nucleus/plugin-registry.js';
20
21
  import { getGovernanceIntegration, } from '../integrations/governance/index.js';
21
- import { mergeVotes } from './governance-core.js';
22
+ import { mergeVotes, calculateMetamorphosisScore } from './governance-core.js';
22
23
  import { frameworkLogger } from '../core/framework-logger.js';
23
24
  export class GovernanceService {
24
25
  constructor() {
@@ -59,7 +60,7 @@ export class GovernanceService {
59
60
  }
60
61
  }
61
62
  // Run governance with end-to-end timeout
62
- const result = await this.runGovernanceWithTimeout(proposals, context, requireExternal, timeoutMs);
63
+ const result = await this.runGovernanceWithTimeout(proposals, context, requireExternal, timeoutMs, options?.metamorphosisThreshold);
63
64
  // Check abstention threshold
64
65
  if (result.results.length > 0 && maxAbstentionThreshold < 1.0) {
65
66
  const totalVotes = result.results.reduce((sum, r) => sum + r.votes.length, 0);
@@ -91,7 +92,7 @@ export class GovernanceService {
91
92
  },
92
93
  };
93
94
  }
94
- async runGovernanceWithTimeout(proposals, context, requireExternal, timeoutMs) {
95
+ async runGovernanceWithTimeout(proposals, context, requireExternal, timeoutMs, metamorphosisThreshold) {
95
96
  const controller = new AbortController();
96
97
  const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
97
98
  try {
@@ -112,13 +113,33 @@ export class GovernanceService {
112
113
  ...(externalVotes[index] || []),
113
114
  ];
114
115
  const merged = mergeVotes(votes);
115
- return {
116
+ const isMetamorphosis = proposal.type === 'metamorphosis' || proposal.source === 'metamorphosis';
117
+ const result = {
116
118
  proposalId: proposal.id,
117
119
  finalDecision: merged.finalDecision,
118
120
  averageConfidence: merged.averageConfidence,
119
121
  votes,
120
122
  reasoningSummary: merged.reasoningSummary,
121
123
  };
124
+ // Metamorphosis resonance scoring: only for self-evolution proposals
125
+ if (isMetamorphosis) {
126
+ const threshold = metamorphosisThreshold ?? 0.7;
127
+ const metaInput = {
128
+ averageConfidence: merged.averageConfidence,
129
+ proposalType: proposal.type,
130
+ };
131
+ const externalConfidence = externalVotes[index]?.[0]?.confidence;
132
+ if (externalConfidence !== undefined) {
133
+ metaInput.historicalCoherence = externalConfidence;
134
+ }
135
+ result.metamorphosisScore = calculateMetamorphosisScore(metaInput);
136
+ // Reject metamorphosis proposals that don't meet the threshold
137
+ if (result.metamorphosisScore < threshold && result.finalDecision === 'approve') {
138
+ result.finalDecision = 'needs_revision';
139
+ result.reasoningSummary += ` | Metamorphosis score ${result.metamorphosisScore} below threshold ${threshold}`;
140
+ }
141
+ }
142
+ return result;
122
143
  });
123
144
  return { results };
124
145
  }
@@ -129,6 +150,45 @@ export class GovernanceService {
129
150
  async callSkillServer(serverName, proposals, context) {
130
151
  const votes = [];
131
152
  const useInProcess = process.env.VERCEL === '1';
153
+ // v3: Try pluginRegistry first for dynamically registered skills.
154
+ // Built-in skills (code-review, security-audit, researcher) fall through
155
+ // to MCP or in-process paths. Custom plugins registered via
156
+ // pluginRegistry.register() are resolved here.
157
+ if (pluginRegistry.has(serverName) && !this.isBuiltInSkill(serverName)) {
158
+ frameworkLogger.log('governance-service', 'plugin-skill-resolved', 'info', {
159
+ server: serverName,
160
+ mode: 'plugin-registry',
161
+ });
162
+ for (const proposal of proposals) {
163
+ try {
164
+ const result = await pluginRegistry.callSkill(serverName, {
165
+ proposalTitle: proposal.title,
166
+ proposalDescription: proposal.description,
167
+ evidence: proposal.evidence || [],
168
+ proposalType: proposal.type,
169
+ });
170
+ const text = result?.content?.[0]?.text || '';
171
+ const vote = this.parseVoteFromText(serverName, text);
172
+ votes.push(vote);
173
+ }
174
+ catch (error) {
175
+ frameworkLogger.log('governance-service', 'plugin-skill-error', 'error', {
176
+ server: serverName,
177
+ proposal: proposal.title,
178
+ error: error instanceof Error ? error.message : String(error),
179
+ mode: 'plugin-registry',
180
+ });
181
+ votes.push({
182
+ server: serverName,
183
+ decision: 'abstain',
184
+ confidence: 0.3,
185
+ reasoning: `Plugin skill ${serverName} failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
186
+ });
187
+ }
188
+ }
189
+ return votes;
190
+ }
191
+ // Built-in skills: use MCP (standard surface) or in-process (Vercel)
132
192
  for (const proposal of proposals) {
133
193
  try {
134
194
  let text = '';
@@ -263,6 +323,9 @@ export class GovernanceService {
263
323
  reasoning: reasoningMatch?.[1]?.trim() || 'No reasoning provided',
264
324
  };
265
325
  }
326
+ isBuiltInSkill(name) {
327
+ return name === 'code-review' || name === 'security-audit' || name === 'researcher';
328
+ }
266
329
  }
267
330
  // Singleton for convenience
268
331
  let governanceServiceInstance = null;
@@ -3,14 +3,14 @@
3
3
  * These types are used by the GovernanceService, Governance MCP,
4
4
  * and all integrations.
5
5
  */
6
- export type ProposalType = 'fix' | 'refactor' | 'guard' | 'automate' | 'codify' | 'strategic' | 'compliance';
6
+ export type ProposalType = 'fix' | 'refactor' | 'guard' | 'automate' | 'codify' | 'strategic' | 'compliance' | 'metamorphosis';
7
7
  export interface GovernanceProposal {
8
8
  id: string;
9
9
  type: ProposalType;
10
10
  title: string;
11
11
  description: string;
12
12
  evidence?: string[];
13
- source?: 'inference' | 'reflection' | 'manual' | 'ci' | 'phase-planning';
13
+ source?: 'inference' | 'reflection' | 'manual' | 'ci' | 'phase-planning' | 'metamorphosis';
14
14
  confidence?: number;
15
15
  metadata?: Record<string, unknown>;
16
16
  }
@@ -35,6 +35,8 @@ export interface GovernanceResult {
35
35
  recommendedActions?: string[];
36
36
  externalContext?: Record<string, unknown>;
37
37
  moralOverride?: 'rejected_critical' | 'downgraded_significant' | 'none';
38
+ /** Metamorphosis resonance score: does this change increase the system's ability to govern complex future states? 0-1. Only present when proposal.type === 'metamorphosis'. */
39
+ metamorphosisScore?: number;
38
40
  }
39
41
  export interface GovernanceContext {
40
42
  project?: string;
@@ -49,6 +51,7 @@ export interface GovernOptions {
49
51
  enableSolarAdjustment?: boolean;
50
52
  timeoutMs?: number;
51
53
  maxAbstentionThreshold?: number;
54
+ metamorphosisThreshold?: number;
52
55
  }
53
56
  export interface GovernanceRequest {
54
57
  proposals: GovernanceProposal[];
@@ -1,10 +1,9 @@
1
1
  export { analyzeStructuralPatterns } from "./semantic-patterns.js";
2
2
  export type { StructuralPattern } from "./semantic-patterns.js";
3
3
  export { captureSessionInference, saveSessionInference, } from "./session-capture.js";
4
- export type { SessionInference, ReasoningLink, SessionMetrics, } from "./session-capture.js";
4
+ export type { SessionInference, SessionMetrics, } from "./session-capture.js";
5
5
  export { shouldTriggerCycle, accumulateCorpus } from "./inference-accumulator.js";
6
- export type { InferenceCorpus, RecurringPattern, RecurringProblem } from "./inference-accumulator.js";
7
6
  export { InferenceCycle } from "./inference-cycle.js";
8
- export type { InferenceProposal, InferenceCycleResult, CyclePhase } from "./inference-cycle.js";
7
+ export type { InferenceProposal, InferenceCycleResult } from "./inference-cycle.js";
9
8
  export { DeployVerifier } from "./deploy-verifier.js";
10
- export type { DeployVerificationResult, DeployCheck } from "./deploy-verifier.js";
9
+ export type { DeployVerificationResult } from "./deploy-verifier.js";
@@ -108,7 +108,7 @@ function loadLastCycleDate(filePath) {
108
108
  return null;
109
109
  try {
110
110
  const data = JSON.parse(fs.readFileSync(filePath, "utf-8"));
111
- return data.completedAt || data.timestamp || null;
111
+ return data.completedAt || data.cycleState?.completedAt || data.timestamp || null;
112
112
  }
113
113
  catch {
114
114
  return null;
@@ -43,7 +43,6 @@ export declare class InferenceCycle {
43
43
  private static instances;
44
44
  private static reEntryLock;
45
45
  private static governedProposalIds;
46
- private static votingCoordinator;
47
46
  static getInstance(projectRoot?: string, options?: InferenceCycleOptions): InferenceCycle;
48
47
  static resetInstance(): void;
49
48
  private inferenceDir;
@@ -58,7 +57,6 @@ export declare class InferenceCycle {
58
57
  maybeRunCycle(): Promise<InferenceCycleResult>;
59
58
  private generateProposals;
60
59
  private adjustFromHistory;
61
- private getCoordinator;
62
60
  private applyProposals;
63
61
  private applyProposalWork;
64
62
  private applyCodeChange;
@@ -67,32 +65,28 @@ export declare class InferenceCycle {
67
65
  private extractTargetFiles;
68
66
  private researcherReview;
69
67
  private governProposals;
70
- private isGovernanceMcpPreferred;
71
- private parseGovernanceMcpResponse;
72
- /**
73
- * Oscillator 1: Internal VotingCoordinator-based governance
74
- */
75
- private governProposalsInternal;
76
68
  /**
77
- * Pure individual knowledge-skill MCP path for governance.
78
- * Used when XRAY_FORCE_MCP_GOVERNANCE=true.
79
- * Each proposal is evaluated directly by the relevant skill servers using analyze_proposal.
69
+ * Map InferenceProposal.source to GovernanceProposal.source.
70
+ * Inference-specific sources (recurring_problem, recurring_pattern, wrong_turn)
71
+ * all normalize to 'inference'. Future tuning/mod-specific sources can be added here.
80
72
  */
81
- private governProposalsWithIndividualSkills;
73
+ private static readonly SOURCE_MAP;
82
74
  /**
83
- * Merge internal and external governance votes.
84
- * A proposal passes both oscillators — must be approved by internal AND external.
75
+ * Convert InferenceProposal[] to GovernanceRequest and route through
76
+ * the nucleus kernel (handleGovernRequest). This is the v3 uniform path.
85
77
  */
86
- private mergeGovernanceVotes;
78
+ private governViaNucleus;
87
79
  /**
88
- * Govern proposals using external chrono-warp-drive Dynamo endpoint
80
+ * Convert a GovernanceResponse (nucleus kernel format) back to the
81
+ * InferenceCycleResult["votes"] format that the rest of the cycle expects.
89
82
  */
90
- private governProposalsExternal;
83
+ private convertNucleusResponse;
84
+ private isGovernanceMcpPreferred;
85
+ private parseGovernanceMcpResponse;
91
86
  private invokeAgentInternal;
92
87
  private invokeViaOpencode;
93
88
  private parseSubagentVotes;
94
89
  private getGovernanceStateManager;
95
- private saveGovernanceState;
96
90
  private extractTextFromNdjson;
97
91
  private resolveOpencodeRoot;
98
92
  private rejectNoQuorum;