0xray 2.1.2 → 2.1.3
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/dependency-audit.md +3 -3
- package/.opencode/enforcer-config.json +2 -2
- package/AGENTS.md +2 -1
- package/README.md +12 -11
- package/dist/AGENTS.md +2 -1
- package/dist/CHANGELOG.md +26 -0
- package/dist/README.md +12 -11
- package/dist/agents/code-reviewer.js +1 -1
- package/dist/analytics/routing-refiner.js +1 -1
- package/dist/cli/index.js +11 -1
- package/dist/cli/server.js +3 -3
- package/dist/core/activity-logger.d.ts +2 -2
- package/dist/core/activity-logger.js +4 -4
- package/dist/core/boot-orchestrator.d.ts +1 -1
- package/dist/core/boot-orchestrator.js +13 -28
- package/dist/core/bridge.mjs +3 -3
- package/dist/core/codex-formatter.js +2 -2
- package/dist/core/codex-injector.d.ts +0 -1
- package/dist/core/codex-injector.js +2 -3
- package/dist/core/config-loader.d.ts +1 -1
- package/dist/core/config-loader.js +1 -1
- package/dist/core/config-paths.d.ts +0 -2
- package/dist/core/config-paths.js +7 -8
- package/dist/core/context-loader.d.ts +1 -1
- package/dist/core/context-loader.js +1 -1
- package/dist/core/errors.d.ts +3 -0
- package/dist/core/errors.js +10 -0
- package/dist/core/features-config.js +1 -1
- package/dist/core/framework-logger.d.ts +3 -3
- package/dist/core/framework-logger.js +17 -9
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +4 -2
- package/dist/core/logging-config.d.ts +2 -1
- package/dist/core/logging-config.js +7 -7
- package/dist/enforcement/loaders/codex-loader.js +1 -1
- package/dist/execution/opencode-cli-invoker.js +5 -5
- package/dist/governance/governance-service.js +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/inference/inference-cycle.d.ts +1 -1
- package/dist/inference/inference-cycle.js +10 -10
- package/dist/integrations/base/Integration.js +1 -1
- package/dist/integrations/base/registry.js +19 -19
- package/dist/integrations/grok/grok-cli.js +17 -17
- package/dist/integrations/grok/hooks/pre-tool-use.js +1 -1
- package/dist/integrations/hermes-agent/bridge.mjs +1 -1
- package/dist/integrations/openclaw/api-server.d.ts +0 -1
- package/dist/integrations/openclaw/api-server.js +7 -10
- package/dist/integrations/openclaw/client.d.ts +0 -1
- package/dist/integrations/openclaw/client.js +22 -24
- package/dist/integrations/openclaw/hooks/xray-hooks.d.ts +0 -1
- package/dist/integrations/openclaw/hooks/xray-hooks.js +17 -18
- package/dist/integrations/plugins/plugin-registry.js +5 -5
- package/dist/mcps/architect-tools.server.d.ts +2 -4
- package/dist/mcps/architect-tools.server.js +112 -195
- package/dist/mcps/auto-format.server.d.ts +2 -4
- package/dist/mcps/auto-format.server.js +49 -95
- package/dist/mcps/boot-orchestrator.server.d.ts +2 -4
- package/dist/mcps/boot-orchestrator.server.js +73 -105
- package/dist/mcps/config/server-config-registry.js +3 -3
- package/dist/mcps/enforcer-tools.server.d.ts +2 -4
- package/dist/mcps/enforcer-tools.server.js +202 -285
- package/dist/mcps/estimation.server.d.ts +2 -4
- package/dist/mcps/estimation.server.js +63 -107
- package/dist/mcps/framework-compliance-audit.server.d.ts +2 -4
- package/dist/mcps/framework-compliance-audit.server.js +53 -82
- package/dist/mcps/framework-help.server.d.ts +2 -4
- package/dist/mcps/framework-help.server.js +63 -101
- package/dist/mcps/governance.server.js +2 -2
- package/dist/mcps/knowledge-skills/api-design.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/api-design.server.js +35 -67
- package/dist/mcps/knowledge-skills/architecture-patterns.server.d.ts +2 -10
- package/dist/mcps/knowledge-skills/architecture-patterns.server.js +35 -74
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +143 -162
- package/dist/mcps/knowledge-skills/code-analyzer.server.d.ts +3 -4
- package/dist/mcps/knowledge-skills/code-analyzer.server.js +20 -45
- package/dist/mcps/knowledge-skills/code-review.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/code-review.server.js +109 -143
- package/dist/mcps/knowledge-skills/content-creator.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/content-creator.server.js +205 -226
- package/dist/mcps/knowledge-skills/database-design.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/database-design.server.js +117 -151
- package/dist/mcps/knowledge-skills/devops-deployment.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/devops-deployment.server.js +71 -160
- package/dist/mcps/knowledge-skills/git-workflow.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/git-workflow.server.js +36 -68
- package/dist/mcps/knowledge-skills/growth-strategist.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/growth-strategist.server.js +303 -324
- package/dist/mcps/knowledge-skills/log-monitor.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/log-monitor.server.js +141 -160
- package/dist/mcps/knowledge-skills/mobile-development.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/mobile-development.server.js +92 -209
- package/dist/mcps/knowledge-skills/multimodal-looker.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/multimodal-looker.server.js +123 -159
- package/dist/mcps/knowledge-skills/performance-optimization.server.d.ts +2 -5
- package/dist/mcps/knowledge-skills/performance-optimization.server.js +155 -296
- package/dist/mcps/knowledge-skills/project-analysis.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/project-analysis.server.js +75 -226
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +63 -156
- package/dist/mcps/knowledge-skills/security-audit.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/security-audit.server.js +102 -136
- package/dist/mcps/knowledge-skills/seo-consultant.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/seo-consultant.server.js +80 -203
- package/dist/mcps/knowledge-skills/session-management.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/session-management.server.js +50 -203
- package/dist/mcps/knowledge-skills/skill-invocation.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/skill-invocation.server.js +168 -347
- package/dist/mcps/knowledge-skills/strategist.server.d.ts +2 -11
- package/dist/mcps/knowledge-skills/strategist.server.js +72 -122
- package/dist/mcps/knowledge-skills/tech-writer.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/tech-writer.server.js +87 -300
- package/dist/mcps/knowledge-skills/testing-best-practices.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/testing-best-practices.server.js +147 -182
- package/dist/mcps/knowledge-skills/testing-strategy.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/testing-strategy.server.js +78 -153
- package/dist/mcps/knowledge-skills/ui-ux-design.server.d.ts +2 -5
- package/dist/mcps/knowledge-skills/ui-ux-design.server.js +90 -399
- package/dist/mcps/lint.server.d.ts +2 -4
- package/dist/mcps/lint.server.js +51 -92
- package/dist/mcps/mcp-client.js +2 -2
- package/dist/mcps/model-health-check.server.d.ts +2 -4
- package/dist/mcps/model-health-check.server.js +32 -60
- package/dist/mcps/performance-analysis.server.d.ts +2 -4
- package/dist/mcps/performance-analysis.server.js +57 -88
- package/dist/mcps/processor-pipeline.server.d.ts +2 -4
- package/dist/mcps/processor-pipeline.server.js +69 -100
- package/dist/mcps/registry.json +1 -1
- package/dist/mcps/researcher.server.d.ts +3 -5
- package/dist/mcps/researcher.server.js +81 -154
- package/dist/mcps/security-scan.server.d.ts +2 -4
- package/dist/mcps/security-scan.server.js +54 -96
- package/dist/mcps/shared/knowledge-skill-base.d.ts +14 -0
- package/dist/mcps/shared/knowledge-skill-base.js +45 -0
- package/dist/{security → mcps/shared}/security-scanner.js +1 -1
- package/dist/mcps/state-manager.server.d.ts +2 -4
- package/dist/mcps/state-manager.server.js +115 -160
- package/dist/orchestrator/orchestrator.d.ts +1 -1
- package/dist/orchestrator/orchestrator.js +1 -1
- package/dist/orchestrator/universal-registry-bridge.js +1 -1
- package/dist/plugin/xray-codex-injection.d.ts +1 -1
- package/dist/plugin/xray-codex-injection.js +1 -1
- package/dist/postprocessor/PostProcessor.d.ts +4 -44
- package/dist/postprocessor/PostProcessor.js +39 -553
- package/dist/postprocessor/analysis/CodeChangeAnalyzer.d.ts +11 -0
- package/dist/postprocessor/analysis/CodeChangeAnalyzer.js +50 -0
- package/dist/postprocessor/compliance/ArchitecturalComplianceChecker.d.ts +11 -0
- package/dist/postprocessor/compliance/ArchitecturalComplianceChecker.js +356 -0
- package/dist/postprocessor/config/ProcessorConfigLoader.d.ts +44 -0
- package/dist/postprocessor/config/ProcessorConfigLoader.js +21 -0
- package/dist/postprocessor/reporting/PostProcessorReporter.d.ts +19 -0
- package/dist/postprocessor/reporting/PostProcessorReporter.js +96 -0
- package/dist/postprocessor/triggers/GitHookTrigger.js +11 -11
- package/dist/processors/implementations/refactoring-logging-processor-wrapper.d.ts +32 -0
- package/dist/processors/implementations/refactoring-logging-processor-wrapper.js +95 -1
- package/dist/processors/processor-manager.js +346 -314
- package/dist/reporting/report-formatter.js +1 -1
- package/dist/security/security-hardener.d.ts +69 -2
- package/dist/security/security-hardener.js +129 -1
- package/dist/skills/registry.json +1 -1
- package/dist/state/index.d.ts +3 -5
- package/dist/state/index.js +1 -7
- package/dist/state/state-manager.d.ts +1 -1
- package/dist/state/state-manager.js +2 -3
- package/package.json +13 -10
- package/scripts/node/universal-version-manager.js +11 -11
- package/src/mcps/architect-tools.server.ts +112 -215
- package/src/mcps/auto-format.server.ts +50 -110
- package/src/mcps/boot-orchestrator.server.ts +75 -121
- package/src/mcps/config/__tests__/server-config-registry.test.ts +21 -12
- package/src/mcps/config/server-config-registry.ts +3 -3
- package/src/mcps/enforcer-tools.server.ts +212 -310
- package/src/mcps/estimation.server.ts +62 -122
- package/src/mcps/framework-compliance-audit.server.ts +52 -97
- package/src/mcps/framework-help.server.ts +64 -114
- package/src/mcps/governance.server.ts +2 -2
- package/src/mcps/knowledge-skills/api-design.server.ts +32 -77
- package/src/mcps/knowledge-skills/architecture-patterns.server.ts +31 -87
- package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +165 -193
- package/src/mcps/knowledge-skills/code-analyzer.server.ts +20 -55
- package/src/mcps/knowledge-skills/code-review.server.ts +114 -161
- package/src/mcps/knowledge-skills/content-creator.server.ts +218 -255
- package/src/mcps/knowledge-skills/database-design.server.ts +118 -165
- package/src/mcps/knowledge-skills/devops-deployment.server.ts +67 -172
- package/src/mcps/knowledge-skills/git-workflow.server.ts +32 -77
- package/src/mcps/knowledge-skills/growth-strategist.server.ts +324 -361
- package/src/mcps/knowledge-skills/log-monitor.server.ts +160 -187
- package/src/mcps/knowledge-skills/mobile-development.server.ts +89 -223
- package/src/mcps/knowledge-skills/multimodal-looker.server.ts +128 -175
- package/src/mcps/knowledge-skills/performance-optimization.server.ts +156 -329
- package/src/mcps/knowledge-skills/project-analysis.server.ts +72 -248
- package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +59 -171
- package/src/mcps/knowledge-skills/security-audit.server.ts +104 -151
- package/src/mcps/knowledge-skills/seo-consultant.server.ts +80 -220
- package/src/mcps/knowledge-skills/session-management.server.ts +51 -232
- package/src/mcps/knowledge-skills/skill-invocation.server.ts +165 -372
- package/src/mcps/knowledge-skills/strategist.server.ts +72 -143
- package/src/mcps/knowledge-skills/tech-writer.server.ts +85 -350
- package/src/mcps/knowledge-skills/testing-best-practices.server.ts +146 -195
- package/src/mcps/knowledge-skills/testing-strategy.server.ts +75 -161
- package/src/mcps/knowledge-skills/ui-ux-design.server.ts +93 -487
- package/src/mcps/lint.server.ts +53 -107
- package/src/mcps/mcp-client.ts +2 -2
- package/src/mcps/model-health-check.server.ts +34 -71
- package/src/mcps/performance-analysis.server.ts +60 -104
- package/src/mcps/processor-pipeline.server.ts +72 -110
- package/src/mcps/registry.json +1 -1
- package/src/mcps/researcher.server.ts +88 -177
- package/src/mcps/security-scan.server.ts +55 -104
- package/src/mcps/shared/knowledge-skill-base.ts +62 -0
- package/src/mcps/shared/prompt-security-validator.ts +199 -0
- package/src/mcps/shared/security-scanner.ts +599 -0
- package/src/mcps/state-manager.server.ts +117 -175
- package/src/opencode/codex.codex +1 -1
- package/src/opencode/commands/dependency-audit.md +3 -3
- package/src/opencode/enforcer-config.json +2 -2
- package/src/skills/registry.json +1 -1
- package/xray/codex.json +1 -1
- package/xray/config.json +1 -1
- package/xray/features.json +1 -1
- package/xray/integrations.json +3 -3
- package/dist/integrations/hermes-agent/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/integrations/hermes-agent/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
- package/dist/integrations/hermes-agent/__pycache__/schemas.cpython-313.pyc +0 -0
- package/dist/integrations/hermes-agent/__pycache__/test_plugin.cpython-313-pytest-9.0.2.pyc +0 -0
- package/dist/integrations/hermes-agent/__pycache__/test_plugin.cpython-313.pyc +0 -0
- package/dist/integrations/hermes-agent/__pycache__/tools.cpython-313.pyc +0 -0
- package/dist/integrations/hermes-agent/conftest.py +0 -14
- package/dist/integrations/hermes-agent/test_plugin.py +0 -1103
- package/dist/processors/implementations/refactoring-logging-processor.d.ts +0 -31
- package/dist/processors/implementations/refactoring-logging-processor.js +0 -96
- package/dist/processors/implementations/session-capture-processor.d.ts +0 -14
- package/dist/processors/implementations/session-capture-processor.js +0 -37
- package/dist/scripts/activate-kernel-pipeline.d.ts +0 -7
- package/dist/scripts/activate-kernel-pipeline.js +0 -101
- package/dist/security/index.d.ts +0 -13
- package/dist/security/index.js +0 -13
- package/dist/security/security-agent-coordinator.d.ts +0 -72
- package/dist/security/security-agent-coordinator.js +0 -204
- package/dist/security/security-auditor.d.ts +0 -56
- package/dist/security/security-auditor.js +0 -584
- package/dist/security/security-hardening-system.d.ts +0 -239
- package/dist/security/security-hardening-system.js +0 -727
- package/dist/security/security-orchestration-layer.d.ts +0 -119
- package/dist/security/security-orchestration-layer.js +0 -496
- /package/dist/{security → mcps/shared}/prompt-security-validator.d.ts +0 -0
- /package/dist/{security → mcps/shared}/prompt-security-validator.js +0 -0
- /package/dist/{security → mcps/shared}/security-scanner.d.ts +0 -0
|
@@ -31,50 +31,50 @@ export async function installForGrokCLI(options = {}) {
|
|
|
31
31
|
];
|
|
32
32
|
let sourceDir = possibleSources.find(p => fs.existsSync(p));
|
|
33
33
|
if (!sourceDir) {
|
|
34
|
-
|
|
34
|
+
frameworkLogger.log('grok-cli', 'Could not locate the 0xray Grok plugin inside the package.', 'error', {});
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
37
|
if (options.dryRun) {
|
|
38
|
-
|
|
38
|
+
frameworkLogger.log('grok-cli', `Dry run: Would copy plugin from ${sourceDir} → ${targetPluginDir}`, 'info', {});
|
|
39
39
|
return;
|
|
40
40
|
}
|
|
41
41
|
try {
|
|
42
42
|
if (fs.existsSync(targetPluginDir) && !options.force) {
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
frameworkLogger.log('grok-cli', '0xray Grok plugin is already installed.', 'info', {});
|
|
44
|
+
frameworkLogger.log('grok-cli', 'Use --force to reinstall.', 'info', {});
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
47
|
fs.cpSync(sourceDir, targetPluginDir, { recursive: true, force: true });
|
|
48
48
|
frameworkLogger.log('grok-integration', 'plugin-copied', 'info', { destination: targetPluginDir });
|
|
49
|
-
|
|
49
|
+
frameworkLogger.log('grok-cli', `Copied Grok plugin to ${targetPluginDir}`, 'info', {});
|
|
50
50
|
// Attempt auto-trust (best effort)
|
|
51
51
|
try {
|
|
52
52
|
execSync(`grok plugins trust "${targetPluginDir}"`, { stdio: 'ignore' });
|
|
53
|
-
|
|
53
|
+
frameworkLogger.log('grok-cli', 'Auto-trusted the 0xray plugin with Grok CLI', 'info', {});
|
|
54
54
|
}
|
|
55
55
|
catch {
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
frameworkLogger.log('grok-cli', 'Please run this command to fully trust the plugin:', 'info', {});
|
|
57
|
+
frameworkLogger.log('grok-cli', ` grok plugins trust "${targetPluginDir}"`, 'info', {});
|
|
58
58
|
}
|
|
59
59
|
// Register MCP servers via grok mcp add (most reliable mechanism)
|
|
60
60
|
const govMcpPath = path.resolve(__dirname, '..', '..', '..', 'dist/mcps/governance.server.js');
|
|
61
61
|
const skillsMcpPath = path.resolve(__dirname, '..', '..', '..', 'dist/mcps/knowledge-skills/skill-invocation.server.js');
|
|
62
62
|
try {
|
|
63
|
-
execSync(`grok mcp add xray-governance --command node --args "${govMcpPath}" --env "
|
|
64
|
-
execSync(`grok mcp add xray-skills --command node --args "${skillsMcpPath}" --env "
|
|
65
|
-
|
|
63
|
+
execSync(`grok mcp add xray-governance --command node --args "${govMcpPath}" --env "XRAY_FORCE_MCP_GOVERNANCE=true" --env "XRAY_ROOT=${process.cwd()}"`, { stdio: 'pipe' });
|
|
64
|
+
execSync(`grok mcp add xray-skills --command node --args "${skillsMcpPath}" --env "XRAY_ROOT=${process.cwd()}"`, { stdio: 'pipe' });
|
|
65
|
+
frameworkLogger.log('grok-cli', 'Registered xray MCP servers with Grok CLI', 'info', {});
|
|
66
66
|
}
|
|
67
67
|
catch {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
frameworkLogger.log('grok-cli', 'Could not auto-register MCP servers. Run manually:', 'info', {});
|
|
69
|
+
frameworkLogger.log('grok-cli', ` grok mcp add xray-governance --command node --args "${govMcpPath}"`, 'info', {});
|
|
70
|
+
frameworkLogger.log('grok-cli', ` grok mcp add xray-skills --command node --args "${skillsMcpPath}"`, 'info', {});
|
|
71
71
|
}
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
frameworkLogger.log('grok-cli', '0xRay is now installed as a first-class Grok CLI plugin!', 'info', {});
|
|
73
|
+
frameworkLogger.log('grok-cli', 'Restart Grok or run `grok` to load the new hooks and MCP servers.', 'info', {});
|
|
74
74
|
}
|
|
75
75
|
catch (err) {
|
|
76
76
|
frameworkLogger.log('grok-integration', 'install-error', 'error', { error: err.message });
|
|
77
|
-
|
|
77
|
+
frameworkLogger.log('grok-cli', 'Failed to install Grok plugin:', 'error', { error: err.message });
|
|
78
78
|
}
|
|
79
79
|
frameworkLogger.log('grok-integration', 'install-complete', 'info', {});
|
|
80
80
|
}
|
|
@@ -16,7 +16,7 @@ function findGovernanceCore() {
|
|
|
16
16
|
const here = path.dirname(new URL(import.meta.url).pathname);
|
|
17
17
|
|
|
18
18
|
// Priority: explicit dev root
|
|
19
|
-
const devRoot =
|
|
19
|
+
const devRoot = ;
|
|
20
20
|
if (devRoot) {
|
|
21
21
|
const devCandidate = path.resolve(devRoot, 'dist/governance/governance-core.js');
|
|
22
22
|
if (fs.existsSync(devCandidate)) return devCandidate;
|
|
@@ -53,7 +53,7 @@ let frameworkLoadAttempted = false;
|
|
|
53
53
|
|
|
54
54
|
// ── Project root detection ───────────────────────────────────
|
|
55
55
|
function findProjectRoot() {
|
|
56
|
-
const envHome =
|
|
56
|
+
const envHome = ;
|
|
57
57
|
if (envHome && existsSync(join(envHome, "package.json"))) return envHome;
|
|
58
58
|
|
|
59
59
|
const candidates = [
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* @version 1.0.0
|
|
8
8
|
* @since 2026-03-14
|
|
9
9
|
*/
|
|
10
|
+
import { frameworkLogger } from '../../core/framework-logger.js';
|
|
10
11
|
import * as crypto from 'crypto';
|
|
11
12
|
import * as http from 'http';
|
|
12
13
|
/**
|
|
@@ -26,7 +27,6 @@ export class XrayAPIServer {
|
|
|
26
27
|
errors: 0,
|
|
27
28
|
};
|
|
28
29
|
responseTimes = [];
|
|
29
|
-
logger;
|
|
30
30
|
constructor(config) {
|
|
31
31
|
this.config = {
|
|
32
32
|
port: config.port || 18431,
|
|
@@ -38,7 +38,6 @@ export class XrayAPIServer {
|
|
|
38
38
|
maxRequests: 100,
|
|
39
39
|
},
|
|
40
40
|
};
|
|
41
|
-
this.logger = console;
|
|
42
41
|
}
|
|
43
42
|
/**
|
|
44
43
|
* Set the agent invoker
|
|
@@ -51,7 +50,7 @@ export class XrayAPIServer {
|
|
|
51
50
|
*/
|
|
52
51
|
async start() {
|
|
53
52
|
if (this.server) {
|
|
54
|
-
|
|
53
|
+
frameworkLogger.log('openclaw-api-server', 'Server already running', 'warning', {});
|
|
55
54
|
return;
|
|
56
55
|
}
|
|
57
56
|
return new Promise((resolve, reject) => {
|
|
@@ -59,13 +58,13 @@ export class XrayAPIServer {
|
|
|
59
58
|
this.handleRequest(req, res);
|
|
60
59
|
});
|
|
61
60
|
this.server.on('error', (error) => {
|
|
62
|
-
|
|
61
|
+
frameworkLogger.log('openclaw-api-server', 'Server error:', 'error', { error });
|
|
63
62
|
this.stats.errors++;
|
|
64
63
|
reject(error);
|
|
65
64
|
});
|
|
66
65
|
this.server.listen(this.config.port, this.config.host, () => {
|
|
67
66
|
this.stats.startedAt = Date.now();
|
|
68
|
-
|
|
67
|
+
frameworkLogger.log('openclaw-api-server', `Listening on http://${this.config.host}:${this.config.port}`, 'info', {});
|
|
69
68
|
resolve();
|
|
70
69
|
});
|
|
71
70
|
});
|
|
@@ -77,7 +76,7 @@ export class XrayAPIServer {
|
|
|
77
76
|
return new Promise((resolve) => {
|
|
78
77
|
if (this.server) {
|
|
79
78
|
this.server.close(() => {
|
|
80
|
-
|
|
79
|
+
frameworkLogger.log('openclaw-api-server', 'Server stopped', 'info', {});
|
|
81
80
|
this.server = null;
|
|
82
81
|
resolve();
|
|
83
82
|
});
|
|
@@ -123,9 +122,7 @@ export class XrayAPIServer {
|
|
|
123
122
|
// to prevent cross-origin attacks where a malicious site could make
|
|
124
123
|
// authenticated requests using the API key from a victim's browser.
|
|
125
124
|
if (this.config.apiKey) {
|
|
126
|
-
|
|
127
|
-
'Restricting Access-Control-Allow-Origin to localhost only. ' +
|
|
128
|
-
'Configure explicit allowed origins if cross-origin access is needed.');
|
|
125
|
+
frameworkLogger.log('openclaw-api-server', 'Security: API key is set with CORS enabled. Restricting Access-Control-Allow-Origin to localhost only. Configure explicit allowed origins if cross-origin access is needed.', 'warning', {});
|
|
129
126
|
const origin = req.headers.origin;
|
|
130
127
|
if (origin && ['http://localhost', 'http://127.0.0.1', 'http://localhost:3000',
|
|
131
128
|
'http://127.0.0.1:3000', 'http://localhost:5173', 'http://127.0.0.1:5173'].includes(origin)) {
|
|
@@ -203,7 +200,7 @@ export class XrayAPIServer {
|
|
|
203
200
|
}
|
|
204
201
|
}
|
|
205
202
|
catch (error) {
|
|
206
|
-
|
|
203
|
+
frameworkLogger.log('openclaw-api-server', 'Error handling request:', 'error', { error });
|
|
207
204
|
this.stats.errors++;
|
|
208
205
|
const errorMessage = error instanceof Error ? error.message : 'Internal server error';
|
|
209
206
|
this.sendResponse(res, 500, { error: errorMessage });
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* @version 1.0.0
|
|
8
8
|
* @since 2026-03-14
|
|
9
9
|
*/
|
|
10
|
+
import { frameworkLogger } from '../../core/framework-logger.js';
|
|
10
11
|
import { WebSocket } from 'ws';
|
|
11
12
|
import * as crypto from 'crypto';
|
|
12
13
|
import { isOpenClawResponse, isOpenClawEvent, OpenClawTimeoutError, OpenClawConnectionError, } from './types.js';
|
|
@@ -32,7 +33,6 @@ export class OpenClawClient {
|
|
|
32
33
|
reconnects: 0,
|
|
33
34
|
errors: 0,
|
|
34
35
|
};
|
|
35
|
-
logger;
|
|
36
36
|
constructor(config) {
|
|
37
37
|
this.config = {
|
|
38
38
|
gatewayUrl: config.gatewayUrl || 'ws://127.0.0.1:18789',
|
|
@@ -45,8 +45,6 @@ export class OpenClawClient {
|
|
|
45
45
|
pingInterval: config.pingInterval ?? 30000,
|
|
46
46
|
requestTimeout: config.requestTimeout ?? 30000,
|
|
47
47
|
};
|
|
48
|
-
// Use console but can be replaced with proper logger
|
|
49
|
-
this.logger = console;
|
|
50
48
|
}
|
|
51
49
|
/**
|
|
52
50
|
* Connect to OpenClaw Gateway
|
|
@@ -56,7 +54,7 @@ export class OpenClawClient {
|
|
|
56
54
|
_handshakeTimeout = null;
|
|
57
55
|
async connect() {
|
|
58
56
|
if (this.state === 'connected' || this.state === 'authenticating') {
|
|
59
|
-
|
|
57
|
+
frameworkLogger.log('openclaw-client', 'Already connected or connecting', 'warning', {});
|
|
60
58
|
return;
|
|
61
59
|
}
|
|
62
60
|
this.setState('connecting');
|
|
@@ -71,7 +69,7 @@ export class OpenClawClient {
|
|
|
71
69
|
try {
|
|
72
70
|
this.ws = new WebSocket(this.config.gatewayUrl);
|
|
73
71
|
this.ws.on('open', () => {
|
|
74
|
-
|
|
72
|
+
frameworkLogger.log('openclaw-client', 'WebSocket connected, waiting for challenge...', 'info', {});
|
|
75
73
|
this.handshakeResolve = resolve;
|
|
76
74
|
this.handshakeReject = reject;
|
|
77
75
|
});
|
|
@@ -80,21 +78,21 @@ export class OpenClawClient {
|
|
|
80
78
|
this.handleMessage(message);
|
|
81
79
|
});
|
|
82
80
|
this.ws.on('close', (code, reason) => {
|
|
83
|
-
|
|
81
|
+
frameworkLogger.log('openclaw-client', `Connection closed: ${code} ${String(reason)}`, 'info', {});
|
|
84
82
|
this.handleDisconnect(Number(code), String(reason));
|
|
85
83
|
});
|
|
86
84
|
this.ws.on('error', (error) => {
|
|
87
|
-
|
|
85
|
+
frameworkLogger.log('openclaw-client', 'WebSocket error:', 'error', { error: error instanceof Error ? error.message : String(error) });
|
|
88
86
|
this.stats.errors++;
|
|
89
87
|
if (this.state === 'connecting') {
|
|
90
88
|
reject(new OpenClawConnectionError(`Failed to connect to ${this.config.gatewayUrl}: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined));
|
|
91
89
|
}
|
|
92
90
|
});
|
|
93
91
|
this.ws.on('ping', () => {
|
|
94
|
-
|
|
92
|
+
frameworkLogger.log('openclaw-client', 'Received ping', 'debug', {});
|
|
95
93
|
});
|
|
96
94
|
this.ws.on('pong', () => {
|
|
97
|
-
|
|
95
|
+
frameworkLogger.log('openclaw-client', 'Received pong', 'debug', {});
|
|
98
96
|
});
|
|
99
97
|
}
|
|
100
98
|
catch (error) {
|
|
@@ -107,7 +105,7 @@ export class OpenClawClient {
|
|
|
107
105
|
* Disconnect from OpenClaw Gateway
|
|
108
106
|
*/
|
|
109
107
|
disconnect() {
|
|
110
|
-
|
|
108
|
+
frameworkLogger.log('openclaw-client', 'Disconnecting...', 'info', {});
|
|
111
109
|
if (this._handshakeTimeout) {
|
|
112
110
|
clearTimeout(this._handshakeTimeout);
|
|
113
111
|
this._handshakeTimeout = null;
|
|
@@ -150,7 +148,7 @@ export class OpenClawClient {
|
|
|
150
148
|
method,
|
|
151
149
|
params,
|
|
152
150
|
};
|
|
153
|
-
|
|
151
|
+
frameworkLogger.log('openclaw-client', `Sending request: ${method} (${id})`, 'debug', {});
|
|
154
152
|
this.stats.requestsSent++;
|
|
155
153
|
return new Promise((resolve, reject) => {
|
|
156
154
|
// Set timeout
|
|
@@ -286,13 +284,13 @@ export class OpenClawClient {
|
|
|
286
284
|
this.setState('authorized');
|
|
287
285
|
this.startPingInterval();
|
|
288
286
|
if (this.handshakeResolve) {
|
|
289
|
-
|
|
287
|
+
frameworkLogger.log('openclaw-client', 'Handshake complete (connect response ok)', 'info', {});
|
|
290
288
|
this.handshakeResolve();
|
|
291
289
|
this.handshakeResolve = null;
|
|
292
290
|
this.handshakeReject = null;
|
|
293
291
|
}
|
|
294
292
|
}).catch((error) => {
|
|
295
|
-
|
|
293
|
+
frameworkLogger.log('openclaw-client', 'Handshake failed:', 'error', { error });
|
|
296
294
|
this.setState('error');
|
|
297
295
|
if (this.handshakeReject) {
|
|
298
296
|
this.handshakeReject(error);
|
|
@@ -315,11 +313,11 @@ export class OpenClawClient {
|
|
|
315
313
|
this.handleEvent(frame);
|
|
316
314
|
}
|
|
317
315
|
else {
|
|
318
|
-
|
|
316
|
+
frameworkLogger.log('openclaw-client', 'Unknown frame type:', 'warning', { frame });
|
|
319
317
|
}
|
|
320
318
|
}
|
|
321
319
|
catch (error) {
|
|
322
|
-
|
|
320
|
+
frameworkLogger.log('openclaw-client', 'Failed to parse message:', 'error', { error });
|
|
323
321
|
this.stats.errors++;
|
|
324
322
|
}
|
|
325
323
|
}
|
|
@@ -340,17 +338,17 @@ export class OpenClawClient {
|
|
|
340
338
|
}
|
|
341
339
|
}
|
|
342
340
|
else {
|
|
343
|
-
|
|
341
|
+
frameworkLogger.log('openclaw-client', 'Received response for unknown request:', 'warning', { requestId: frame.id });
|
|
344
342
|
}
|
|
345
343
|
}
|
|
346
344
|
/**
|
|
347
345
|
* Handle event frame
|
|
348
346
|
*/
|
|
349
347
|
handleEvent(frame) {
|
|
350
|
-
|
|
348
|
+
frameworkLogger.log('openclaw-client', 'Event:', 'debug', { event: frame.event });
|
|
351
349
|
// Handle specific events
|
|
352
350
|
if (frame.event === 'connect.challenge') {
|
|
353
|
-
|
|
351
|
+
frameworkLogger.log('openclaw-client', 'Received challenge, sending handshake...', 'info', {});
|
|
354
352
|
this.sendHandshake();
|
|
355
353
|
return;
|
|
356
354
|
}
|
|
@@ -375,7 +373,7 @@ export class OpenClawClient {
|
|
|
375
373
|
listener(frame.data);
|
|
376
374
|
}
|
|
377
375
|
catch (error) {
|
|
378
|
-
|
|
376
|
+
frameworkLogger.log('openclaw-client', 'Event listener error:', 'error', { error });
|
|
379
377
|
}
|
|
380
378
|
}
|
|
381
379
|
}
|
|
@@ -387,7 +385,7 @@ export class OpenClawClient {
|
|
|
387
385
|
listener(frame.event, frame.data);
|
|
388
386
|
}
|
|
389
387
|
catch (error) {
|
|
390
|
-
|
|
388
|
+
frameworkLogger.log('openclaw-client', 'All-event listener error:', 'error', { error });
|
|
391
389
|
}
|
|
392
390
|
}
|
|
393
391
|
}
|
|
@@ -422,12 +420,12 @@ export class OpenClawClient {
|
|
|
422
420
|
const delay = this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);
|
|
423
421
|
const maxDelay = 30000;
|
|
424
422
|
const actualDelay = Math.min(delay, maxDelay);
|
|
425
|
-
|
|
423
|
+
frameworkLogger.log('openclaw-client', `Scheduling reconnect attempt ${this.reconnectAttempts}/${this.config.reconnectAttempts} in ${actualDelay}ms`, 'info', {});
|
|
426
424
|
this.setState('reconnecting');
|
|
427
425
|
this.reconnectTimeout = setTimeout(() => {
|
|
428
426
|
this.reconnectTimeout = null;
|
|
429
427
|
this.connect().catch((error) => {
|
|
430
|
-
|
|
428
|
+
frameworkLogger.log('openclaw-client', 'Reconnection failed:', 'error', { error });
|
|
431
429
|
});
|
|
432
430
|
}, actualDelay);
|
|
433
431
|
}
|
|
@@ -448,14 +446,14 @@ export class OpenClawClient {
|
|
|
448
446
|
const previousState = this.state;
|
|
449
447
|
this.state = newState;
|
|
450
448
|
if (previousState !== newState) {
|
|
451
|
-
|
|
449
|
+
frameworkLogger.log('openclaw-client', `State: ${previousState} → ${newState}`, 'info', {});
|
|
452
450
|
// Notify state listeners
|
|
453
451
|
for (const listener of this.stateListeners) {
|
|
454
452
|
try {
|
|
455
453
|
listener(newState, previousState);
|
|
456
454
|
}
|
|
457
455
|
catch (error) {
|
|
458
|
-
|
|
456
|
+
frameworkLogger.log('openclaw-client', 'State listener error:', 'error', { error });
|
|
459
457
|
}
|
|
460
458
|
}
|
|
461
459
|
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* @version 1.0.0
|
|
8
8
|
* @since 2026-03-14
|
|
9
9
|
*/
|
|
10
|
+
import { frameworkLogger } from '../../../core/framework-logger.js';
|
|
10
11
|
/**
|
|
11
12
|
* OpenClaw Hooks Manager
|
|
12
13
|
*/
|
|
@@ -16,7 +17,6 @@ export class OpenClawHooksManager {
|
|
|
16
17
|
initialized = false;
|
|
17
18
|
toolBeforeCallbacks = new Set();
|
|
18
19
|
toolAfterCallbacks = new Set();
|
|
19
|
-
logger;
|
|
20
20
|
// Offline event buffering
|
|
21
21
|
eventQueue = [];
|
|
22
22
|
maxQueueSize = 100;
|
|
@@ -30,7 +30,6 @@ export class OpenClawHooksManager {
|
|
|
30
30
|
includeResult: config.includeResult ?? true,
|
|
31
31
|
...(config.toolFilter ? { toolFilter: config.toolFilter } : {}),
|
|
32
32
|
};
|
|
33
|
-
this.logger = console;
|
|
34
33
|
}
|
|
35
34
|
/**
|
|
36
35
|
* Set the OpenClaw client
|
|
@@ -43,19 +42,19 @@ export class OpenClawHooksManager {
|
|
|
43
42
|
*/
|
|
44
43
|
async initialize() {
|
|
45
44
|
if (this.initialized) {
|
|
46
|
-
|
|
45
|
+
frameworkLogger.log('openclaw-hooks', 'Already initialized', 'warning', {});
|
|
47
46
|
return;
|
|
48
47
|
}
|
|
49
48
|
if (!this.config.enabled) {
|
|
50
|
-
|
|
49
|
+
frameworkLogger.log('openclaw-hooks', 'Hooks disabled in configuration', 'info', {});
|
|
51
50
|
return;
|
|
52
51
|
}
|
|
53
|
-
|
|
52
|
+
frameworkLogger.log('openclaw-hooks', 'Initializing 0xRay tool hooks...', 'info', {});
|
|
54
53
|
// Register with 0xRay's event system
|
|
55
54
|
// The integration should call registerToolBefore and registerToolAfter
|
|
56
55
|
// to connect to 0xRay's actual tool execution events
|
|
57
56
|
this.initialized = true;
|
|
58
|
-
|
|
57
|
+
frameworkLogger.log('openclaw-hooks', 'Hooks initialized successfully', 'info', {});
|
|
59
58
|
}
|
|
60
59
|
/**
|
|
61
60
|
* Register a callback for tool.before events
|
|
@@ -121,13 +120,13 @@ export class OpenClawHooksManager {
|
|
|
121
120
|
await callback(event);
|
|
122
121
|
}
|
|
123
122
|
catch (error) {
|
|
124
|
-
|
|
123
|
+
frameworkLogger.log('openclaw-hooks', 'Callback error in tool.before:', 'error', { error });
|
|
125
124
|
}
|
|
126
125
|
}
|
|
127
|
-
|
|
126
|
+
frameworkLogger.log('openclaw-hooks', `tool.before: ${event.toolName}`, 'debug', {});
|
|
128
127
|
}
|
|
129
128
|
catch (error) {
|
|
130
|
-
|
|
129
|
+
frameworkLogger.log('openclaw-hooks', 'Error handling tool.before:', 'error', { error });
|
|
131
130
|
}
|
|
132
131
|
}
|
|
133
132
|
/**
|
|
@@ -171,13 +170,13 @@ export class OpenClawHooksManager {
|
|
|
171
170
|
await callback(event);
|
|
172
171
|
}
|
|
173
172
|
catch (error) {
|
|
174
|
-
|
|
173
|
+
frameworkLogger.log('openclaw-hooks', 'Callback error in tool.after:', 'error', { error });
|
|
175
174
|
}
|
|
176
175
|
}
|
|
177
|
-
|
|
176
|
+
frameworkLogger.log('openclaw-hooks', `tool.after: ${event.toolName} (${event.error ? 'error' : 'success'})`, 'debug', {});
|
|
178
177
|
}
|
|
179
178
|
catch (error) {
|
|
180
|
-
|
|
179
|
+
frameworkLogger.log('openclaw-hooks', 'Error handling tool.after:', 'error', { error });
|
|
181
180
|
}
|
|
182
181
|
}
|
|
183
182
|
/**
|
|
@@ -187,10 +186,10 @@ export class OpenClawHooksManager {
|
|
|
187
186
|
if (this.eventQueue.length >= this.maxQueueSize) {
|
|
188
187
|
// Remove oldest event to make room
|
|
189
188
|
this.eventQueue.shift();
|
|
190
|
-
|
|
189
|
+
frameworkLogger.log('openclaw-hooks', 'Event queue full, dropping oldest event', 'warning', {});
|
|
191
190
|
}
|
|
192
191
|
this.eventQueue.push({ type, event });
|
|
193
|
-
|
|
192
|
+
frameworkLogger.log('openclaw-hooks', `Queued ${type} event (queue size: ${this.eventQueue.length})`, 'debug', {});
|
|
194
193
|
}
|
|
195
194
|
/**
|
|
196
195
|
* Flush queued events to OpenClaw Gateway
|
|
@@ -213,12 +212,12 @@ export class OpenClawHooksManager {
|
|
|
213
212
|
}
|
|
214
213
|
}
|
|
215
214
|
catch (error) {
|
|
216
|
-
|
|
215
|
+
frameworkLogger.log('openclaw-hooks', `Failed to send queued ${item.type} event:`, 'error', { error });
|
|
217
216
|
// Re-queue failed events
|
|
218
217
|
this.eventQueue.push(item);
|
|
219
218
|
}
|
|
220
219
|
}
|
|
221
|
-
|
|
220
|
+
frameworkLogger.log('openclaw-hooks', `Flushed ${queue.length} queued events`, 'info', {});
|
|
222
221
|
}
|
|
223
222
|
finally {
|
|
224
223
|
this.isFlushing = false;
|
|
@@ -235,7 +234,7 @@ export class OpenClawHooksManager {
|
|
|
235
234
|
*/
|
|
236
235
|
async handleReconnect() {
|
|
237
236
|
if (this.eventQueue.length > 0) {
|
|
238
|
-
|
|
237
|
+
frameworkLogger.log('openclaw-hooks', `Client reconnected, flushing ${this.eventQueue.length} queued events...`, 'info', {});
|
|
239
238
|
await this.flushEventQueue();
|
|
240
239
|
}
|
|
241
240
|
}
|
|
@@ -248,7 +247,7 @@ export class OpenClawHooksManager {
|
|
|
248
247
|
this.eventQueue.length = 0;
|
|
249
248
|
this.initialized = false;
|
|
250
249
|
this.client = null;
|
|
251
|
-
|
|
250
|
+
frameworkLogger.log('openclaw-hooks', `Hooks shutdown complete (${queuedCount} queued events dropped)`, 'info', {});
|
|
252
251
|
}
|
|
253
252
|
/**
|
|
254
253
|
* Check if hooks are initialized
|
|
@@ -462,10 +462,10 @@ export class PluginRegistry extends EventEmitter {
|
|
|
462
462
|
this.debounceReload(pluginName);
|
|
463
463
|
}
|
|
464
464
|
});
|
|
465
|
-
frameworkLogger.log("plugin-registry", "hot-reload-started", "info", { pluginsDir: this.pluginsDir })
|
|
465
|
+
frameworkLogger.log("plugin-registry", "hot-reload-started", "info", { pluginsDir: this.pluginsDir });
|
|
466
466
|
}
|
|
467
467
|
catch (error) {
|
|
468
|
-
frameworkLogger.log("plugin-registry", "hot-reload-failed", "error", { error: error instanceof Error ? error.message : String(error) })
|
|
468
|
+
frameworkLogger.log("plugin-registry", "hot-reload-failed", "error", { error: error instanceof Error ? error.message : String(error) });
|
|
469
469
|
}
|
|
470
470
|
}
|
|
471
471
|
/**
|
|
@@ -479,7 +479,7 @@ export class PluginRegistry extends EventEmitter {
|
|
|
479
479
|
const timeout = setTimeout(() => {
|
|
480
480
|
this.reloadDebounce.delete(pluginName);
|
|
481
481
|
this.hotReloadPlugin(pluginName).catch((error) => {
|
|
482
|
-
frameworkLogger.log("plugin-registry", "hot-reload-error", "error", { pluginName, error: error instanceof Error ? error.message : String(error) })
|
|
482
|
+
frameworkLogger.log("plugin-registry", "hot-reload-error", "error", { pluginName, error: error instanceof Error ? error.message : String(error) });
|
|
483
483
|
});
|
|
484
484
|
}, 1000);
|
|
485
485
|
this.reloadDebounce.set(pluginName, timeout);
|
|
@@ -506,7 +506,7 @@ export class PluginRegistry extends EventEmitter {
|
|
|
506
506
|
await newPlugin.restart();
|
|
507
507
|
}
|
|
508
508
|
this.emitEvent("plugin-reloaded", { name: pluginName, phase: "loaded" });
|
|
509
|
-
await frameworkLogger.log("plugin-registry", "plugin-hot-reloaded", "info", { name: pluginName })
|
|
509
|
+
await frameworkLogger.log("plugin-registry", "plugin-hot-reloaded", "info", { name: pluginName });
|
|
510
510
|
}
|
|
511
511
|
}
|
|
512
512
|
/**
|
|
@@ -529,7 +529,7 @@ export class PluginRegistry extends EventEmitter {
|
|
|
529
529
|
results.forEach((result, index) => {
|
|
530
530
|
if (result.status === "rejected") {
|
|
531
531
|
const pluginNames = Array.from(this.plugins.keys());
|
|
532
|
-
frameworkLogger.log("plugin-registry", "plugin-shutdown-error", "error", { name: pluginNames[index], error: result.reason })
|
|
532
|
+
frameworkLogger.log("plugin-registry", "plugin-shutdown-error", "error", { name: pluginNames[index], error: result.reason });
|
|
533
533
|
}
|
|
534
534
|
});
|
|
535
535
|
this.plugins.clear();
|
|
@@ -4,14 +4,12 @@
|
|
|
4
4
|
* Converts architect-tools.ts functions into MCP server tools
|
|
5
5
|
* Provides contextual analysis capabilities via MCP protocol
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
import { XrayKnowledgeSkillBase } from "./shared/knowledge-skill-base.js";
|
|
8
|
+
declare class XrayArchitectToolsServer extends XrayKnowledgeSkillBase {
|
|
9
9
|
constructor();
|
|
10
|
-
private setupToolHandlers;
|
|
11
10
|
private contextAnalysis;
|
|
12
11
|
private codebaseStructure;
|
|
13
12
|
private dependencyAnalysis;
|
|
14
13
|
private architectureAssessment;
|
|
15
|
-
run(): Promise<void>;
|
|
16
14
|
}
|
|
17
15
|
export default XrayArchitectToolsServer;
|