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.
Files changed (250) hide show
  1. package/.opencode/codex.codex +1 -1
  2. package/.opencode/commands/dependency-audit.md +3 -3
  3. package/.opencode/enforcer-config.json +2 -2
  4. package/AGENTS.md +2 -1
  5. package/README.md +12 -11
  6. package/dist/AGENTS.md +2 -1
  7. package/dist/CHANGELOG.md +26 -0
  8. package/dist/README.md +12 -11
  9. package/dist/agents/code-reviewer.js +1 -1
  10. package/dist/analytics/routing-refiner.js +1 -1
  11. package/dist/cli/index.js +11 -1
  12. package/dist/cli/server.js +3 -3
  13. package/dist/core/activity-logger.d.ts +2 -2
  14. package/dist/core/activity-logger.js +4 -4
  15. package/dist/core/boot-orchestrator.d.ts +1 -1
  16. package/dist/core/boot-orchestrator.js +13 -28
  17. package/dist/core/bridge.mjs +3 -3
  18. package/dist/core/codex-formatter.js +2 -2
  19. package/dist/core/codex-injector.d.ts +0 -1
  20. package/dist/core/codex-injector.js +2 -3
  21. package/dist/core/config-loader.d.ts +1 -1
  22. package/dist/core/config-loader.js +1 -1
  23. package/dist/core/config-paths.d.ts +0 -2
  24. package/dist/core/config-paths.js +7 -8
  25. package/dist/core/context-loader.d.ts +1 -1
  26. package/dist/core/context-loader.js +1 -1
  27. package/dist/core/errors.d.ts +3 -0
  28. package/dist/core/errors.js +10 -0
  29. package/dist/core/features-config.js +1 -1
  30. package/dist/core/framework-logger.d.ts +3 -3
  31. package/dist/core/framework-logger.js +17 -9
  32. package/dist/core/index.d.ts +2 -2
  33. package/dist/core/index.js +4 -2
  34. package/dist/core/logging-config.d.ts +2 -1
  35. package/dist/core/logging-config.js +7 -7
  36. package/dist/enforcement/loaders/codex-loader.js +1 -1
  37. package/dist/execution/opencode-cli-invoker.js +5 -5
  38. package/dist/governance/governance-service.js +1 -1
  39. package/dist/index.d.ts +3 -3
  40. package/dist/index.js +3 -3
  41. package/dist/inference/inference-cycle.d.ts +1 -1
  42. package/dist/inference/inference-cycle.js +10 -10
  43. package/dist/integrations/base/Integration.js +1 -1
  44. package/dist/integrations/base/registry.js +19 -19
  45. package/dist/integrations/grok/grok-cli.js +17 -17
  46. package/dist/integrations/grok/hooks/pre-tool-use.js +1 -1
  47. package/dist/integrations/hermes-agent/bridge.mjs +1 -1
  48. package/dist/integrations/openclaw/api-server.d.ts +0 -1
  49. package/dist/integrations/openclaw/api-server.js +7 -10
  50. package/dist/integrations/openclaw/client.d.ts +0 -1
  51. package/dist/integrations/openclaw/client.js +22 -24
  52. package/dist/integrations/openclaw/hooks/xray-hooks.d.ts +0 -1
  53. package/dist/integrations/openclaw/hooks/xray-hooks.js +17 -18
  54. package/dist/integrations/plugins/plugin-registry.js +5 -5
  55. package/dist/mcps/architect-tools.server.d.ts +2 -4
  56. package/dist/mcps/architect-tools.server.js +112 -195
  57. package/dist/mcps/auto-format.server.d.ts +2 -4
  58. package/dist/mcps/auto-format.server.js +49 -95
  59. package/dist/mcps/boot-orchestrator.server.d.ts +2 -4
  60. package/dist/mcps/boot-orchestrator.server.js +73 -105
  61. package/dist/mcps/config/server-config-registry.js +3 -3
  62. package/dist/mcps/enforcer-tools.server.d.ts +2 -4
  63. package/dist/mcps/enforcer-tools.server.js +202 -285
  64. package/dist/mcps/estimation.server.d.ts +2 -4
  65. package/dist/mcps/estimation.server.js +63 -107
  66. package/dist/mcps/framework-compliance-audit.server.d.ts +2 -4
  67. package/dist/mcps/framework-compliance-audit.server.js +53 -82
  68. package/dist/mcps/framework-help.server.d.ts +2 -4
  69. package/dist/mcps/framework-help.server.js +63 -101
  70. package/dist/mcps/governance.server.js +2 -2
  71. package/dist/mcps/knowledge-skills/api-design.server.d.ts +2 -4
  72. package/dist/mcps/knowledge-skills/api-design.server.js +35 -67
  73. package/dist/mcps/knowledge-skills/architecture-patterns.server.d.ts +2 -10
  74. package/dist/mcps/knowledge-skills/architecture-patterns.server.js +35 -74
  75. package/dist/mcps/knowledge-skills/bug-triage-specialist.server.d.ts +2 -4
  76. package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +143 -162
  77. package/dist/mcps/knowledge-skills/code-analyzer.server.d.ts +3 -4
  78. package/dist/mcps/knowledge-skills/code-analyzer.server.js +20 -45
  79. package/dist/mcps/knowledge-skills/code-review.server.d.ts +2 -4
  80. package/dist/mcps/knowledge-skills/code-review.server.js +109 -143
  81. package/dist/mcps/knowledge-skills/content-creator.server.d.ts +2 -4
  82. package/dist/mcps/knowledge-skills/content-creator.server.js +205 -226
  83. package/dist/mcps/knowledge-skills/database-design.server.d.ts +2 -4
  84. package/dist/mcps/knowledge-skills/database-design.server.js +117 -151
  85. package/dist/mcps/knowledge-skills/devops-deployment.server.d.ts +2 -4
  86. package/dist/mcps/knowledge-skills/devops-deployment.server.js +71 -160
  87. package/dist/mcps/knowledge-skills/git-workflow.server.d.ts +2 -4
  88. package/dist/mcps/knowledge-skills/git-workflow.server.js +36 -68
  89. package/dist/mcps/knowledge-skills/growth-strategist.server.d.ts +2 -4
  90. package/dist/mcps/knowledge-skills/growth-strategist.server.js +303 -324
  91. package/dist/mcps/knowledge-skills/log-monitor.server.d.ts +2 -4
  92. package/dist/mcps/knowledge-skills/log-monitor.server.js +141 -160
  93. package/dist/mcps/knowledge-skills/mobile-development.server.d.ts +2 -4
  94. package/dist/mcps/knowledge-skills/mobile-development.server.js +92 -209
  95. package/dist/mcps/knowledge-skills/multimodal-looker.server.d.ts +2 -4
  96. package/dist/mcps/knowledge-skills/multimodal-looker.server.js +123 -159
  97. package/dist/mcps/knowledge-skills/performance-optimization.server.d.ts +2 -5
  98. package/dist/mcps/knowledge-skills/performance-optimization.server.js +155 -296
  99. package/dist/mcps/knowledge-skills/project-analysis.server.d.ts +2 -4
  100. package/dist/mcps/knowledge-skills/project-analysis.server.js +75 -226
  101. package/dist/mcps/knowledge-skills/refactoring-strategies.server.d.ts +2 -4
  102. package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +63 -156
  103. package/dist/mcps/knowledge-skills/security-audit.server.d.ts +2 -4
  104. package/dist/mcps/knowledge-skills/security-audit.server.js +102 -136
  105. package/dist/mcps/knowledge-skills/seo-consultant.server.d.ts +2 -4
  106. package/dist/mcps/knowledge-skills/seo-consultant.server.js +80 -203
  107. package/dist/mcps/knowledge-skills/session-management.server.d.ts +2 -4
  108. package/dist/mcps/knowledge-skills/session-management.server.js +50 -203
  109. package/dist/mcps/knowledge-skills/skill-invocation.server.d.ts +2 -4
  110. package/dist/mcps/knowledge-skills/skill-invocation.server.js +168 -347
  111. package/dist/mcps/knowledge-skills/strategist.server.d.ts +2 -11
  112. package/dist/mcps/knowledge-skills/strategist.server.js +72 -122
  113. package/dist/mcps/knowledge-skills/tech-writer.server.d.ts +2 -4
  114. package/dist/mcps/knowledge-skills/tech-writer.server.js +87 -300
  115. package/dist/mcps/knowledge-skills/testing-best-practices.server.d.ts +2 -4
  116. package/dist/mcps/knowledge-skills/testing-best-practices.server.js +147 -182
  117. package/dist/mcps/knowledge-skills/testing-strategy.server.d.ts +2 -4
  118. package/dist/mcps/knowledge-skills/testing-strategy.server.js +78 -153
  119. package/dist/mcps/knowledge-skills/ui-ux-design.server.d.ts +2 -5
  120. package/dist/mcps/knowledge-skills/ui-ux-design.server.js +90 -399
  121. package/dist/mcps/lint.server.d.ts +2 -4
  122. package/dist/mcps/lint.server.js +51 -92
  123. package/dist/mcps/mcp-client.js +2 -2
  124. package/dist/mcps/model-health-check.server.d.ts +2 -4
  125. package/dist/mcps/model-health-check.server.js +32 -60
  126. package/dist/mcps/performance-analysis.server.d.ts +2 -4
  127. package/dist/mcps/performance-analysis.server.js +57 -88
  128. package/dist/mcps/processor-pipeline.server.d.ts +2 -4
  129. package/dist/mcps/processor-pipeline.server.js +69 -100
  130. package/dist/mcps/registry.json +1 -1
  131. package/dist/mcps/researcher.server.d.ts +3 -5
  132. package/dist/mcps/researcher.server.js +81 -154
  133. package/dist/mcps/security-scan.server.d.ts +2 -4
  134. package/dist/mcps/security-scan.server.js +54 -96
  135. package/dist/mcps/shared/knowledge-skill-base.d.ts +14 -0
  136. package/dist/mcps/shared/knowledge-skill-base.js +45 -0
  137. package/dist/{security → mcps/shared}/security-scanner.js +1 -1
  138. package/dist/mcps/state-manager.server.d.ts +2 -4
  139. package/dist/mcps/state-manager.server.js +115 -160
  140. package/dist/orchestrator/orchestrator.d.ts +1 -1
  141. package/dist/orchestrator/orchestrator.js +1 -1
  142. package/dist/orchestrator/universal-registry-bridge.js +1 -1
  143. package/dist/plugin/xray-codex-injection.d.ts +1 -1
  144. package/dist/plugin/xray-codex-injection.js +1 -1
  145. package/dist/postprocessor/PostProcessor.d.ts +4 -44
  146. package/dist/postprocessor/PostProcessor.js +39 -553
  147. package/dist/postprocessor/analysis/CodeChangeAnalyzer.d.ts +11 -0
  148. package/dist/postprocessor/analysis/CodeChangeAnalyzer.js +50 -0
  149. package/dist/postprocessor/compliance/ArchitecturalComplianceChecker.d.ts +11 -0
  150. package/dist/postprocessor/compliance/ArchitecturalComplianceChecker.js +356 -0
  151. package/dist/postprocessor/config/ProcessorConfigLoader.d.ts +44 -0
  152. package/dist/postprocessor/config/ProcessorConfigLoader.js +21 -0
  153. package/dist/postprocessor/reporting/PostProcessorReporter.d.ts +19 -0
  154. package/dist/postprocessor/reporting/PostProcessorReporter.js +96 -0
  155. package/dist/postprocessor/triggers/GitHookTrigger.js +11 -11
  156. package/dist/processors/implementations/refactoring-logging-processor-wrapper.d.ts +32 -0
  157. package/dist/processors/implementations/refactoring-logging-processor-wrapper.js +95 -1
  158. package/dist/processors/processor-manager.js +346 -314
  159. package/dist/reporting/report-formatter.js +1 -1
  160. package/dist/security/security-hardener.d.ts +69 -2
  161. package/dist/security/security-hardener.js +129 -1
  162. package/dist/skills/registry.json +1 -1
  163. package/dist/state/index.d.ts +3 -5
  164. package/dist/state/index.js +1 -7
  165. package/dist/state/state-manager.d.ts +1 -1
  166. package/dist/state/state-manager.js +2 -3
  167. package/package.json +13 -10
  168. package/scripts/node/universal-version-manager.js +11 -11
  169. package/src/mcps/architect-tools.server.ts +112 -215
  170. package/src/mcps/auto-format.server.ts +50 -110
  171. package/src/mcps/boot-orchestrator.server.ts +75 -121
  172. package/src/mcps/config/__tests__/server-config-registry.test.ts +21 -12
  173. package/src/mcps/config/server-config-registry.ts +3 -3
  174. package/src/mcps/enforcer-tools.server.ts +212 -310
  175. package/src/mcps/estimation.server.ts +62 -122
  176. package/src/mcps/framework-compliance-audit.server.ts +52 -97
  177. package/src/mcps/framework-help.server.ts +64 -114
  178. package/src/mcps/governance.server.ts +2 -2
  179. package/src/mcps/knowledge-skills/api-design.server.ts +32 -77
  180. package/src/mcps/knowledge-skills/architecture-patterns.server.ts +31 -87
  181. package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +165 -193
  182. package/src/mcps/knowledge-skills/code-analyzer.server.ts +20 -55
  183. package/src/mcps/knowledge-skills/code-review.server.ts +114 -161
  184. package/src/mcps/knowledge-skills/content-creator.server.ts +218 -255
  185. package/src/mcps/knowledge-skills/database-design.server.ts +118 -165
  186. package/src/mcps/knowledge-skills/devops-deployment.server.ts +67 -172
  187. package/src/mcps/knowledge-skills/git-workflow.server.ts +32 -77
  188. package/src/mcps/knowledge-skills/growth-strategist.server.ts +324 -361
  189. package/src/mcps/knowledge-skills/log-monitor.server.ts +160 -187
  190. package/src/mcps/knowledge-skills/mobile-development.server.ts +89 -223
  191. package/src/mcps/knowledge-skills/multimodal-looker.server.ts +128 -175
  192. package/src/mcps/knowledge-skills/performance-optimization.server.ts +156 -329
  193. package/src/mcps/knowledge-skills/project-analysis.server.ts +72 -248
  194. package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +59 -171
  195. package/src/mcps/knowledge-skills/security-audit.server.ts +104 -151
  196. package/src/mcps/knowledge-skills/seo-consultant.server.ts +80 -220
  197. package/src/mcps/knowledge-skills/session-management.server.ts +51 -232
  198. package/src/mcps/knowledge-skills/skill-invocation.server.ts +165 -372
  199. package/src/mcps/knowledge-skills/strategist.server.ts +72 -143
  200. package/src/mcps/knowledge-skills/tech-writer.server.ts +85 -350
  201. package/src/mcps/knowledge-skills/testing-best-practices.server.ts +146 -195
  202. package/src/mcps/knowledge-skills/testing-strategy.server.ts +75 -161
  203. package/src/mcps/knowledge-skills/ui-ux-design.server.ts +93 -487
  204. package/src/mcps/lint.server.ts +53 -107
  205. package/src/mcps/mcp-client.ts +2 -2
  206. package/src/mcps/model-health-check.server.ts +34 -71
  207. package/src/mcps/performance-analysis.server.ts +60 -104
  208. package/src/mcps/processor-pipeline.server.ts +72 -110
  209. package/src/mcps/registry.json +1 -1
  210. package/src/mcps/researcher.server.ts +88 -177
  211. package/src/mcps/security-scan.server.ts +55 -104
  212. package/src/mcps/shared/knowledge-skill-base.ts +62 -0
  213. package/src/mcps/shared/prompt-security-validator.ts +199 -0
  214. package/src/mcps/shared/security-scanner.ts +599 -0
  215. package/src/mcps/state-manager.server.ts +117 -175
  216. package/src/opencode/codex.codex +1 -1
  217. package/src/opencode/commands/dependency-audit.md +3 -3
  218. package/src/opencode/enforcer-config.json +2 -2
  219. package/src/skills/registry.json +1 -1
  220. package/xray/codex.json +1 -1
  221. package/xray/config.json +1 -1
  222. package/xray/features.json +1 -1
  223. package/xray/integrations.json +3 -3
  224. package/dist/integrations/hermes-agent/__pycache__/__init__.cpython-313.pyc +0 -0
  225. package/dist/integrations/hermes-agent/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
  226. package/dist/integrations/hermes-agent/__pycache__/schemas.cpython-313.pyc +0 -0
  227. package/dist/integrations/hermes-agent/__pycache__/test_plugin.cpython-313-pytest-9.0.2.pyc +0 -0
  228. package/dist/integrations/hermes-agent/__pycache__/test_plugin.cpython-313.pyc +0 -0
  229. package/dist/integrations/hermes-agent/__pycache__/tools.cpython-313.pyc +0 -0
  230. package/dist/integrations/hermes-agent/conftest.py +0 -14
  231. package/dist/integrations/hermes-agent/test_plugin.py +0 -1103
  232. package/dist/processors/implementations/refactoring-logging-processor.d.ts +0 -31
  233. package/dist/processors/implementations/refactoring-logging-processor.js +0 -96
  234. package/dist/processors/implementations/session-capture-processor.d.ts +0 -14
  235. package/dist/processors/implementations/session-capture-processor.js +0 -37
  236. package/dist/scripts/activate-kernel-pipeline.d.ts +0 -7
  237. package/dist/scripts/activate-kernel-pipeline.js +0 -101
  238. package/dist/security/index.d.ts +0 -13
  239. package/dist/security/index.js +0 -13
  240. package/dist/security/security-agent-coordinator.d.ts +0 -72
  241. package/dist/security/security-agent-coordinator.js +0 -204
  242. package/dist/security/security-auditor.d.ts +0 -56
  243. package/dist/security/security-auditor.js +0 -584
  244. package/dist/security/security-hardening-system.d.ts +0 -239
  245. package/dist/security/security-hardening-system.js +0 -727
  246. package/dist/security/security-orchestration-layer.d.ts +0 -119
  247. package/dist/security/security-orchestration-layer.js +0 -496
  248. /package/dist/{security → mcps/shared}/prompt-security-validator.d.ts +0 -0
  249. /package/dist/{security → mcps/shared}/prompt-security-validator.js +0 -0
  250. /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
