0xray 3.1.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/.opencode/codex.codex +1 -1
  2. package/.opencode/commands/auto-format.md +3 -3
  3. package/.opencode/commands/auto-summary-capture.md +2 -2
  4. package/.opencode/commands/enforcer-daily-scan.md +3 -3
  5. package/.opencode/commands/framework-compliance-audit.md +4 -4
  6. package/.opencode/commands/interactive-validator.md +2 -2
  7. package/.opencode/commands/job-summary-logger.md +2 -2
  8. package/.opencode/commands/mode-switch.md +1 -1
  9. package/.opencode/commands/model-health-check.md +2 -2
  10. package/.opencode/commands/performance-analysis.md +2 -2
  11. package/.opencode/commands/pre-commit-introspection.md +3 -3
  12. package/.opencode/commands/security-scan.md +3 -3
  13. package/.opencode/commands/sisyphus-validation.md +3 -3
  14. package/.opencode/commands/summary-logger.md +2 -2
  15. package/AGENTS.md +3 -13
  16. package/README.md +3 -3
  17. package/dist/AGENTS.md +3 -13
  18. package/dist/CHANGELOG.md +29 -0
  19. package/dist/README.md +3 -3
  20. package/dist/analytics/consent-manager.js +0 -1
  21. package/dist/analytics/emerging-pattern-detector.js +0 -1
  22. package/dist/analytics/pattern-learning-engine.js +0 -1
  23. package/dist/analytics/pattern-performance-tracker.js +0 -1
  24. package/dist/analytics/predictive-analytics.js +0 -1
  25. package/dist/analytics/prompt-pattern-analyzer.js +0 -1
  26. package/dist/analytics/routing-performance-analyzer.js +0 -1
  27. package/dist/analytics/routing-refiner.js +0 -1
  28. package/dist/analytics/simple-pattern-analyzer.js +0 -1
  29. package/dist/cli/commands/archive-logs.js +0 -1
  30. package/dist/cli/commands/opencode-install.js +13 -0
  31. package/dist/cli/commands/plugin-commands.js +0 -1
  32. package/dist/cli/commands/status.js +11 -13
  33. package/dist/cli/index.js +2 -7
  34. package/dist/core/activity-logger.js +0 -1
  35. package/dist/core/adaptive-kernel.js +0 -1
  36. package/dist/core/boot-orchestrator.js +2 -12
  37. package/dist/core/bridge.mjs +0 -1
  38. package/dist/core/codex-formatter.js +0 -1
  39. package/dist/core/codex-injector.js +0 -1
  40. package/dist/core/config-loader.js +36 -28
  41. package/dist/core/context-loader.js +0 -1
  42. package/dist/core/context-validator.js +0 -1
  43. package/dist/core/features-config.js +37 -1
  44. package/dist/core/kernel-patterns.js +0 -1
  45. package/dist/core/model-router.js +23 -64
  46. package/dist/core/system-prompt-generator.js +0 -1
  47. package/dist/delegation/agent-delegator.js +0 -1
  48. package/dist/delegation/agent-expertise.js +0 -1
  49. package/dist/delegation/analytics/index.js +0 -1
  50. package/dist/delegation/analytics/learning-engine.js +0 -1
  51. package/dist/delegation/analytics/outcome-tracker.js +0 -1
  52. package/dist/delegation/analytics/routing-analytics.js +0 -1
  53. package/dist/delegation/ast-code-parser.js +0 -1
  54. package/dist/delegation/complexity-analyzer.js +0 -1
  55. package/dist/delegation/dependency-graph-builder.js +0 -1
  56. package/dist/delegation/index.js +0 -1
  57. package/dist/delegation/metrics-aggregator.js +0 -1
  58. package/dist/delegation/session-coordinator.js +0 -1
  59. package/dist/delegation/strategy-selector.js +0 -1
  60. package/dist/delegation/voting-coordinator.js +0 -1
  61. package/dist/delegation/voting-types.js +0 -1
  62. package/dist/delegation/weighted-voting-aggregator.js +0 -1
  63. package/dist/enforcement/core/index.js +0 -1
  64. package/dist/enforcement/core/rule-executor.js +0 -1
  65. package/dist/enforcement/core/rule-hierarchy.js +0 -1
  66. package/dist/enforcement/core/rule-registry.js +0 -1
  67. package/dist/enforcement/core/violation-fixer.js +0 -1
  68. package/dist/enforcement/index.js +0 -1
  69. package/dist/enforcement/loaders/agent-triage-loader.js +0 -1
  70. package/dist/enforcement/loaders/agents-md-validation-loader.js +0 -1
  71. package/dist/enforcement/loaders/base-loader.js +0 -1
  72. package/dist/enforcement/loaders/codex-loader.js +0 -1
  73. package/dist/enforcement/loaders/index.js +0 -1
  74. package/dist/enforcement/loaders/loader-orchestrator.js +0 -1
  75. package/dist/enforcement/loaders/processor-loader.js +0 -1
  76. package/dist/enforcement/types.js +0 -1
  77. package/dist/enforcement/validators/architecture-validators.js +0 -1
  78. package/dist/enforcement/validators/base-validator.js +0 -1
  79. package/dist/enforcement/validators/code-quality-validators.js +0 -1
  80. package/dist/enforcement/validators/index.js +0 -1
  81. package/dist/enforcement/validators/security-validators.js +0 -1
  82. package/dist/enforcement/validators/testing-validators.js +0 -1
  83. package/dist/enforcement/validators/validator-registry.js +0 -1
  84. package/dist/governance/codex-policy.service.js +0 -1
  85. package/dist/inference/inference-agent-invoker.js +67 -0
  86. package/dist/inference/inference-applier.js +178 -0
  87. package/dist/inference/inference-cycle.js +51 -827
  88. package/dist/inference/inference-proposal-generator.js +149 -0
  89. package/dist/infrastructure/iac-validator.js +465 -0
  90. package/dist/infrastructure/schemas/cloud-schemas.js +488 -0
  91. package/dist/integrations/base/ExampleIntegration.js +0 -1
  92. package/dist/integrations/base/Integration.js +0 -1
  93. package/dist/integrations/base/index.js +0 -1
  94. package/dist/integrations/base/registry.js +0 -1
  95. package/dist/integrations/base/types.js +0 -1
  96. package/dist/integrations/enforcement-gate.js +3 -3
  97. package/dist/integrations/governance/governance-client.js +0 -1
  98. package/dist/integrations/governance/index.js +11 -19
  99. package/dist/integrations/governance/types.js +0 -1
  100. package/dist/integrations/hermes-agent/__init__.py +4 -0
  101. package/dist/integrations/hermes-agent/bridge.mjs +37 -0
  102. package/dist/integrations/openclaw/api-server.js +0 -1
  103. package/dist/integrations/openclaw/client.js +0 -1
  104. package/dist/integrations/openclaw/config.js +0 -1
  105. package/dist/integrations/openclaw/hooks/xray-hooks.js +0 -1
  106. package/dist/integrations/openclaw/index.js +0 -1
  107. package/dist/integrations/openclaw/types.js +0 -1
  108. package/dist/integrations/plugins/index.js +0 -1
  109. package/dist/integrations/plugins/plugin-integration.js +0 -1
  110. package/dist/integrations/plugins/plugin-registry.js +0 -1
  111. package/dist/mcps/agent-resolver.js +0 -1
  112. package/dist/mcps/architect-tools.server.js +119 -185
  113. package/dist/mcps/auto-format.server.js +56 -74
  114. package/dist/mcps/boot-orchestrator.server.js +67 -85
  115. package/dist/mcps/config/config-loader.js +6 -0
  116. package/dist/mcps/config/plugin-server-registry.js +0 -1
  117. package/dist/mcps/enforcer-tools.server.js +207 -273
  118. package/dist/mcps/estimation.server.js +63 -107
  119. package/dist/mcps/framework-compliance-audit.server.js +52 -81
  120. package/dist/mcps/framework-help.server.js +71 -89
  121. package/dist/mcps/governance.server.js +97 -149
  122. package/dist/mcps/knowledge-skills/api-design.server.js +33 -65
  123. package/dist/mcps/knowledge-skills/architecture-patterns.server.js +33 -65
  124. package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +123 -163
  125. package/dist/mcps/knowledge-skills/code-analyzer.server.js +210 -237
  126. package/dist/mcps/knowledge-skills/code-review.server.js +108 -142
  127. package/dist/mcps/knowledge-skills/content-creator.server.js +203 -225
  128. package/dist/mcps/knowledge-skills/database-design.server.js +116 -150
  129. package/dist/mcps/knowledge-skills/devops-deployment.server.js +123 -157
  130. package/dist/mcps/knowledge-skills/git-workflow.server.js +34 -67
  131. package/dist/mcps/knowledge-skills/growth-strategist.server.js +301 -323
  132. package/dist/mcps/knowledge-skills/log-monitor.server.js +139 -159
  133. package/dist/mcps/knowledge-skills/mobile-development.server.js +170 -200
  134. package/dist/mcps/knowledge-skills/multimodal-looker.server.js +122 -158
  135. package/dist/mcps/knowledge-skills/performance-optimization.server.js +88 -138
  136. package/dist/mcps/knowledge-skills/project-analysis.server.js +131 -218
  137. package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +115 -150
  138. package/dist/mcps/knowledge-skills/security-audit.server.js +16 -143
  139. package/dist/mcps/knowledge-skills/seo-consultant.server.js +20 -213
  140. package/dist/mcps/knowledge-skills/session-management.server.js +13 -90
  141. package/dist/mcps/knowledge-skills/skill-invocation.server.js +43 -421
  142. package/dist/mcps/knowledge-skills/strategist.server.js +10 -55
  143. package/dist/mcps/knowledge-skills/tech-writer.server.js +16 -191
  144. package/dist/mcps/knowledge-skills/testing-best-practices.server.js +18 -191
  145. package/dist/mcps/knowledge-skills/testing-strategy.server.js +18 -156
  146. package/dist/mcps/knowledge-skills/ui-ux-design.server.js +22 -296
  147. package/dist/mcps/lint.server.js +50 -91
  148. package/dist/mcps/model-health-check.server.js +32 -60
  149. package/dist/mcps/orchestrator/aside-context.js +207 -0
  150. package/dist/mcps/orchestrator/handlers/complexity-handler.js +5 -1
  151. package/dist/mcps/orchestrator/handlers/status-handler.js +8 -1
  152. package/dist/mcps/orchestrator/handlers/task-handler.js +5 -0
  153. package/dist/mcps/orchestrator/index.js +5 -0
  154. package/dist/mcps/orchestrator/server.js +63 -8
  155. package/dist/mcps/performance-analysis.server.js +56 -87
  156. package/dist/mcps/processor-pipeline.server.js +68 -99
  157. package/dist/mcps/researcher.server.js +80 -153
  158. package/dist/mcps/security-scan.server.js +56 -70
  159. package/dist/mcps/shared/knowledge-skill-base.js +11 -4
  160. package/dist/mcps/state-manager.server.js +124 -152
  161. package/dist/monitoring/nudge-watchdog.js +0 -1
  162. package/dist/nucleus/default-plugins.js +13 -19
  163. package/dist/nucleus/index.js +0 -1
  164. package/dist/orchestrator/agent-spawn-governor.js +0 -1
  165. package/dist/orchestrator/intelligent-commit-batcher.js +2 -10
  166. package/dist/orchestrator/multi-agent-orchestration-coordinator.js +0 -1
  167. package/dist/orchestrator/orchestrator.js +8 -18
  168. package/dist/orchestrator/self-direction-activation.js +0 -1
  169. package/dist/orchestrator/universal-registry-bridge.js +0 -1
  170. package/dist/performance/performance-budget-enforcer.js +0 -1
  171. package/dist/performance/performance-regression-tester.js +0 -1
  172. package/dist/plugin/plugin-codex-context.js +87 -0
  173. package/dist/plugin/plugin-helpers.js +155 -0
  174. package/dist/plugin/plugin-logger.js +46 -0
  175. package/dist/plugin/plugin-modules.js +144 -0
  176. package/dist/plugin/plugin-quality-gate.js +88 -0
  177. package/dist/plugin/plugin-types.js +1 -0
  178. package/dist/plugin/xray-codex-injection.js +338 -0
  179. package/dist/postprocessor/PostProcessor.js +3 -9
  180. package/dist/postprocessor/analysis/CodeChangeAnalyzer.js +50 -0
  181. package/dist/postprocessor/config/ProcessorConfigLoader.js +16 -0
  182. package/dist/postprocessor/integration.js +194 -0
  183. package/dist/postprocessor/metamorphosis/SelfProposalEngine.js +472 -0
  184. package/dist/postprocessor/metamorphosis/index.js +1 -0
  185. package/dist/postprocessor/redeploy/RetryHandler.js +118 -0
  186. package/dist/postprocessor/services/RegressionAnalysisService.js +0 -1
  187. package/dist/postprocessor/triggers/APITrigger.js +0 -1
  188. package/dist/postprocessor/triggers/WebhookTrigger.js +0 -1
  189. package/dist/processors/implementations/agents-md-validation-processor.js +0 -1
  190. package/dist/processors/implementations/async-pattern-processor.js +0 -1
  191. package/dist/processors/implementations/console-log-guard-processor.js +0 -1
  192. package/dist/processors/implementations/coverage-analysis-processor.js +0 -1
  193. package/dist/processors/implementations/inference-improvement-processor.js +2 -9
  194. package/dist/processors/implementations/log-protection-processor.js +0 -1
  195. package/dist/processors/implementations/nudge-processor.js +0 -1
  196. package/dist/processors/implementations/performance-budget-processor.js +0 -1
  197. package/dist/processors/implementations/postprocessor-chain-validator.js +0 -1
  198. package/dist/processors/implementations/publish-preflight-processor.js +4 -12
  199. package/dist/processors/implementations/session-summary-processor.js +8 -16
  200. package/dist/processors/implementations/spawn-governance-processor.js +0 -1
  201. package/dist/processors/implementations/storytelling-trigger-processor.js +3 -28
  202. package/dist/processors/implementations/test-auto-creation-processor.js +0 -1
  203. package/dist/processors/implementations/typescript-compilation-processor.js +0 -1
  204. package/dist/processors/implementations/version-compliance-processor.js +0 -1
  205. package/dist/processors/processor-interfaces.js +0 -1
  206. package/dist/processors/processor-types.js +0 -1
  207. package/dist/scripts/integration.js +0 -1
  208. package/dist/security/comprehensive-security-audit.js +0 -1
  209. package/dist/security/security-agent-coordinator.js +0 -1
  210. package/dist/security/security-auditor.js +0 -1
  211. package/dist/security/security-hardener.js +0 -1
  212. package/dist/security/security-hardening-system.js +0 -1
  213. package/dist/security/security-headers.js +0 -1
  214. package/dist/security/security-orchestration-layer.js +0 -1
  215. package/dist/services/inference-tuner.js +0 -1
  216. package/dist/session/session-cleanup-manager.js +0 -1
  217. package/dist/session/session-monitor.js +0 -1
  218. package/dist/session/session-state-manager.js +0 -1
  219. package/dist/skills/xray-orchestrator/index.js +0 -1
  220. package/dist/utils/codex-parser.js +0 -1
  221. package/dist/utils/language-detector.js +0 -1
  222. package/dist/utils/shutdown-handler.js +0 -1
  223. package/dist/validation/agent-config-validator.js +280 -0
  224. package/dist/validation/orchestration-flow-validator.js +606 -0
  225. package/package.json +1 -1
  226. package/scripts/node/release.mjs +2 -2
  227. package/scripts/node/setup.cjs +28 -0
  228. package/scripts/node/universal-version-manager.js +1 -1
  229. package/src/mcps/agent-resolver.ts +0 -1
  230. package/src/mcps/architect-tools.server.ts +129 -211
  231. package/src/mcps/auto-format.server.ts +74 -103
  232. package/src/mcps/boot-orchestrator.server.ts +71 -96
  233. package/src/mcps/config/__tests__/config-loader.test.ts +6 -6
  234. package/src/mcps/config/config-loader.ts +7 -0
  235. package/src/mcps/config/plugin-server-registry.ts +0 -1
  236. package/src/mcps/enforcer-tools.server.ts +217 -294
  237. package/src/mcps/estimation.server.ts +62 -122
  238. package/src/mcps/framework-compliance-audit.server.ts +53 -95
  239. package/src/mcps/framework-help.server.ts +74 -96
  240. package/src/mcps/governance.server.ts +97 -162
  241. package/src/mcps/knowledge-skills/api-design.server.ts +33 -72
  242. package/src/mcps/knowledge-skills/architecture-patterns.server.ts +33 -72
  243. package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +148 -193
  244. package/src/mcps/knowledge-skills/code-analyzer.server.ts +222 -254
  245. package/src/mcps/knowledge-skills/code-review.server.ts +115 -157
  246. package/src/mcps/knowledge-skills/content-creator.server.ts +219 -246
  247. package/src/mcps/knowledge-skills/database-design.server.ts +119 -160
  248. package/src/mcps/knowledge-skills/devops-deployment.server.ts +126 -167
  249. package/src/mcps/knowledge-skills/git-workflow.server.ts +32 -77
  250. package/src/mcps/knowledge-skills/growth-strategist.server.ts +322 -360
  251. package/src/mcps/knowledge-skills/log-monitor.server.ts +68 -95
  252. package/src/mcps/knowledge-skills/mobile-development.server.ts +16 -56
  253. package/src/mcps/knowledge-skills/multimodal-looker.server.ts +13 -59
  254. package/src/mcps/knowledge-skills/performance-optimization.server.ts +13 -74
  255. package/src/mcps/knowledge-skills/project-analysis.server.ts +13 -120
  256. package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +13 -60
  257. package/src/mcps/knowledge-skills/security-audit.server.ts +19 -157
  258. package/src/mcps/knowledge-skills/seo-consultant.server.ts +23 -227
  259. package/src/mcps/knowledge-skills/session-management.server.ts +17 -106
  260. package/src/mcps/knowledge-skills/skill-invocation.server.ts +45 -446
  261. package/src/mcps/knowledge-skills/strategist.server.ts +13 -63
  262. package/src/mcps/knowledge-skills/tech-writer.server.ts +19 -204
  263. package/src/mcps/knowledge-skills/testing-best-practices.server.ts +21 -204
  264. package/src/mcps/knowledge-skills/testing-strategy.server.ts +21 -165
  265. package/src/mcps/knowledge-skills/ui-ux-design.server.ts +25 -342
  266. package/src/mcps/lint.server.ts +52 -105
  267. package/src/mcps/model-health-check.server.ts +34 -70
  268. package/src/mcps/orchestrator/aside-context.ts +245 -0
  269. package/src/mcps/orchestrator/handlers/complexity-handler.ts +9 -3
  270. package/src/mcps/orchestrator/handlers/status-handler.ts +11 -1
  271. package/src/mcps/orchestrator/handlers/task-handler.ts +8 -1
  272. package/src/mcps/orchestrator/index.ts +29 -0
  273. package/src/mcps/orchestrator/server.ts +79 -24
  274. package/src/mcps/orchestrator/types.ts +37 -0
  275. package/src/mcps/performance-analysis.server.ts +59 -102
  276. package/src/mcps/processor-pipeline.server.ts +70 -108
  277. package/src/mcps/researcher.server.ts +87 -175
  278. package/src/mcps/security-scan.server.ts +57 -76
  279. package/src/mcps/shared/knowledge-skill-base.ts +12 -4
  280. package/src/mcps/state-manager.server.ts +129 -169
  281. package/src/opencode/codex.codex +1 -1
  282. package/src/opencode/commands/auto-format.md +3 -3
  283. package/src/opencode/commands/auto-summary-capture.md +2 -2
  284. package/src/opencode/commands/enforcer-daily-scan.md +3 -3
  285. package/src/opencode/commands/framework-compliance-audit.md +4 -4
  286. package/src/opencode/commands/interactive-validator.md +2 -2
  287. package/src/opencode/commands/job-summary-logger.md +2 -2
  288. package/src/opencode/commands/mode-switch.md +1 -1
  289. package/src/opencode/commands/model-health-check.md +2 -2
  290. package/src/opencode/commands/performance-analysis.md +2 -2
  291. package/src/opencode/commands/pre-commit-introspection.md +3 -3
  292. package/src/opencode/commands/security-scan.md +3 -3
  293. package/src/opencode/commands/sisyphus-validation.md +3 -3
  294. package/src/opencode/commands/summary-logger.md +2 -2
  295. package/src/skills/xray-orchestrator/index.ts +0 -1
  296. package/dist/nucleus/orchestrator.js +0 -479
