0xray 2.1.2 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.opencode/codex.codex +1 -1
- package/.opencode/commands/dependency-audit.md +3 -3
- package/.opencode/enforcer-config.json +2 -2
- package/AGENTS.md +2 -1
- package/README.md +12 -11
- package/dist/AGENTS.md +2 -1
- package/dist/CHANGELOG.md +26 -0
- package/dist/README.md +12 -11
- package/dist/agents/code-reviewer.js +1 -1
- package/dist/analytics/routing-refiner.js +1 -1
- package/dist/cli/index.js +11 -1
- package/dist/cli/server.js +3 -3
- package/dist/core/activity-logger.d.ts +2 -2
- package/dist/core/activity-logger.js +4 -4
- package/dist/core/boot-orchestrator.d.ts +1 -1
- package/dist/core/boot-orchestrator.js +13 -28
- package/dist/core/bridge.mjs +3 -3
- package/dist/core/codex-formatter.js +2 -2
- package/dist/core/codex-injector.d.ts +0 -1
- package/dist/core/codex-injector.js +2 -3
- package/dist/core/config-loader.d.ts +1 -1
- package/dist/core/config-loader.js +1 -1
- package/dist/core/config-paths.d.ts +0 -2
- package/dist/core/config-paths.js +7 -8
- package/dist/core/context-loader.d.ts +1 -1
- package/dist/core/context-loader.js +1 -1
- package/dist/core/errors.d.ts +3 -0
- package/dist/core/errors.js +10 -0
- package/dist/core/features-config.js +1 -1
- package/dist/core/framework-logger.d.ts +3 -3
- package/dist/core/framework-logger.js +17 -9
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +4 -2
- package/dist/core/logging-config.d.ts +2 -1
- package/dist/core/logging-config.js +7 -7
- package/dist/enforcement/loaders/codex-loader.js +1 -1
- package/dist/execution/opencode-cli-invoker.js +5 -5
- package/dist/governance/governance-service.js +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/inference/inference-cycle.d.ts +1 -1
- package/dist/inference/inference-cycle.js +10 -10
- package/dist/integrations/base/Integration.js +1 -1
- package/dist/integrations/base/registry.js +19 -19
- package/dist/integrations/grok/grok-cli.js +17 -17
- package/dist/integrations/grok/hooks/pre-tool-use.js +1 -1
- package/dist/integrations/hermes-agent/bridge.mjs +1 -1
- package/dist/integrations/openclaw/api-server.d.ts +0 -1
- package/dist/integrations/openclaw/api-server.js +7 -10
- package/dist/integrations/openclaw/client.d.ts +0 -1
- package/dist/integrations/openclaw/client.js +22 -24
- package/dist/integrations/openclaw/hooks/xray-hooks.d.ts +0 -1
- package/dist/integrations/openclaw/hooks/xray-hooks.js +17 -18
- package/dist/integrations/plugins/plugin-registry.js +5 -5
- package/dist/mcps/architect-tools.server.d.ts +2 -4
- package/dist/mcps/architect-tools.server.js +112 -195
- package/dist/mcps/auto-format.server.d.ts +2 -4
- package/dist/mcps/auto-format.server.js +49 -95
- package/dist/mcps/boot-orchestrator.server.d.ts +2 -4
- package/dist/mcps/boot-orchestrator.server.js +73 -105
- package/dist/mcps/config/server-config-registry.js +3 -3
- package/dist/mcps/enforcer-tools.server.d.ts +2 -4
- package/dist/mcps/enforcer-tools.server.js +202 -285
- package/dist/mcps/estimation.server.d.ts +2 -4
- package/dist/mcps/estimation.server.js +63 -107
- package/dist/mcps/framework-compliance-audit.server.d.ts +2 -4
- package/dist/mcps/framework-compliance-audit.server.js +53 -82
- package/dist/mcps/framework-help.server.d.ts +2 -4
- package/dist/mcps/framework-help.server.js +63 -101
- package/dist/mcps/governance.server.js +2 -2
- package/dist/mcps/knowledge-skills/api-design.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/api-design.server.js +35 -67
- package/dist/mcps/knowledge-skills/architecture-patterns.server.d.ts +2 -10
- package/dist/mcps/knowledge-skills/architecture-patterns.server.js +35 -74
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +143 -162
- package/dist/mcps/knowledge-skills/code-analyzer.server.d.ts +3 -4
- package/dist/mcps/knowledge-skills/code-analyzer.server.js +20 -45
- package/dist/mcps/knowledge-skills/code-review.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/code-review.server.js +109 -143
- package/dist/mcps/knowledge-skills/content-creator.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/content-creator.server.js +205 -226
- package/dist/mcps/knowledge-skills/database-design.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/database-design.server.js +117 -151
- package/dist/mcps/knowledge-skills/devops-deployment.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/devops-deployment.server.js +71 -160
- package/dist/mcps/knowledge-skills/git-workflow.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/git-workflow.server.js +36 -68
- package/dist/mcps/knowledge-skills/growth-strategist.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/growth-strategist.server.js +303 -324
- package/dist/mcps/knowledge-skills/log-monitor.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/log-monitor.server.js +141 -160
- package/dist/mcps/knowledge-skills/mobile-development.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/mobile-development.server.js +92 -209
- package/dist/mcps/knowledge-skills/multimodal-looker.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/multimodal-looker.server.js +123 -159
- package/dist/mcps/knowledge-skills/performance-optimization.server.d.ts +2 -5
- package/dist/mcps/knowledge-skills/performance-optimization.server.js +155 -296
- package/dist/mcps/knowledge-skills/project-analysis.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/project-analysis.server.js +75 -226
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +63 -156
- package/dist/mcps/knowledge-skills/security-audit.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/security-audit.server.js +102 -136
- package/dist/mcps/knowledge-skills/seo-consultant.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/seo-consultant.server.js +80 -203
- package/dist/mcps/knowledge-skills/session-management.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/session-management.server.js +50 -203
- package/dist/mcps/knowledge-skills/skill-invocation.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/skill-invocation.server.js +168 -347
- package/dist/mcps/knowledge-skills/strategist.server.d.ts +2 -11
- package/dist/mcps/knowledge-skills/strategist.server.js +72 -122
- package/dist/mcps/knowledge-skills/tech-writer.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/tech-writer.server.js +87 -300
- package/dist/mcps/knowledge-skills/testing-best-practices.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/testing-best-practices.server.js +147 -182
- package/dist/mcps/knowledge-skills/testing-strategy.server.d.ts +2 -4
- package/dist/mcps/knowledge-skills/testing-strategy.server.js +78 -153
- package/dist/mcps/knowledge-skills/ui-ux-design.server.d.ts +2 -5
- package/dist/mcps/knowledge-skills/ui-ux-design.server.js +90 -399
- package/dist/mcps/lint.server.d.ts +2 -4
- package/dist/mcps/lint.server.js +51 -92
- package/dist/mcps/mcp-client.js +2 -2
- package/dist/mcps/model-health-check.server.d.ts +2 -4
- package/dist/mcps/model-health-check.server.js +32 -60
- package/dist/mcps/performance-analysis.server.d.ts +2 -4
- package/dist/mcps/performance-analysis.server.js +57 -88
- package/dist/mcps/processor-pipeline.server.d.ts +2 -4
- package/dist/mcps/processor-pipeline.server.js +69 -100
- package/dist/mcps/registry.json +1 -1
- package/dist/mcps/researcher.server.d.ts +3 -5
- package/dist/mcps/researcher.server.js +81 -154
- package/dist/mcps/security-scan.server.d.ts +2 -4
- package/dist/mcps/security-scan.server.js +54 -96
- package/dist/mcps/shared/knowledge-skill-base.d.ts +14 -0
- package/dist/mcps/shared/knowledge-skill-base.js +45 -0
- package/dist/{security → mcps/shared}/security-scanner.js +1 -1
- package/dist/mcps/state-manager.server.d.ts +2 -4
- package/dist/mcps/state-manager.server.js +115 -160
- package/dist/orchestrator/orchestrator.d.ts +1 -1
- package/dist/orchestrator/orchestrator.js +1 -1
- package/dist/orchestrator/universal-registry-bridge.js +1 -1
- package/dist/plugin/xray-codex-injection.d.ts +1 -1
- package/dist/plugin/xray-codex-injection.js +1 -1
- package/dist/postprocessor/PostProcessor.d.ts +4 -44
- package/dist/postprocessor/PostProcessor.js +39 -553
- package/dist/postprocessor/analysis/CodeChangeAnalyzer.d.ts +11 -0
- package/dist/postprocessor/analysis/CodeChangeAnalyzer.js +50 -0
- package/dist/postprocessor/compliance/ArchitecturalComplianceChecker.d.ts +11 -0
- package/dist/postprocessor/compliance/ArchitecturalComplianceChecker.js +356 -0
- package/dist/postprocessor/config/ProcessorConfigLoader.d.ts +44 -0
- package/dist/postprocessor/config/ProcessorConfigLoader.js +21 -0
- package/dist/postprocessor/reporting/PostProcessorReporter.d.ts +19 -0
- package/dist/postprocessor/reporting/PostProcessorReporter.js +96 -0
- package/dist/postprocessor/triggers/GitHookTrigger.js +11 -11
- package/dist/processors/implementations/refactoring-logging-processor-wrapper.d.ts +32 -0
- package/dist/processors/implementations/refactoring-logging-processor-wrapper.js +95 -1
- package/dist/processors/processor-manager.js +346 -314
- package/dist/reporting/report-formatter.js +1 -1
- package/dist/security/security-hardener.d.ts +69 -2
- package/dist/security/security-hardener.js +129 -1
- package/dist/skills/registry.json +1 -1
- package/dist/state/index.d.ts +3 -5
- package/dist/state/index.js +1 -7
- package/dist/state/state-manager.d.ts +1 -1
- package/dist/state/state-manager.js +2 -3
- package/package.json +13 -10
- package/scripts/node/universal-version-manager.js +11 -11
- package/src/mcps/architect-tools.server.ts +112 -215
- package/src/mcps/auto-format.server.ts +50 -110
- package/src/mcps/boot-orchestrator.server.ts +75 -121
- package/src/mcps/config/__tests__/server-config-registry.test.ts +21 -12
- package/src/mcps/config/server-config-registry.ts +3 -3
- package/src/mcps/enforcer-tools.server.ts +212 -310
- package/src/mcps/estimation.server.ts +62 -122
- package/src/mcps/framework-compliance-audit.server.ts +52 -97
- package/src/mcps/framework-help.server.ts +64 -114
- package/src/mcps/governance.server.ts +2 -2
- package/src/mcps/knowledge-skills/api-design.server.ts +32 -77
- package/src/mcps/knowledge-skills/architecture-patterns.server.ts +31 -87
- package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +165 -193
- package/src/mcps/knowledge-skills/code-analyzer.server.ts +20 -55
- package/src/mcps/knowledge-skills/code-review.server.ts +114 -161
- package/src/mcps/knowledge-skills/content-creator.server.ts +218 -255
- package/src/mcps/knowledge-skills/database-design.server.ts +118 -165
- package/src/mcps/knowledge-skills/devops-deployment.server.ts +67 -172
- package/src/mcps/knowledge-skills/git-workflow.server.ts +32 -77
- package/src/mcps/knowledge-skills/growth-strategist.server.ts +324 -361
- package/src/mcps/knowledge-skills/log-monitor.server.ts +160 -187
- package/src/mcps/knowledge-skills/mobile-development.server.ts +89 -223
- package/src/mcps/knowledge-skills/multimodal-looker.server.ts +128 -175
- package/src/mcps/knowledge-skills/performance-optimization.server.ts +156 -329
- package/src/mcps/knowledge-skills/project-analysis.server.ts +72 -248
- package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +59 -171
- package/src/mcps/knowledge-skills/security-audit.server.ts +104 -151
- package/src/mcps/knowledge-skills/seo-consultant.server.ts +80 -220
- package/src/mcps/knowledge-skills/session-management.server.ts +51 -232
- package/src/mcps/knowledge-skills/skill-invocation.server.ts +165 -372
- package/src/mcps/knowledge-skills/strategist.server.ts +72 -143
- package/src/mcps/knowledge-skills/tech-writer.server.ts +85 -350
- package/src/mcps/knowledge-skills/testing-best-practices.server.ts +146 -195
- package/src/mcps/knowledge-skills/testing-strategy.server.ts +75 -161
- package/src/mcps/knowledge-skills/ui-ux-design.server.ts +93 -487
- package/src/mcps/lint.server.ts +53 -107
- package/src/mcps/mcp-client.ts +2 -2
- package/src/mcps/model-health-check.server.ts +34 -71
- package/src/mcps/performance-analysis.server.ts +60 -104
- package/src/mcps/processor-pipeline.server.ts +72 -110
- package/src/mcps/registry.json +1 -1
- package/src/mcps/researcher.server.ts +88 -177
- package/src/mcps/security-scan.server.ts +55 -104
- package/src/mcps/shared/knowledge-skill-base.ts +62 -0
- package/src/mcps/shared/prompt-security-validator.ts +199 -0
- package/src/mcps/shared/security-scanner.ts +599 -0
- package/src/mcps/state-manager.server.ts +117 -175
- package/src/opencode/codex.codex +1 -1
- package/src/opencode/commands/dependency-audit.md +3 -3
- package/src/opencode/enforcer-config.json +2 -2
- package/src/skills/registry.json +1 -1
- package/xray/codex.json +1 -1
- package/xray/config.json +1 -1
- package/xray/features.json +1 -1
- package/xray/integrations.json +3 -3
- package/dist/integrations/hermes-agent/__pycache__/__init__.cpython-313.pyc +0 -0
- package/dist/integrations/hermes-agent/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc +0 -0
- package/dist/integrations/hermes-agent/__pycache__/schemas.cpython-313.pyc +0 -0
- package/dist/integrations/hermes-agent/__pycache__/test_plugin.cpython-313-pytest-9.0.2.pyc +0 -0
- package/dist/integrations/hermes-agent/__pycache__/test_plugin.cpython-313.pyc +0 -0
- package/dist/integrations/hermes-agent/__pycache__/tools.cpython-313.pyc +0 -0
- package/dist/integrations/hermes-agent/conftest.py +0 -14
- package/dist/integrations/hermes-agent/test_plugin.py +0 -1103
- package/dist/processors/implementations/refactoring-logging-processor.d.ts +0 -31
- package/dist/processors/implementations/refactoring-logging-processor.js +0 -96
- package/dist/processors/implementations/session-capture-processor.d.ts +0 -14
- package/dist/processors/implementations/session-capture-processor.js +0 -37
- package/dist/scripts/activate-kernel-pipeline.d.ts +0 -7
- package/dist/scripts/activate-kernel-pipeline.js +0 -101
- package/dist/security/index.d.ts +0 -13
- package/dist/security/index.js +0 -13
- package/dist/security/security-agent-coordinator.d.ts +0 -72
- package/dist/security/security-agent-coordinator.js +0 -204
- package/dist/security/security-auditor.d.ts +0 -56
- package/dist/security/security-auditor.js +0 -584
- package/dist/security/security-hardening-system.d.ts +0 -239
- package/dist/security/security-hardening-system.js +0 -727
- package/dist/security/security-orchestration-layer.d.ts +0 -119
- package/dist/security/security-orchestration-layer.js +0 -496
- /package/dist/{security → mcps/shared}/prompt-security-validator.d.ts +0 -0
- /package/dist/{security → mcps/shared}/prompt-security-validator.js +0 -0
- /package/dist/{security → mcps/shared}/security-scanner.d.ts +0 -0
|
@@ -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
|
|
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
|
+
}
|
|
@@ -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?:
|
|
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?:
|
|
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?:
|
|
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)
|
|
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)
|
|
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) })
|
|
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)
|
|
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
|
+
}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { KernelOrchestrator } from "./orchestrator.js";
|
|
2
|
-
export { defaultXrayConfig
|
|
3
|
-
export { getConfigDir, resolveConfigPath, resolveStateDir, resolveProfilesDir, resolveCodexPath, resolveLogDir, resetConfigDirCache,
|
|
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";
|
package/dist/core/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { KernelOrchestrator } from "./orchestrator.js";
|
|
2
|
-
export { defaultXrayConfig
|
|
2
|
+
export { defaultXrayConfig } from "./xray-activation.js";
|
|
3
3
|
// Decoupled config path resolution (Layer 1)
|
|
4
|
-
export { getConfigDir, resolveConfigPath, resolveStateDir, resolveProfilesDir, resolveCodexPath, resolveLogDir, resetConfigDirCache,
|
|
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:
|
|
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.
|
|
4
|
-
level: process.env.
|
|
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.
|
|
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.
|
|
35
|
+
if ((process.env.XRAY_LOGGING_ENABLED) === "false") {
|
|
36
36
|
setLoggingConfig({ enabled: false });
|
|
37
37
|
}
|
|
38
|
-
if (process.env.
|
|
39
|
-
setLoggingConfig({ level: process.env.
|
|
38
|
+
if (process.env.XRAY_LOG_LEVEL) {
|
|
39
|
+
setLoggingConfig({ level: (process.env.XRAY_LOG_LEVEL) });
|
|
40
40
|
}
|
|
41
|
-
if (process.env.
|
|
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("
|
|
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.
|
|
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 ??
|
|
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
|
|
8
|
-
export { XrayStateManager
|
|
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
|
|
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
|
|
8
|
-
export { XrayStateManager
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
@@ -93,7 +93,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
93
93
|
name,
|
|
94
94
|
version: integration.version,
|
|
95
95
|
});
|
|
96
|
-
frameworkLogger.log("integration-registry", `Registered integration: ${name} v${integration.version}`, "info", { name, version: integration.version }
|
|
96
|
+
frameworkLogger.log("integration-registry", `Registered integration: ${name} v${integration.version}`, "info", { name, version: integration.version });
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
99
|
* Unregister an integration from the registry
|
|
@@ -109,12 +109,12 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
109
109
|
// If loaded, unload first
|
|
110
110
|
if (this.loadedIntegrations.has(name)) {
|
|
111
111
|
this.unload(name).catch((error) => {
|
|
112
|
-
frameworkLogger.log("integration-registry", `Error unloading integration '${name}' during unregister: ${error}`, "error", { name, error: String(error) }
|
|
112
|
+
frameworkLogger.log("integration-registry", `Error unloading integration '${name}' during unregister: ${error}`, "error", { name, error: String(error) });
|
|
113
113
|
});
|
|
114
114
|
}
|
|
115
115
|
this.registeredIntegrations.delete(name);
|
|
116
116
|
this.emitEvent("integration-unregistered", { name });
|
|
117
|
-
frameworkLogger.log("integration-registry", `Unregistered integration: ${name}`, "info", { name }
|
|
117
|
+
frameworkLogger.log("integration-registry", `Unregistered integration: ${name}`, "info", { name });
|
|
118
118
|
}
|
|
119
119
|
// ==========================================================================
|
|
120
120
|
// Accessor Methods
|
|
@@ -184,7 +184,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
184
184
|
async load(name, config) {
|
|
185
185
|
// Check if already loaded
|
|
186
186
|
if (this.loadedIntegrations.has(name)) {
|
|
187
|
-
frameworkLogger.log("integration-registry", `Integration '${name}' already loaded`, "warning", { name }
|
|
187
|
+
frameworkLogger.log("integration-registry", `Integration '${name}' already loaded`, "warning", { name });
|
|
188
188
|
return;
|
|
189
189
|
}
|
|
190
190
|
const integration = this.registeredIntegrations.get(name);
|
|
@@ -211,7 +211,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
211
211
|
name,
|
|
212
212
|
version: integration.version,
|
|
213
213
|
});
|
|
214
|
-
frameworkLogger.log("integration-registry", `Loaded integration: ${name}`, "success", { name, version: integration.version }
|
|
214
|
+
frameworkLogger.log("integration-registry", `Loaded integration: ${name}`, "success", { name, version: integration.version });
|
|
215
215
|
}
|
|
216
216
|
catch (error) {
|
|
217
217
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -239,7 +239,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
239
239
|
// Remove from loaded map
|
|
240
240
|
this.loadedIntegrations.delete(name);
|
|
241
241
|
this.emitEvent("integration-unloaded", { name });
|
|
242
|
-
frameworkLogger.log("integration-registry", `Unloaded integration: ${name}`, "success", { name }
|
|
242
|
+
frameworkLogger.log("integration-registry", `Unloaded integration: ${name}`, "success", { name });
|
|
243
243
|
}
|
|
244
244
|
catch (error) {
|
|
245
245
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -250,7 +250,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
250
250
|
error: errorMessage,
|
|
251
251
|
phase: "unload",
|
|
252
252
|
}, error instanceof Error ? error : undefined);
|
|
253
|
-
frameworkLogger.log("integration-registry", `Error unloading integration '${name}': ${errorMessage}`, "error", { name, error: errorMessage }
|
|
253
|
+
frameworkLogger.log("integration-registry", `Error unloading integration '${name}': ${errorMessage}`, "error", { name, error: errorMessage });
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
256
|
/**
|
|
@@ -261,14 +261,14 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
261
261
|
async loadAll(config) {
|
|
262
262
|
const entries = Object.entries(config.integrations);
|
|
263
263
|
const enabledEntries = entries.filter(([, entry]) => entry.enabled);
|
|
264
|
-
frameworkLogger.log("integration-registry", `Loading ${enabledEntries.length} enabled integrations...`, "info", { total: entries.length, enabled: enabledEntries.length }
|
|
264
|
+
frameworkLogger.log("integration-registry", `Loading ${enabledEntries.length} enabled integrations...`, "info", { total: entries.length, enabled: enabledEntries.length });
|
|
265
265
|
const results = [];
|
|
266
266
|
// Load all enabled integrations
|
|
267
267
|
for (const [name, entry] of enabledEntries) {
|
|
268
268
|
try {
|
|
269
269
|
// Check if registered
|
|
270
270
|
if (!this.registeredIntegrations.has(name)) {
|
|
271
|
-
frameworkLogger.log("integration-registry", `Skipping '${name}': not registered`, "warning", { name }
|
|
271
|
+
frameworkLogger.log("integration-registry", `Skipping '${name}': not registered`, "warning", { name });
|
|
272
272
|
results.push({ name, success: false, error: "Not registered" });
|
|
273
273
|
continue;
|
|
274
274
|
}
|
|
@@ -282,7 +282,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
282
282
|
catch (error) {
|
|
283
283
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
284
284
|
results.push({ name, success: false, error: errorMessage });
|
|
285
|
-
frameworkLogger.log("integration-registry", `Failed to load integration '${name}': ${errorMessage}`, "error", { name, error: errorMessage }
|
|
285
|
+
frameworkLogger.log("integration-registry", `Failed to load integration '${name}': ${errorMessage}`, "error", { name, error: errorMessage });
|
|
286
286
|
}
|
|
287
287
|
}
|
|
288
288
|
this.emitEvent("load-complete", {
|
|
@@ -293,14 +293,14 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
293
293
|
});
|
|
294
294
|
const succeeded = results.filter((r) => r.success).length;
|
|
295
295
|
const failed = results.filter((r) => !r.success).length;
|
|
296
|
-
frameworkLogger.log("integration-registry", `Load complete: ${succeeded} succeeded, ${failed} failed`, failed > 0 ? "warning" : "success", { succeeded, failed }
|
|
296
|
+
frameworkLogger.log("integration-registry", `Load complete: ${succeeded} succeeded, ${failed} failed`, failed > 0 ? "warning" : "success", { succeeded, failed });
|
|
297
297
|
}
|
|
298
298
|
/**
|
|
299
299
|
* Unload all loaded integrations
|
|
300
300
|
*/
|
|
301
301
|
async unloadAll() {
|
|
302
302
|
const loadedNames = Array.from(this.loadedIntegrations.keys());
|
|
303
|
-
frameworkLogger.log("integration-registry", `Unloading ${loadedNames.length} integrations...`, "info", { count: loadedNames.length }
|
|
303
|
+
frameworkLogger.log("integration-registry", `Unloading ${loadedNames.length} integrations...`, "info", { count: loadedNames.length });
|
|
304
304
|
const results = [];
|
|
305
305
|
// Unload all loaded integrations
|
|
306
306
|
for (const name of loadedNames) {
|
|
@@ -321,7 +321,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
321
321
|
});
|
|
322
322
|
const succeeded = results.filter((r) => r.success).length;
|
|
323
323
|
const failed = results.filter((r) => !r.success).length;
|
|
324
|
-
frameworkLogger.log("integration-registry", `Unload complete: ${succeeded} succeeded, ${failed} failed`, failed > 0 ? "warning" : "success", { succeeded, failed }
|
|
324
|
+
frameworkLogger.log("integration-registry", `Unload complete: ${succeeded} succeeded, ${failed} failed`, failed > 0 ? "warning" : "success", { succeeded, failed });
|
|
325
325
|
}
|
|
326
326
|
// ==========================================================================
|
|
327
327
|
// Health and Stats Methods
|
|
@@ -427,7 +427,7 @@ export class IntegrationRegistry extends EventEmitter {
|
|
|
427
427
|
this.registeredIntegrations.delete(name);
|
|
428
428
|
}
|
|
429
429
|
}
|
|
430
|
-
frameworkLogger.log("integration-registry", "Cleared non-loaded integrations", "info", { cleared: names.length - this.loadedIntegrations.size }
|
|
430
|
+
frameworkLogger.log("integration-registry", "Cleared non-loaded integrations", "info", { cleared: names.length - this.loadedIntegrations.size });
|
|
431
431
|
}
|
|
432
432
|
/**
|
|
433
433
|
* Get registry statistics
|
|
@@ -494,7 +494,7 @@ export async function discoverIntegrations(integrationsPath) {
|
|
|
494
494
|
const path = await import("path");
|
|
495
495
|
// Check if directory exists
|
|
496
496
|
if (!fs.existsSync(integrationsPath)) {
|
|
497
|
-
frameworkLogger.log("integration-registry", `Integrations directory not found: ${integrationsPath}`, "warning", { path: integrationsPath })
|
|
497
|
+
frameworkLogger.log("integration-registry", `Integrations directory not found: ${integrationsPath}`, "warning", { path: integrationsPath });
|
|
498
498
|
return discovered;
|
|
499
499
|
}
|
|
500
500
|
// Read directory contents
|
|
@@ -533,18 +533,18 @@ export async function discoverIntegrations(integrationsPath) {
|
|
|
533
533
|
path: indexPath,
|
|
534
534
|
module,
|
|
535
535
|
});
|
|
536
|
-
frameworkLogger.log("integration-registry", `Discovered integration: ${name}`, "info", { name, path: indexPath })
|
|
536
|
+
frameworkLogger.log("integration-registry", `Discovered integration: ${name}`, "info", { name, path: indexPath });
|
|
537
537
|
}
|
|
538
538
|
catch (error) {
|
|
539
539
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
540
|
-
frameworkLogger.log("integration-registry", `Failed to load integration from ${indexPath}: ${errorMessage}`, "warning", { path: indexPath, error: errorMessage })
|
|
540
|
+
frameworkLogger.log("integration-registry", `Failed to load integration from ${indexPath}: ${errorMessage}`, "warning", { path: indexPath, error: errorMessage });
|
|
541
541
|
}
|
|
542
542
|
}
|
|
543
543
|
}
|
|
544
544
|
}
|
|
545
545
|
catch (error) {
|
|
546
546
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
547
|
-
frameworkLogger.log("integration-registry", `Error during integration discovery: ${errorMessage}`, "error", { error: errorMessage })
|
|
547
|
+
frameworkLogger.log("integration-registry", `Error during integration discovery: ${errorMessage}`, "error", { error: errorMessage });
|
|
548
548
|
}
|
|
549
549
|
return discovered;
|
|
550
550
|
}
|
|
@@ -595,7 +595,7 @@ export async function autoRegisterIntegrations(registry, integrationsPath) {
|
|
|
595
595
|
catch (error) {
|
|
596
596
|
// Skip integrations that fail to register (already registered, etc.)
|
|
597
597
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
598
|
-
frameworkLogger.log("integration-registry", `Failed to register integration '${d.name}': ${errorMessage}`, "warning", { name: d.name, error: errorMessage })
|
|
598
|
+
frameworkLogger.log("integration-registry", `Failed to register integration '${d.name}': ${errorMessage}`, "warning", { name: d.name, error: errorMessage });
|
|
599
599
|
}
|
|
600
600
|
}
|
|
601
601
|
return registered;
|