- console.error('[Grok] Could not locate the 0xray Grok plugin inside the package.');
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
- console.log(`[Grok] Dry run: Would copy plugin from ${sourceDir} → ${targetPluginDir}`);
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
- console.log('[Grok] 0xray Grok plugin is already installed.');
44
- console.log('Use --force to reinstall.');
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
- console.log(`\x1b[32m✓ Copied Grok plugin to ${targetPluginDir}\x1b[0m`);
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
- console.log('\x1b[32m✓ Auto-trusted the 0xray plugin with Grok CLI\x1b[0m');
53
+ frameworkLogger.log('grok-cli', 'Auto-trusted the 0xray plugin with Grok CLI', 'info', {});
54
54
  }
55
55
  catch {
56
- console.log('\nPlease run this command to fully trust the plugin:');
57
- console.log(` grok plugins trust "${targetPluginDir}"`);
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 "STRRAY_FORCE_MCP_GOVERNANCE=true" --env "STRRAY_ROOT=${process.cwd()}"`, { stdio: 'pipe' });
64
- execSync(`grok mcp add xray-skills --command node --args "${skillsMcpPath}" --env "STRRAY_ROOT=${process.cwd()}"`, { stdio: 'pipe' });
65
- console.log('\x1b[32m✓ Registered xray MCP servers with Grok CLI\x1b[0m');
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
- console.log('\nCould not auto-register MCP servers. Run manually:');
69
- console.log(` grok mcp add xray-governance --command node --args "${govMcpPath}"`);
70
- console.log(` grok mcp add xray-skills --command node --args "${skillsMcpPath}"`);
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
- console.log('\n✅ 0xRay is now installed as a first-class Grok CLI plugin!');
73
- console.log('Restart Grok or run `grok` to load the new hooks and MCP servers.');
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
- console.error('Failed to install Grok plugin:', err.message);
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 = process.env.STRRAY_ROOT;
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 = process.env.STRRAY_HOME;
56
+ const envHome = ;
57
57
  if (envHome && existsSync(join(envHome, "package.json"))) return envHome;
58
58
 
59
59
  const candidates = [
@@ -28,7 +28,6 @@ export declare class XrayAPIServer {
28
28
  private apiKey;
29
29
  private stats;
30
30
  private responseTimes;
31
- private logger;
32
31
  constructor(config: XrayAPIServerConfig);
33
32
  /**
34
33
  * Set the agent invoker
@@ -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
- this.logger.warn('[XrayAPIServer] Server already running');
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
- this.logger.error('[XrayAPIServer] Server error:', error);
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
- this.logger.info(`[XrayAPIServer] Listening on http://${this.config.host}:${this.config.port}`);
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
- this.logger.info('[XrayAPIServer] Server stopped');
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
- this.logger.warn('[XrayAPIServer] Security: API key is set with CORS enabled. ' +
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
- this.logger.error(`[XrayAPIServer] Error handling request:`, error);
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 });
@@ -22,7 +22,6 @@ export declare class OpenClawClient {
22
22
  private reconnectTimeout;
23
23
  private pingInterval;
24
24
  private stats;
25
- private logger;
26
25
  constructor(config: OpenClawClientConfig);
27
26
  /**
28
27
  * Connect to OpenClaw Gateway
@@ -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
- this.logger.warn('[OpenClawClient] Already connected or connecting');
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
- this.logger.info('[OpenClawClient] WebSocket connected, waiting for challenge...');
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
- this.logger.info(`[OpenClawClient] Connection closed: ${code} ${String(reason)}`);
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
- this.logger.error('[OpenClawClient] WebSocket error:', error instanceof Error ? error.message : String(error));
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
- this.logger.debug('[OpenClawClient] Received ping');
92
+ frameworkLogger.log('openclaw-client', 'Received ping', 'debug', {});
95
93
  });
96
94
  this.ws.on('pong', () => {
97
- this.logger.debug('[OpenClawClient] Received pong');
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
- this.logger.info('[OpenClawClient] Disconnecting...');
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
- this.logger.debug(`[OpenClawClient] Sending request: ${method} (${id})`);
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
- this.logger.info('[OpenClawClient] Handshake complete (connect response ok)');
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
- this.logger.error('[OpenClawClient] Handshake failed:', error);
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
- this.logger.warn('[OpenClawClient] Unknown frame type:', frame);
316
+ frameworkLogger.log('openclaw-client', 'Unknown frame type:', 'warning', { frame });
319
317
  }
320
318
  }
321
319
  catch (error) {
322
- this.logger.error('[OpenClawClient] Failed to parse message:', error);
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
- this.logger.warn('[OpenClawClient] Received response for unknown request:', frame.id);
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
- this.logger.debug('[OpenClawClient] Event:', frame.event);
348
+ frameworkLogger.log('openclaw-client', 'Event:', 'debug', { event: frame.event });
351
349
  // Handle specific events
352
350
  if (frame.event === 'connect.challenge') {
353
- this.logger.info('[OpenClawClient] Received challenge, sending handshake...');
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
- this.logger.error('[OpenClawClient] Event listener error:', error);
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
- this.logger.error('[OpenClawClient] All-event listener error:', error);
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
- this.logger.info(`[OpenClawClient] Scheduling reconnect attempt ${this.reconnectAttempts}/${this.config.reconnectAttempts} in ${actualDelay}ms`);
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
- this.logger.error('[OpenClawClient] Reconnection failed:', error);
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
- this.logger.info(`[OpenClawClient] State: ${previousState} → ${newState}`);
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
- this.logger.error('[OpenClawClient] State listener error:', error);
456
+ frameworkLogger.log('openclaw-client', 'State listener error:', 'error', { error });
459
457
  }
460
458
  }
461
459
  }
@@ -46,7 +46,6 @@ export declare class OpenClawHooksManager {
46
46
  private initialized;
47
47
  private toolBeforeCallbacks;
48
48
  private toolAfterCallbacks;
49
- private logger;
50
49
  private eventQueue;
51
50
  private maxQueueSize;
52
51
  private isFlushing;
@@ -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
- this.logger.warn('[OpenClawHooks] Already initialized');
45
+ frameworkLogger.log('openclaw-hooks', 'Already initialized', 'warning', {});
47
46
  return;
48
47
  }
49
48
  if (!this.config.enabled) {
50
- this.logger.info('[OpenClawHooks] Hooks disabled in configuration');
49
+ frameworkLogger.log('openclaw-hooks', 'Hooks disabled in configuration', 'info', {});
51
50
  return;
52
51
  }
53
- this.logger.info('[OpenClawHooks] Initializing 0xRay tool hooks...');
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
- this.logger.info('[OpenClawHooks] Hooks initialized successfully');
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
- this.logger.error('[OpenClawHooks] Callback error in tool.before:', error);
123
+ frameworkLogger.log('openclaw-hooks', 'Callback error in tool.before:', 'error', { error });
125
124
  }
126
125
  }
127
- this.logger.debug(`[OpenClawHooks] tool.before: ${event.toolName}`);
126
+ frameworkLogger.log('openclaw-hooks', `tool.before: ${event.toolName}`, 'debug', {});
128
127
  }
129
128
  catch (error) {
130
- this.logger.error('[OpenClawHooks] Error handling tool.before:', error);
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
- this.logger.error('[OpenClawHooks] Callback error in tool.after:', error);
173
+ frameworkLogger.log('openclaw-hooks', 'Callback error in tool.after:', 'error', { error });
175
174
  }
176
175
  }
177
- this.logger.debug(`[OpenClawHooks] tool.after: ${event.toolName} (${event.error ? 'error' : 'success'})`);
176
+ frameworkLogger.log('openclaw-hooks', `tool.after: ${event.toolName} (${event.error ? 'error' : 'success'})`, 'debug', {});
178
177
  }
179
178
  catch (error) {
180
- this.logger.error('[OpenClawHooks] Error handling tool.after:', error);
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
- this.logger.warn('[OpenClawHooks] Event queue full, dropping oldest event');
189
+ frameworkLogger.log('openclaw-hooks', 'Event queue full, dropping oldest event', 'warning', {});
191
190
  }
192
191
  this.eventQueue.push({ type, event });
193
- this.logger.debug(`[OpenClawHooks] Queued ${type} event (queue size: ${this.eventQueue.length})`);
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
- this.logger.error(`[OpenClawHooks] Failed to send queued ${item.type} event:`, error);
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
- this.logger.info(`[OpenClawHooks] Flushed ${queue.length} queued events`);
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
- this.logger.info(`[OpenClawHooks] Client reconnected, flushing ${this.eventQueue.length} queued events...`);
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
- this.logger.info(`[OpenClawHooks] Hooks shutdown complete (${queuedCount} queued events dropped)`);
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 }).catch(() => { });
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) }).catch(() => { });
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) }).catch(() => { });
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 }).catch(() => { });
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 }).catch(() => { });
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
- declare class XrayArchitectToolsServer {
8
- private server;
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;