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.
Files changed (254) 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 +3 -2
  5. package/README.md +12 -11
  6. package/dist/AGENTS.md +3 -2
  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 +14 -10
  168. package/scripts/node/setup.cjs +32 -0
  169. package/scripts/node/universal-version-manager.js +11 -11
  170. package/src/mcps/architect-tools.server.ts +112 -215
  171. package/src/mcps/auto-format.server.ts +50 -110
  172. package/src/mcps/boot-orchestrator.server.ts +75 -121
  173. package/src/mcps/config/__tests__/server-config-registry.test.ts +21 -12
  174. package/src/mcps/config/server-config-registry.ts +3 -3
  175. package/src/mcps/enforcer-tools.server.ts +212 -310
  176. package/src/mcps/estimation.server.ts +62 -122
  177. package/src/mcps/framework-compliance-audit.server.ts +52 -97
  178. package/src/mcps/framework-help.server.ts +64 -114
  179. package/src/mcps/governance.server.ts +2 -2
  180. package/src/mcps/knowledge-skills/api-design.server.ts +32 -77
  181. package/src/mcps/knowledge-skills/architecture-patterns.server.ts +31 -87
  182. package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +165 -193
  183. package/src/mcps/knowledge-skills/code-analyzer.server.ts +20 -55
  184. package/src/mcps/knowledge-skills/code-review.server.ts +114 -161
  185. package/src/mcps/knowledge-skills/content-creator.server.ts +218 -255
  186. package/src/mcps/knowledge-skills/database-design.server.ts +118 -165
  187. package/src/mcps/knowledge-skills/devops-deployment.server.ts +67 -172
  188. package/src/mcps/knowledge-skills/git-workflow.server.ts +32 -77
  189. package/src/mcps/knowledge-skills/growth-strategist.server.ts +324 -361
  190. package/src/mcps/knowledge-skills/log-monitor.server.ts +160 -187
  191. package/src/mcps/knowledge-skills/mobile-development.server.ts +89 -223
  192. package/src/mcps/knowledge-skills/multimodal-looker.server.ts +128 -175
  193. package/src/mcps/knowledge-skills/performance-optimization.server.ts +156 -329
  194. package/src/mcps/knowledge-skills/project-analysis.server.ts +72 -248
  195. package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +59 -171
  196. package/src/mcps/knowledge-skills/security-audit.server.ts +104 -151
  197. package/src/mcps/knowledge-skills/seo-consultant.server.ts +80 -220
  198. package/src/mcps/knowledge-skills/session-management.server.ts +51 -232
  199. package/src/mcps/knowledge-skills/skill-invocation.server.ts +165 -372
  200. package/src/mcps/knowledge-skills/strategist.server.ts +72 -143
  201. package/src/mcps/knowledge-skills/tech-writer.server.ts +85 -350
  202. package/src/mcps/knowledge-skills/testing-best-practices.server.ts +146 -195
  203. package/src/mcps/knowledge-skills/testing-strategy.server.ts +75 -161
  204. package/src/mcps/knowledge-skills/ui-ux-design.server.ts +93 -487
  205. package/src/mcps/lint.server.ts +53 -107
  206. package/src/mcps/mcp-client.ts +2 -2
  207. package/src/mcps/model-health-check.server.ts +34 -71
  208. package/src/mcps/performance-analysis.server.ts +60 -104
  209. package/src/mcps/processor-pipeline.server.ts +72 -110
  210. package/src/mcps/registry.json +1 -1
  211. package/src/mcps/researcher.server.ts +88 -177
  212. package/src/mcps/security-scan.server.ts +55 -104
  213. package/src/mcps/shared/knowledge-skill-base.ts +62 -0
  214. package/src/mcps/shared/prompt-security-validator.ts +199 -0
  215. package/src/mcps/shared/security-scanner.ts +599 -0
  216. package/src/mcps/state-manager.server.ts +117 -175
  217. package/src/opencode/codex.codex +1 -1
  218. package/src/opencode/commands/dependency-audit.md +3 -3
  219. package/src/opencode/enforcer-config.json +2 -2
  220. package/src/skills/registry.json +1 -1
  221. package/xray/agents_template.md +109 -0
  222. package/xray/codex.json +598 -0
  223. package/xray/config.json +26 -0
  224. package/xray/features.json +132 -0
  225. package/xray/integrations.json +23 -0
  226. package/xray/routing-mappings.json +752 -0
  227. package/xray/workflow_state.json +28 -0
  228. package/dist/integrations/hermes-agent/__pycache__/__init__.cpython-313.pyc +0 -0
  229. package/dist/integrations/hermes-agent/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
  230. package/dist/integrations/hermes-agent/__pycache__/schemas.cpython-313.pyc +0 -0
  231. package/dist/integrations/hermes-agent/__pycache__/test_plugin.cpython-313-pytest-9.0.2.pyc +0 -0
  232. package/dist/integrations/hermes-agent/__pycache__/test_plugin.cpython-313.pyc +0 -0
  233. package/dist/integrations/hermes-agent/__pycache__/tools.cpython-313.pyc +0 -0
  234. package/dist/integrations/hermes-agent/conftest.py +0 -14
  235. package/dist/integrations/hermes-agent/test_plugin.py +0 -1103
  236. package/dist/processors/implementations/refactoring-logging-processor.d.ts +0 -31
  237. package/dist/processors/implementations/refactoring-logging-processor.js +0 -96
  238. package/dist/processors/implementations/session-capture-processor.d.ts +0 -14
  239. package/dist/processors/implementations/session-capture-processor.js +0 -37
  240. package/dist/scripts/activate-kernel-pipeline.d.ts +0 -7
  241. package/dist/scripts/activate-kernel-pipeline.js +0 -101
  242. package/dist/security/index.d.ts +0 -13
  243. package/dist/security/index.js +0 -13
  244. package/dist/security/security-agent-coordinator.d.ts +0 -72
  245. package/dist/security/security-agent-coordinator.js +0 -204
  246. package/dist/security/security-auditor.d.ts +0 -56
  247. package/dist/security/security-auditor.js +0 -584
  248. package/dist/security/security-hardening-system.d.ts +0 -239
  249. package/dist/security/security-hardening-system.js +0 -727
  250. package/dist/security/security-orchestration-layer.d.ts +0 -119
  251. package/dist/security/security-orchestration-layer.js +0 -496
  252. /package/dist/{security → mcps/shared}/prompt-security-validator.d.ts +0 -0
  253. /package/dist/{security → mcps/shared}/prompt-security-validator.js +0 -0
  254. /package/dist/{security → mcps/shared}/security-scanner.d.ts +0 -0
