strray-ai 1.7.0 → 1.7.2
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/enforcer-config.json +2 -2
- package/.opencode/package.json +1 -1
- package/.opencode/strray/codex.json +1 -1
- package/.opencode/strray/config.json +1 -1
- package/.opencode/strray/features.json +1 -1
- package/dist/core/boot-orchestrator.js +1 -1
- package/dist/core/boot-orchestrator.js.map +1 -1
- package/dist/core/features-config.js +1 -1
- package/dist/core/features-config.js.map +1 -1
- package/dist/delegation/task-skill-router.d.ts.map +1 -1
- package/dist/delegation/task-skill-router.js +110 -21
- package/dist/delegation/task-skill-router.js.map +1 -1
- package/dist/mcps/architect-tools.server.js +1 -1
- package/dist/mcps/architect-tools.server.js.map +1 -1
- package/dist/mcps/auto-format.server.js +1 -1
- package/dist/mcps/auto-format.server.js.map +1 -1
- package/dist/mcps/boot-orchestrator.server.js +1 -1
- package/dist/mcps/boot-orchestrator.server.js.map +1 -1
- package/dist/mcps/enforcer-tools.server.js +1 -1
- package/dist/mcps/enforcer-tools.server.js.map +1 -1
- package/dist/mcps/framework-compliance-audit.server.js +1 -1
- package/dist/mcps/framework-compliance-audit.server.js.map +1 -1
- package/dist/mcps/framework-help.server.js +1 -1
- package/dist/mcps/framework-help.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/api-design.server.js +1 -1
- package/dist/mcps/knowledge-skills/api-design.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/architecture-patterns.server.js +1 -1
- package/dist/mcps/knowledge-skills/architecture-patterns.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +1 -1
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/code-analyzer.server.js +1 -1
- package/dist/mcps/knowledge-skills/code-analyzer.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/code-review.server.js +1 -1
- package/dist/mcps/knowledge-skills/code-review.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/content-creator.server.js +1 -1
- package/dist/mcps/knowledge-skills/content-creator.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/database-design.server.js +1 -1
- package/dist/mcps/knowledge-skills/database-design.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/devops-deployment.server.js +1 -1
- package/dist/mcps/knowledge-skills/devops-deployment.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/git-workflow.server.js +1 -1
- package/dist/mcps/knowledge-skills/git-workflow.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/growth-strategist.server.js +1 -1
- package/dist/mcps/knowledge-skills/growth-strategist.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/log-monitor.server.js +1 -1
- package/dist/mcps/knowledge-skills/log-monitor.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/mobile-development.server.js +1 -1
- package/dist/mcps/knowledge-skills/mobile-development.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/multimodal-looker.server.js +1 -1
- package/dist/mcps/knowledge-skills/multimodal-looker.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/performance-optimization.server.js +1 -1
- package/dist/mcps/knowledge-skills/performance-optimization.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/project-analysis.server.js +1 -1
- package/dist/mcps/knowledge-skills/project-analysis.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +1 -1
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/security-audit.server.js +1 -1
- package/dist/mcps/knowledge-skills/security-audit.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/seo-consultant.server.js +1 -1
- package/dist/mcps/knowledge-skills/seo-consultant.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/session-management.server.js +1 -1
- package/dist/mcps/knowledge-skills/session-management.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/skill-invocation.server.js +1 -1
- package/dist/mcps/knowledge-skills/skill-invocation.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/strategist.server.js +1 -1
- package/dist/mcps/knowledge-skills/strategist.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/tech-writer.server.js +2 -2
- package/dist/mcps/knowledge-skills/tech-writer.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/testing-best-practices.server.js +1 -1
- package/dist/mcps/knowledge-skills/testing-best-practices.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/testing-strategy.server.js +1 -1
- package/dist/mcps/knowledge-skills/testing-strategy.server.js.map +1 -1
- package/dist/mcps/knowledge-skills/ui-ux-design.server.js +1 -1
- package/dist/mcps/knowledge-skills/ui-ux-design.server.js.map +1 -1
- package/dist/mcps/lint.server.js +1 -1
- package/dist/mcps/lint.server.js.map +1 -1
- package/dist/mcps/mcp-client.js +1 -1
- package/dist/mcps/mcp-client.js.map +1 -1
- package/dist/mcps/model-health-check.server.js +1 -1
- package/dist/mcps/model-health-check.server.js.map +1 -1
- package/dist/mcps/orchestrator.server.js +1 -1
- package/dist/mcps/orchestrator.server.js.map +1 -1
- package/dist/mcps/performance-analysis.server.js +1 -1
- package/dist/mcps/performance-analysis.server.js.map +1 -1
- package/dist/mcps/processor-pipeline.server.js +1 -1
- package/dist/mcps/processor-pipeline.server.js.map +1 -1
- package/dist/mcps/researcher.server.js +1 -1
- package/dist/mcps/researcher.server.js.map +1 -1
- package/dist/mcps/security-scan.server.js +1 -1
- package/dist/mcps/security-scan.server.js.map +1 -1
- package/dist/mcps/state-manager.server.js +1 -1
- package/dist/mcps/state-manager.server.js.map +1 -1
- package/dist/orchestrator/universal-registry-bridge.js +1 -1
- package/dist/orchestrator/universal-registry-bridge.js.map +1 -1
- package/dist/plugins/marketplace/marketplace-service.d.ts +108 -0
- package/dist/plugins/marketplace/marketplace-service.d.ts.map +1 -0
- package/dist/plugins/marketplace/marketplace-service.js +620 -0
- package/dist/plugins/marketplace/marketplace-service.js.map +1 -0
- package/dist/plugins/marketplace/marketplace-types.d.ts +468 -0
- package/dist/plugins/marketplace/marketplace-types.d.ts.map +1 -0
- package/dist/plugins/marketplace/marketplace-types.js +11 -0
- package/dist/plugins/marketplace/marketplace-types.js.map +1 -0
- package/dist/plugins/plugin-system.d.ts +152 -0
- package/dist/plugins/plugin-system.d.ts.map +1 -0
- package/dist/plugins/plugin-system.js +419 -0
- package/dist/plugins/plugin-system.js.map +1 -0
- package/dist/plugins/stringray-codex-injection.d.ts +21 -0
- package/dist/plugins/stringray-codex-injection.d.ts.map +1 -0
- package/dist/plugins/stringray-codex-injection.js +169 -0
- package/dist/plugins/stringray-codex-injection.js.map +1 -0
- package/dist/security/secure-authentication-system.d.ts +107 -6
- package/dist/security/secure-authentication-system.d.ts.map +1 -1
- package/dist/security/secure-authentication-system.js +426 -11
- package/dist/security/secure-authentication-system.js.map +1 -1
- package/dist/security/security-hardening-system.d.ts +11 -2
- package/dist/security/security-hardening-system.d.ts.map +1 -1
- package/dist/security/security-hardening-system.js +62 -4
- package/dist/security/security-hardening-system.js.map +1 -1
- package/package.json +4 -2
- package/scripts/node/universal-version-manager.js +3 -3
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Ecosystem
|
|
3
|
+
*
|
|
4
|
+
* Secure plugin system for third-party agent extensions.
|
|
5
|
+
* Provides sandboxed execution, validation, and lifecycle management.
|
|
6
|
+
*
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @since 2026-01-07
|
|
9
|
+
*/
|
|
10
|
+
import { frameworkLogger, generateJobId } from "../core/framework-logger.js";
|
|
11
|
+
export class PluginValidator {
|
|
12
|
+
requiredFields = [
|
|
13
|
+
"id",
|
|
14
|
+
"name",
|
|
15
|
+
"version",
|
|
16
|
+
"description",
|
|
17
|
+
"author",
|
|
18
|
+
"license",
|
|
19
|
+
"engines",
|
|
20
|
+
];
|
|
21
|
+
securityChecks = [
|
|
22
|
+
"validatePackageName",
|
|
23
|
+
"validateDependencies",
|
|
24
|
+
"validatePermissions",
|
|
25
|
+
"validateCodeSecurity",
|
|
26
|
+
"validateResourceLimits",
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Comprehensive plugin validation
|
|
30
|
+
*/
|
|
31
|
+
async validatePlugin(pluginPath) {
|
|
32
|
+
const result = {
|
|
33
|
+
valid: false,
|
|
34
|
+
errors: [],
|
|
35
|
+
warnings: [],
|
|
36
|
+
securityIssues: [],
|
|
37
|
+
compatibilityScore: 0,
|
|
38
|
+
};
|
|
39
|
+
try {
|
|
40
|
+
const packageJson = await this.loadPackageJson(pluginPath);
|
|
41
|
+
const metadataValidation = this.validateMetadata(packageJson);
|
|
42
|
+
result.errors.push(...metadataValidation.errors);
|
|
43
|
+
result.warnings.push(...metadataValidation.warnings);
|
|
44
|
+
const capabilitiesValidation = this.validateCapabilities(packageJson);
|
|
45
|
+
result.errors.push(...capabilitiesValidation.errors);
|
|
46
|
+
result.warnings.push(...capabilitiesValidation.warnings);
|
|
47
|
+
const securityValidation = await this.validateSecurity(pluginPath, packageJson);
|
|
48
|
+
result.securityIssues.push(...securityValidation.issues);
|
|
49
|
+
result.errors.push(...securityValidation.errors);
|
|
50
|
+
result.compatibilityScore = this.calculateCompatibilityScore(packageJson);
|
|
51
|
+
result.valid =
|
|
52
|
+
result.errors.length === 0 && result.securityIssues.length === 0;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
result.errors.push(`Validation failed: ${error}`);
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
async loadPackageJson(pluginPath) {
|
|
60
|
+
const fs = require("fs").promises;
|
|
61
|
+
const path = require("path");
|
|
62
|
+
const packagePath = path.join(pluginPath, "package.json");
|
|
63
|
+
const content = await fs.readFile(packagePath, "utf-8");
|
|
64
|
+
return JSON.parse(content);
|
|
65
|
+
}
|
|
66
|
+
validateMetadata(packageJson) {
|
|
67
|
+
const errors = [];
|
|
68
|
+
const warnings = [];
|
|
69
|
+
for (const field of this.requiredFields) {
|
|
70
|
+
if (!packageJson[field]) {
|
|
71
|
+
errors.push(`Missing required field: ${field}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (packageJson.version && !/^\d+\.\d+\.\d+/.test(packageJson.version)) {
|
|
75
|
+
errors.push("Invalid version format (expected semver)");
|
|
76
|
+
}
|
|
77
|
+
if (!packageJson.engines?.strray) {
|
|
78
|
+
errors.push("Missing StringRay engine requirement");
|
|
79
|
+
}
|
|
80
|
+
const suspiciousKeywords = [
|
|
81
|
+
"hack",
|
|
82
|
+
"exploit",
|
|
83
|
+
"malware",
|
|
84
|
+
"virus",
|
|
85
|
+
"trojan",
|
|
86
|
+
];
|
|
87
|
+
const keywords = packageJson.keywords || [];
|
|
88
|
+
for (const keyword of keywords) {
|
|
89
|
+
if (suspiciousKeywords.some((s) => keyword.toLowerCase().includes(s))) {
|
|
90
|
+
warnings.push(`Suspicious keyword detected: ${keyword}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { errors, warnings };
|
|
94
|
+
}
|
|
95
|
+
validateCapabilities(packageJson) {
|
|
96
|
+
const errors = [];
|
|
97
|
+
const warnings = [];
|
|
98
|
+
const capabilities = packageJson.stringrayCapabilities;
|
|
99
|
+
if (!capabilities) {
|
|
100
|
+
errors.push("Missing stringrayCapabilities in package.json");
|
|
101
|
+
return { errors, warnings };
|
|
102
|
+
}
|
|
103
|
+
if (!capabilities.agentTypes || !Array.isArray(capabilities.agentTypes)) {
|
|
104
|
+
errors.push("Missing or invalid agentTypes in capabilities");
|
|
105
|
+
}
|
|
106
|
+
if (!capabilities.supportedTasks ||
|
|
107
|
+
!Array.isArray(capabilities.supportedTasks)) {
|
|
108
|
+
errors.push("Missing or invalid supportedTasks in capabilities");
|
|
109
|
+
}
|
|
110
|
+
if (!capabilities.requiredPermissions ||
|
|
111
|
+
!Array.isArray(capabilities.requiredPermissions)) {
|
|
112
|
+
warnings.push("Missing requiredPermissions - assuming minimal permissions");
|
|
113
|
+
}
|
|
114
|
+
return { errors, warnings };
|
|
115
|
+
}
|
|
116
|
+
async validateSecurity(pluginPath, packageJson) {
|
|
117
|
+
const issues = [];
|
|
118
|
+
const errors = [];
|
|
119
|
+
const dangerousDeps = [
|
|
120
|
+
"eval",
|
|
121
|
+
"child_process",
|
|
122
|
+
"fs",
|
|
123
|
+
"net",
|
|
124
|
+
"http",
|
|
125
|
+
"https",
|
|
126
|
+
"crypto",
|
|
127
|
+
"tls",
|
|
128
|
+
"cluster",
|
|
129
|
+
"worker_threads",
|
|
130
|
+
];
|
|
131
|
+
const allDeps = {
|
|
132
|
+
...packageJson.dependencies,
|
|
133
|
+
...packageJson.devDependencies,
|
|
134
|
+
};
|
|
135
|
+
for (const dep of Object.keys(allDeps)) {
|
|
136
|
+
if (dangerousDeps.includes(dep)) {
|
|
137
|
+
issues.push(`Potentially dangerous dependency: ${dep}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const scripts = packageJson.scripts || {};
|
|
141
|
+
for (const [name, script] of Object.entries(scripts)) {
|
|
142
|
+
if (typeof script === "string") {
|
|
143
|
+
if (script.includes("rm -rf") ||
|
|
144
|
+
script.includes("sudo") ||
|
|
145
|
+
script.includes("chmod +x")) {
|
|
146
|
+
issues.push(`Potentially dangerous script: ${name}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const fs = require("fs").promises;
|
|
151
|
+
const path = require("path");
|
|
152
|
+
try {
|
|
153
|
+
const files = await fs.readdir(pluginPath);
|
|
154
|
+
const hasIndex = files.includes("index.js") || files.includes("index.ts");
|
|
155
|
+
if (!hasIndex) {
|
|
156
|
+
errors.push("Plugin must have an index.js or index.ts file");
|
|
157
|
+
}
|
|
158
|
+
for (const file of files) {
|
|
159
|
+
const stat = await fs.stat(path.join(pluginPath, file));
|
|
160
|
+
if (stat.isFile() && stat.mode & parseInt("111", 8)) {
|
|
161
|
+
issues.push(`Executable file detected: ${file}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
errors.push(`Failed to validate plugin structure: ${error}`);
|
|
167
|
+
}
|
|
168
|
+
return { issues, errors };
|
|
169
|
+
}
|
|
170
|
+
calculateCompatibilityScore(packageJson) {
|
|
171
|
+
let score = 0;
|
|
172
|
+
const strrayEngine = packageJson.engines?.strray;
|
|
173
|
+
if (strrayEngine) {
|
|
174
|
+
if (strrayEngine === "^1.0.0")
|
|
175
|
+
score += 30;
|
|
176
|
+
else if (strrayEngine.startsWith("^1."))
|
|
177
|
+
score += 20;
|
|
178
|
+
else if (strrayEngine.startsWith("~1."))
|
|
179
|
+
score += 15;
|
|
180
|
+
else
|
|
181
|
+
score += 5;
|
|
182
|
+
}
|
|
183
|
+
const nodeEngine = packageJson.engines?.node;
|
|
184
|
+
if (nodeEngine) {
|
|
185
|
+
if (nodeEngine === "^18.0.0" || nodeEngine === ">=18.0.0")
|
|
186
|
+
score += 20;
|
|
187
|
+
else if (nodeEngine.startsWith("^18."))
|
|
188
|
+
score += 15;
|
|
189
|
+
else
|
|
190
|
+
score += 5;
|
|
191
|
+
}
|
|
192
|
+
const keywords = packageJson.keywords || [];
|
|
193
|
+
const relevantKeywords = ["strray", "plugin", "agent", "ai", "framework"];
|
|
194
|
+
const relevantCount = keywords.filter((k) => relevantKeywords.some((r) => k.toLowerCase().includes(r))).length;
|
|
195
|
+
score += Math.min(relevantCount * 5, 25);
|
|
196
|
+
if (packageJson.description)
|
|
197
|
+
score += 10;
|
|
198
|
+
if (packageJson.homepage)
|
|
199
|
+
score += 5;
|
|
200
|
+
if (packageJson.repository)
|
|
201
|
+
score += 5;
|
|
202
|
+
return Math.min(score, 100);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
export class PluginSandbox {
|
|
206
|
+
sandbox = null;
|
|
207
|
+
config;
|
|
208
|
+
constructor(config = {}) {
|
|
209
|
+
this.config = {
|
|
210
|
+
memoryLimit: 50, // 50MB
|
|
211
|
+
timeout: 30000, // 30 seconds
|
|
212
|
+
allowedModules: ["util", "events", "stream", "buffer", "string_decoder"],
|
|
213
|
+
networkAccess: false,
|
|
214
|
+
fileSystemAccess: false,
|
|
215
|
+
environmentVariables: [],
|
|
216
|
+
...config,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Execute plugin code in sandbox
|
|
221
|
+
*/
|
|
222
|
+
async executePlugin(pluginPath, method, ...args) {
|
|
223
|
+
const vm = require("vm");
|
|
224
|
+
const fs = require("fs").promises;
|
|
225
|
+
const path = require("path");
|
|
226
|
+
const pluginCode = await fs.readFile(path.join(pluginPath, "index.js"), "utf-8");
|
|
227
|
+
const context = vm.createContext({
|
|
228
|
+
console: {
|
|
229
|
+
log: async (...args) => await frameworkLogger.log("plugin-system", "-plugin-args-error-args-any-console-error-plugin-a", "error", { message: "[PLUGIN]", ...args }),
|
|
230
|
+
error: (...args) => console.error("[PLUGIN]", ...args),
|
|
231
|
+
warn: (...args) => console.warn("[PLUGIN]", ...args),
|
|
232
|
+
},
|
|
233
|
+
require: this.createRestrictedRequire(),
|
|
234
|
+
process: {
|
|
235
|
+
env: this.filterEnvironmentVariables(),
|
|
236
|
+
version: process.version,
|
|
237
|
+
platform: process.platform,
|
|
238
|
+
},
|
|
239
|
+
Buffer: Buffer,
|
|
240
|
+
setTimeout: setTimeout,
|
|
241
|
+
clearTimeout: clearTimeout,
|
|
242
|
+
setInterval: setInterval,
|
|
243
|
+
clearInterval: clearInterval,
|
|
244
|
+
});
|
|
245
|
+
const script = new vm.Script(pluginCode);
|
|
246
|
+
const pluginInstance = script.runInContext(context);
|
|
247
|
+
return Promise.race([
|
|
248
|
+
pluginInstance[method](...args),
|
|
249
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("Plugin execution timeout")), this.config.timeout)),
|
|
250
|
+
]);
|
|
251
|
+
}
|
|
252
|
+
createRestrictedRequire() {
|
|
253
|
+
const Module = require("module");
|
|
254
|
+
const originalRequire = Module.prototype.require;
|
|
255
|
+
return (id) => {
|
|
256
|
+
if (!this.config.allowedModules.includes(id)) {
|
|
257
|
+
throw new Error(`Module '${id}' is not allowed in plugin sandbox`);
|
|
258
|
+
}
|
|
259
|
+
return originalRequire.call(this, id);
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
filterEnvironmentVariables() {
|
|
263
|
+
const filtered = {};
|
|
264
|
+
for (const key of this.config.environmentVariables) {
|
|
265
|
+
if (process.env[key]) {
|
|
266
|
+
filtered[key] = process.env[key];
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return filtered;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
export class PluginRegistry {
|
|
273
|
+
plugins = new Map();
|
|
274
|
+
activePlugins = new Set();
|
|
275
|
+
validator;
|
|
276
|
+
sandbox;
|
|
277
|
+
constructor() {
|
|
278
|
+
this.validator = new PluginValidator();
|
|
279
|
+
this.sandbox = new PluginSandbox();
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Register a plugin
|
|
283
|
+
*/
|
|
284
|
+
async registerPlugin(pluginPath) {
|
|
285
|
+
try {
|
|
286
|
+
const validation = await this.validator.validatePlugin(pluginPath);
|
|
287
|
+
if (!validation.valid) {
|
|
288
|
+
return {
|
|
289
|
+
success: false,
|
|
290
|
+
errors: [...validation.errors, ...validation.securityIssues],
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
const pluginInstance = await this.sandbox.executePlugin(pluginPath, "createPlugin");
|
|
294
|
+
this.plugins.set(pluginInstance.metadata.id, pluginInstance);
|
|
295
|
+
const jobId = generateJobId("plugin-system-register");
|
|
296
|
+
frameworkLogger.log("plugin-system", "plugin registered", "success", {
|
|
297
|
+
name: pluginInstance.metadata.name,
|
|
298
|
+
version: pluginInstance.metadata.version,
|
|
299
|
+
}, undefined, jobId);
|
|
300
|
+
return { success: true, errors: [] };
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
return {
|
|
304
|
+
success: false,
|
|
305
|
+
errors: [`Plugin registration failed: ${error}`],
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Activate a plugin
|
|
311
|
+
*/
|
|
312
|
+
async activatePlugin(pluginId, config = {}) {
|
|
313
|
+
const plugin = this.plugins.get(pluginId);
|
|
314
|
+
if (!plugin) {
|
|
315
|
+
console.error(`Plugin ${pluginId} not found`);
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
try {
|
|
319
|
+
await plugin.initialize(config);
|
|
320
|
+
await plugin.activate();
|
|
321
|
+
this.activePlugins.add(pluginId);
|
|
322
|
+
const jobId = generateJobId("plugin-system-activate");
|
|
323
|
+
frameworkLogger.log("plugin-system", "plugin activated", "success", {
|
|
324
|
+
name: plugin.metadata.name,
|
|
325
|
+
}, undefined, jobId);
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
console.error(`❌ Plugin activation failed: ${error}`);
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Deactivate a plugin
|
|
335
|
+
*/
|
|
336
|
+
async deactivatePlugin(pluginId) {
|
|
337
|
+
const plugin = this.plugins.get(pluginId);
|
|
338
|
+
if (!plugin)
|
|
339
|
+
return false;
|
|
340
|
+
try {
|
|
341
|
+
await plugin.deactivate();
|
|
342
|
+
this.activePlugins.delete(pluginId);
|
|
343
|
+
const jobId = generateJobId("plugin-system-deactivate");
|
|
344
|
+
frameworkLogger.log("plugin-system", "plugin deactivated", "success", {
|
|
345
|
+
name: plugin.metadata.name,
|
|
346
|
+
}, undefined, jobId);
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
console.error(`❌ Plugin deactivation failed: ${error}`);
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Get plugin instance
|
|
356
|
+
*/
|
|
357
|
+
getPlugin(pluginId) {
|
|
358
|
+
return this.plugins.get(pluginId) || null;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* List all registered plugins
|
|
362
|
+
*/
|
|
363
|
+
listPlugins() {
|
|
364
|
+
return Array.from(this.plugins.entries()).map(([id, plugin]) => ({
|
|
365
|
+
id,
|
|
366
|
+
name: plugin.metadata.name,
|
|
367
|
+
version: plugin.metadata.version,
|
|
368
|
+
active: this.activePlugins.has(id),
|
|
369
|
+
}));
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Get plugin health status
|
|
373
|
+
*/
|
|
374
|
+
async getPluginHealth(pluginId) {
|
|
375
|
+
const plugin = this.plugins.get(pluginId);
|
|
376
|
+
if (!plugin)
|
|
377
|
+
return null;
|
|
378
|
+
try {
|
|
379
|
+
return await plugin.getHealthStatus();
|
|
380
|
+
}
|
|
381
|
+
catch (error) {
|
|
382
|
+
return {
|
|
383
|
+
status: "unhealthy",
|
|
384
|
+
lastCheck: Date.now(),
|
|
385
|
+
uptime: 0,
|
|
386
|
+
errorCount: 1,
|
|
387
|
+
warningCount: 0,
|
|
388
|
+
details: { error: String(error) },
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Unregister a plugin
|
|
394
|
+
*/
|
|
395
|
+
async unregisterPlugin(pluginId) {
|
|
396
|
+
const plugin = this.plugins.get(pluginId);
|
|
397
|
+
if (!plugin)
|
|
398
|
+
return false;
|
|
399
|
+
if (this.activePlugins.has(pluginId)) {
|
|
400
|
+
await this.deactivatePlugin(pluginId);
|
|
401
|
+
}
|
|
402
|
+
try {
|
|
403
|
+
await plugin.dispose();
|
|
404
|
+
}
|
|
405
|
+
catch (error) {
|
|
406
|
+
console.warn(`Plugin disposal failed: ${error}`);
|
|
407
|
+
}
|
|
408
|
+
this.plugins.delete(pluginId);
|
|
409
|
+
const jobId = generateJobId("plugin-system-unregister");
|
|
410
|
+
frameworkLogger.log("plugin-system", "plugin unregistered", "success", {
|
|
411
|
+
name: plugin.metadata.name,
|
|
412
|
+
}, undefined, jobId);
|
|
413
|
+
return true;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
export const pluginValidator = new PluginValidator();
|
|
417
|
+
export const pluginSandbox = new PluginSandbox();
|
|
418
|
+
export const pluginRegistry = new PluginRegistry();
|
|
419
|
+
//# sourceMappingURL=plugin-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-system.js","sourceRoot":"","sources":["../../src/plugins/plugin-system.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAsF7E,MAAM,OAAO,eAAe;IACT,cAAc,GAAG;QAChC,IAAI;QACJ,MAAM;QACN,SAAS;QACT,aAAa;QACb,QAAQ;QACR,SAAS;QACT,SAAS;KACV,CAAC;IAEe,cAAc,GAAG;QAChC,qBAAqB;QACrB,sBAAsB;QACtB,qBAAqB;QACrB,sBAAsB;QACtB,wBAAwB;KACzB,CAAC;IAEF;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,UAAkB;QACrC,MAAM,MAAM,GAA2B;YACrC,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,EAAE;YAClB,kBAAkB,EAAE,CAAC;SACtB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAE3D,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAErD,MAAM,sBAAsB,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;YACrD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YAEzD,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACpD,UAAU,EACV,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAEjD,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC;YAE1E,MAAM,CAAC,KAAK;gBACV,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,UAAkB;QAC9C,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAE7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAEO,gBAAgB,CAAC,WAAgB;QAIvC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,IAAI,WAAW,CAAC,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,kBAAkB,GAAG;YACzB,MAAM;YACN,SAAS;YACT,SAAS;YACT,OAAO;YACP,QAAQ;SACT,CAAC;QACF,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,QAAQ,CAAC,IAAI,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAEO,oBAAoB,CAAC,WAAgB;QAI3C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,MAAM,YAAY,GAAG,WAAW,CAAC,qBAAqB,CAAC;QACvD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC/D,CAAC;QAED,IACE,CAAC,YAAY,CAAC,cAAc;YAC5B,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,EAC3C,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACnE,CAAC;QAED,IACE,CAAC,YAAY,CAAC,mBAAmB;YACjC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,EAChD,CAAC;YACD,QAAQ,CAAC,IAAI,CACX,4DAA4D,CAC7D,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,UAAkB,EAClB,WAAgB;QAEhB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,MAAM,aAAa,GAAG;YACpB,MAAM;YACN,eAAe;YACf,IAAI;YACJ,KAAK;YACL,MAAM;YACN,OAAO;YACP,QAAQ;YACR,KAAK;YACL,SAAS;YACT,gBAAgB;SACjB,CAAC;QAEF,MAAM,OAAO,GAAG;YACd,GAAG,WAAW,CAAC,YAAY;YAC3B,GAAG,WAAW,CAAC,eAAe;SAC/B,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,qCAAqC,GAAG,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,IACE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBACzB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACvB,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC3B,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAE1E,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC/D,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;gBACxD,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;oBACpD,MAAM,CAAC,IAAI,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,wCAAwC,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAEO,2BAA2B,CAAC,WAAgB;QAClD,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;QACjD,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,YAAY,KAAK,QAAQ;gBAAE,KAAK,IAAI,EAAE,CAAC;iBACtC,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC;gBAAE,KAAK,IAAI,EAAE,CAAC;iBAChD,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC;gBAAE,KAAK,IAAI,EAAE,CAAC;;gBAChD,KAAK,IAAI,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC;QAC7C,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,UAAU;gBAAE,KAAK,IAAI,EAAE,CAAC;iBAClE,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,KAAK,IAAI,EAAE,CAAC;;gBAC/C,KAAK,IAAI,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC5C,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAClD,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAC1D,CAAC,MAAM,CAAC;QACT,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAEzC,IAAI,WAAW,CAAC,WAAW;YAAE,KAAK,IAAI,EAAE,CAAC;QACzC,IAAI,WAAW,CAAC,QAAQ;YAAE,KAAK,IAAI,CAAC,CAAC;QACrC,IAAI,WAAW,CAAC,UAAU;YAAE,KAAK,IAAI,CAAC,CAAC;QAEvC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,aAAa;IAChB,OAAO,GAAQ,IAAI,CAAC;IACpB,MAAM,CAAsB;IAEpC,YAAY,SAAuC,EAAE;QACnD,IAAI,CAAC,MAAM,GAAG;YACZ,WAAW,EAAE,EAAE,EAAE,OAAO;YACxB,OAAO,EAAE,KAAK,EAAE,aAAa;YAC7B,cAAc,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,CAAC;YACxE,aAAa,EAAE,KAAK;YACpB,gBAAgB,EAAE,KAAK;YACvB,oBAAoB,EAAE,EAAE;YACxB,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,UAAkB,EAClB,MAAc,EACd,GAAG,IAAW;QAEd,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAE7B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAClC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EACjC,OAAO,CACR,CAAC;QAEF,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC;YAC/B,OAAO,EAAE;gBACP,GAAG,EAAE,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE,CAC5B,MAAM,eAAe,CAAC,GAAG,CACvB,eAAe,EACf,oDAAoD,EACpD,OAAO,EACP,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,CACjC;gBACH,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC;gBAC7D,IAAI,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC;aAC5D;YACD,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE;YACvC,OAAO,EAAE;gBACP,GAAG,EAAE,IAAI,CAAC,0BAA0B,EAAE;gBACtC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B;YACD,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,UAAU;YACtB,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,WAAW;YACxB,aAAa,EAAE,aAAa;SAC7B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAEpD,OAAO,OAAO,CAAC,IAAI,CAAC;YAClB,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;YAC/B,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACxB,UAAU,CACR,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,EACnD,IAAI,CAAC,MAAM,CAAC,OAAO,CACpB,CACF;SACF,CAAC,CAAC;IACL,CAAC;IAEO,uBAAuB;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QAEjD,OAAO,CAAC,EAAU,EAAE,EAAE;YACpB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,oCAAoC,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC;IACJ,CAAC;IAEO,0BAA0B;QAChC,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAE5C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YACnD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YACpC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,MAAM,OAAO,cAAc;IACjB,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC7C,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,SAAS,CAAkB;IAC3B,OAAO,CAAgB;IAE/B;QACE,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,UAAkB;QAElB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACnE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC;iBAC7D,CAAC;YACJ,CAAC;YAED,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CACrD,UAAU,EACV,cAAc,CACf,CAAC;YAEF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YAE7D,MAAM,KAAK,GAAG,aAAa,CAAC,wBAAwB,CAAC,CAAC;YACtD,eAAe,CAAC,GAAG,CACjB,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT;gBACE,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,IAAI;gBAClC,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO;aACzC,EACD,SAAS,EACT,KAAK,CACN,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,CAAC,+BAA+B,KAAK,EAAE,CAAC;aACjD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,SAAc,EAAE;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,UAAU,QAAQ,YAAY,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAEjC,MAAM,KAAK,GAAG,aAAa,CAAC,wBAAwB,CAAC,CAAC;YACtD,eAAe,CAAC,GAAG,CACjB,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT;gBACE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;aAC3B,EACD,SAAS,EACT,KAAK,CACN,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEpC,MAAM,KAAK,GAAG,aAAa,CAAC,0BAA0B,CAAC,CAAC;YACxD,eAAe,CAAC,GAAG,CACjB,eAAe,EACf,oBAAoB,EACpB,SAAS,EACT;gBACE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;aAC3B,EACD,SAAS,EACT,KAAK,CACN,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,QAAgB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,WAAW;QAMT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/D,EAAE;YACF,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;YAC1B,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;YAChC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;SACnC,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,MAAM,EAAE,CAAC;gBACT,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;aAClC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,aAAa,CAAC,0BAA0B,CAAC,CAAC;QACxD,eAAe,CAAC,GAAG,CACjB,eAAe,EACf,qBAAqB,EACrB,SAAS,EACT;YACE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;SAC3B,EACD,SAAS,EACT,KAAK,CACN,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AACjD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StringRay Plugin for OpenCode
|
|
3
|
+
*
|
|
4
|
+
* Enterprise AI orchestration with systematic error prevention.
|
|
5
|
+
* This plugin provides intelligent agent coordination and codex-based code quality enforcement.
|
|
6
|
+
*
|
|
7
|
+
* @version 1.1.2
|
|
8
|
+
* @author StringRay Framework Team
|
|
9
|
+
*/
|
|
10
|
+
export declare function stringrayPlugin(input: any): {
|
|
11
|
+
config: (input: {
|
|
12
|
+
client?: string;
|
|
13
|
+
directory?: string;
|
|
14
|
+
worktree?: string;
|
|
15
|
+
}) => void;
|
|
16
|
+
"experimental.chat.system.transform": (messages: any[], context: any) => any[];
|
|
17
|
+
"tool.execute.before": (tool: string, args: any) => void;
|
|
18
|
+
"tool.execute.after": (tool: string, args: any, result: any) => void;
|
|
19
|
+
};
|
|
20
|
+
export default stringrayPlugin;
|
|
21
|
+
//# sourceMappingURL=stringray-codex-injection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringray-codex-injection.d.ts","sourceRoot":"","sources":["../../src/plugins/stringray-codex-injection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwMH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG;oBA/LxB;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;qDAYgD,GAAG,EAAE,WAAW,GAAG;kCA8HtC,MAAM,QAAQ,GAAG;iCAYlB,MAAM,QAAQ,GAAG,UAAU,GAAG;EA6D5D;AAGD,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StringRay Plugin for OpenCode
|
|
3
|
+
*
|
|
4
|
+
* Enterprise AI orchestration with systematic error prevention.
|
|
5
|
+
* This plugin provides intelligent agent coordination and codex-based code quality enforcement.
|
|
6
|
+
*
|
|
7
|
+
* @version 1.1.2
|
|
8
|
+
* @author StringRay Framework Team
|
|
9
|
+
*/
|
|
10
|
+
import { frameworkLogger, generateJobId } from "../core/framework-logger.js";
|
|
11
|
+
import { TokenManager } from "../utils/token-manager.js";
|
|
12
|
+
const tokenManager = new TokenManager();
|
|
13
|
+
const pluginHooks = {
|
|
14
|
+
config: (input) => {
|
|
15
|
+
const jobId = generateJobId("codex-injector-init");
|
|
16
|
+
frameworkLogger.log("codex-injector", "plugin initialized", "info", {}, undefined, jobId);
|
|
17
|
+
},
|
|
18
|
+
"experimental.chat.system.transform": (messages, context) => {
|
|
19
|
+
const jobId = generateJobId("codex-injector-transform");
|
|
20
|
+
frameworkLogger.log("codex-injector", "chat.system.transform hook called", "info", { messageCount: messages?.length }, undefined, jobId);
|
|
21
|
+
// Inject codex context into system messages for agent guidance
|
|
22
|
+
try {
|
|
23
|
+
const fullContent = `## StringRay Framework Codex v1.2.25
|
|
24
|
+
|
|
25
|
+
Welcome to StringRay AI! This session includes systematic error prevention and production-ready development guidelines.
|
|
26
|
+
|
|
27
|
+
### 🚀 Available Framework Capabilities
|
|
28
|
+
|
|
29
|
+
**Agent Commands (use @agent-name):**
|
|
30
|
+
- **@orchestrator** - Multi-agent workflow coordination (accesses all internal agents)
|
|
31
|
+
- **@enforcer** - Codex compliance & error prevention
|
|
32
|
+
|
|
33
|
+
**Internal Agent System:**
|
|
34
|
+
All 8 specialized agents (architect, bug-triage-specialist, code-reviewer, security-auditor, refactorer, testing-lead, researcher) are available internally through orchestrator coordination and framework operations.
|
|
35
|
+
|
|
36
|
+
**Skills System (23 lazy-loaded capabilities):**
|
|
37
|
+
- project-analysis, testing-strategy, code-review, security-audit, performance-optimization
|
|
38
|
+
- refactoring-strategies, ui-ux-design, documentation-generation, and more
|
|
39
|
+
|
|
40
|
+
**Framework Tools:**
|
|
41
|
+
- **framework-reporting-system** - Generate comprehensive activity reports
|
|
42
|
+
- **complexity-analyzer** - Analyze code complexity and delegation decisions
|
|
43
|
+
- **codex-injector** - Apply development standards automatically
|
|
44
|
+
|
|
45
|
+
**Help & Discovery:**
|
|
46
|
+
To discover all available capabilities, use the framework-help system:
|
|
47
|
+
- Get capabilities overview and command examples
|
|
48
|
+
- Access detailed explanations of any framework feature
|
|
49
|
+
- Available through MCP server: framework-help
|
|
50
|
+
|
|
51
|
+
### Core Principles:
|
|
52
|
+
- **Progressive Prod-Ready Code**: All code must be production-ready from the first commit
|
|
53
|
+
- **No Patches/Boiler/Stubs**: Prohibit temporary patches and incomplete implementations
|
|
54
|
+
- **Surgical Fixes**: Apply precise, targeted fixes with root cause resolution
|
|
55
|
+
- **Type Safety First**: Leverage TypeScript's type system fully
|
|
56
|
+
- **Single Source of Truth**: Maintain authoritative sources for all information
|
|
57
|
+
|
|
58
|
+
### Development Guidelines:
|
|
59
|
+
- **YAGNI**: Don't implement features not currently needed
|
|
60
|
+
- **DRY**: Don't repeat yourself - extract reusable logic
|
|
61
|
+
- **Separation of Concerns**: Keep UI, business logic, and data layers distinct
|
|
62
|
+
- **Test Coverage >85%**: Maintain comprehensive behavioral test coverage
|
|
63
|
+
- **Performance Budget**: Bundle size <2MB (gzipped <700KB)
|
|
64
|
+
|
|
65
|
+
For complete codex documentation, see: .opencode/strray/codex.json
|
|
66
|
+
|
|
67
|
+
### 🔒 Critical Spawn Governance (All Agents)
|
|
68
|
+
|
|
69
|
+
**MANDATORY: All agents must follow these spawn governance rules:**
|
|
70
|
+
|
|
71
|
+
- **Maximum 2 subagents total** across all operations within a single agent session
|
|
72
|
+
- **No nested subagent spawning** - subagents cannot spawn their own subagents
|
|
73
|
+
- **Solo agents (researcher)** can spawn 0 subagents - they are terminal agents
|
|
74
|
+
- **Always check spawn authorization** before creating new agents via agentSpawnGovernor
|
|
75
|
+
- **Report spawn attempts** to monitoring system before execution
|
|
76
|
+
- **Terminate gracefully** if spawn limits exceeded - do not attempt workarounds
|
|
77
|
+
- **Single level only** - coordinator agents can spawn workers, but workers cannot spawn more agents
|
|
78
|
+
|
|
79
|
+
**Violation of these rules will result in immediate system shutdown to prevent infinite loops.**`;
|
|
80
|
+
const limitCheck = tokenManager.checkLimits(fullContent);
|
|
81
|
+
let finalContent = fullContent;
|
|
82
|
+
if (!limitCheck.withinLimit) {
|
|
83
|
+
const jobId = generateJobId("codex-injector-token-exceed");
|
|
84
|
+
frameworkLogger.log("codex-injector", "Codex content exceeds token limits, pruning context", "error", {
|
|
85
|
+
currentTokens: limitCheck.currentTokens,
|
|
86
|
+
maxTokens: limitCheck.maxTokens,
|
|
87
|
+
}, undefined, jobId);
|
|
88
|
+
finalContent = tokenManager.pruneContext(fullContent);
|
|
89
|
+
}
|
|
90
|
+
else if (limitCheck.warning) {
|
|
91
|
+
const jobId = generateJobId("codex-injector-token-warning");
|
|
92
|
+
frameworkLogger.log("codex-injector", "Codex content approaching token limits", "info", {
|
|
93
|
+
currentTokens: limitCheck.currentTokens,
|
|
94
|
+
maxTokens: limitCheck.maxTokens,
|
|
95
|
+
}, undefined, jobId);
|
|
96
|
+
}
|
|
97
|
+
// CRITICAL: DO NOT add complexity analysis here
|
|
98
|
+
// Complexity analysis belongs in the delegation system, not context injection
|
|
99
|
+
// This plugin should ONLY handle codex context injection
|
|
100
|
+
const codexMessage = {
|
|
101
|
+
role: "system",
|
|
102
|
+
content: finalContent,
|
|
103
|
+
};
|
|
104
|
+
// Modify context.system array to include codex message
|
|
105
|
+
if (context && context.system && Array.isArray(context.system)) {
|
|
106
|
+
context.system.unshift(codexMessage);
|
|
107
|
+
}
|
|
108
|
+
// Return the original messages (the hook modifies context in place)
|
|
109
|
+
return messages;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error("❌ StringRay: Error injecting codex context:", error);
|
|
113
|
+
// Return original messages if injection fails
|
|
114
|
+
return messages;
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"tool.execute.before": (tool, args) => {
|
|
118
|
+
const jobId = generateJobId("codex-injector-tool-before");
|
|
119
|
+
frameworkLogger.log("codex-injector", "tool.execute.before hook called", "info", { tool }, undefined, jobId);
|
|
120
|
+
},
|
|
121
|
+
"tool.execute.after": (tool, args, result) => {
|
|
122
|
+
const jobId = generateJobId("codex-injector-tool-after");
|
|
123
|
+
frameworkLogger.log("codex-injector", "tool.execute.after hook called", "success", { tool }, undefined, jobId);
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
// Lightweight bypass for simple interactions
|
|
127
|
+
function isSimpleInteraction(input) {
|
|
128
|
+
if (!input || typeof input !== "object")
|
|
129
|
+
return false;
|
|
130
|
+
// Check messages for simple greetings/chats
|
|
131
|
+
if (input.messages && Array.isArray(input.messages)) {
|
|
132
|
+
const lastMessage = input.messages[input.messages.length - 1];
|
|
133
|
+
if (lastMessage && lastMessage.content) {
|
|
134
|
+
const content = String(lastMessage.content).toLowerCase().trim();
|
|
135
|
+
// Detect basic greetings and chat
|
|
136
|
+
if (content.match(/^(hi|hello|hey|sup|yo|howdy|greeting|chat|how are you|what'?s up)$/i)) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
// Export a function that returns the plugin hooks object
|
|
144
|
+
export function stringrayPlugin(input) {
|
|
145
|
+
// Fast path for simple interactions - skip full framework activation
|
|
146
|
+
if (isSimpleInteraction(input)) {
|
|
147
|
+
return {
|
|
148
|
+
config: () => { }, // No-op for simple interactions
|
|
149
|
+
"experimental.chat.system.transform": (messages, context) => {
|
|
150
|
+
// Insert minimal welcome message for simple interactions
|
|
151
|
+
const lightMessage = {
|
|
152
|
+
role: "system",
|
|
153
|
+
content: "Hello! I'm the StrRay Agentic Framework. Ready to help with development tasks.",
|
|
154
|
+
};
|
|
155
|
+
if (context && context.system && Array.isArray(context.system)) {
|
|
156
|
+
context.system.unshift(lightMessage);
|
|
157
|
+
}
|
|
158
|
+
return messages;
|
|
159
|
+
},
|
|
160
|
+
"tool.execute.before": () => { },
|
|
161
|
+
"tool.execute.after": () => { },
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// Full framework activation for complex requests
|
|
165
|
+
return pluginHooks;
|
|
166
|
+
}
|
|
167
|
+
// Default export for compatibility
|
|
168
|
+
export default stringrayPlugin;
|
|
169
|
+
//# sourceMappingURL=stringray-codex-injection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringray-codex-injection.js","sourceRoot":"","sources":["../../src/plugins/stringray-codex-injection.ts"],"names":[],"mappings":"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"}
|