@@ -0,0 +1,338 @@
1
+ /**
2
+ * Consumer runtime compat shim from prior 0xRay releases (1-line min per Scope Rule; xray codex injection + .xray fallbacks).
3
+ */
4
+ import * as fs from "fs";
5
+ import * as path from "path";
6
+ import { getOrCreateLogger } from "./plugin-logger.js";
7
+ import { resolveStateDir, importSystemPromptGenerator, loadXrayComponents, getProcessorManager, getXrayStateManager, getFeaturesConfigLoader, getDetectTaskType, getSystemPromptGenerator, } from "./plugin-modules.js";
8
+ import { getFrameworkIdentity, classifyTaskType, isWriteEditOperation, isPublishOperation, resolveAgentName, registerAllProcessors, registerAfterPostProcessors, logPreProcessorResults, logPostProcessorResults, logTestAutoCreationResult, spawnPromise, } from "./plugin-helpers.js";
9
+ import { runEnforcerQualityGate } from "./plugin-quality-gate.js";
10
+ // Re-export all public API for test compatibility
11
+ export { classifyTaskType } from "./plugin-helpers.js";
12
+ export { validateModulePath } from "./plugin-modules.js";
13
+ export { extractCodexMetadata, createCodexContextEntry, formatCodexContext } from "./plugin-codex-context.js";
14
+ export { isWriteEditOperation, isPublishOperation, TOOL_AGENT_MAP, registerAllProcessors, registerAfterPostProcessors, resolveAgentName, getFrameworkVersion, getFrameworkIdentity } from "./plugin-helpers.js";
15
+ export { runEnforcerQualityGate } from "./plugin-quality-gate.js";
16
+ export { PluginLogger } from "./plugin-logger.js";
17
+ const INFERENCE_TUNE_INTERVAL = 100;
18
+ let _openCodeToolCallCount = 0;
19
+ let _lastTuneToolCallCount = 0;
20
+ export default async function xrayCodexPlugin(input) {
21
+ const { directory: inputDirectory } = input;
22
+ const directory = inputDirectory || process.cwd();
23
+ return {
24
+ "experimental.chat.system.transform": async (_input, output) => {
25
+ try {
26
+ await importSystemPromptGenerator();
27
+ let leanPrompt = getFrameworkIdentity();
28
+ const _systemPromptGenerator = getSystemPromptGenerator();
29
+ if (_systemPromptGenerator) {
30
+ leanPrompt = await _systemPromptGenerator({
31
+ showWelcomeBanner: true,
32
+ showCodexContext: false,
33
+ enableTokenOptimization: true,
34
+ maxTokenBudget: 8192,
35
+ showCriticalTermsOnly: true,
36
+ showEssentialLinks: true,
37
+ });
38
+ }
39
+ if (output.system && Array.isArray(output.system)) {
40
+ output.system = [leanPrompt];
41
+ }
42
+ }
43
+ catch (error) {
44
+ const logger = await getOrCreateLogger(directory);
45
+ logger.error("System prompt injection failed:", error);
46
+ const fallback = getFrameworkIdentity();
47
+ if (output.system && Array.isArray(output.system)) {
48
+ output.system = [fallback];
49
+ }
50
+ }
51
+ },
52
+ "tool.execute.before": async (input, output) => {
53
+ const logger = await getOrCreateLogger(directory);
54
+ logger.log(`🚀 TOOL EXECUTE BEFORE HOOK FIRED: ${input.tool}`);
55
+ logger.log(`📥 Full input: ${JSON.stringify(input)}`);
56
+ await loadXrayComponents();
57
+ const _featuresConfigLoader = getFeaturesConfigLoader();
58
+ const _detectTaskType = getDetectTaskType();
59
+ if (_featuresConfigLoader && _detectTaskType) {
60
+ try {
61
+ const config = _featuresConfigLoader.loadConfig();
62
+ if (config.model_routing?.enabled) {
63
+ const taskType = _detectTaskType(input.tool);
64
+ const routing = taskType !== "unknown"
65
+ ? config.model_routing.task_routing?.[taskType]
66
+ : undefined;
67
+ if (routing?.model) {
68
+ output.model = routing.model;
69
+ logger.log(`Model routed: ${input.tool} → ${taskType} → ${routing.model}`);
70
+ }
71
+ }
72
+ }
73
+ catch (e) {
74
+ logger.error("Model routing error", e);
75
+ }
76
+ }
77
+ const { tool, args } = input;
78
+ const qualityGateResult = await runEnforcerQualityGate(input, logger);
79
+ if (!qualityGateResult.passed) {
80
+ logger.error(`🚫 Quality gate failed: ${qualityGateResult.violations.join(", ")}`);
81
+ throw new Error(`ENFORCER BLOCKED: ${qualityGateResult.violations.join("; ")}`);
82
+ }
83
+ logger.log(`✅ Quality gate passed for ${tool}`);
84
+ if (isWriteEditOperation(tool)) {
85
+ const _ProcessorManager = getProcessorManager();
86
+ const _XrayStateManager = getXrayStateManager();
87
+ if (!_ProcessorManager || !_XrayStateManager) {
88
+ logger.error("ProcessorManager or XrayStateManager not loaded");
89
+ return;
90
+ }
91
+ let stateManager;
92
+ let processorManager;
93
+ const globalState = globalThis.xrayStateManager;
94
+ if (globalState) {
95
+ logger.log("🔗 Connecting to booted 0xRay framework");
96
+ stateManager = globalState;
97
+ }
98
+ else {
99
+ logger.log("🚀 0xRay framework not booted, initializing...");
100
+ stateManager = new _XrayStateManager(await resolveStateDir(directory));
101
+ globalThis.xrayStateManager = stateManager;
102
+ }
103
+ processorManager = stateManager.get("processor:manager") ?? null;
104
+ if (!processorManager) {
105
+ logger.log("⚙️ Creating and registering processors...");
106
+ processorManager = new _ProcessorManager(stateManager);
107
+ registerAllProcessors(processorManager);
108
+ stateManager.set("processor:manager", processorManager);
109
+ logger.log("✅ Processors registered successfully");
110
+ }
111
+ else {
112
+ logger.log("✅ Using existing processor manager");
113
+ }
114
+ try {
115
+ logger.log(`▶️ Executing pre-processors for ${tool}...`);
116
+ const preProcessorInput = {
117
+ tool,
118
+ args: args,
119
+ context: {
120
+ directory,
121
+ operation: "tool_execution",
122
+ filePath: args?.filePath,
123
+ },
124
+ };
125
+ const result = await processorManager.executePreProcessors(preProcessorInput);
126
+ logPreProcessorResults(result, logger);
127
+ }
128
+ catch (error) {
129
+ logger.error(`💥 Pre-processor execution error`, error);
130
+ }
131
+ try {
132
+ logger.log(`▶️ Executing post-processors for ${tool}...`);
133
+ logger.log(`📝 Post-processor args: ${JSON.stringify(args)}`);
134
+ const agentName = resolveAgentName(input);
135
+ const postProcessorContext = {
136
+ directory,
137
+ operation: tool,
138
+ filePath: args?.filePath,
139
+ success: true,
140
+ agentName,
141
+ metadata: {
142
+ isPublishing: isPublishOperation(tool),
143
+ hook: "tool_execution",
144
+ toolName: tool,
145
+ timestamp: Date.now(),
146
+ agentType: agentName,
147
+ },
148
+ };
149
+ const postResults = await processorManager.executePostProcessors(tool, postProcessorContext, []);
150
+ logPostProcessorResults(postResults, logger);
151
+ }
152
+ catch (error) {
153
+ logger.error(`💥 Post-processor execution error`, error);
154
+ }
155
+ }
156
+ },
157
+ "tool.execute.after": async (input, _output) => {
158
+ const logger = await getOrCreateLogger(directory);
159
+ await loadXrayComponents();
160
+ const { tool, args, result } = input;
161
+ try {
162
+ const { routingOutcomeTracker } = await import("../delegation/analytics/outcome-tracker.js");
163
+ const { TOOL_AGENT_MAP } = await import("./plugin-helpers.js");
164
+ const mapping = TOOL_AGENT_MAP[tool];
165
+ const taskType = classifyTaskType(tool, args);
166
+ const rawDesc = args?.content
167
+ ? String(args.content).slice(0, 150)
168
+ : args?.filePath
169
+ ? String(args.filePath)
170
+ : args?.command
171
+ ? String(args.command).slice(0, 150)
172
+ : tool;
173
+ const description = `[${taskType}] ${rawDesc}`;
174
+ const outcomeFields = {
175
+ taskId: `opencode-${_openCodeToolCallCount}`,
176
+ taskDescription: description,
177
+ routedAgent: mapping?.agent ?? "direct",
178
+ routedSkill: mapping?.skill ?? tool,
179
+ confidence: mapping ? 0.8 : 0.5,
180
+ success: result?.error == null,
181
+ routingMethod: mapping ? "keyword" : "default",
182
+ };
183
+ if (taskType !== "unknown")
184
+ outcomeFields.taskType = taskType;
185
+ routingOutcomeTracker.recordOutcome(outcomeFields);
186
+ }
187
+ catch {
188
+ // Outcome tracker not available — skip silently
189
+ }
190
+ logger.log(`📥 After hook input: ${JSON.stringify({ tool, hasArgs: !!args, args, hasResult: !!result }).slice(0, 200)}`);
191
+ if (isWriteEditOperation(tool)) {
192
+ const _ProcessorManager = getProcessorManager();
193
+ const _XrayStateManager = getXrayStateManager();
194
+ if (!_ProcessorManager || !_XrayStateManager)
195
+ return;
196
+ const stateManager = new _XrayStateManager(await resolveStateDir(directory));
197
+ const processorManager = new _ProcessorManager(stateManager);
198
+ registerAfterPostProcessors(processorManager);
199
+ try {
200
+ logger.log(`📝 Post-processor tool: ${tool}`);
201
+ logger.log(`📝 Post-processor args: ${JSON.stringify(args)}`);
202
+ logger.log(`📝 Post-processor directory: ${directory}`);
203
+ const postProcessorContext = {
204
+ directory,
205
+ operation: tool,
206
+ filePath: args?.filePath,
207
+ success: result?.success !== false,
208
+ metadata: {
209
+ isPublishing: isPublishOperation(tool),
210
+ hook: "tool_execution",
211
+ toolName: tool,
212
+ timestamp: Date.now(),
213
+ },
214
+ };
215
+ const postResults = await processorManager.executePostProcessors(tool, postProcessorContext, []);
216
+ logPostProcessorResults(postResults, logger);
217
+ logTestAutoCreationResult(postResults, logger);
218
+ }
219
+ catch (error) {
220
+ logger.error(`💥 Post-processor error`, error);
221
+ }
222
+ }
223
+ _openCodeToolCallCount++;
224
+ if (_openCodeToolCallCount - _lastTuneToolCallCount >= INFERENCE_TUNE_INTERVAL) {
225
+ _lastTuneToolCallCount = _openCodeToolCallCount;
226
+ try {
227
+ const { inferenceTuner } = await import("../services/inference-tuner.js");
228
+ inferenceTuner
229
+ .runTuningCycle()
230
+ .then(() => {
231
+ logger.log(`🔄 Inference tuning cycle completed (call #${_openCodeToolCallCount})`);
232
+ })
233
+ .catch((err) => {
234
+ logger.log(`⚠️ Inference tuning cycle skipped: ${err instanceof Error ? err.message : String(err)}`);
235
+ });
236
+ }
237
+ catch {
238
+ // Tuner not available in this environment — skip silently
239
+ }
240
+ }
241
+ },
242
+ "chat.message": async (input, output) => {
243
+ const logger = await getOrCreateLogger(directory);
244
+ if (!output.parts) {
245
+ return;
246
+ }
247
+ const textContent = input.parts?.find(p => p.type === "text")?.text ?? "";
248
+ if (!textContent) {
249
+ return;
250
+ }
251
+ const agentMentionRegex = /@([\w-]+)(?:\s+(.+?))?(?=$|\n\n|\r\r)/g;
252
+ let match;
253
+ let hasAgentMention = false;
254
+ let transformedText = textContent;
255
+ const knownAgents = {
256
+ "architect": "architect",
257
+ "strategist": "strategist",
258
+ "testinglead": "testing-lead",
259
+ "bugtriagespecialist": "bug-triage-specialist",
260
+ "codereviewer": "code-reviewer",
261
+ "securityauditor": "security-auditor",
262
+ "refactorer": "refactorer",
263
+ "researcher": "researcher",
264
+ "codeanalyzer": "code-analyzer",
265
+ "frontendengineer": "frontend-engineer",
266
+ "frontenduiuxengineer": "frontend-ui-ux-engineer",
267
+ "backendengineer": "backend-engineer",
268
+ "databaseengineer": "database-engineer",
269
+ "devopsengineer": "devops-engineer",
270
+ "performanceengineer": "performance-engineer",
271
+ "mobiledeveloper": "mobile-developer",
272
+ "contentcreator": "content-creator",
273
+ "growthstrategist": "growth-strategist",
274
+ "seoconsultant": "seo-consultant",
275
+ "techwriter": "tech-writer",
276
+ "multimodallooker": "multimodal-looker",
277
+ "logmonitor": "log-monitor",
278
+ };
279
+ while ((match = agentMentionRegex.exec(textContent)) !== null) {
280
+ const agentName = match[1].toLowerCase().replace(/-/g, "");
281
+ const taskPart = match[2]?.trim() ?? "";
282
+ if (knownAgents[agentName]) {
283
+ hasAgentMention = true;
284
+ const canonicalAgent = knownAgents[agentName];
285
+ logger.log(`🎯 Agent mention detected: @${canonicalAgent}`);
286
+ const prefix = `\n[DELEGATE TO AGENT: ${canonicalAgent}]\n`;
287
+ transformedText = prefix + (taskPart || textContent.replace(`@${match[1]}`, "").trim());
288
+ break;
289
+ }
290
+ }
291
+ if (hasAgentMention) {
292
+ const textPart = output.parts.find(p => p.type === "text");
293
+ if (textPart) {
294
+ textPart.text = transformedText;
295
+ logger.log(`✅ Transformed prompt for agent routing`);
296
+ }
297
+ }
298
+ },
299
+ config: async (_config) => {
300
+ const lockFile = path.join(directory, ".opencode", "logs", ".xray-init.lock");
301
+ const now = Date.now();
302
+ try {
303
+ if (fs.existsSync(lockFile)) {
304
+ const stat = fs.statSync(lockFile);
305
+ if (now - stat.mtimeMs < 15000) {
306
+ return;
307
+ }
308
+ }
309
+ fs.writeFileSync(lockFile, String(now));
310
+ }
311
+ catch {
312
+ // lock check failed — proceed anyway
313
+ }
314
+ const logger = await getOrCreateLogger(directory);
315
+ logger.log("🔧 Plugin config hook triggered - initializing 0xRay integration");
316
+ let initScriptPath = path.join(directory, ".opencode", "init.sh");
317
+ const pkgInitPath = path.join(directory, "node_modules", "0xray", ".opencode", "init.sh");
318
+ if (!fs.existsSync(initScriptPath) && fs.existsSync(pkgInitPath)) {
319
+ initScriptPath = pkgInitPath;
320
+ }
321
+ if (fs.existsSync(initScriptPath)) {
322
+ try {
323
+ const { stderr } = await spawnPromise("bash", [initScriptPath], directory);
324
+ if (stderr) {
325
+ logger.error(`Framework init error: ${stderr}`);
326
+ }
327
+ else {
328
+ logger.log("✅ 0xRay Framework initialized successfully");
329
+ }
330
+ }
331
+ catch (error) {
332
+ logger.error("Framework initialization failed", error);
333
+ }
334
+ }
335
+ logger.log("✅ Plugin config hook completed");
336
+ },
337
+ };
338
+ }
@@ -4,12 +4,11 @@
4
4
  * Automated CI/CD loop orchestration: commit → push → monitor → fix → redeploy → monitor