@@ -21,7 +21,7 @@ import { join, resolve } from "path";
21
21
  /** Environment variable name for custom config root */
22
22
  export const XRAY_CONFIG_DIR_ENV = "XRAY_CONFIG_DIR";
23
23
  /** Legacy env var name (backward compat) */
24
- export const STRRAY_CONFIG_DIR_ENV = "STRRAY_CONFIG_DIR";
24
+ // STRRAY_CONFIG_DIR_ENV kept for legacy consumer compat (see bridge and tests)
25
25
  /** Resolved config directories, cached per projectRoot */
26
26
  const _resolvedConfigDirs = new Map();
27
27
  /**
@@ -33,7 +33,7 @@ export function getConfigDir(projectRoot) {
33
33
  const cached = _resolvedConfigDirs.get(root);
34
34
  if (cached)
35
35
  return cached;
36
- const envDir = process.env[XRAY_CONFIG_DIR_ENV] || process.env[STRRAY_CONFIG_DIR_ENV];
36
+ const envDir = process.env[XRAY_CONFIG_DIR_ENV];
37
37
  // Priority candidates
38
38
  const candidates = [];
39
39
  if (envDir) {
@@ -64,13 +64,13 @@ export function getConfigDir(projectRoot) {
64
64
  */
65
65
  export function resolveConfigPath(relativePath, projectRoot) {
66
66
  const root = projectRoot || process.cwd();
67
- const envDir = process.env[XRAY_CONFIG_DIR_ENV] || process.env[STRRAY_CONFIG_DIR_ENV];
67
+ const envDir = process.env[XRAY_CONFIG_DIR_ENV];
68
68
  const candidates = [];
69
69
  if (envDir) {
70
70
  candidates.push(resolve(root, envDir, relativePath));
71
71
  }
72
72
  candidates.push(join(root, ".xray", relativePath));
73
- candidates.push(join(root, ".opencode", "xray", relativePath));
73
+ candidates.push(join(root, "xray", relativePath));
74
74
  for (const candidate of candidates) {
75
75
  if (existsSync(candidate)) {
76
76
  return candidate;
@@ -86,7 +86,7 @@ export function resolveConfigPath(relativePath, projectRoot) {
86
86
  */
87
87
  export function resolveStateDir(projectRoot) {
88
88
  const root = projectRoot || process.cwd();
89
- const envDir = process.env[XRAY_CONFIG_DIR_ENV] || process.env[STRRAY_CONFIG_DIR_ENV];
89
+ const envDir = process.env[XRAY_CONFIG_DIR_ENV];
90
90
  const candidates = [];
91
91
  if (envDir) {
92
92
  candidates.push(join(root, envDir, "state"));
@@ -113,7 +113,7 @@ export function resolveStateFilePath(projectRoot) {
113
113
  */
114
114
  export function resolveProfilesDir(projectRoot) {
115
115
  const root = projectRoot || process.cwd();
116
- const envDir = process.env[XRAY_CONFIG_DIR_ENV] || process.env[STRRAY_CONFIG_DIR_ENV];
116
+ const envDir = process.env[XRAY_CONFIG_DIR_ENV];
117
117
  const candidates = [];
118
118
  if (envDir) {
119
119
  candidates.push(join(root, envDir, "profiles"));
@@ -133,14 +133,13 @@ export function resolveProfilesDir(projectRoot) {
133
133
  */
134
134
  export function resolveCodexPath(projectRoot) {
135
135
  const root = projectRoot || process.cwd();
136
- const envDir = process.env[XRAY_CONFIG_DIR_ENV] || process.env[STRRAY_CONFIG_DIR_ENV];
136
+ const envDir = process.env[XRAY_CONFIG_DIR_ENV];
137
137
  const candidates = [];
138
138
  if (envDir) {
139
139
  candidates.push(join(root, envDir, "codex.json"));
140
140
  }
141
141
  candidates.push(join(root, ".xray", "codex.json"));
142
142
  candidates.push(join(root, "xray", "codex.json"));
143
- candidates.push(join(root, ".opencode", "xray", "codex.json"));
144
143
  // Additional fallback locations (for standalone usage)
145
144
  candidates.push(join(root, "codex.json"));
146
145
  candidates.push(join(root, "src", "codex.json"));
@@ -119,4 +119,4 @@ export declare class XrayContextLoader {
119
119
  * Export singleton instance
120
120
  */
121
121
  export declare const xrayContextLoader: XrayContextLoader;
122
- export { xrayContextLoader as strRayContextLoader, XrayContextLoader as StringRayContextLoader };
122
+ export { xrayContextLoader as strRayContextLoader };
@@ -268,4 +268,4 @@ export class XrayContextLoader {
268
268
  */
269
269
  export const xrayContextLoader = XrayContextLoader.getInstance();
270
270
  // Backward compat alias
271
- export { xrayContextLoader as strRayContextLoader, XrayContextLoader as StringRayContextLoader };
271
+ export { xrayContextLoader as strRayContextLoader };
@@ -0,0 +1,3 @@
1
+ export declare function logAndReturn<T = never>(logger: any, component: string, message: string, error: unknown, returnValue: T): T;
2
+ export declare function logWarning(logger: any, component: string, message: string, details?: Record<string, unknown>): void;
3
+ export declare function logInfo(logger: any, component: string, message: string, details?: Record<string, unknown>): void;
@@ -0,0 +1,10 @@
1
+ export function logAndReturn(logger, component, message, error, returnValue) {
2
+ logger.log(component, message, "error", { error: error instanceof Error ? error.message : String(error) }).catch(() => { });
3
+ return returnValue;
4
+ }
5
+ export function logWarning(logger, component, message, details) {
6
+ logger.log(component, message, "warning", details).catch(() => { });
7
+ }
8
+ export function logInfo(logger, component, message, details) {
9
+ logger.log(component, message, "info", details).catch(() => { });
10
+ }
@@ -286,7 +286,7 @@ export class FeaturesConfigLoader {
286
286
  */
287
287
  getDefaultConfig() {
288
288
  return {
289
- version: "2.0.1",
289
+ version: "2.1.1",
290
290
  description: "0xRay Framework - Unified Feature Configuration",
291
291
  token_optimization: {
292
292
  enabled: true,
@@ -43,7 +43,7 @@ export declare class JobContext {
43
43
  * Log job completion with diagnostic info
44
44
  * Enhanced with outcome and complexity accuracy tracking
45
45
  */
46
- complete(success?: boolean, details?: any): Promise<void>;
46
+ complete(success?: boolean, details?: Record<string, unknown>): Promise<void>;
47
47
  }
48
48
  export interface FrameworkLogEntry {
49
49
  timestamp: number;
@@ -56,7 +56,7 @@ export interface FrameworkLogEntry {
56
56
  traceId?: string;
57
57
  spanId?: string;
58
58
  parentSpanId?: string;
59
- details?: any;
59
+ details?: Record<string, unknown>;
60
60
  }
61
61
  export declare class FrameworkUsageLogger {
62
62
  private logs;
@@ -66,7 +66,7 @@ export declare class FrameworkUsageLogger {
66
66
  private flushing;
67
67
  private readonly FLUSH_INTERVAL_MS;
68
68
  private readonly MAX_BUFFER_SIZE;
69
- log(component: string, action: string, status: LogStatus, details?: any, sessionId?: string, jobId?: string): Promise<void>;
69
+ log(component: string, action: string, status: LogStatus, details?: Record<string, unknown>, sessionId?: string, jobId?: string): Promise<void>;
70
70
  private bufferEntry;
71
71
  private flushBuffer;
72
72
  getRecentLogs(count?: number): FrameworkLogEntry[];
@@ -75,21 +75,21 @@ export function withJobContext(operation, jobId) {
75
75
  if (result instanceof Promise) {
76
76
  return result.finally(async () => {
77
77
  // Auto-complete job on operation finish
78
- await jobContext.complete(true).catch(() => { });
78
+ await jobContext.complete(true);
79
79
  // Restore original context
80
80
  currentJobContext = originalContext;
81
81
  });
82
82
  }
83
83
  else {
84
84
  // Sync operation - complete immediately
85
- jobContext.complete(true).catch(() => { });
85
+ jobContext.complete(true);
86
86
  currentJobContext = originalContext;
87
87
  return Promise.resolve(result);
88
88
  }
89
89
  }
90
90
  catch (error) {
91
91
  // Error occurred - complete job with failure
92
- jobContext.complete(false, { error: String(error) }).catch(() => { });
92
+ jobContext.complete(false, { error: String(error) });
93
93
  currentJobContext = originalContext;
94
94
  throw error;
95
95
  }
@@ -204,7 +204,7 @@ export class FrameworkUsageLogger {
204
204
  ...(currentTraceId && { traceId: currentTraceId }),
205
205
  ...(currentSpanId && { spanId: currentSpanId }),
206
206
  ...(currentParentSpanId && { parentSpanId: currentParentSpanId }),
207
- details,
207
+ ...(details !== undefined && { details }),
208
208
  };
209
209
  this.logs.push(entry);
210
210
  if (this.logs.length > this.maxLogs) {
@@ -212,7 +212,7 @@ export class FrameworkUsageLogger {
212
212
  }
213
213
  this.bufferEntry(entry);
214
214
  }
215
- bufferEntry(entry) {
215
+ async bufferEntry(entry) {
216
216
  const jobIdPart = entry.jobId ? `[${entry.jobId}] ` : "";
217
217
  const tracePart = entry.traceId ? `[${entry.traceId}.${entry.spanId}] ` : "";
218
218
  const detailsPart = entry.details
@@ -226,7 +226,7 @@ export class FrameworkUsageLogger {
226
226
  const line = `${new Date(entry.timestamp).toISOString()} ${jobIdPart}${tracePart}[${entry.component}] ${entry.action} - ${entry.status.toUpperCase()}${detailsPart}\n`;
227
227
  this.buffer.push(line);
228
228
  if (this.buffer.length >= this.MAX_BUFFER_SIZE) {
229
- this.flushBuffer();
229
+ await this.flushBuffer();
230
230
  return;
231
231
  }
232
232
  if (!this.flushTimer) {
@@ -247,17 +247,21 @@ export class FrameworkUsageLogger {
247
247
  const data = toWrite.join("");
248
248
  try {
249
249
  const cwd = process.cwd();
250
- if (!cwd)
250
+ if (!cwd) {
251
+ this.flushing = false;
251
252
  return;
253
+ }
252
254
  const logDir = join(cwd, "logs", "framework");
253
255
  const logFile = join(logDir, "activity.log");
254
256
  if (!existsSync(logDir)) {
255
257
  mkdirSync(logDir, { recursive: true });
256
258
  }
257
- await fs.appendFile(logFile, data).catch(() => { });
258
- this.flushing = false;
259
+ await fs.appendFile(logFile, data);
259
260
  }
260
261
  catch {
262
+ // flush failure is non-fatal
263
+ }
264
+ finally {
261
265
  this.flushing = false;
262
266
  }
263
267
  }
@@ -273,3 +277,7 @@ export class FrameworkUsageLogger {
273
277
  }
274
278
  }
275
279
  export const frameworkLogger = new FrameworkUsageLogger();
280
+ // Startup self-test: verify logger works
281
+ if (typeof process !== "undefined" && process.env?.NODE_ENV !== "test") {
282
+ frameworkLogger.log("system", "logger initialized", "info").catch(() => { });
283
+ }
@@ -1,5 +1,5 @@
1
1
  export { KernelOrchestrator } from "./orchestrator.js";
2
- export { defaultXrayConfig, defaultXrayConfig as defaultStringRayConfig } from "./xray-activation.js";
3
- export { getConfigDir, resolveConfigPath, resolveStateDir, resolveProfilesDir, resolveCodexPath, resolveLogDir, resetConfigDirCache, STRRAY_CONFIG_DIR_ENV, } from "./config-paths.js";
2
+ export { defaultXrayConfig } from "./xray-activation.js";
3
+ export { getConfigDir, resolveConfigPath, resolveStateDir, resolveProfilesDir, resolveCodexPath, resolveLogDir, resetConfigDirCache, XRAY_CONFIG_DIR_ENV, } from "./config-paths.js";
4
4
  export { formatCodexPrompt, formatMinimalCodexPrompt, getCodexConfig, findCodexPath, loadCodex, BUILTIN_CODEX, } from "./codex-formatter.js";
5
5
  export type { CodexTerm, CodexConfig, FormatOptions, FormatResult, } from "./codex-formatter.js";
@@ -1,6 +1,8 @@
1
1
  export { KernelOrchestrator } from "./orchestrator.js";
2
- export { defaultXrayConfig, defaultXrayConfig as defaultStringRayConfig } from "./xray-activation.js"; // consumer runtime compat from prior StringRay releases (1-line min per Scope Rule)
2
+ export { defaultXrayConfig } from "./xray-activation.js";
3
3
  // Decoupled config path resolution (Layer 1)
4
- export { getConfigDir, resolveConfigPath, resolveStateDir, resolveProfilesDir, resolveCodexPath, resolveLogDir, resetConfigDirCache, STRRAY_CONFIG_DIR_ENV, } from "./config-paths.js";
4
+ export { getConfigDir, resolveConfigPath, resolveStateDir, resolveProfilesDir, resolveCodexPath, resolveLogDir, resetConfigDirCache, XRAY_CONFIG_DIR_ENV,
5
+ // STRRAY_CONFIG_DIR_ENV (legacy export for compat shims)
6
+ } from "./config-paths.js";
5
7
  // Standalone codex formatter (Layer 2)
6
8
  export { formatCodexPrompt, formatMinimalCodexPrompt, getCodexConfig, findCodexPath, loadCodex, BUILTIN_CODEX, } from "./codex-formatter.js";
@@ -1,3 +1,4 @@
1
+ import type { LogStatus } from "./framework-logger.js";
1
2
  export interface LoggingConfig {
2
3
  enabled: boolean;
3
4
  level: "debug" | "info" | "warn" | "error";
@@ -7,4 +8,4 @@ export interface LoggingConfig {
7
8
  export declare function getLoggingConfig(): LoggingConfig;
8
9
  export declare function setLoggingConfig(config: Partial<LoggingConfig>): void;
9
10
  export declare function isLoggingEnabled(): boolean;
10
- export declare function shouldLog(level: string): boolean;
11
+ export declare function shouldLog(level: LogStatus): boolean;
@@ -1,9 +1,9 @@
1
1
  // Default logging configuration
2
2
  const defaultLoggingConfig = {
3
- enabled: process.env.STRRAY_LOGGING_ENABLED !== "false", // Default true, can be disabled
4
- level: process.env.STRRAY_LOG_LEVEL || "info",
3
+ enabled: (process.env.XRAY_LOGGING_ENABLED) !== "false", // Default true, can be disabled
4
+ level: (process.env.XRAY_LOG_LEVEL) || "info",
5
5
  destinations: ["console", "file"],
6
- performanceMode: process.env.STRRAY_PERFORMANCE_MODE === "true",
6
+ performanceMode: (process.env.XRAY_PERFORMANCE_MODE) === "true",
7
7
  };
8
8
  // Available log levels in priority order (higher index = more verbose)
9
9
  const LOG_LEVELS = ["debug", "info", "warn", "error"];
@@ -32,12 +32,12 @@ export function shouldLog(level) {
32
32
  return messageLevelIndex >= currentLevelIndex;
33
33
  }
34
34
  // Environment variable configuration
35
- if (process.env.STRRAY_LOGGING_ENABLED === "false") {
35
+ if ((process.env.XRAY_LOGGING_ENABLED) === "false") {
36
36
  setLoggingConfig({ enabled: false });
37
37
  }
38
- if (process.env.STRRAY_LOG_LEVEL) {
39
- setLoggingConfig({ level: process.env.STRRAY_LOG_LEVEL });
38
+ if (process.env.XRAY_LOG_LEVEL) {
39
+ setLoggingConfig({ level: (process.env.XRAY_LOG_LEVEL) });
40
40
  }
41
- if (process.env.STRRAY_PERFORMANCE_MODE === "true") {
41
+ if ((process.env.XRAY_PERFORMANCE_MODE) === "true") {
42
42
  setLoggingConfig({ performanceMode: true });
43
43
  }
@@ -36,7 +36,7 @@ export class CodexLoader extends BaseLoader {
36
36
  const candidates = resolveCodexPath();
37
37
  const found = candidates.find((p) => existsSync(p));
38
38
  // Fallback to primary path even if not found yet
39
- return found ?? candidates[0] ?? this.resolvePath(".opencode/xray/codex.json");
39
+ return found ?? candidates[0] ?? this.resolvePath("xray/codex.json");
40
40
  }
41
41
  /**
42
42
  * Check if codex.json exists.
@@ -17,7 +17,7 @@ import { getConfigDir } from "../core/config-paths.js";
17
17
  let opencodeAvailable = null;
18
18
  export async function invokeViaOpencode(agentName, prompt, projectRoot = process.cwd()) {
19
19
  // In pure MCP mode we must never reach here
20
- if (process.env.STRRAY_FORCE_MCP_GOVERNANCE === "true") {
20
+ if ((process.env.XRAY_FORCE_MCP_GOVERNANCE) === "true") {
21
21
  throw new Error(`[PURE MCP] invokeViaOpencode called for "${agentName}" — this path is forbidden.`);
22
22
  }
23
23
  // GATE: Centralized spawn gate — blocks all agent spawning by default
@@ -79,7 +79,7 @@ export async function invokeViaOpencode(agentName, prompt, projectRoot = process
79
79
  settled = true;
80
80
  child.kill("SIGKILL");
81
81
  if (trackingId) {
82
- agentSpawnGovernor.failSpawn(trackingId, new Error(`opencode ${agentName} timed out`)).catch(() => { });
82
+ agentSpawnGovernor.failSpawn(trackingId, new Error(`opencode ${agentName} timed out`)).catch((err) => frameworkLogger.log("opencode-cli-invoker", "spawn-governor-error", "error", { error: String(err) }));
83
83
  }
84
84
  reject(new Error(`opencode ${agentName} timed out`));
85
85
  }
@@ -103,7 +103,7 @@ export async function invokeViaOpencode(agentName, prompt, projectRoot = process
103
103
  settled = true;
104
104
  if (code === 0 && stdout.trim()) {
105
105
  if (trackingId) {
106
- await agentSpawnGovernor.completeSpawn(trackingId, true).catch(() => { });
106
+ await agentSpawnGovernor.completeSpawn(trackingId, true).catch((err) => frameworkLogger.log("opencode-cli-invoker", "spawn-governor-error", "error", { error: String(err) }));
107
107
  }
108
108
  frameworkLogger.log("inference-cycle", "opencode-spawn-success", "info", { agentName, trackingId });
109
109
  const textResponse = extractTextFromNdjson(stdout.trim());
@@ -117,7 +117,7 @@ export async function invokeViaOpencode(agentName, prompt, projectRoot = process
117
117
  else {
118
118
  const error = new Error(`${agentName} exited ${code}`);
119
119
  if (trackingId) {
120
- await agentSpawnGovernor.failSpawn(trackingId, error).catch(() => { });
120
+ await agentSpawnGovernor.failSpawn(trackingId, error).catch((err) => frameworkLogger.log("opencode-cli-invoker", "spawn-governor-error", "error", { error: String(err) }));
121
121
  }
122
122
  frameworkLogger.log("inference-cycle", "opencode-spawn-failed", "error", { agentName, trackingId, code });
123
123
  reject(error);
@@ -128,7 +128,7 @@ export async function invokeViaOpencode(agentName, prompt, projectRoot = process
128
128
  if (!settled) {
129
129
  settled = true;
130
130
  if (trackingId) {
131
- await agentSpawnGovernor.failSpawn(trackingId, err).catch(() => { });
131
+ await agentSpawnGovernor.failSpawn(trackingId, err).catch((e) => frameworkLogger.log("opencode-cli-invoker", "spawn-governor-error", "error", { error: String(e) }));
132
132
  }
133
133
  frameworkLogger.log("inference-cycle", "opencode-spawn-error", "error", { agentName, trackingId, error: err.message });
134
134
  reject(err);
@@ -39,7 +39,7 @@ export class GovernanceService {
39
39
  */
40
40
  async govern(request) {
41
41
  const { proposals, context, options } = request;
42
- const requireExternal = options?.requireExternalDynamo ?? true;
42
+ const requireExternal = options?.requireExternalDynamo ?? !process.env.XRAY_LOCAL_MODE;
43
43
  const timeoutMs = options?.timeoutMs ?? 90000;
44
44
  const maxAbstentionThreshold = options?.maxAbstentionThreshold ?? 1.0;
45
45
  frameworkLogger.log('governance-service', 'govern-start', 'info', {
package/dist/index.d.ts CHANGED
@@ -4,13 +4,13 @@
4
4
  * This is the main entry point for the 0xRay framework.
5
5
  * It exports the core initialization function and key components.
6
6
  */
7
- export { XrayOrchestrator, XrayOrchestrator as StringRayOrchestrator } from "./orchestrator/orchestrator.js";
8
- export { XrayStateManager, XrayStateManager as StringRayStateManager } from "./state/index.js";
7
+ export { XrayOrchestrator } from "./orchestrator/orchestrator.js";
8
+ export { XrayStateManager } from "./state/index.js";
9
9
  export { AgentDelegator } from "./delegation/index.js";
10
10
  export { frameworkLogger } from "./core/framework-logger.js";
11
11
  export { BUILTIN_CODEX } from "./core/codex-formatter.js";
12
12
  import { defaultXrayConfig } from "./core/index.js";
13
- export { defaultXrayConfig, defaultXrayConfig as defaultStringRayConfig };
13
+ export { defaultXrayConfig };
14
14
  export { OpenClawIntegration, initializeOpenClawIntegration, getOpenClawIntegration, shutdownOpenClawIntegration } from "./integrations/openclaw/index.js";
15
15
  export type { OpenClawIntegrationConfig } from "./integrations/openclaw/types.js";
16
16
  export declare function initializeXray(config?: {}): {
package/dist/index.js CHANGED
@@ -4,13 +4,13 @@
4
4
  * This is the main entry point for the 0xRay framework.
5
5
  * It exports the core initialization function and key components.
6
6
  */
7
- export { XrayOrchestrator, XrayOrchestrator as StringRayOrchestrator } from "./orchestrator/orchestrator.js";
8
- export { XrayStateManager, XrayStateManager as StringRayStateManager } from "./state/index.js";
7
+ export { XrayOrchestrator } from "./orchestrator/orchestrator.js";
8
+ export { XrayStateManager } from "./state/index.js";
9
9
  export { AgentDelegator } from "./delegation/index.js";
10
10
  export { frameworkLogger } from "./core/framework-logger.js";
11
11
  export { BUILTIN_CODEX } from "./core/codex-formatter.js";
12
12
  import { defaultXrayConfig } from "./core/index.js";
13
- export { defaultXrayConfig, defaultXrayConfig as defaultStringRayConfig };
13
+ export { defaultXrayConfig };
14
14
  export { OpenClawIntegration, initializeOpenClawIntegration, getOpenClawIntegration, shutdownOpenClawIntegration } from "./integrations/openclaw/index.js";
15
15
  // Main initialization function
16
16
  export function initializeXray(config = {}) {
@@ -75,7 +75,7 @@ export declare class InferenceCycle {
75
75
  private governProposalsInternal;
76
76
  /**
77
77
  * Pure individual knowledge-skill MCP path for governance.
78
- * Used when STRRAY_FORCE_MCP_GOVERNANCE=true.
78
+ * Used when XRAY_FORCE_MCP_GOVERNANCE=true.
79
79
  * Each proposal is evaluated directly by the relevant skill servers using analyze_proposal.
80
80
  */
81
81
  private governProposalsWithIndividualSkills;
@@ -328,7 +328,7 @@ export class InferenceCycle {
328
328
  try {
329
329
  let agentName = p.type === "refactor" ? "refactorer" : "code-reviewer";
330
330
  // In pure MCP mode, use real skill server names so the orchestrator dispatches to actual MCP tools
331
- if (process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true') {
331
+ if ((process.env.XRAY_FORCE_MCP_GOVERNANCE) === 'true') {
332
332
  agentName = p.type === "refactor" ? "refactoring-strategies" : "code-review";
333
333
  }
334
334
  await this.invokeAgentInternal(agentName, prompt);
@@ -353,11 +353,11 @@ export class InferenceCycle {
353
353
  ``,
354
354
  `1. Read the relevant source files`,
355
355
  `2. Add the missing guard, validation, or edge case handling`,
356
- `3. If this is a codex rule, add the term to .opencode/xray/codex.json`,
356
+ `3. If this is a codex rule, add the term to xray/codex.json`,
357
357
  `4. Make minimal, surgical changes`,
358
358
  ].join("\n");
359
359
  try {
360
- const agentName = process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true'
360
+ const agentName = (process.env.XRAY_FORCE_MCP_GOVERNANCE) === 'true'
361
361
  ? "code-review"
362
362
  : "code-reviewer";
363
363
  await this.invokeAgentInternal(agentName, prompt);
@@ -388,7 +388,7 @@ export class InferenceCycle {
388
388
  `3. Implement it if straightforward, otherwise describe the design`,
389
389
  ].join("\n");
390
390
  try {
391
- const agentName = process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true'
391
+ const agentName = (process.env.XRAY_FORCE_MCP_GOVERNANCE) === 'true'
392
392
  ? "architecture-patterns"
393
393
  : "architect";
394
394
  await this.invokeAgentInternal(agentName, prompt);
@@ -455,7 +455,7 @@ Respond with EXACTLY one of:
455
455
  async governProposals(proposals) {
456
456
  // Primary path: Use the first-class Governance MCP (real skill servers + required Dynamo)
457
457
  // This is the clean, centralized path (governance.server.ts + GovernanceService)
458
- const useGovernanceMcp = process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true' ||
458
+ const useGovernanceMcp = (process.env.XRAY_FORCE_MCP_GOVERNANCE) === 'true' ||
459
459
  this.isGovernanceMcpPreferred();
460
460
  if (useGovernanceMcp) {
461
461
  try {
@@ -488,7 +488,7 @@ Respond with EXACTLY one of:
488
488
  error: err instanceof Error ? err.message : String(err),
489
489
  });
490
490
  // In forced pure MCP mode we must not silently fall back
491
- if (process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true') {
491
+ if (process.env.XRAY_FORCE_MCP_GOVERNANCE === 'true') {
492
492
  throw err;
493
493
  }
494
494
  // In normal mode, fall back to legacy path with deprecation warning.
@@ -552,7 +552,7 @@ Respond with EXACTLY one of:
552
552
  */
553
553
  async governProposalsInternal(proposals) {
554
554
  // Defensive: if pure MCP mode is forced, use individual skill servers only
555
- if (process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true') {
555
+ if ((process.env.XRAY_FORCE_MCP_GOVERNANCE) === 'true') {
556
556
  return this.governProposalsWithIndividualSkills(proposals);
557
557
  }
558
558
  const coordinator = this.getCoordinator();
@@ -633,7 +633,7 @@ Respond with EXACTLY one of:
633
633
  }
634
634
  /**
635
635
  * Pure individual knowledge-skill MCP path for governance.
636
- * Used when STRRAY_FORCE_MCP_GOVERNANCE=true.
636
+ * Used when XRAY_FORCE_MCP_GOVERNANCE=true.
637
637
  * Each proposal is evaluated directly by the relevant skill servers using analyze_proposal.
638
638
  */
639
639
  async governProposalsWithIndividualSkills(proposals) {
@@ -801,7 +801,7 @@ Respond with EXACTLY one of:
801
801
  responseText = JSON.stringify(result);
802
802
  }
803
803
  // In pure MCP governance mode, trust the orchestrator response (it now does real work)
804
- const isPureMcp = process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true';
804
+ const isPureMcp = (process.env.XRAY_FORCE_MCP_GOVERNANCE) === 'true';
805
805
  const hasRealContent = /PROPOSAL:\s*\d+/i.test(responseText) ||
806
806
  /DECISION:\s*(approve|reject|abstain)/i.test(responseText) ||
807
807
  /Agent Outputs \(real MCP responses\):/i.test(responseText);
@@ -830,7 +830,7 @@ Respond with EXACTLY one of:
830
830
  return this.agentInvoker(agentName, prompt);
831
831
  }
832
832
  // Only fall back to OpenCode if not in forced pure MCP mode
833
- if (process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true') {
833
+ if ((process.env.XRAY_FORCE_MCP_GOVERNANCE) === 'true') {
834
834
  throw new Error(`[PURE MCP] Orchestrator returned no usable response for agent "${agentName}" and OpenCode fallback is disabled`);
835
835
  }
836
836
  return this.invokeViaOpencode(agentName, prompt);
@@ -315,7 +315,7 @@ export class BaseIntegration extends EventEmitter {
315
315
  version: this.version,
316
316
  status: this._status,
317
317
  jobId: this.jobId,
318
- }, this.jobId);
318
+ }, undefined, this.jobId);
319
319
  }
320
320
  catch {
321
321
  // Silent fail - logging should never break application