0xray 2.1.1 → 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 +3 -2
- package/README.md +12 -11
- package/dist/AGENTS.md +3 -2
- 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 +14 -10
- package/scripts/node/setup.cjs +32 -0
- 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/agents_template.md +109 -0
- package/xray/codex.json +598 -0
- package/xray/config.json +26 -0
- package/xray/features.json +132 -0
- package/xray/integrations.json +23 -0
- package/xray/routing-mappings.json +752 -0
- package/xray/workflow_state.json +28 -0
- 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
|
@@ -93,7 +93,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
93
93
|
name,
|
|
94
94
|
version: integration.version,
|
|
95
95
|
});
|
|
96
|
-
frameworkLogger.log("integration-registry", `Registered integration: ${name} v${integration.version}`, "info", { name, version: integration.version }
|
|
96
|
+
frameworkLogger.log("integration-registry", `Registered integration: ${name} v${integration.version}`, "info", { name, version: integration.version });
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
99
|
* Unregister an integration from the registry
|
|
@@ -109,12 +109,12 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
109
109
|
// If loaded, unload first
|
|
110
110
|
if (this.loadedIntegrations.has(name)) {
|
|
111
111
|
this.unload(name).catch((error) => {
|
|
112
|
-
frameworkLogger.log("integration-registry", `Error unloading integration '${name}' during unregister: ${error}`, "error", { name, error: String(error) }
|
|
112
|
+
frameworkLogger.log("integration-registry", `Error unloading integration '${name}' during unregister: ${error}`, "error", { name, error: String(error) });
|
|
113
113
|
});
|
|
114
114
|
}
|
|
115
115
|
this.registeredIntegrations.delete(name);
|
|
116
116
|
this.emitEvent("integration-unregistered", { name });
|
|
117
|
-
frameworkLogger.log("integration-registry", `Unregistered integration: ${name}`, "info", { name }
|
|
117
|
+
frameworkLogger.log("integration-registry", `Unregistered integration: ${name}`, "info", { name });
|
|
118
118
|
}
|
|
119
119
|
// ==========================================================================
|
|
120
120
|
// Accessor Methods
|
|
@@ -184,7 +184,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
184
184
|
async load(name, config) {
|
|
185
185
|
// Check if already loaded
|
|
186
186
|
if (this.loadedIntegrations.has(name)) {
|
|
187
|
-
frameworkLogger.log("integration-registry", `Integration '${name}' already loaded`, "warning", { name }
|
|
187
|
+
frameworkLogger.log("integration-registry", `Integration '${name}' already loaded`, "warning", { name });
|
|
188
188
|
return;
|
|
189
189
|
}
|
|
190
190
|
const integration = this.registeredIntegrations.get(name);
|
|
@@ -211,7 +211,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
211
211
|
name,
|
|
212
212
|
version: integration.version,
|
|
213
213
|
});
|
|
214
|
-
frameworkLogger.log("integration-registry", `Loaded integration: ${name}`, "success", { name, version: integration.version }
|
|
214
|
+
frameworkLogger.log("integration-registry", `Loaded integration: ${name}`, "success", { name, version: integration.version });
|
|
215
215
|
}
|
|
216
216
|
catch (error) {
|
|
217
217
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -239,7 +239,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
239
239
|
// Remove from loaded map
|
|
240
240
|
this.loadedIntegrations.delete(name);
|
|
241
241
|
this.emitEvent("integration-unloaded", { name });
|
|
242
|
-
frameworkLogger.log("integration-registry", `Unloaded integration: ${name}`, "success", { name }
|
|
242
|
+
frameworkLogger.log("integration-registry", `Unloaded integration: ${name}`, "success", { name });
|
|
243
243
|
}
|
|
244
244
|
catch (error) {
|
|
245
245
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -250,7 +250,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
250
250
|
error: errorMessage,
|
|
251
251
|
phase: "unload",
|
|
252
252
|
}, error instanceof Error ? error : undefined);
|
|
253
|
-
frameworkLogger.log("integration-registry", `Error unloading integration '${name}': ${errorMessage}`, "error", { name, error: errorMessage }
|
|
253
|
+
frameworkLogger.log("integration-registry", `Error unloading integration '${name}': ${errorMessage}`, "error", { name, error: errorMessage });
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
256
|
/**
|
|
@@ -261,14 +261,14 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
261
261
|
async loadAll(config) {
|
|
262
262
|
const entries = Object.entries(config.integrations);
|
|
263
263
|
const enabledEntries = entries.filter(([, entry]) => entry.enabled);
|
|
264
|
-
frameworkLogger.log("integration-registry", `Loading ${enabledEntries.length} enabled integrations...`, "info", { total: entries.length, enabled: enabledEntries.length }
|
|
264
|
+
frameworkLogger.log("integration-registry", `Loading ${enabledEntries.length} enabled integrations...`, "info", { total: entries.length, enabled: enabledEntries.length });
|
|
265
265
|
const results = [];
|
|
266
266
|
// Load all enabled integrations
|
|
267
267
|
for (const [name, entry] of enabledEntries) {
|
|
268
268
|
try {
|
|
269
269
|
// Check if registered
|
|
270
270
|
if (!this.registeredIntegrations.has(name)) {
|
|
271
|
-
frameworkLogger.log("integration-registry", `Skipping '${name}': not registered`, "warning", { name }
|
|
271
|
+
frameworkLogger.log("integration-registry", `Skipping '${name}': not registered`, "warning", { name });
|
|
272
272
|
results.push({ name, success: false, error: "Not registered" });
|
|
273
273
|
continue;
|
|
274
274
|
}
|
|
@@ -282,7 +282,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
282
282
|
catch (error) {
|
|
283
283
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
284
284
|
results.push({ name, success: false, error: errorMessage });
|
|
285
|
-
frameworkLogger.log("integration-registry", `Failed to load integration '${name}': ${errorMessage}`, "error", { name, error: errorMessage }
|
|
285
|
+
frameworkLogger.log("integration-registry", `Failed to load integration '${name}': ${errorMessage}`, "error", { name, error: errorMessage });
|
|
286
286
|
}
|
|
287
287
|
}
|
|
288
288
|
this.emitEvent("load-complete", {
|
|
@@ -293,14 +293,14 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
293
293
|
});
|
|
294
294
|
const succeeded = results.filter((r) => r.success).length;
|
|
295
295
|
const failed = results.filter((r) => !r.success).length;
|
|
296
|
-
frameworkLogger.log("integration-registry", `Load complete: ${succeeded} succeeded, ${failed} failed`, failed > 0 ? "warning" : "success", { succeeded, failed }
|
|
296
|
+
frameworkLogger.log("integration-registry", `Load complete: ${succeeded} succeeded, ${failed} failed`, failed > 0 ? "warning" : "success", { succeeded, failed });
|
|
297
297
|
}
|
|
298
298
|
/**
|
|
299
299
|
* Unload all loaded integrations
|
|
300
300
|
*/
|
|
301
301
|
async unloadAll() {
|
|
302
302
|
const loadedNames = Array.from(this.loadedIntegrations.keys());
|
|
303
|
-
frameworkLogger.log("integration-registry", `Unloading ${loadedNames.length} integrations...`, "info", { count: loadedNames.length }
|
|
303
|
+
frameworkLogger.log("integration-registry", `Unloading ${loadedNames.length} integrations...`, "info", { count: loadedNames.length });
|
|
304
304
|
const results = [];
|
|
305
305
|
// Unload all loaded integrations
|
|
306
306
|
for (const name of loadedNames) {
|
|
@@ -321,7 +321,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
321
321
|
});
|
|
322
322
|
const succeeded = results.filter((r) => r.success).length;
|
|
323
323
|
const failed = results.filter((r) => !r.success).length;
|
|
324
|
-
frameworkLogger.log("integration-registry", `Unload complete: ${succeeded} succeeded, ${failed} failed`, failed > 0 ? "warning" : "success", { succeeded, failed }
|
|
324
|
+
frameworkLogger.log("integration-registry", `Unload complete: ${succeeded} succeeded, ${failed} failed`, failed > 0 ? "warning" : "success", { succeeded, failed });
|
|
325
325
|
}
|
|
326
326
|
// ==========================================================================
|
|
327
327
|
// Health and Stats Methods
|
|
@@ -427,7 +427,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
427
427
|
this.registeredIntegrations.delete(name);
|
|
428
428
|
}
|
|
429
429
|
}
|
|
430
|
-
frameworkLogger.log("integration-registry", "Cleared non-loaded integrations", "info", { cleared: names.length - this.loadedIntegrations.size }
|
|
430
|
+
frameworkLogger.log("integration-registry", "Cleared non-loaded integrations", "info", { cleared: names.length - this.loadedIntegrations.size });
|
|
431
431
|
}
|
|
432
432
|
/**
|
|
433
433
|
* Get registry statistics
|
|
@@ -494,7 +494,7 @@ export async function discoverIntegrations(integrationsPath) {
|
|
|
494
494
|
const path = await import("path");
|
|
495
495
|
// Check if directory exists
|
|
496
496
|
if (!fs.existsSync(integrationsPath)) {
|
|
497
|
-
frameworkLogger.log("integration-registry", `Integrations directory not found: ${integrationsPath}`, "warning", { path: integrationsPath })
|
|
497
|
+
frameworkLogger.log("integration-registry", `Integrations directory not found: ${integrationsPath}`, "warning", { path: integrationsPath });
|
|
498
498
|
return discovered;
|
|
499
499
|
}
|
|
500
500
|
// Read directory contents
|
|
@@ -533,18 +533,18 @@ export async function discoverIntegrations(integrationsPath) {
|
|
|
533
533
|
path: indexPath,
|
|
534
534
|
module,
|
|
535
535
|
});
|
|
536
|
-
frameworkLogger.log("integration-registry", `Discovered integration: ${name}`, "info", { name, path: indexPath })
|
|
536
|
+
frameworkLogger.log("integration-registry", `Discovered integration: ${name}`, "info", { name, path: indexPath });
|
|
537
537
|
}
|
|
538
538
|
catch (error) {
|
|
539
539
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
540
|
-
frameworkLogger.log("integration-registry", `Failed to load integration from ${indexPath}: ${errorMessage}`, "warning", { path: indexPath, error: errorMessage })
|
|
540
|
+
frameworkLogger.log("integration-registry", `Failed to load integration from ${indexPath}: ${errorMessage}`, "warning", { path: indexPath, error: errorMessage });
|
|
541
541
|
}
|
|
542
542
|
}
|
|
543
543
|
}
|
|
544
544
|
}
|
|
545
545
|
catch (error) {
|
|
546
546
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
547
|
-
frameworkLogger.log("integration-registry", `Error during integration discovery: ${errorMessage}`, "error", { error: errorMessage })
|
|
547
|
+
frameworkLogger.log("integration-registry", `Error during integration discovery: ${errorMessage}`, "error", { error: errorMessage });
|
|
548
548
|
}
|
|
549
549
|
return discovered;
|
|
550
550
|
}
|
|
@@ -595,7 +595,7 @@ export async function autoRegisterIntegrations(registry, integrationsPath) {
|
|
|
595
595
|
catch (error) {
|
|
596
596
|
// Skip integrations that fail to register (already registered, etc.)
|
|
597
597
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
598
|
-
frameworkLogger.log("integration-registry", `Failed to register integration '${d.name}': ${errorMessage}`, "warning", { name: d.name, error: errorMessage })
|
|
598
|
+
frameworkLogger.log("integration-registry", `Failed to register integration '${d.name}': ${errorMessage}`, "warning", { name: d.name, error: errorMessage });
|
|
599
599
|
}
|
|
600
600
|
}
|
|
601
601
|
return registered;
|
|
@@ -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
|
}
|