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.
- package/.opencode/codex.codex +1 -1
- package/.opencode/commands/auto-format.md +3 -3
- package/.opencode/commands/auto-summary-capture.md +2 -2
- package/.opencode/commands/enforcer-daily-scan.md +3 -3
- package/.opencode/commands/framework-compliance-audit.md +4 -4
- package/.opencode/commands/interactive-validator.md +2 -2
- package/.opencode/commands/job-summary-logger.md +2 -2
- package/.opencode/commands/mode-switch.md +1 -1
- package/.opencode/commands/model-health-check.md +2 -2
- package/.opencode/commands/performance-analysis.md +2 -2
- package/.opencode/commands/pre-commit-introspection.md +3 -3
- package/.opencode/commands/security-scan.md +3 -3
- package/.opencode/commands/sisyphus-validation.md +3 -3
- package/.opencode/commands/summary-logger.md +2 -2
- package/AGENTS.md +3 -13
- package/README.md +3 -3
- package/dist/AGENTS.md +3 -13
- package/dist/CHANGELOG.md +29 -0
- package/dist/README.md +3 -3
- package/dist/analytics/consent-manager.js +0 -1
- package/dist/analytics/emerging-pattern-detector.js +0 -1
- package/dist/analytics/pattern-learning-engine.js +0 -1
- package/dist/analytics/pattern-performance-tracker.js +0 -1
- package/dist/analytics/predictive-analytics.js +0 -1
- package/dist/analytics/prompt-pattern-analyzer.js +0 -1
- package/dist/analytics/routing-performance-analyzer.js +0 -1
- package/dist/analytics/routing-refiner.js +0 -1
- package/dist/analytics/simple-pattern-analyzer.js +0 -1
- package/dist/cli/commands/archive-logs.js +0 -1
- package/dist/cli/commands/opencode-install.js +13 -0
- package/dist/cli/commands/plugin-commands.js +0 -1
- package/dist/cli/commands/status.js +11 -13
- package/dist/cli/index.js +2 -7
- package/dist/core/activity-logger.js +0 -1
- package/dist/core/adaptive-kernel.js +0 -1
- package/dist/core/boot-orchestrator.js +2 -12
- package/dist/core/bridge.mjs +0 -1
- package/dist/core/codex-formatter.js +0 -1
- package/dist/core/codex-injector.js +0 -1
- package/dist/core/config-loader.js +36 -28
- package/dist/core/context-loader.js +0 -1
- package/dist/core/context-validator.js +0 -1
- package/dist/core/features-config.js +37 -1
- package/dist/core/kernel-patterns.js +0 -1
- package/dist/core/model-router.js +23 -64
- package/dist/core/system-prompt-generator.js +0 -1
- package/dist/delegation/agent-delegator.js +0 -1
- package/dist/delegation/agent-expertise.js +0 -1
- package/dist/delegation/analytics/index.js +0 -1
- package/dist/delegation/analytics/learning-engine.js +0 -1
- package/dist/delegation/analytics/outcome-tracker.js +0 -1
- package/dist/delegation/analytics/routing-analytics.js +0 -1
- package/dist/delegation/ast-code-parser.js +0 -1
- package/dist/delegation/complexity-analyzer.js +0 -1
- package/dist/delegation/dependency-graph-builder.js +0 -1
- package/dist/delegation/index.js +0 -1
- package/dist/delegation/metrics-aggregator.js +0 -1
- package/dist/delegation/session-coordinator.js +0 -1
- package/dist/delegation/strategy-selector.js +0 -1
- package/dist/delegation/voting-coordinator.js +0 -1
- package/dist/delegation/voting-types.js +0 -1
- package/dist/delegation/weighted-voting-aggregator.js +0 -1
- package/dist/enforcement/core/index.js +0 -1
- package/dist/enforcement/core/rule-executor.js +0 -1
- package/dist/enforcement/core/rule-hierarchy.js +0 -1
- package/dist/enforcement/core/rule-registry.js +0 -1
- package/dist/enforcement/core/violation-fixer.js +0 -1
- package/dist/enforcement/index.js +0 -1
- package/dist/enforcement/loaders/agent-triage-loader.js +0 -1
- package/dist/enforcement/loaders/agents-md-validation-loader.js +0 -1
- package/dist/enforcement/loaders/base-loader.js +0 -1
- package/dist/enforcement/loaders/codex-loader.js +0 -1
- package/dist/enforcement/loaders/index.js +0 -1
- package/dist/enforcement/loaders/loader-orchestrator.js +0 -1
- package/dist/enforcement/loaders/processor-loader.js +0 -1
- package/dist/enforcement/types.js +0 -1
- package/dist/enforcement/validators/architecture-validators.js +0 -1
- package/dist/enforcement/validators/base-validator.js +0 -1
- package/dist/enforcement/validators/code-quality-validators.js +0 -1
- package/dist/enforcement/validators/index.js +0 -1
- package/dist/enforcement/validators/security-validators.js +0 -1
- package/dist/enforcement/validators/testing-validators.js +0 -1
- package/dist/enforcement/validators/validator-registry.js +0 -1
- package/dist/governance/codex-policy.service.js +0 -1
- package/dist/inference/inference-agent-invoker.js +67 -0
- package/dist/inference/inference-applier.js +178 -0
- package/dist/inference/inference-cycle.js +51 -827
- package/dist/inference/inference-proposal-generator.js +149 -0
- package/dist/infrastructure/iac-validator.js +465 -0
- package/dist/infrastructure/schemas/cloud-schemas.js +488 -0
- package/dist/integrations/base/ExampleIntegration.js +0 -1
- package/dist/integrations/base/Integration.js +0 -1
- package/dist/integrations/base/index.js +0 -1
- package/dist/integrations/base/registry.js +0 -1
- package/dist/integrations/base/types.js +0 -1
- package/dist/integrations/enforcement-gate.js +3 -3
- package/dist/integrations/governance/governance-client.js +0 -1
- package/dist/integrations/governance/index.js +11 -19
- package/dist/integrations/governance/types.js +0 -1
- package/dist/integrations/hermes-agent/__init__.py +4 -0
- package/dist/integrations/hermes-agent/bridge.mjs +37 -0
- package/dist/integrations/openclaw/api-server.js +0 -1
- package/dist/integrations/openclaw/client.js +0 -1
- package/dist/integrations/openclaw/config.js +0 -1
- package/dist/integrations/openclaw/hooks/xray-hooks.js +0 -1
- package/dist/integrations/openclaw/index.js +0 -1
- package/dist/integrations/openclaw/types.js +0 -1
- package/dist/integrations/plugins/index.js +0 -1
- package/dist/integrations/plugins/plugin-integration.js +0 -1
- package/dist/integrations/plugins/plugin-registry.js +0 -1
- package/dist/mcps/agent-resolver.js +0 -1
- package/dist/mcps/architect-tools.server.js +119 -185
- package/dist/mcps/auto-format.server.js +56 -74
- package/dist/mcps/boot-orchestrator.server.js +67 -85
- package/dist/mcps/config/config-loader.js +6 -0
- package/dist/mcps/config/plugin-server-registry.js +0 -1
- package/dist/mcps/enforcer-tools.server.js +207 -273
- package/dist/mcps/estimation.server.js +63 -107
- package/dist/mcps/framework-compliance-audit.server.js +52 -81
- package/dist/mcps/framework-help.server.js +71 -89
- package/dist/mcps/governance.server.js +97 -149
- package/dist/mcps/knowledge-skills/api-design.server.js +33 -65
- package/dist/mcps/knowledge-skills/architecture-patterns.server.js +33 -65
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +123 -163
- package/dist/mcps/knowledge-skills/code-analyzer.server.js +210 -237
- package/dist/mcps/knowledge-skills/code-review.server.js +108 -142
- package/dist/mcps/knowledge-skills/content-creator.server.js +203 -225
- package/dist/mcps/knowledge-skills/database-design.server.js +116 -150
- package/dist/mcps/knowledge-skills/devops-deployment.server.js +123 -157
- package/dist/mcps/knowledge-skills/git-workflow.server.js +34 -67
- package/dist/mcps/knowledge-skills/growth-strategist.server.js +301 -323
- package/dist/mcps/knowledge-skills/log-monitor.server.js +139 -159
- package/dist/mcps/knowledge-skills/mobile-development.server.js +170 -200
- package/dist/mcps/knowledge-skills/multimodal-looker.server.js +122 -158
- package/dist/mcps/knowledge-skills/performance-optimization.server.js +88 -138
- package/dist/mcps/knowledge-skills/project-analysis.server.js +131 -218
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +115 -150
- package/dist/mcps/knowledge-skills/security-audit.server.js +16 -143
- package/dist/mcps/knowledge-skills/seo-consultant.server.js +20 -213
- package/dist/mcps/knowledge-skills/session-management.server.js +13 -90
- package/dist/mcps/knowledge-skills/skill-invocation.server.js +43 -421
- package/dist/mcps/knowledge-skills/strategist.server.js +10 -55
- package/dist/mcps/knowledge-skills/tech-writer.server.js +16 -191
- package/dist/mcps/knowledge-skills/testing-best-practices.server.js +18 -191
- package/dist/mcps/knowledge-skills/testing-strategy.server.js +18 -156
- package/dist/mcps/knowledge-skills/ui-ux-design.server.js +22 -296
- package/dist/mcps/lint.server.js +50 -91
- package/dist/mcps/model-health-check.server.js +32 -60
- package/dist/mcps/orchestrator/aside-context.js +207 -0
- package/dist/mcps/orchestrator/handlers/complexity-handler.js +5 -1
- package/dist/mcps/orchestrator/handlers/status-handler.js +8 -1
- package/dist/mcps/orchestrator/handlers/task-handler.js +5 -0
- package/dist/mcps/orchestrator/index.js +5 -0
- package/dist/mcps/orchestrator/server.js +63 -8
- package/dist/mcps/performance-analysis.server.js +56 -87
- package/dist/mcps/processor-pipeline.server.js +68 -99
- package/dist/mcps/researcher.server.js +80 -153
- package/dist/mcps/security-scan.server.js +56 -70
- package/dist/mcps/shared/knowledge-skill-base.js +11 -4
- package/dist/mcps/state-manager.server.js +124 -152
- package/dist/monitoring/nudge-watchdog.js +0 -1
- package/dist/nucleus/default-plugins.js +13 -19
- package/dist/nucleus/index.js +0 -1
- package/dist/orchestrator/agent-spawn-governor.js +0 -1
- package/dist/orchestrator/intelligent-commit-batcher.js +2 -10
- package/dist/orchestrator/multi-agent-orchestration-coordinator.js +0 -1
- package/dist/orchestrator/orchestrator.js +8 -18
- package/dist/orchestrator/self-direction-activation.js +0 -1
- package/dist/orchestrator/universal-registry-bridge.js +0 -1
- package/dist/performance/performance-budget-enforcer.js +0 -1
- package/dist/performance/performance-regression-tester.js +0 -1
- package/dist/plugin/plugin-codex-context.js +87 -0
- package/dist/plugin/plugin-helpers.js +155 -0
- package/dist/plugin/plugin-logger.js +46 -0
- package/dist/plugin/plugin-modules.js +144 -0
- package/dist/plugin/plugin-quality-gate.js +88 -0
- package/dist/plugin/plugin-types.js +1 -0
- package/dist/plugin/xray-codex-injection.js +338 -0
- package/dist/postprocessor/PostProcessor.js +3 -9
- package/dist/postprocessor/analysis/CodeChangeAnalyzer.js +50 -0
- package/dist/postprocessor/config/ProcessorConfigLoader.js +16 -0
- package/dist/postprocessor/integration.js +194 -0
- package/dist/postprocessor/metamorphosis/SelfProposalEngine.js +472 -0
- package/dist/postprocessor/metamorphosis/index.js +1 -0
- package/dist/postprocessor/redeploy/RetryHandler.js +118 -0
- package/dist/postprocessor/services/RegressionAnalysisService.js +0 -1
- package/dist/postprocessor/triggers/APITrigger.js +0 -1
- package/dist/postprocessor/triggers/WebhookTrigger.js +0 -1
- package/dist/processors/implementations/agents-md-validation-processor.js +0 -1
- package/dist/processors/implementations/async-pattern-processor.js +0 -1
- package/dist/processors/implementations/console-log-guard-processor.js +0 -1
- package/dist/processors/implementations/coverage-analysis-processor.js +0 -1
- package/dist/processors/implementations/inference-improvement-processor.js +2 -9
- package/dist/processors/implementations/log-protection-processor.js +0 -1
- package/dist/processors/implementations/nudge-processor.js +0 -1
- package/dist/processors/implementations/performance-budget-processor.js +0 -1
- package/dist/processors/implementations/postprocessor-chain-validator.js +0 -1
- package/dist/processors/implementations/publish-preflight-processor.js +4 -12
- package/dist/processors/implementations/session-summary-processor.js +8 -16
- package/dist/processors/implementations/spawn-governance-processor.js +0 -1
- package/dist/processors/implementations/storytelling-trigger-processor.js +3 -28
- package/dist/processors/implementations/test-auto-creation-processor.js +0 -1
- package/dist/processors/implementations/typescript-compilation-processor.js +0 -1
- package/dist/processors/implementations/version-compliance-processor.js +0 -1
- package/dist/processors/processor-interfaces.js +0 -1
- package/dist/processors/processor-types.js +0 -1
- package/dist/scripts/integration.js +0 -1
- package/dist/security/comprehensive-security-audit.js +0 -1
- package/dist/security/security-agent-coordinator.js +0 -1
- package/dist/security/security-auditor.js +0 -1
- package/dist/security/security-hardener.js +0 -1
- package/dist/security/security-hardening-system.js +0 -1
- package/dist/security/security-headers.js +0 -1
- package/dist/security/security-orchestration-layer.js +0 -1
- package/dist/services/inference-tuner.js +0 -1
- package/dist/session/session-cleanup-manager.js +0 -1
- package/dist/session/session-monitor.js +0 -1
- package/dist/session/session-state-manager.js +0 -1
- package/dist/skills/xray-orchestrator/index.js +0 -1
- package/dist/utils/codex-parser.js +0 -1
- package/dist/utils/language-detector.js +0 -1
- package/dist/utils/shutdown-handler.js +0 -1
- package/dist/validation/agent-config-validator.js +280 -0
- package/dist/validation/orchestration-flow-validator.js +606 -0
- package/package.json +1 -1
- package/scripts/node/release.mjs +2 -2
- package/scripts/node/setup.cjs +28 -0
- package/scripts/node/universal-version-manager.js +1 -1
- package/src/mcps/agent-resolver.ts +0 -1
- package/src/mcps/architect-tools.server.ts +129 -211
- package/src/mcps/auto-format.server.ts +74 -103
- package/src/mcps/boot-orchestrator.server.ts +71 -96
- package/src/mcps/config/__tests__/config-loader.test.ts +6 -6
- package/src/mcps/config/config-loader.ts +7 -0
- package/src/mcps/config/plugin-server-registry.ts +0 -1
- package/src/mcps/enforcer-tools.server.ts +217 -294
- package/src/mcps/estimation.server.ts +62 -122
- package/src/mcps/framework-compliance-audit.server.ts +53 -95
- package/src/mcps/framework-help.server.ts +74 -96
- package/src/mcps/governance.server.ts +97 -162
- package/src/mcps/knowledge-skills/api-design.server.ts +33 -72
- package/src/mcps/knowledge-skills/architecture-patterns.server.ts +33 -72
- package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +148 -193
- package/src/mcps/knowledge-skills/code-analyzer.server.ts +222 -254
- package/src/mcps/knowledge-skills/code-review.server.ts +115 -157
- package/src/mcps/knowledge-skills/content-creator.server.ts +219 -246
- package/src/mcps/knowledge-skills/database-design.server.ts +119 -160
- package/src/mcps/knowledge-skills/devops-deployment.server.ts +126 -167
- package/src/mcps/knowledge-skills/git-workflow.server.ts +32 -77
- package/src/mcps/knowledge-skills/growth-strategist.server.ts +322 -360
- package/src/mcps/knowledge-skills/log-monitor.server.ts +68 -95
- package/src/mcps/knowledge-skills/mobile-development.server.ts +16 -56
- package/src/mcps/knowledge-skills/multimodal-looker.server.ts +13 -59
- package/src/mcps/knowledge-skills/performance-optimization.server.ts +13 -74
- package/src/mcps/knowledge-skills/project-analysis.server.ts +13 -120
- package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +13 -60
- package/src/mcps/knowledge-skills/security-audit.server.ts +19 -157
- package/src/mcps/knowledge-skills/seo-consultant.server.ts +23 -227
- package/src/mcps/knowledge-skills/session-management.server.ts +17 -106
- package/src/mcps/knowledge-skills/skill-invocation.server.ts +45 -446
- package/src/mcps/knowledge-skills/strategist.server.ts +13 -63
- package/src/mcps/knowledge-skills/tech-writer.server.ts +19 -204
- package/src/mcps/knowledge-skills/testing-best-practices.server.ts +21 -204
- package/src/mcps/knowledge-skills/testing-strategy.server.ts +21 -165
- package/src/mcps/knowledge-skills/ui-ux-design.server.ts +25 -342
- package/src/mcps/lint.server.ts +52 -105
- package/src/mcps/model-health-check.server.ts +34 -70
- package/src/mcps/orchestrator/aside-context.ts +245 -0
- package/src/mcps/orchestrator/handlers/complexity-handler.ts +9 -3
- package/src/mcps/orchestrator/handlers/status-handler.ts +11 -1
- package/src/mcps/orchestrator/handlers/task-handler.ts +8 -1
- package/src/mcps/orchestrator/index.ts +29 -0
- package/src/mcps/orchestrator/server.ts +79 -24
- package/src/mcps/orchestrator/types.ts +37 -0
- package/src/mcps/performance-analysis.server.ts +59 -102
- package/src/mcps/processor-pipeline.server.ts +70 -108
- package/src/mcps/researcher.server.ts +87 -175
- package/src/mcps/security-scan.server.ts +57 -76
- package/src/mcps/shared/knowledge-skill-base.ts +12 -4
- package/src/mcps/state-manager.server.ts +129 -169
- package/src/opencode/codex.codex +1 -1
- package/src/opencode/commands/auto-format.md +3 -3
- package/src/opencode/commands/auto-summary-capture.md +2 -2
- package/src/opencode/commands/enforcer-daily-scan.md +3 -3
- package/src/opencode/commands/framework-compliance-audit.md +4 -4
- package/src/opencode/commands/interactive-validator.md +2 -2
- package/src/opencode/commands/job-summary-logger.md +2 -2
- package/src/opencode/commands/mode-switch.md +1 -1
- package/src/opencode/commands/model-health-check.md +2 -2
- package/src/opencode/commands/performance-analysis.md +2 -2
- package/src/opencode/commands/pre-commit-introspection.md +3 -3
- package/src/opencode/commands/security-scan.md +3 -3
- package/src/opencode/commands/sisyphus-validation.md +3 -3
- package/src/opencode/commands/summary-logger.md +2 -2
- package/src/skills/xray-orchestrator/index.ts +0 -1
- 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 {
|
|
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
|
|
212
|
-
|
|
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
|