0xray 3.1.1 → 3.3.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.
- package/.opencode/codex.codex +1 -1
- package/.opencode/commands/auto-format.md +3 -3
- package/.opencode/commands/auto-summary-capture.md +2 -2
- package/.opencode/commands/enforcer-daily-scan.md +3 -3
- package/.opencode/commands/framework-compliance-audit.md +4 -4
- package/.opencode/commands/interactive-validator.md +2 -2
- package/.opencode/commands/job-summary-logger.md +2 -2
- package/.opencode/commands/mode-switch.md +1 -1
- package/.opencode/commands/model-health-check.md +2 -2
- package/.opencode/commands/performance-analysis.md +2 -2
- package/.opencode/commands/pre-commit-introspection.md +3 -3
- package/.opencode/commands/security-scan.md +3 -3
- package/.opencode/commands/sisyphus-validation.md +3 -3
- package/.opencode/commands/summary-logger.md +2 -2
- package/AGENTS.md +3 -13
- package/README.md +3 -3
- package/dist/AGENTS.md +3 -13
- package/dist/CHANGELOG.md +55 -0
- package/dist/README.md +3 -3
- package/dist/analytics/consent-manager.js +0 -1
- package/dist/analytics/emerging-pattern-detector.js +0 -1
- package/dist/analytics/pattern-learning-engine.js +0 -1
- package/dist/analytics/pattern-performance-tracker.js +0 -1
- package/dist/analytics/predictive-analytics.js +0 -1
- package/dist/analytics/prompt-pattern-analyzer.js +0 -1
- package/dist/analytics/routing-performance-analyzer.js +0 -1
- package/dist/analytics/routing-refiner.js +0 -1
- package/dist/analytics/simple-pattern-analyzer.js +0 -1
- package/dist/cli/commands/archive-logs.js +0 -1
- package/dist/cli/commands/opencode-install.js +13 -0
- package/dist/cli/commands/plugin-commands.js +0 -1
- package/dist/cli/commands/status.js +11 -13
- package/dist/cli/index.js +2 -7
- package/dist/core/activity-logger.js +0 -1
- package/dist/core/adaptive-kernel.js +0 -1
- package/dist/core/boot-orchestrator.js +2 -12
- package/dist/core/bridge.mjs +0 -1
- package/dist/core/codex-formatter.js +0 -1
- package/dist/core/codex-injector.js +0 -1
- package/dist/core/config-loader.js +36 -28
- package/dist/core/context-loader.js +0 -1
- package/dist/core/context-validator.js +0 -1
- package/dist/core/features-config.js +40 -1
- package/dist/core/kernel-patterns.js +0 -1
- package/dist/core/model-router.js +23 -64
- package/dist/core/system-prompt-generator.js +0 -1
- package/dist/delegation/agent-delegator.js +0 -1
- package/dist/delegation/agent-expertise.js +0 -1
- package/dist/delegation/analytics/index.js +0 -1
- package/dist/delegation/analytics/learning-engine.js +0 -1
- package/dist/delegation/analytics/outcome-tracker.js +0 -1
- package/dist/delegation/analytics/routing-analytics.js +0 -1
- package/dist/delegation/ast-code-parser.js +0 -1
- package/dist/delegation/complexity-analyzer.js +0 -1
- package/dist/delegation/dependency-graph-builder.js +0 -1
- package/dist/delegation/index.js +0 -1
- package/dist/delegation/metrics-aggregator.js +0 -1
- package/dist/delegation/session-coordinator.js +0 -1
- package/dist/delegation/strategy-selector.js +0 -1
- package/dist/delegation/voting-coordinator.js +0 -1
- package/dist/delegation/voting-types.js +0 -1
- package/dist/delegation/weighted-voting-aggregator.js +0 -1
- package/dist/enforcement/core/index.js +0 -1
- package/dist/enforcement/core/rule-executor.js +0 -1
- package/dist/enforcement/core/rule-hierarchy.js +0 -1
- package/dist/enforcement/core/rule-registry.js +0 -1
- package/dist/enforcement/core/violation-fixer.js +0 -1
- package/dist/enforcement/index.js +0 -1
- package/dist/enforcement/loaders/agent-triage-loader.js +0 -1
- package/dist/enforcement/loaders/agents-md-validation-loader.js +0 -1
- package/dist/enforcement/loaders/base-loader.js +0 -1
- package/dist/enforcement/loaders/codex-loader.js +0 -1
- package/dist/enforcement/loaders/index.js +0 -1
- package/dist/enforcement/loaders/loader-orchestrator.js +0 -1
- package/dist/enforcement/loaders/processor-loader.js +0 -1
- package/dist/enforcement/types.js +0 -1
- package/dist/enforcement/validators/architecture-validators.js +0 -1
- package/dist/enforcement/validators/base-validator.js +0 -1
- package/dist/enforcement/validators/code-quality-validators.js +0 -1
- package/dist/enforcement/validators/index.js +0 -1
- package/dist/enforcement/validators/security-validators.js +0 -1
- package/dist/enforcement/validators/testing-validators.js +0 -1
- package/dist/enforcement/validators/validator-registry.js +0 -1
- package/dist/governance/codex-policy.service.js +0 -1
- package/dist/inference/inference-agent-invoker.js +67 -0
- package/dist/inference/inference-applier.js +178 -0
- package/dist/inference/inference-cycle.js +51 -827
- package/dist/inference/inference-proposal-generator.js +149 -0
- package/dist/infrastructure/iac-validator.js +465 -0
- package/dist/infrastructure/schemas/cloud-schemas.js +488 -0
- package/dist/integrations/base/ExampleIntegration.js +0 -1
- package/dist/integrations/base/Integration.js +0 -1
- package/dist/integrations/base/index.js +0 -1
- package/dist/integrations/base/registry.js +0 -1
- package/dist/integrations/base/types.js +0 -1
- package/dist/integrations/enforcement-gate.js +3 -3
- package/dist/integrations/governance/governance-client.js +0 -1
- package/dist/integrations/governance/index.js +11 -19
- package/dist/integrations/governance/types.js +0 -1
- package/dist/integrations/hermes-agent/__init__.py +4 -0
- package/dist/integrations/hermes-agent/bridge.mjs +37 -0
- package/dist/integrations/openclaw/api-server.js +0 -1
- package/dist/integrations/openclaw/client.js +0 -1
- package/dist/integrations/openclaw/config.js +0 -1
- package/dist/integrations/openclaw/hooks/xray-hooks.js +0 -1
- package/dist/integrations/openclaw/index.js +0 -1
- package/dist/integrations/openclaw/types.js +0 -1
- package/dist/integrations/plugins/index.js +0 -1
- package/dist/integrations/plugins/plugin-integration.js +0 -1
- package/dist/integrations/plugins/plugin-registry.js +0 -1
- package/dist/mcps/agent-resolver.js +0 -1
- package/dist/mcps/architect-tools.server.js +119 -185
- package/dist/mcps/auto-format.server.js +56 -74
- package/dist/mcps/boot-orchestrator.server.js +67 -85
- package/dist/mcps/config/config-loader.js +6 -0
- package/dist/mcps/config/plugin-server-registry.js +0 -1
- package/dist/mcps/enforcer-tools.server.js +207 -273
- package/dist/mcps/estimation.server.js +63 -107
- package/dist/mcps/framework-compliance-audit.server.js +52 -81
- package/dist/mcps/framework-help.server.js +71 -89
- package/dist/mcps/governance.server.js +97 -149
- package/dist/mcps/knowledge-skills/api-design.server.js +33 -65
- package/dist/mcps/knowledge-skills/architecture-patterns.server.js +33 -65
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +123 -163
- package/dist/mcps/knowledge-skills/code-analyzer.server.js +210 -237
- package/dist/mcps/knowledge-skills/code-review.server.js +108 -142
- package/dist/mcps/knowledge-skills/content-creator.server.js +203 -225
- package/dist/mcps/knowledge-skills/database-design.server.js +116 -150
- package/dist/mcps/knowledge-skills/devops-deployment.server.js +123 -157
- package/dist/mcps/knowledge-skills/git-workflow.server.js +34 -67
- package/dist/mcps/knowledge-skills/growth-strategist.server.js +301 -323
- package/dist/mcps/knowledge-skills/log-monitor.server.js +139 -159
- package/dist/mcps/knowledge-skills/mobile-development.server.js +170 -200
- package/dist/mcps/knowledge-skills/multimodal-looker.server.js +122 -158
- package/dist/mcps/knowledge-skills/performance-optimization.server.js +88 -138
- package/dist/mcps/knowledge-skills/project-analysis.server.js +131 -218
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +115 -150
- package/dist/mcps/knowledge-skills/security-audit.server.js +16 -143
- package/dist/mcps/knowledge-skills/seo-consultant.server.js +20 -213
- package/dist/mcps/knowledge-skills/session-management.server.js +13 -90
- package/dist/mcps/knowledge-skills/skill-invocation.server.js +43 -421
- package/dist/mcps/knowledge-skills/strategist.server.js +10 -55
- package/dist/mcps/knowledge-skills/tech-writer.server.js +16 -191
- package/dist/mcps/knowledge-skills/testing-best-practices.server.js +18 -191
- package/dist/mcps/knowledge-skills/testing-strategy.server.js +18 -156
- package/dist/mcps/knowledge-skills/ui-ux-design.server.js +22 -296
- package/dist/mcps/lint.server.js +50 -91
- package/dist/mcps/model-health-check.server.js +32 -60
- package/dist/mcps/orchestrator/aside-context.js +207 -0
- package/dist/mcps/orchestrator/config/agent-capabilities.js +30 -11
- package/dist/mcps/orchestrator/config/memory-routing-bridge.js +70 -0
- package/dist/mcps/orchestrator/execution/execution-planner.js +25 -7
- package/dist/mcps/orchestrator/handlers/complexity-handler.js +5 -1
- package/dist/mcps/orchestrator/handlers/status-handler.js +8 -1
- package/dist/mcps/orchestrator/handlers/task-handler.js +59 -1
- package/dist/mcps/orchestrator/index.js +5 -0
- package/dist/mcps/orchestrator/server.js +63 -8
- package/dist/mcps/performance-analysis.server.js +56 -87
- package/dist/mcps/processor-pipeline.server.js +68 -99
- package/dist/mcps/researcher.server.js +80 -153
- package/dist/mcps/security-scan.server.js +56 -70
- package/dist/mcps/shared/knowledge-skill-base.js +11 -4
- package/dist/mcps/state-manager.server.js +124 -152
- package/dist/memory-routing/index.js +4 -0
- package/dist/memory-routing/null-provider.js +51 -0
- package/dist/memory-routing/provider-loader.js +91 -0
- package/dist/memory-routing/provider-registry.js +40 -0
- package/dist/memory-routing/types.js +7 -0
- package/dist/memory-routing/validate-config.js +32 -0
- package/dist/monitoring/nudge-watchdog.js +0 -1
- package/dist/nucleus/default-plugins.js +13 -19
- package/dist/nucleus/index.js +0 -1
- package/dist/nucleus/thin-dispatch.js +29 -1
- package/dist/orchestrator/agent-spawn-governor.js +0 -1
- package/dist/orchestrator/intelligent-commit-batcher.js +2 -10
- package/dist/orchestrator/multi-agent-orchestration-coordinator.js +0 -1
- package/dist/orchestrator/orchestrator.js +8 -18
- package/dist/orchestrator/self-direction-activation.js +0 -1
- package/dist/orchestrator/universal-registry-bridge.js +0 -1
- package/dist/performance/performance-budget-enforcer.js +0 -1
- package/dist/performance/performance-regression-tester.js +0 -1
- package/dist/plugin/plugin-codex-context.js +87 -0
- package/dist/plugin/plugin-helpers.js +155 -0
- package/dist/plugin/plugin-logger.js +46 -0
- package/dist/plugin/plugin-modules.js +144 -0
- package/dist/plugin/plugin-quality-gate.js +88 -0
- package/dist/plugin/plugin-types.js +1 -0
- package/dist/plugin/xray-codex-injection.js +338 -0
- package/dist/postprocessor/PostProcessor.js +3 -9
- package/dist/postprocessor/analysis/CodeChangeAnalyzer.js +50 -0
- package/dist/postprocessor/config/ProcessorConfigLoader.js +16 -0
- package/dist/postprocessor/integration.js +194 -0
- package/dist/postprocessor/metamorphosis/SelfProposalEngine.js +472 -0
- package/dist/postprocessor/metamorphosis/index.js +1 -0
- package/dist/postprocessor/redeploy/RetryHandler.js +118 -0
- package/dist/postprocessor/services/RegressionAnalysisService.js +0 -1
- package/dist/postprocessor/triggers/APITrigger.js +0 -1
- package/dist/postprocessor/triggers/WebhookTrigger.js +0 -1
- package/dist/processors/implementations/agents-md-validation-processor.js +0 -1
- package/dist/processors/implementations/async-pattern-processor.js +0 -1
- package/dist/processors/implementations/console-log-guard-processor.js +0 -1
- package/dist/processors/implementations/coverage-analysis-processor.js +0 -1
- package/dist/processors/implementations/inference-improvement-processor.js +2 -9
- package/dist/processors/implementations/log-protection-processor.js +0 -1
- package/dist/processors/implementations/nudge-processor.js +0 -1
- package/dist/processors/implementations/performance-budget-processor.js +0 -1
- package/dist/processors/implementations/postprocessor-chain-validator.js +0 -1
- package/dist/processors/implementations/publish-preflight-processor.js +4 -12
- package/dist/processors/implementations/session-summary-processor.js +8 -16
- package/dist/processors/implementations/spawn-governance-processor.js +0 -1
- package/dist/processors/implementations/storytelling-trigger-processor.js +3 -28
- package/dist/processors/implementations/test-auto-creation-processor.js +0 -1
- package/dist/processors/implementations/typescript-compilation-processor.js +0 -1
- package/dist/processors/implementations/version-compliance-processor.js +0 -1
- package/dist/processors/processor-interfaces.js +0 -1
- package/dist/processors/processor-types.js +0 -1
- package/dist/scripts/integration.js +0 -1
- package/dist/security/comprehensive-security-audit.js +0 -1
- package/dist/security/security-agent-coordinator.js +0 -1
- package/dist/security/security-auditor.js +0 -1
- package/dist/security/security-hardener.js +0 -1
- package/dist/security/security-hardening-system.js +0 -1
- package/dist/security/security-headers.js +0 -1
- package/dist/security/security-orchestration-layer.js +0 -1
- package/dist/services/inference-tuner.js +0 -1
- package/dist/session/session-cleanup-manager.js +0 -1
- package/dist/session/session-monitor.js +0 -1
- package/dist/session/session-state-manager.js +0 -1
- package/dist/skills/xray-orchestrator/index.js +0 -1
- package/dist/utils/codex-parser.js +0 -1
- package/dist/utils/language-detector.js +0 -1
- package/dist/utils/shutdown-handler.js +0 -1
- package/dist/validation/agent-config-validator.js +280 -0
- package/dist/validation/orchestration-flow-validator.js +606 -0
- package/package.json +1 -1
- package/scripts/node/release.mjs +2 -2
- package/scripts/node/setup.cjs +28 -0
- package/scripts/node/universal-version-manager.js +1 -1
- package/src/mcps/agent-resolver.ts +0 -1
- package/src/mcps/architect-tools.server.ts +129 -211
- package/src/mcps/auto-format.server.ts +74 -103
- package/src/mcps/boot-orchestrator.server.ts +71 -96
- package/src/mcps/config/__tests__/config-loader.test.ts +6 -6
- package/src/mcps/config/config-loader.ts +7 -0
- package/src/mcps/config/plugin-server-registry.ts +0 -1
- package/src/mcps/enforcer-tools.server.ts +217 -294
- package/src/mcps/estimation.server.ts +62 -122
- package/src/mcps/framework-compliance-audit.server.ts +53 -95
- package/src/mcps/framework-help.server.ts +74 -96
- package/src/mcps/governance.server.ts +97 -162
- package/src/mcps/knowledge-skills/api-design.server.ts +33 -72
- package/src/mcps/knowledge-skills/architecture-patterns.server.ts +33 -72
- package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +148 -193
- package/src/mcps/knowledge-skills/code-analyzer.server.ts +222 -254
- package/src/mcps/knowledge-skills/code-review.server.ts +115 -157
- package/src/mcps/knowledge-skills/content-creator.server.ts +219 -246
- package/src/mcps/knowledge-skills/database-design.server.ts +119 -160
- package/src/mcps/knowledge-skills/devops-deployment.server.ts +126 -167
- package/src/mcps/knowledge-skills/git-workflow.server.ts +32 -77
- package/src/mcps/knowledge-skills/growth-strategist.server.ts +322 -360
- package/src/mcps/knowledge-skills/log-monitor.server.ts +68 -95
- package/src/mcps/knowledge-skills/mobile-development.server.ts +16 -56
- package/src/mcps/knowledge-skills/multimodal-looker.server.ts +13 -59
- package/src/mcps/knowledge-skills/performance-optimization.server.ts +13 -74
- package/src/mcps/knowledge-skills/project-analysis.server.ts +13 -120
- package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +13 -60
- package/src/mcps/knowledge-skills/security-audit.server.ts +19 -157
- package/src/mcps/knowledge-skills/seo-consultant.server.ts +23 -227
- package/src/mcps/knowledge-skills/session-management.server.ts +17 -106
- package/src/mcps/knowledge-skills/skill-invocation.server.ts +45 -446
- package/src/mcps/knowledge-skills/strategist.server.ts +13 -63
- package/src/mcps/knowledge-skills/tech-writer.server.ts +19 -204
- package/src/mcps/knowledge-skills/testing-best-practices.server.ts +21 -204
- package/src/mcps/knowledge-skills/testing-strategy.server.ts +21 -165
- package/src/mcps/knowledge-skills/ui-ux-design.server.ts +25 -342
- package/src/mcps/lint.server.ts +52 -105
- package/src/mcps/model-health-check.server.ts +34 -70
- package/src/mcps/orchestrator/aside-context.ts +245 -0
- package/src/mcps/orchestrator/config/agent-capabilities.ts +49 -14
- package/src/mcps/orchestrator/config/memory-routing-bridge.ts +80 -0
- package/src/mcps/orchestrator/execution/execution-planner.ts +36 -9
- package/src/mcps/orchestrator/handlers/complexity-handler.ts +9 -3
- package/src/mcps/orchestrator/handlers/status-handler.ts +11 -1
- package/src/mcps/orchestrator/handlers/task-handler.ts +78 -2
- package/src/mcps/orchestrator/index.ts +29 -0
- package/src/mcps/orchestrator/server.ts +79 -24
- package/src/mcps/orchestrator/types.ts +50 -0
- package/src/mcps/performance-analysis.server.ts +59 -102
- package/src/mcps/processor-pipeline.server.ts +70 -108
- package/src/mcps/researcher.server.ts +87 -175
- package/src/mcps/security-scan.server.ts +57 -76
- package/src/mcps/shared/knowledge-skill-base.ts +12 -4
- package/src/mcps/state-manager.server.ts +129 -169
- package/src/opencode/codex.codex +1 -1
- package/src/opencode/commands/auto-format.md +3 -3
- package/src/opencode/commands/auto-summary-capture.md +2 -2
- package/src/opencode/commands/enforcer-daily-scan.md +3 -3
- package/src/opencode/commands/framework-compliance-audit.md +4 -4
- package/src/opencode/commands/interactive-validator.md +2 -2
- package/src/opencode/commands/job-summary-logger.md +2 -2
- package/src/opencode/commands/mode-switch.md +1 -1
- package/src/opencode/commands/model-health-check.md +2 -2
- package/src/opencode/commands/performance-analysis.md +2 -2
- package/src/opencode/commands/pre-commit-introspection.md +3 -3
- package/src/opencode/commands/security-scan.md +3 -3
- package/src/opencode/commands/sisyphus-validation.md +3 -3
- package/src/opencode/commands/summary-logger.md +2 -2
- package/src/skills/xray-orchestrator/index.ts +0 -1
- package/dist/nucleus/orchestrator.js +0 -479
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
import { frameworkLogger } from "../core/framework-logger.js";
|
|
10
10
|
import { getLevelFromScore, getAgentForTier, levelToTier, } from "../delegation/complexity-core.js";
|
|
11
11
|
import { ComplexityAnalyzer } from "../delegation/complexity-analyzer.js";
|
|
12
|
+
import { getMemoryRoutingProviderSync, initializeMemoryRouting, } from "../memory-routing/index.js";
|
|
13
|
+
initializeMemoryRouting();
|
|
12
14
|
export const NUCLEUS_THIN_DISPATCH_VERSION = "0.1.0";
|
|
13
15
|
/**
|
|
14
16
|
* Score the complexity of an operation given its description and context.
|
|
@@ -52,6 +54,32 @@ export function routeToAgent(scoreOrLevel, level) {
|
|
|
52
54
|
*/
|
|
53
55
|
export function scoreAndRoute(operation, context, thresholds) {
|
|
54
56
|
const score = scoreComplexity(operation, context, thresholds);
|
|
55
|
-
|
|
57
|
+
let agent = routeToAgent(score);
|
|
58
|
+
const provider = getMemoryRoutingProviderSync();
|
|
59
|
+
let memoryRouting;
|
|
60
|
+
if (provider.id !== "null") {
|
|
61
|
+
const resolved = provider.resolveThinDispatch(agent, operation, score.score);
|
|
62
|
+
agent = resolved.agent;
|
|
63
|
+
memoryRouting = {
|
|
64
|
+
providerId: resolved.context.providerId,
|
|
65
|
+
adjustedScore: resolved.adjustedScore,
|
|
66
|
+
signals: resolved.context.matchedSignals,
|
|
67
|
+
};
|
|
68
|
+
const adjustedLevel = getLevelFromScore(resolved.adjustedScore, thresholds);
|
|
69
|
+
frameworkLogger.log("nucleus-thin-dispatch", "memory-routing", "info", {
|
|
70
|
+
providerId: resolved.context.providerId,
|
|
71
|
+
baseAgent: routeToAgent(score),
|
|
72
|
+
resolvedAgent: agent,
|
|
73
|
+
baseScore: score.score,
|
|
74
|
+
adjustedScore: resolved.adjustedScore,
|
|
75
|
+
level: adjustedLevel,
|
|
76
|
+
signals: resolved.context.matchedSignals,
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
score: { ...score, score: resolved.adjustedScore, level: adjustedLevel },
|
|
80
|
+
agent,
|
|
81
|
+
memoryRouting,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
56
84
|
return { score, agent };
|
|
57
85
|
}
|
|
@@ -4,9 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Configuration is read from .xray/features.json -> commit_cycle
|
|
6
6
|
*/
|
|
7
|
-
import * as fs from "fs";
|
|
8
|
-
import * as path from "path";
|
|
9
7
|
import { frameworkLogger } from "../core/framework-logger.js";
|
|
8
|
+
import { featuresConfigLoader } from "../core/features-config.js";
|
|
10
9
|
import { runCommandSafe } from "../utils/command-runner.js";
|
|
11
10
|
export class IntelligentCommitBatcher {
|
|
12
11
|
pendingChanges = [];
|
|
@@ -35,14 +34,7 @@ export class IntelligentCommitBatcher {
|
|
|
35
34
|
}
|
|
36
35
|
loadFeaturesConfig() {
|
|
37
36
|
try {
|
|
38
|
-
|
|
39
|
-
path.join(process.cwd(), ".xray", "features.json"),
|
|
40
|
-
];
|
|
41
|
-
for (const configPath of configPaths) {
|
|
42
|
-
if (fs.existsSync(configPath)) {
|
|
43
|
-
return JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
44
|
-
}
|
|
45
|
-
}
|
|
37
|
+
return featuresConfigLoader.loadConfig();
|
|
46
38
|
}
|
|
47
39
|
catch (e) {
|
|
48
40
|
frameworkLogger.log("intelligent-commit-batcher", "config-load-failed", "warning", { error: e instanceof Error ? e.message : String(e) });
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* Central coordinator for multi-agent orchestration that integrates all orchestration components
|
|
5
5
|
* for comprehensive E2E workflow management and coordination.
|
|
6
6
|
*
|
|
7
|
-
* @version 1.1.0
|
|
8
7
|
* @since 2026-01-23
|
|
9
8
|
*/
|
|
10
9
|
import { KernelOrchestrator } from "../core/orchestrator.js";
|
|
@@ -4,17 +4,16 @@
|
|
|
4
4
|
* Coordinates multi-step tasks and delegates to specialized subagents.
|
|
5
5
|
* Implements Sisyphus integration for relentless execution.
|
|
6
6
|
*
|
|
7
|
-
* @version 1.0.0
|
|
8
7
|
* @since 2026-01-07
|
|
9
8
|
*/
|
|
10
9
|
import { enhancedMultiAgentOrchestrator } from "./enhanced-multi-agent-orchestrator.js";
|
|
10
|
+
import { featuresConfigLoader } from "../core/features-config.js";
|
|
11
11
|
import { frameworkLogger } from "../core/framework-logger.js";
|
|
12
12
|
import { routingOutcomeTracker } from "../delegation/analytics/outcome-tracker.js";
|
|
13
13
|
import { patternPerformanceTracker } from "../analytics/pattern-performance-tracker.js";
|
|
14
14
|
import { VotingCoordinator } from "../delegation/voting-coordinator.js";
|
|
15
15
|
import { getAgentExpertiseLevel } from "../delegation/agent-expertise.js";
|
|
16
16
|
import { XrayStateManager } from "../state/state-manager.js";
|
|
17
|
-
import fs from "fs";
|
|
18
17
|
export class XrayOrchestrator {
|
|
19
18
|
config;
|
|
20
19
|
activeTasks = new Map();
|
|
@@ -35,22 +34,13 @@ export class XrayOrchestrator {
|
|
|
35
34
|
*/
|
|
36
35
|
loadOrchestratorConfig() {
|
|
37
36
|
try {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const features = JSON.parse(content);
|
|
46
|
-
if (features.multi_agent_orchestration) {
|
|
47
|
-
const ma = features.multi_agent_orchestration;
|
|
48
|
-
return {
|
|
49
|
-
maxConcurrentTasks: ma.max_concurrent_agents,
|
|
50
|
-
conflictResolutionStrategy: this.mapConflictResolution(ma.conflict_resolution),
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
}
|
|
37
|
+
const features = featuresConfigLoader.loadConfig();
|
|
38
|
+
if (features.multi_agent_orchestration) {
|
|
39
|
+
const ma = features.multi_agent_orchestration;
|
|
40
|
+
return {
|
|
41
|
+
maxConcurrentTasks: ma.max_concurrent_agents,
|
|
42
|
+
conflictResolutionStrategy: this.mapConflictResolution(ma.conflict_resolution),
|
|
43
|
+
};
|
|
54
44
|
}
|
|
55
45
|
}
|
|
56
46
|
catch (e) {
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { resolveCodexPath } from "./plugin-modules.js";
|
|
4
|
+
import { PluginLogger } from "./plugin-logger.js";
|
|
5
|
+
let cachedCodexContexts = null;
|
|
6
|
+
async function getCodexFileLocations(directory) {
|
|
7
|
+
const root = directory || process.cwd();
|
|
8
|
+
const resolved = await resolveCodexPath(root);
|
|
9
|
+
resolved.push(path.join(root, ".opencode", "codex.codex"), path.join(root, ".xray", "agents_template.md"), path.join(root, "AGENTS.md"));
|
|
10
|
+
return resolved;
|
|
11
|
+
}
|
|
12
|
+
function readFileContent(filePath) {
|
|
13
|
+
try {
|
|
14
|
+
return fs.readFileSync(filePath, "utf-8");
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
const logger = new PluginLogger(process.cwd());
|
|
18
|
+
logger.error(`Failed to read file ${filePath}`, error);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function extractCodexMetadata(content) {
|
|
23
|
+
if (content.trim().startsWith("{")) {
|
|
24
|
+
try {
|
|
25
|
+
const parsed = JSON.parse(content);
|
|
26
|
+
const version = parsed.version || "1.6.0";
|
|
27
|
+
const terms = parsed.terms || {};
|
|
28
|
+
const termCount = Object.keys(terms).length;
|
|
29
|
+
return { version, termCount };
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Not valid JSON, try markdown format
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const versionMatch = content.match(/\*\*Version\*\*:\s*(\d+\.\d+\.\d+)/);
|
|
36
|
+
const version = versionMatch?.[1] ?? "1.6.0";
|
|
37
|
+
const termMatches = content.match(/####\s*\d+\.\s/g);
|
|
38
|
+
const termCount = termMatches ? termMatches.length : 0;
|
|
39
|
+
return { version, termCount };
|
|
40
|
+
}
|
|
41
|
+
export function createCodexContextEntry(filePath, content) {
|
|
42
|
+
const metadata = extractCodexMetadata(content);
|
|
43
|
+
return {
|
|
44
|
+
id: `xray-codex-${path.basename(filePath)}`,
|
|
45
|
+
source: filePath,
|
|
46
|
+
content,
|
|
47
|
+
priority: "critical",
|
|
48
|
+
metadata: {
|
|
49
|
+
version: metadata.version,
|
|
50
|
+
termCount: metadata.termCount,
|
|
51
|
+
loadedAt: new Date().toISOString(),
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export async function loadCodexContext(directory) {
|
|
56
|
+
if (cachedCodexContexts) {
|
|
57
|
+
return cachedCodexContexts;
|
|
58
|
+
}
|
|
59
|
+
const codexContexts = [];
|
|
60
|
+
const locations = await getCodexFileLocations(directory);
|
|
61
|
+
for (const fileLocation of locations) {
|
|
62
|
+
const fullPath = path.isAbsolute(fileLocation) ? fileLocation : path.join(directory, fileLocation);
|
|
63
|
+
const content = readFileContent(fullPath);
|
|
64
|
+
if (content && content.trim().length > 0) {
|
|
65
|
+
const entry = createCodexContextEntry(fullPath, content);
|
|
66
|
+
if (entry.metadata.termCount > 0) {
|
|
67
|
+
codexContexts.push(entry);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
cachedCodexContexts = codexContexts;
|
|
72
|
+
if (codexContexts.length === 0) {
|
|
73
|
+
const { getOrCreateLogger } = await import("./plugin-logger.js");
|
|
74
|
+
void getOrCreateLogger(directory).then((l) => l.error(`No valid codex files found. Checked: ${locations.join(", ")}`));
|
|
75
|
+
}
|
|
76
|
+
return codexContexts;
|
|
77
|
+
}
|
|
78
|
+
export function formatCodexContext(contexts) {
|
|
79
|
+
if (contexts.length === 0) {
|
|
80
|
+
return "";
|
|
81
|
+
}
|
|
82
|
+
const parts = [];
|
|
83
|
+
for (const context of contexts) {
|
|
84
|
+
parts.push(`# 0xRay Codex Context v${context.metadata.version}`, `Source: ${context.source}`, `Terms Loaded: ${context.metadata.termCount}`, `Loaded At: ${context.metadata.loadedAt}`, "", context.content, "", "---", "");
|
|
85
|
+
}
|
|
86
|
+
return parts.join("\n");
|
|
87
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { spawn } from "child_process";
|
|
4
|
+
export function spawnPromise(command, args, cwd) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const child = spawn(command, args, {
|
|
7
|
+
cwd,
|
|
8
|
+
stdio: ["ignore", "inherit", "pipe"],
|
|
9
|
+
});
|
|
10
|
+
let stderr = "";
|
|
11
|
+
if (child.stderr) {
|
|
12
|
+
child.stderr.on("data", (data) => {
|
|
13
|
+
stderr += data.toString();
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
child.on("close", (code) => {
|
|
17
|
+
if (code === 0) {
|
|
18
|
+
resolve({ stdout: "", stderr });
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
reject(new Error(`Process exited with code ${code}: ${stderr}`));
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
child.on("error", (error) => {
|
|
25
|
+
reject(error);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export function getFrameworkVersion() {
|
|
30
|
+
try {
|
|
31
|
+
const packageJsonPath = path.join(process.cwd(), "package.json");
|
|
32
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
33
|
+
return packageJson.version || "1.4.6";
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return "1.4.6";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function getFrameworkIdentity() {
|
|
40
|
+
const version = getFrameworkVersion();
|
|
41
|
+
return `0xRay Framework v${version} - AI Orchestration
|
|
42
|
+
|
|
43
|
+
🔧 Core: architect, code-reviewer, refactorer, testing-lead, strategist
|
|
44
|
+
📚 Codex: 5 Essential Terms (99.6% Error Prevention Target)
|
|
45
|
+
🎯 Goal: Progressive, production-ready development workflow
|
|
46
|
+
|
|
47
|
+
📖 Documentation: config dir (codex, config, agents docs) — resolved via config-paths
|
|
48
|
+
`;
|
|
49
|
+
}
|
|
50
|
+
export const TOOL_AGENT_MAP = {
|
|
51
|
+
write: { agent: "code-reviewer", skill: "write" },
|
|
52
|
+
edit: { agent: "code-reviewer", skill: "edit" },
|
|
53
|
+
multiedit: { agent: "code-reviewer", skill: "multiedit" },
|
|
54
|
+
bash: { agent: "testing-lead", skill: "execution" },
|
|
55
|
+
search: { agent: "researcher", skill: "search" },
|
|
56
|
+
read: { agent: "researcher", skill: "read" },
|
|
57
|
+
glob: { agent: "researcher", skill: "glob" },
|
|
58
|
+
grep: { agent: "researcher", skill: "search" },
|
|
59
|
+
ls: { agent: "researcher", skill: "list" },
|
|
60
|
+
};
|
|
61
|
+
export function classifyTaskType(tool, args) {
|
|
62
|
+
const cmd = String(args?.command ?? "").toLowerCase().trim();
|
|
63
|
+
if (tool === "bash" && cmd) {
|
|
64
|
+
if (/(npm|yarn|pnpm)\s+test|jest|vitest|mocha|pytest/.test(cmd))
|
|
65
|
+
return "testing";
|
|
66
|
+
if (/(npm|yarn|pnpm)\s+run|npx|cargo|go run|make\s/.test(cmd))
|
|
67
|
+
return "build";
|
|
68
|
+
if (/audit|security|snyk|owasp|bandit/.test(cmd))
|
|
69
|
+
return "security";
|
|
70
|
+
if (/eslint|prettier|black|ruff|lint|format/.test(cmd))
|
|
71
|
+
return "lint";
|
|
72
|
+
if (/git\s/.test(cmd))
|
|
73
|
+
return "git";
|
|
74
|
+
if (/(npm|yarn|pnpm)\s+install|pip install|cargo add/.test(cmd))
|
|
75
|
+
return "install";
|
|
76
|
+
if (/grep|rg |find |ls |cat |head |tail /.test(cmd))
|
|
77
|
+
return "search";
|
|
78
|
+
}
|
|
79
|
+
if (tool === "write")
|
|
80
|
+
return "write";
|
|
81
|
+
if (tool === "edit" || tool === "multiedit")
|
|
82
|
+
return "edit";
|
|
83
|
+
if (tool === "read")
|
|
84
|
+
return "read";
|
|
85
|
+
if (tool === "search" || tool === "grep" || tool === "glob")
|
|
86
|
+
return "search";
|
|
87
|
+
return "unknown";
|
|
88
|
+
}
|
|
89
|
+
export function isWriteEditOperation(tool) {
|
|
90
|
+
return tool === "write" || tool === "edit" || tool === "multiedit";
|
|
91
|
+
}
|
|
92
|
+
export function isPublishOperation(tool) {
|
|
93
|
+
return tool === "publish" || tool === "release" || tool === "npm-publish" || tool === "xray-release";
|
|
94
|
+
}
|
|
95
|
+
export function resolveAgentName(input) {
|
|
96
|
+
const globalAgent = globalThis.currentAgent;
|
|
97
|
+
if (globalAgent?.agentType)
|
|
98
|
+
return globalAgent.agentType;
|
|
99
|
+
if (globalAgent?.type)
|
|
100
|
+
return globalAgent.type;
|
|
101
|
+
if (input?.agentType)
|
|
102
|
+
return input.agentType;
|
|
103
|
+
return "architect";
|
|
104
|
+
}
|
|
105
|
+
export function registerAllProcessors(pm) {
|
|
106
|
+
pm.registerProcessor({ name: "preValidate", type: "pre", priority: 10, enabled: true });
|
|
107
|
+
pm.registerProcessor({ name: "codexCompliance", type: "pre", priority: 20, enabled: true });
|
|
108
|
+
pm.registerProcessor({ name: "versionCompliance", type: "pre", priority: 25, enabled: true });
|
|
109
|
+
pm.registerProcessor({ name: "testAutoCreation", type: "post", priority: 5, enabled: true });
|
|
110
|
+
pm.registerProcessor({ name: "testExecution", type: "post", priority: 10, enabled: true });
|
|
111
|
+
pm.registerProcessor({ name: "coverageAnalysis", type: "post", priority: 20, enabled: true });
|
|
112
|
+
}
|
|
113
|
+
export function registerAfterPostProcessors(pm) {
|
|
114
|
+
pm.registerProcessor({ name: "testAutoCreation", type: "post", priority: 50, enabled: true });
|
|
115
|
+
pm.registerProcessor({ name: "testExecution", type: "post", priority: 10, enabled: true });
|
|
116
|
+
pm.registerProcessor({ name: "coverageAnalysis", type: "post", priority: 20, enabled: true });
|
|
117
|
+
}
|
|
118
|
+
export function logPreProcessorResults(results, logger) {
|
|
119
|
+
logger.log(`📊 Pre-processor result: ${results.success ? "SUCCESS" : "FAILED"} (${results.results.length} processors)`);
|
|
120
|
+
if (!results.success) {
|
|
121
|
+
const failures = results.results.filter((r) => !r.success);
|
|
122
|
+
for (const f of failures) {
|
|
123
|
+
logger.error(`❌ Pre-processor ${f.processorName} failed: ${f.error}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
for (const r of results.results) {
|
|
128
|
+
logger.log(`✅ Pre-processor ${r.processorName}: ${r.success ? "OK" : "FAILED"}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
export function logPostProcessorResults(results, logger) {
|
|
133
|
+
const allSuccess = results.every((r) => r.success);
|
|
134
|
+
logger.log(`📊 Post-processor result: ${allSuccess ? "SUCCESS" : "FAILED"} (${results.length} processors)`);
|
|
135
|
+
for (const r of results) {
|
|
136
|
+
if (r.success) {
|
|
137
|
+
logger.log(`✅ Post-processor ${r.processorName}: OK`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
logger.error(`❌ Post-processor ${r.processorName} failed: ${r.error}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export function logTestAutoCreationResult(results, logger) {
|
|
145
|
+
const testAutoResult = results.find((r) => r.processorName === "testAutoCreation");
|
|
146
|
+
if (testAutoResult) {
|
|
147
|
+
const data = testAutoResult.data;
|
|
148
|
+
if (testAutoResult.success && data?.testCreated && data?.testFile) {
|
|
149
|
+
logger.log(`✅ TEST AUTO-CREATION: Created ${data.testFile}`);
|
|
150
|
+
}
|
|
151
|
+
else if (!testAutoResult.success) {
|
|
152
|
+
logger.log(`ℹ️ TEST AUTO-CREATION: ${testAutoResult.error ?? "skipped - no new files"}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
export class PluginLogger {
|
|
4
|
+
logPath;
|
|
5
|
+
constructor(directory) {
|
|
6
|
+
const logsDir = path.join(directory, ".opencode", "logs");
|
|
7
|
+
if (!fs.existsSync(logsDir)) {
|
|
8
|
+
fs.mkdirSync(logsDir, { recursive: true });
|
|
9
|
+
}
|
|
10
|
+
const today = new Date().toISOString().split("T")[0];
|
|
11
|
+
this.logPath = path.join(logsDir, `xray-plugin-${today}.log`);
|
|
12
|
+
}
|
|
13
|
+
async logAsync(message) {
|
|
14
|
+
try {
|
|
15
|
+
const timestamp = new Date().toISOString();
|
|
16
|
+
const logEntry = `[${timestamp}] ${message}\n`;
|
|
17
|
+
await fs.promises.appendFile(this.logPath, logEntry, "utf-8");
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Silent fail - logging failure should not break plugin
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
log(message) {
|
|
24
|
+
void this.logAsync(message);
|
|
25
|
+
}
|
|
26
|
+
error(message, error) {
|
|
27
|
+
const errorDetail = error instanceof Error ? `: ${error.message}` : "";
|
|
28
|
+
this.log(`ERROR: ${message}${errorDetail}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let loggerInstance = null;
|
|
32
|
+
let loggerInitPromise = null;
|
|
33
|
+
export async function getOrCreateLogger(directory) {
|
|
34
|
+
if (loggerInstance) {
|
|
35
|
+
return loggerInstance;
|
|
36
|
+
}
|
|
37
|
+
if (loggerInitPromise) {
|
|
38
|
+
return loggerInitPromise;
|
|
39
|
+
}
|
|
40
|
+
loggerInitPromise = (async () => {
|
|
41
|
+
const logger = new PluginLogger(directory);
|
|
42
|
+
loggerInstance = logger;
|
|
43
|
+
return logger;
|
|
44
|
+
})();
|
|
45
|
+
return loggerInitPromise;
|
|
46
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { getOrCreateLogger } from "./plugin-logger.js";
|
|
3
|
+
let _resolveCodexPath = null;
|
|
4
|
+
let _resolveStateDir = null;
|
|
5
|
+
let _frameworkLogger = null;
|
|
6
|
+
let _systemPromptGenerator = null;
|
|
7
|
+
let _ProcessorManager = null;
|
|
8
|
+
let _XrayStateManager = null;
|
|
9
|
+
let _featuresConfigLoader = null;
|
|
10
|
+
let _detectTaskType = null;
|
|
11
|
+
export function getProcessorManager() { return _ProcessorManager; }
|
|
12
|
+
export function getXrayStateManager() { return _XrayStateManager; }
|
|
13
|
+
export function getFeaturesConfigLoader() { return _featuresConfigLoader; }
|
|
14
|
+
export function getDetectTaskType() { return _detectTaskType; }
|
|
15
|
+
export function getSystemPromptGenerator() { return _systemPromptGenerator; }
|
|
16
|
+
async function loadFrameworkLogger() {
|
|
17
|
+
if (_frameworkLogger)
|
|
18
|
+
return _frameworkLogger;
|
|
19
|
+
const candidates = [
|
|
20
|
+
"../core/framework-logger.js",
|
|
21
|
+
"../../node_modules/0xray/dist/core/framework-logger.js",
|
|
22
|
+
];
|
|
23
|
+
for (const p of candidates) {
|
|
24
|
+
try {
|
|
25
|
+
const mod = await import(p);
|
|
26
|
+
_frameworkLogger = mod.frameworkLogger;
|
|
27
|
+
return _frameworkLogger;
|
|
28
|
+
}
|
|
29
|
+
catch (_) {
|
|
30
|
+
// try next candidate
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
_frameworkLogger = {
|
|
34
|
+
log: (_module, _event, _status, _data) => { },
|
|
35
|
+
};
|
|
36
|
+
return _frameworkLogger;
|
|
37
|
+
}
|
|
38
|
+
async function loadConfigPaths() {
|
|
39
|
+
if (_resolveCodexPath && _resolveStateDir)
|
|
40
|
+
return;
|
|
41
|
+
const candidates = [
|
|
42
|
+
"../core/config-paths.js",
|
|
43
|
+
"../../node_modules/0xray/dist/core/config-paths.js",
|
|
44
|
+
];
|
|
45
|
+
for (const p of candidates) {
|
|
46
|
+
try {
|
|
47
|
+
const mod = await import(p);
|
|
48
|
+
_resolveCodexPath = mod.resolveCodexPath;
|
|
49
|
+
_resolveStateDir = mod.resolveStateDir;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
catch (_) {
|
|
53
|
+
// try next candidate
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const logger = await loadFrameworkLogger();
|
|
57
|
+
logger.log("xray-codex-plugin", "config-paths-load-failed", "warning", { warning: "Failed to load config-paths module from any location" });
|
|
58
|
+
}
|
|
59
|
+
export async function resolveCodexPath(root) {
|
|
60
|
+
await loadConfigPaths();
|
|
61
|
+
if (!_resolveCodexPath)
|
|
62
|
+
throw new Error("resolveCodexPath not available after loading");
|
|
63
|
+
return _resolveCodexPath(root);
|
|
64
|
+
}
|
|
65
|
+
export async function resolveStateDir(root) {
|
|
66
|
+
await loadConfigPaths();
|
|
67
|
+
if (!_resolveStateDir)
|
|
68
|
+
throw new Error("resolveStateDir not available after loading");
|
|
69
|
+
return _resolveStateDir(root);
|
|
70
|
+
}
|
|
71
|
+
export async function importSystemPromptGenerator() {
|
|
72
|
+
if (_systemPromptGenerator)
|
|
73
|
+
return;
|
|
74
|
+
const candidates = [
|
|
75
|
+
"../core/system-prompt-generator.js",
|
|
76
|
+
"../../node_modules/0xray/dist/core/system-prompt-generator.js",
|
|
77
|
+
];
|
|
78
|
+
for (const p of candidates) {
|
|
79
|
+
try {
|
|
80
|
+
const module = await import(p);
|
|
81
|
+
_systemPromptGenerator = module.generateLeanSystemPrompt;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
catch (_) {
|
|
85
|
+
// try next candidate
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const logger = await loadFrameworkLogger();
|
|
89
|
+
logger.log("xray-codex-plugin", "system-prompt-generator-load-failed", "warning", { warning: "Failed to load lean system prompt generator, using fallback" });
|
|
90
|
+
}
|
|
91
|
+
export function validateModulePath(resolvedPath, allowedPrefix) {
|
|
92
|
+
const normalized = path.resolve(resolvedPath);
|
|
93
|
+
const allowed = path.resolve(allowedPrefix);
|
|
94
|
+
if (!normalized.startsWith(allowed)) {
|
|
95
|
+
throw new Error(`Module path validation failed: ${normalized} is outside allowed path ${allowed}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export async function loadXrayComponents() {
|
|
99
|
+
if (_ProcessorManager && _XrayStateManager && _featuresConfigLoader)
|
|
100
|
+
return;
|
|
101
|
+
const logger = await getOrCreateLogger(process.cwd());
|
|
102
|
+
try {
|
|
103
|
+
const root = process.cwd();
|
|
104
|
+
const distPrefix = path.join(root, 'dist');
|
|
105
|
+
validateModulePath(`${root}/dist/processors/processor-manager.js`, distPrefix);
|
|
106
|
+
validateModulePath(`${root}/dist/state/state-manager.js`, distPrefix);
|
|
107
|
+
validateModulePath(`${root}/dist/core/features-config.js`, distPrefix);
|
|
108
|
+
const procModule = await import(`${root}/dist/processors/processor-manager.js`);
|
|
109
|
+
const stateModule = await import(`${root}/dist/state/state-manager.js`);
|
|
110
|
+
const featuresModule = await import(`${root}/dist/core/features-config.js`);
|
|
111
|
+
_ProcessorManager = procModule.ProcessorManager;
|
|
112
|
+
_XrayStateManager = stateModule.XrayStateManager;
|
|
113
|
+
_featuresConfigLoader = featuresModule.featuresConfigLoader;
|
|
114
|
+
_detectTaskType = featuresModule.detectTaskType;
|
|
115
|
+
logger.log(`✅ Loaded from cwd/dist/`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
120
|
+
logger.log(`❌ Failed to load from cwd/dist/: ${message}`);
|
|
121
|
+
}
|
|
122
|
+
const pluginPaths = ["0xray"];
|
|
123
|
+
for (const pluginPath of pluginPaths) {
|
|
124
|
+
try {
|
|
125
|
+
const nodeModulesPrefix = path.join(process.cwd(), 'node_modules');
|
|
126
|
+
validateModulePath(`${process.cwd()}/node_modules/${pluginPath}/dist/processors/processor-manager.js`, nodeModulesPrefix);
|
|
127
|
+
validateModulePath(`${process.cwd()}/node_modules/${pluginPath}/dist/state/state-manager.js`, nodeModulesPrefix);
|
|
128
|
+
validateModulePath(`${process.cwd()}/node_modules/${pluginPath}/dist/core/features-config.js`, nodeModulesPrefix);
|
|
129
|
+
const pm = await import(`${process.cwd()}/node_modules/${pluginPath}/dist/processors/processor-manager.js`);
|
|
130
|
+
const sm = await import(`${process.cwd()}/node_modules/${pluginPath}/dist/state/state-manager.js`);
|
|
131
|
+
const fm = await import(`${process.cwd()}/node_modules/${pluginPath}/dist/core/features-config.js`);
|
|
132
|
+
_ProcessorManager = pm.ProcessorManager;
|
|
133
|
+
_XrayStateManager = sm.XrayStateManager;
|
|
134
|
+
_featuresConfigLoader = fm.featuresConfigLoader;
|
|
135
|
+
_detectTaskType = fm.detectTaskType;
|
|
136
|
+
logger.log(`✅ Loaded from node_modules/${pluginPath}/dist/`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
141
|
+
logger.log(`❌ Failed to load from node_modules/${pluginPath}/dist/: ${message}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|