5
5
  * Provides systematic error prevention and deployment automation.
6
6
  *
7
- * @version 1.0.0
8
7
  * @since 2026-01-13
9
8
  */
10
9
  import * as path from "path";
11
10
  import { frameworkLogger } from "../core/framework-logger.js";
12
- import { resolveConfigPath } from "../core/config-paths.js";
11
+ import { featuresConfigLoader } from "../core/features-config.js";
13
12
  import { GitHookTrigger } from "./triggers/GitHookTrigger.js";
14
13
  import { WebhookTrigger } from "./triggers/WebhookTrigger.js";
15
14
  import { APITrigger } from "./triggers/APITrigger.js";
@@ -205,14 +204,9 @@ export class PostProcessor {
205
204
  * FIX: Issue #2 - Make processor registration configurable
206
205
  */
207
206
  async loadProcessorConfig() {
208
- const fs = await import("fs");
209
- const path = await import("path");
210
207
  try {
211
- const configPath = resolveConfigPath("features.json") ?? path.join(process.cwd(), ".xray", "features.json");
212
- if (fs.existsSync(configPath)) {
213
- const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
214
- return config.processors || {};
215
- }
208
+ const config = featuresConfigLoader.loadConfig();
209
+ return config.processors ?? {};
216
210
  }
217
211
  catch (error) {
218
212
  frameworkLogger.log("postprocessor", "processor-config-load-failed", "info", {
@@ -0,0 +1,50 @@
1
+ import { frameworkLogger } from "../../core/framework-logger.js";
2
+ export class CodeChangeAnalyzer {
3
+ async analyzeCodeChanges(context) {
4
+ const fs = await import("fs");
5
+ const path = await import("path");
6
+ const newCode = new Map();
7
+ const existingCode = new Map();
8
+ const tests = [];
9
+ const dependencies = [];
10
+ try {
11
+ // Read new/changed files
12
+ for (const file of context.files || []) {
13
+ try {
14
+ const fullPath = path.join(process.cwd(), file);
15
+ if (fs.existsSync(fullPath)) {
16
+ // Read new code
17
+ const content = fs.readFileSync(fullPath, "utf-8");
18
+ newCode.set(file, content);
19
+ // Check for test files
20
+ if (file.includes(".test.") || file.includes(".spec.")) {
21
+ tests.push(file);
22
+ }
23
+ // Check for package.json or dependency files
24
+ if (file.includes("package.json") || file.includes("requirements.txt") || file.includes("Cargo.toml")) {
25
+ dependencies.push(file);
26
+ }
27
+ }
28
+ }
29
+ catch (error) {
30
+ // Skip files that can't be read
31
+ await frameworkLogger.log("-post-processor", "-code-analysis-file-error", "info", { message: `Could not analyze ${file}: ${error}` });
32
+ }
33
+ }
34
+ await frameworkLogger.log("-post-processor", "-code-analysis-complete", "info", {
35
+ message: `Analyzed ${newCode.size} files, ${tests.length} tests, ${dependencies.length} dependencies`,
36
+ });
37
+ }
38
+ catch (error) {
39
+ await frameworkLogger.log("-post-processor", "-code-analysis-failed", "error", { message: `Code analysis failed: ${error}` });
40
+ }
41
+ return {
42
+ operation: "commit",
43
+ files: context.files || [],
44
+ newCode,
45
+ existingCode,
46
+ tests,
47
+ dependencies,
48
+ };
49
+ }
50
+ }
@@ -0,0 +1,16 @@
1
+ import { featuresConfigLoader } from "../../core/features-config.js";
2
+ import { frameworkLogger } from "../../core/framework-logger.js";
3
+ export class ProcessorConfigLoader {
4
+ async loadProcessorConfig() {
5
+ try {
6
+ const config = featuresConfigLoader.loadConfig();
7
+ return config.processors ?? {};
8
+ }
9
+ catch (error) {
10
+ frameworkLogger.log("postprocessor", "processor-config-load-failed", "info", {
11
+ error: error instanceof Error ? error.message : String(error),
12
+ });
13
+ }
14
+ return {};
15
+ }
16
+ }
@@ -0,0 +1,194 @@
1
+ /**
2
+ * 0xRay Integration Layer
3
+ *
4
+ * Provides generic connectors for integrating 0xRay's PostProcessor
5
+ * with external applications and frameworks.
6
+ *
7
+ * This is framework-agnostic - works with Express, Fastify, Koa, etc.
8
+ *
9
+ * @since 2026-03-08
10
+ */
11
+ export { WebhookTrigger } from './triggers/WebhookTrigger.js';
12
+ export { APITrigger } from './triggers/APITrigger.js';
13
+ /**
14
+ * Generic 0xRay integration for any external application
15
+ *
16
+ * Provides:
17
+ * - Webhook receivers (GitHub, GitLab, Bitbucket, Stripe)
18
+ * - REST API triggers (manual trigger, retry, status)
19
+ * - Framework-agnostic (works with Express, Fastify, Koa, etc.)
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * import { createXrayIntegration } from '0xray/integration';
24
+ *
25
+ * const postProcessor = new PostProcessor(stateManager);
26
+ * const integration = createXrayIntegration(postProcessor);
27
+ *
28
+ * // Get Express app for mounting
29
+ * app.use('/webhooks', integration.getWebhookApp());
30
+ * app.use('/api/post-process', integration.getAPIApp());
31
+ *
32
+ * // Or get raw routers for Fastify/Koa
33
+ * const webhookRouter = integration.getWebhookRouter();
34
+ * const apiRouter = integration.getAPIRouter();
35
+ * ```
36
+ */
37
+ export class XrayIntegration {
38
+ postProcessor;
39
+ webhookTrigger = null;
40
+ apiTrigger = null;
41
+ constructor(postProcessor) {
42
+ this.postProcessor = postProcessor;
43
+ }
44
+ /**
45
+ * Initialize all triggers with default configuration
46
+ *
47
+ * @param config - Optional configuration for triggers
48
+ */
49
+ async initialize(config) {
50
+ const { WebhookTrigger } = await import('./triggers/WebhookTrigger.js');
51
+ const { APITrigger } = await import('./triggers/APITrigger.js');
52
+ // Initialize webhook trigger with default GitHub config
53
+ this.webhookTrigger = new WebhookTrigger(this.postProcessor, {
54
+ provider: 'github',
55
+ events: ['push', 'pull_request'],
56
+ path: '/webhooks/github',
57
+ verifySignature: true,
58
+ ...config?.webhook
59
+ });
60
+ await this.webhookTrigger.initialize();
61
+ // Initialize API trigger with default config
62
+ this.apiTrigger = new APITrigger(this.postProcessor, {
63
+ enabled: true,
64
+ path: '/api/post-process',
65
+ ...config?.api
66
+ });
67
+ await this.apiTrigger.initialize();
68
+ }
69
+ /**
70
+ * Get webhook app for framework-specific mounting
71
+ *
72
+ * Returns an Express Application. For other frameworks,
73
+ * use getWebhookRouter() to get the router instance.
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * // Express
78
+ * app.use('/webhooks', integration.getWebhookApp());
79
+ *
80
+ * // Fastify
81
+ * await fastify.register(integration.getWebhookRouter(), { prefix: '/webhooks' });
82
+ *
83
+ * // Koa
84
+ * app.use(integration.getWebhookRouter().routes());
85
+ * ```
86
+ */
87
+ getWebhookApp() {
88
+ return this.webhookTrigger?.getApp() ?? null;
89
+ }
90
+ /**
91
+ * Get webhook router (raw Express router)
92
+ *
93
+ * Useful for frameworks that need the router instance directly
94
+ * rather than the full Express app.
95
+ */
96
+ getWebhookRouter() {
97
+ return this.webhookTrigger?.getApp() ?? null;
98
+ }
99
+ /**
100
+ * Get API trigger app for framework-specific mounting
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * // Express
105
+ * app.use('/api/post-process', integration.getAPIApp());
106
+ *
107
+ * // Fastify
108
+ * await fastify.register(integration.getAPIRouter(), { prefix: '/api/post-process' });
109
+ * ```
110
+ */
111
+ getAPIApp() {
112
+ return this.apiTrigger?.getApp() ?? null;
113
+ }
114
+ /**
115
+ * Get API trigger router (raw Express router)
116
+ *
117
+ * Useful for frameworks that need the router instance directly.
118
+ */
119
+ getAPIRouter() {
120
+ return this.apiTrigger?.getApp() ?? null;
121
+ }
122
+ /**
123
+ * Manually trigger PostProcessor via API
124
+ *
125
+ * Convenience method for programmatic triggering without
126
+ * going through the HTTP endpoint.
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * await integration.trigger({
131
+ * tool: 'test',
132
+ * operation: 'run',
133
+ * reason: 'Manual test trigger'
134
+ * });
135
+ * ```
136
+ */
137
+ async trigger(options) {
138
+ const context = {
139
+ commitSha: `manual-${Date.now()}`,
140
+ repository: '',
141
+ branch: '',
142
+ author: 'manual',
143
+ files: [],
144
+ trigger: 'manual',
145
+ tool: options.tool,
146
+ operation: options.operation,
147
+ ...(options.filePath !== undefined ? { filePath: options.filePath } : {}),
148
+ ...(options.directory !== undefined ? { directory: options.directory } : {}),
149
+ };
150
+ await this.postProcessor.executePostProcessorLoop(context);
151
+ }
152
+ /**
153
+ * Shutdown all triggers
154
+ */
155
+ async shutdown() {
156
+ if (this.webhookTrigger) {
157
+ this.webhookTrigger.shutdown();
158
+ }
159
+ if (this.apiTrigger) {
160
+ this.apiTrigger.shutdown();
161
+ }
162
+ }
163
+ }
164
+ /**
165
+ * Factory function for easy integration setup
166
+ *
167
+ * @example
168
+ * ```typescript
169
+ * import { createXrayIntegration } from '0xray/integration';
170
+ *
171
+ * // With default configuration
172
+ * const integration = createXrayIntegration(postProcessor);
173
+ * await integration.initialize();
174
+ *
175
+ * // With custom configuration
176
+ * const integration = createXrayIntegration(postProcessor);
177
+ * await integration.initialize({
178
+ * webhook: {
179
+ * provider: 'gitlab',
180
+ * secret: process.env.GITLAB_WEBHOOK_SECRET,
181
+ * events: ['push', 'merge_request'],
182
+ * path: '/webhooks/gitlab'
183
+ * },
184
+ * api: {
185
+ * path: '/api/stray-trigger',
186
+ * apiKey: process.env.API_KEY
187
+ * }
188
+ * });
189
+ * ```
190
+ */
191
+ export function createXrayIntegration(postProcessor) {
192
+ return new XrayIntegration(postProcessor);
193
+ }
194
+ // Backward compat aliases