strray-ai 1.7.2 → 1.7.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/hooks/post-commit +152 -55
- package/.opencode/hooks/post-commit.backup +110 -174
- package/.opencode/hooks/post-push +47 -64
- package/.opencode/hooks/post-push.backup +34 -38
- package/.opencode/strray/features.json +3 -3
- package/.opencode/strray/routing-mappings.json +90 -34
- package/AGENTS.md +7 -2
- package/dist/analytics/anonymization-engine.d.ts +108 -0
- package/dist/analytics/anonymization-engine.d.ts.map +1 -0
- package/dist/analytics/anonymization-engine.js +352 -0
- package/dist/analytics/anonymization-engine.js.map +1 -0
- package/dist/analytics/consent-manager.d.ts +94 -0
- package/dist/analytics/consent-manager.d.ts.map +1 -0
- package/dist/analytics/consent-manager.js +257 -0
- package/dist/analytics/consent-manager.js.map +1 -0
- package/dist/analytics/emerging-pattern-detector.d.ts +68 -0
- package/dist/analytics/emerging-pattern-detector.d.ts.map +1 -0
- package/dist/analytics/emerging-pattern-detector.js +250 -0
- package/dist/analytics/emerging-pattern-detector.js.map +1 -0
- package/dist/analytics/pattern-learning-engine.d.ts +81 -0
- package/dist/analytics/pattern-learning-engine.d.ts.map +1 -0
- package/dist/analytics/pattern-learning-engine.js +262 -0
- package/dist/analytics/pattern-learning-engine.js.map +1 -0
- package/dist/analytics/pattern-performance-tracker.d.ts +89 -0
- package/dist/analytics/pattern-performance-tracker.d.ts.map +1 -0
- package/dist/analytics/pattern-performance-tracker.js +289 -0
- package/dist/analytics/pattern-performance-tracker.js.map +1 -0
- package/dist/analytics/prompt-pattern-analyzer.d.ts +100 -0
- package/dist/analytics/prompt-pattern-analyzer.d.ts.map +1 -0
- package/dist/analytics/prompt-pattern-analyzer.js +372 -0
- package/dist/analytics/prompt-pattern-analyzer.js.map +1 -0
- package/dist/analytics/routing-performance-analyzer.d.ts +102 -0
- package/dist/analytics/routing-performance-analyzer.d.ts.map +1 -0
- package/dist/analytics/routing-performance-analyzer.js +342 -0
- package/dist/analytics/routing-performance-analyzer.js.map +1 -0
- package/dist/analytics/routing-refiner.d.ts +105 -0
- package/dist/analytics/routing-refiner.d.ts.map +1 -0
- package/dist/analytics/routing-refiner.js +381 -0
- package/dist/analytics/routing-refiner.js.map +1 -0
- package/dist/cli/commands/analytics-disable.d.ts +10 -0
- package/dist/cli/commands/analytics-disable.d.ts.map +1 -0
- package/dist/cli/commands/analytics-disable.js +73 -0
- package/dist/cli/commands/analytics-disable.js.map +1 -0
- package/dist/cli/commands/analytics-enable-action.d.ts +9 -0
- package/dist/cli/commands/analytics-enable-action.d.ts.map +1 -0
- package/dist/cli/commands/analytics-enable-action.js +83 -0
- package/dist/cli/commands/analytics-enable-action.js.map +1 -0
- package/dist/cli/commands/analytics-preview.d.ts +10 -0
- package/dist/cli/commands/analytics-preview.d.ts.map +1 -0
- package/dist/cli/commands/analytics-preview.js +107 -0
- package/dist/cli/commands/analytics-preview.js.map +1 -0
- package/dist/cli/commands/analytics-status.d.ts +10 -0
- package/dist/cli/commands/analytics-status.d.ts.map +1 -0
- package/dist/cli/commands/analytics-status.js +68 -0
- package/dist/cli/commands/analytics-status.js.map +1 -0
- package/dist/cli/index.js +6 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adaptive-kernel.d.ts +110 -0
- package/dist/core/adaptive-kernel.d.ts.map +1 -0
- package/dist/core/adaptive-kernel.js +193 -0
- package/dist/core/adaptive-kernel.js.map +1 -0
- package/dist/core/kernel-patterns.d.ts +105 -0
- package/dist/core/kernel-patterns.d.ts.map +1 -0
- package/dist/core/kernel-patterns.js +328 -0
- package/dist/core/kernel-patterns.js.map +1 -0
- package/dist/core/orchestrator.d.ts +1 -0
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +40 -11
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/delegation/agent-delegator.d.ts +1 -0
- package/dist/delegation/agent-delegator.d.ts.map +1 -1
- package/dist/delegation/agent-delegator.js +24 -2
- package/dist/delegation/agent-delegator.js.map +1 -1
- package/dist/delegation/task-skill-router.d.ts +269 -5
- package/dist/delegation/task-skill-router.d.ts.map +1 -1
- package/dist/delegation/task-skill-router.js +810 -23
- package/dist/delegation/task-skill-router.js.map +1 -1
- package/dist/postprocessor/PostProcessor.d.ts +10 -0
- package/dist/postprocessor/PostProcessor.d.ts.map +1 -1
- package/dist/postprocessor/PostProcessor.js +87 -17
- package/dist/postprocessor/PostProcessor.js.map +1 -1
- package/dist/processors/agents-md-validation-processor.d.ts +1 -0
- package/dist/processors/agents-md-validation-processor.d.ts.map +1 -1
- package/dist/processors/agents-md-validation-processor.js +34 -12
- package/dist/processors/agents-md-validation-processor.js.map +1 -1
- package/dist/processors/processor-manager.d.ts +7 -0
- package/dist/processors/processor-manager.d.ts.map +1 -1
- package/dist/processors/processor-manager.js +93 -0
- package/dist/processors/processor-manager.js.map +1 -1
- package/dist/processors/test-auto-creation-processor.d.ts.map +1 -1
- package/dist/processors/test-auto-creation-processor.js +52 -38
- package/dist/processors/test-auto-creation-processor.js.map +1 -1
- package/dist/scripts/analytics/daily-routing-analysis.d.ts +18 -0
- package/dist/scripts/analytics/daily-routing-analysis.d.ts.map +1 -0
- package/dist/scripts/analytics/daily-routing-analysis.js +268 -0
- package/dist/scripts/analytics/daily-routing-analysis.js.map +1 -0
- package/dist/scripts/analytics/index.d.ts +15 -0
- package/dist/scripts/analytics/index.d.ts.map +1 -0
- package/dist/scripts/analytics/index.js +17 -0
- package/dist/scripts/analytics/index.js.map +1 -0
- package/dist/scripts/test-p9.d.ts +15 -0
- package/dist/scripts/test-p9.d.ts.map +1 -0
- package/dist/scripts/test-p9.js +220 -0
- package/dist/scripts/test-p9.js.map +1 -0
- package/package.json +6 -2
- package/scripts/node/kernel-e2e-test.mjs +168 -0
- package/scripts/node/kernel-framework-test.mjs +127 -0
- package/scripts/node/kernel-live-test.mjs +147 -0
- package/scripts/node/kernel-real-framework-test.mjs +103 -0
- package/scripts/node/kernel-update.cjs +379 -0
- package/scripts/node/reflection-check.sh +245 -27
- package/scripts/node/test-simple-names-comprehensive.mjs +221 -0
- package/scripts/node/test-simple-names.mjs +39 -0
- package/dist/agents/documentation-writer.d.ts +0 -9
- package/dist/agents/documentation-writer.d.ts.map +0 -1
- package/dist/agents/documentation-writer.js +0 -85
- package/dist/agents/documentation-writer.js.map +0 -1
- package/dist/agents/explore.d.ts +0 -8
- package/dist/agents/explore.d.ts.map +0 -1
- package/dist/agents/explore.js +0 -55
- package/dist/agents/explore.js.map +0 -1
- package/dist/agents/librarian.d.ts +0 -3
- package/dist/agents/librarian.d.ts.map +0 -1
- package/dist/agents/librarian.js +0 -84
- package/dist/agents/librarian.js.map +0 -1
- package/dist/agents/marketing-expert.d.ts +0 -9
- package/dist/agents/marketing-expert.d.ts.map +0 -1
- package/dist/agents/marketing-expert.js +0 -112
- package/dist/agents/marketing-expert.js.map +0 -1
- package/dist/agents/oracle.d.ts +0 -8
- package/dist/agents/oracle.d.ts.map +0 -1
- package/dist/agents/oracle.js +0 -51
- package/dist/agents/oracle.js.map +0 -1
- package/dist/agents/seo-copywriter.d.ts +0 -10
- package/dist/agents/seo-copywriter.d.ts.map +0 -1
- package/dist/agents/seo-copywriter.js +0 -73
- package/dist/agents/seo-copywriter.js.map +0 -1
- package/dist/agents/seo-specialist.d.ts +0 -9
- package/dist/agents/seo-specialist.d.ts.map +0 -1
- package/dist/agents/seo-specialist.js +0 -54
- package/dist/agents/seo-specialist.js.map +0 -1
- package/dist/agents/test-architect.d.ts +0 -3
- package/dist/agents/test-architect.d.ts.map +0 -1
- package/dist/agents/test-architect.js +0 -96
- package/dist/agents/test-architect.js.map +0 -1
- package/dist/mcps/enhanced-orchestrator.server.d.ts +0 -14
- package/dist/mcps/enhanced-orchestrator.server.d.ts.map +0 -1
- package/dist/mcps/enhanced-orchestrator.server.js +0 -266
- package/dist/mcps/enhanced-orchestrator.server.js.map +0 -1
- package/dist/mcps/knowledge-skills/analyzer.server.d.ts +0 -7
- package/dist/mcps/knowledge-skills/analyzer.server.d.ts.map +0 -1
- package/dist/mcps/knowledge-skills/analyzer.server.js +0 -282
- package/dist/mcps/knowledge-skills/analyzer.server.js.map +0 -1
- package/dist/mcps/knowledge-skills/documentation-generation.server.d.ts +0 -48
- package/dist/mcps/knowledge-skills/documentation-generation.server.d.ts.map +0 -1
- package/dist/mcps/knowledge-skills/documentation-generation.server.js +0 -1238
- package/dist/mcps/knowledge-skills/documentation-generation.server.js.map +0 -1
- package/dist/mcps/knowledge-skills/explore.server.d.ts +0 -21
- package/dist/mcps/knowledge-skills/explore.server.d.ts.map +0 -1
- package/dist/mcps/knowledge-skills/explore.server.js +0 -582
- package/dist/mcps/knowledge-skills/explore.server.js.map +0 -1
- package/dist/mcps/knowledge-skills/marketing-expert.server.d.ts +0 -8
- package/dist/mcps/knowledge-skills/marketing-expert.server.d.ts.map +0 -1
- package/dist/mcps/knowledge-skills/marketing-expert.server.js +0 -356
- package/dist/mcps/knowledge-skills/marketing-expert.server.js.map +0 -1
- package/dist/mcps/knowledge-skills/oracle.server.d.ts +0 -25
- package/dist/mcps/knowledge-skills/oracle.server.d.ts.map +0 -1
- package/dist/mcps/knowledge-skills/oracle.server.js +0 -569
- package/dist/mcps/knowledge-skills/oracle.server.js.map +0 -1
- package/dist/mcps/knowledge-skills/seo-copywriter.server.d.ts +0 -8
- package/dist/mcps/knowledge-skills/seo-copywriter.server.d.ts.map +0 -1
- package/dist/mcps/knowledge-skills/seo-copywriter.server.js +0 -251
- package/dist/mcps/knowledge-skills/seo-copywriter.server.js.map +0 -1
- package/dist/mcps/knowledge-skills/seo-specialist.server.d.ts +0 -8
- package/dist/mcps/knowledge-skills/seo-specialist.server.d.ts.map +0 -1
- package/dist/mcps/knowledge-skills/seo-specialist.server.js +0 -211
- package/dist/mcps/knowledge-skills/seo-specialist.server.js.map +0 -1
- package/dist/mcps/librarian.server.d.ts +0 -17
- package/dist/mcps/librarian.server.d.ts.map +0 -1
- package/dist/mcps/librarian.server.js +0 -382
- package/dist/mcps/librarian.server.js.map +0 -1
- package/dist/optimization/performance-optimizer.d.ts +0 -179
- package/dist/optimization/performance-optimizer.d.ts.map +0 -1
- package/dist/optimization/performance-optimizer.js +0 -556
- package/dist/optimization/performance-optimizer.js.map +0 -1
- package/dist/utils/memory-pool.d.ts +0 -90
- package/dist/utils/memory-pool.d.ts.map +0 -1
- package/dist/utils/memory-pool.js +0 -245
- package/dist/utils/memory-pool.js.map +0 -1
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consent Manager for StringRay Central Analytics
|
|
3
|
+
*
|
|
4
|
+
* Manages user consent for analytics data submission with granular
|
|
5
|
+
* control over what categories can be shared.
|
|
6
|
+
*
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @since 2026-03-06
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from "fs/promises";
|
|
11
|
+
import * as path from "path";
|
|
12
|
+
export class ConsentManager {
|
|
13
|
+
configPath;
|
|
14
|
+
config = null;
|
|
15
|
+
submissionQueue = [];
|
|
16
|
+
constructor(configPath = ".opencode/consent.json") {
|
|
17
|
+
this.configPath = path.join(process.cwd(), configPath);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Initialize consent manager - load existing config or create default
|
|
21
|
+
*/
|
|
22
|
+
async initialize() {
|
|
23
|
+
try {
|
|
24
|
+
await this.loadConfig();
|
|
25
|
+
if (!this.config) {
|
|
26
|
+
// Create default disabled configuration
|
|
27
|
+
this.config = this.createDefaultConfig();
|
|
28
|
+
await this.saveConfig();
|
|
29
|
+
}
|
|
30
|
+
return this.config;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
// If config doesn't exist, create default
|
|
34
|
+
this.config = this.createDefaultConfig();
|
|
35
|
+
await this.saveConfig();
|
|
36
|
+
return this.config;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Enable analytics (opt-in)
|
|
41
|
+
*/
|
|
42
|
+
async enableConsent(categories) {
|
|
43
|
+
if (!this.config) {
|
|
44
|
+
await this.initialize();
|
|
45
|
+
}
|
|
46
|
+
if (!this.config) {
|
|
47
|
+
throw new Error("Failed to initialize consent configuration");
|
|
48
|
+
}
|
|
49
|
+
// Enable all categories if none specified
|
|
50
|
+
const categoriesToEnable = categories || Object.keys(this.config.categories);
|
|
51
|
+
// Enable main analytics flag
|
|
52
|
+
this.config.analyticsEnabled = true;
|
|
53
|
+
this.config.consentDate = new Date();
|
|
54
|
+
this.config.consentVersion = "1.0";
|
|
55
|
+
// Enable specified categories
|
|
56
|
+
categoriesToEnable.forEach(cat => {
|
|
57
|
+
if (this.config && cat in this.config.categories) {
|
|
58
|
+
this.config.categories[cat] = true;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
// Generate project ID if not exists
|
|
62
|
+
if (!this.config.projectId || this.config.projectId === "") {
|
|
63
|
+
this.config.projectId = this.generateProjectId();
|
|
64
|
+
}
|
|
65
|
+
await this.saveConfig();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Disable analytics (opt-out)
|
|
69
|
+
*/
|
|
70
|
+
async disableConsent() {
|
|
71
|
+
if (!this.config) {
|
|
72
|
+
await this.initialize();
|
|
73
|
+
}
|
|
74
|
+
if (!this.config) {
|
|
75
|
+
throw new Error("Failed to initialize consent configuration");
|
|
76
|
+
}
|
|
77
|
+
// Disable all analytics
|
|
78
|
+
this.config.analyticsEnabled = false;
|
|
79
|
+
this.config.lastOptOut = new Date();
|
|
80
|
+
// Disable all categories
|
|
81
|
+
Object.keys(this.config.categories).forEach(cat => {
|
|
82
|
+
this.config.categories[cat] = false;
|
|
83
|
+
});
|
|
84
|
+
await this.saveConfig();
|
|
85
|
+
// Clear submission queue
|
|
86
|
+
await this.clearSubmissionQueue();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check if submission is allowed for a category
|
|
90
|
+
*/
|
|
91
|
+
canSubmit(category) {
|
|
92
|
+
if (!this.config) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return this.config.analyticsEnabled &&
|
|
96
|
+
this.config.categories[category] === true;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get current consent status
|
|
100
|
+
*/
|
|
101
|
+
async getStatus() {
|
|
102
|
+
if (!this.config) {
|
|
103
|
+
await this.initialize();
|
|
104
|
+
}
|
|
105
|
+
if (!this.config) {
|
|
106
|
+
throw new Error("Failed to load consent configuration");
|
|
107
|
+
}
|
|
108
|
+
return { ...this.config };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Enable specific category
|
|
112
|
+
*/
|
|
113
|
+
async enableCategory(category) {
|
|
114
|
+
if (!this.config) {
|
|
115
|
+
await this.initialize();
|
|
116
|
+
}
|
|
117
|
+
if (!this.config || !(category in this.config.categories)) {
|
|
118
|
+
throw new Error(`Invalid category: ${category}`);
|
|
119
|
+
}
|
|
120
|
+
this.config.categories[category] = true;
|
|
121
|
+
await this.saveConfig();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Disable specific category
|
|
125
|
+
*/
|
|
126
|
+
async disableCategory(category) {
|
|
127
|
+
if (!this.config) {
|
|
128
|
+
await this.initialize();
|
|
129
|
+
}
|
|
130
|
+
if (!this.config || !(category in this.config.categories)) {
|
|
131
|
+
throw new Error(`Invalid category: ${category}`);
|
|
132
|
+
}
|
|
133
|
+
this.config.categories[category] = false;
|
|
134
|
+
await this.saveConfig();
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get all categories with their status
|
|
138
|
+
*/
|
|
139
|
+
getCategories() {
|
|
140
|
+
if (!this.config) {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
const categoryInfo = {
|
|
144
|
+
reflections: "Anonymized reflection data for pattern learning",
|
|
145
|
+
logs: "Framework activity logs for performance analysis",
|
|
146
|
+
metrics: "Agent performance and routing metrics",
|
|
147
|
+
patterns: "P9 pattern learning data and insights"
|
|
148
|
+
};
|
|
149
|
+
return Object.entries(this.config.categories).map(([name, enabled]) => ({
|
|
150
|
+
name,
|
|
151
|
+
description: categoryInfo[name] || "",
|
|
152
|
+
enabled: enabled
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Generate anonymous project ID
|
|
157
|
+
*/
|
|
158
|
+
generateProjectId() {
|
|
159
|
+
// Generate UUID-like identifier
|
|
160
|
+
const timestamp = Date.now().toString(36);
|
|
161
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
162
|
+
return `project-${timestamp}-${random}`;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Create default disabled configuration
|
|
166
|
+
*/
|
|
167
|
+
createDefaultConfig() {
|
|
168
|
+
return {
|
|
169
|
+
analyticsEnabled: false,
|
|
170
|
+
consentDate: new Date(),
|
|
171
|
+
consentVersion: "1.0",
|
|
172
|
+
lastOptOut: undefined,
|
|
173
|
+
categories: {
|
|
174
|
+
reflections: false,
|
|
175
|
+
logs: false,
|
|
176
|
+
metrics: false,
|
|
177
|
+
patterns: false
|
|
178
|
+
},
|
|
179
|
+
projectId: this.generateProjectId()
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Load configuration from file
|
|
184
|
+
*/
|
|
185
|
+
async loadConfig() {
|
|
186
|
+
try {
|
|
187
|
+
const configData = await fs.readFile(this.configPath, "utf-8");
|
|
188
|
+
this.config = JSON.parse(configData);
|
|
189
|
+
// Convert date strings back to Date objects
|
|
190
|
+
if (this.config.consentDate) {
|
|
191
|
+
this.config.consentDate = new Date(this.config.consentDate);
|
|
192
|
+
}
|
|
193
|
+
if (this.config.lastOptOut) {
|
|
194
|
+
this.config.lastOptOut = new Date(this.config.lastOptOut);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
// Config doesn't exist or is invalid
|
|
199
|
+
this.config = null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Save configuration to file
|
|
204
|
+
*/
|
|
205
|
+
async saveConfig() {
|
|
206
|
+
if (!this.config) {
|
|
207
|
+
throw new Error("No configuration to save");
|
|
208
|
+
}
|
|
209
|
+
// Ensure directory exists
|
|
210
|
+
const configDir = path.dirname(this.configPath);
|
|
211
|
+
try {
|
|
212
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// Directory already exists
|
|
216
|
+
}
|
|
217
|
+
await fs.writeFile(this.configPath, JSON.stringify(this.config, null, 2), "utf-8");
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Clear submission queue
|
|
221
|
+
*/
|
|
222
|
+
async clearSubmissionQueue() {
|
|
223
|
+
const queuePath = path.join(path.dirname(this.configPath), "analytics", "submission-queue.json");
|
|
224
|
+
try {
|
|
225
|
+
await fs.writeFile(queuePath, "[]", "utf-8");
|
|
226
|
+
this.submissionQueue = [];
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
// Queue directory doesn't exist yet, which is fine
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Add item to submission queue
|
|
234
|
+
*/
|
|
235
|
+
async queueSubmission(data) {
|
|
236
|
+
if (!this.canSubmit("all")) {
|
|
237
|
+
throw new Error("Analytics is disabled or category not enabled");
|
|
238
|
+
}
|
|
239
|
+
this.submissionQueue.push(data);
|
|
240
|
+
await this.saveSubmissionQueue();
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Save submission queue to file
|
|
244
|
+
*/
|
|
245
|
+
async saveSubmissionQueue() {
|
|
246
|
+
const queueDir = path.join(path.dirname(this.configPath), "analytics");
|
|
247
|
+
const queuePath = path.join(queueDir, "submission-queue.json");
|
|
248
|
+
try {
|
|
249
|
+
await fs.mkdir(queueDir, { recursive: true });
|
|
250
|
+
await fs.writeFile(queuePath, JSON.stringify(this.submissionQueue, null, 2), "utf-8");
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
console.error("Failed to save submission queue:", error);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=consent-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-manager.js","sourceRoot":"","sources":["../../src/analytics/consent-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAsB7B,MAAM,OAAO,cAAc;IACjB,UAAU,CAAS;IACnB,MAAM,GAAgC,IAAI,CAAC;IAC3C,eAAe,GAAU,EAAE,CAAC;IAEpC,YAAY,UAAU,GAAG,wBAAwB;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YAExB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,wCAAwC;gBACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1B,CAAC;YAED,OAAO,IAAI,CAAC,MAAO,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0CAA0C;YAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,UAAqB;QACvC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,0CAA0C;QAC1C,MAAM,kBAAkB,GAAG,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE7E,6BAA6B;QAC7B,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC;QAEnC,8BAA8B;QAC9B,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC/B,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,UAAkB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,oCAAoC;QACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,EAAE,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACnD,CAAC;QAED,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;QAEpC,yBAAyB;QACzB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAChD,IAAI,CAAC,MAAO,CAAC,UAAkB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAExB,yBAAyB;QACzB,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,QAAgB;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAC3B,IAAI,CAAC,MAAM,CAAC,UAAkB,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,EAAE,GAAG,IAAI,CAAC,MAAO,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QAEA,IAAI,CAAC,MAAO,CAAC,UAAkB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QAClD,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QAEA,IAAI,CAAC,MAAO,CAAC,UAAkB,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QACnD,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,YAAY,GAA2B;YAC3C,WAAW,EAAE,iDAAiD;YAC9D,IAAI,EAAE,kDAAkD;YACxD,OAAO,EAAE,uCAAuC;YAChD,QAAQ,EAAE,uCAAuC;SAClD,CAAC;QAEF,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACtE,IAAI;YACJ,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;YACrC,OAAO,EAAE,OAAkB;SAC5B,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,gCAAgC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1D,OAAO,WAAW,SAAS,IAAI,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,OAAO;YACL,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,IAAI,IAAI,EAAE;YACvB,cAAc,EAAE,KAAK;YACrB,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE;gBACV,WAAW,EAAE,KAAK;gBAClB,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,KAAK;aAChB;YACD,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE;SACpC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAErC,4CAA4C;YAC5C,IAAI,IAAI,CAAC,MAAO,CAAC,WAAW,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAO,CAAC,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,WAAkB,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,IAAI,CAAC,MAAO,CAAC,UAAU,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAO,CAAC,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,UAAiB,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,qCAAqC;YACrC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,0BAA0B;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;QAED,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,uBAAuB,CAAC,CAAC;QAEjG,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mDAAmD;QACrD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,IAAS;QAC7B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QAE/D,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emerging Pattern Detector for P9 - ADAPTIVE_PATTERN_LEARNING
|
|
3
|
+
*
|
|
4
|
+
* Discovers new routing patterns from recent task requests,
|
|
5
|
+
* identifies emergent behaviors, and suggests new pattern candidates.
|
|
6
|
+
*
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @since 2026-03-05
|
|
9
|
+
*/
|
|
10
|
+
import type { EmergentPattern } from "../core/kernel-patterns.js";
|
|
11
|
+
import type { RoutingOutcome } from "../delegation/task-skill-router.js";
|
|
12
|
+
export interface ClusterResult {
|
|
13
|
+
clusterId: string;
|
|
14
|
+
patterns: string[];
|
|
15
|
+
frequency: number;
|
|
16
|
+
keywords: string[];
|
|
17
|
+
suggestedAgents: string[];
|
|
18
|
+
suggestedSkills: string[];
|
|
19
|
+
confidence: number;
|
|
20
|
+
}
|
|
21
|
+
export interface PatternDiscoveryResult {
|
|
22
|
+
emergentPatterns: EmergentPattern[];
|
|
23
|
+
clusters: ClusterResult[];
|
|
24
|
+
recommendations: string[];
|
|
25
|
+
}
|
|
26
|
+
export declare class EmergingPatternDetector {
|
|
27
|
+
private readonly minFrequencyThreshold;
|
|
28
|
+
private readonly minConfidenceThreshold;
|
|
29
|
+
private readonly clusterSimilarityThreshold;
|
|
30
|
+
private readonly maxClusters;
|
|
31
|
+
private readonly stopWords;
|
|
32
|
+
/**
|
|
33
|
+
* Extract meaningful keywords from task description
|
|
34
|
+
*/
|
|
35
|
+
private extractKeywords;
|
|
36
|
+
/**
|
|
37
|
+
* Calculate Jaccard similarity between two keyword sets
|
|
38
|
+
*/
|
|
39
|
+
private calculateSimilarity;
|
|
40
|
+
/**
|
|
41
|
+
* Cluster similar task descriptions
|
|
42
|
+
*/
|
|
43
|
+
private clusterTasks;
|
|
44
|
+
/**
|
|
45
|
+
* Detect emergent patterns from recent routing outcomes
|
|
46
|
+
*/
|
|
47
|
+
detectEmergingPatterns(outcomes: RoutingOutcome[]): PatternDiscoveryResult;
|
|
48
|
+
/**
|
|
49
|
+
* Check if a specific pattern is emerging
|
|
50
|
+
*/
|
|
51
|
+
isPatternEmerging(pattern: string, recentOutcomes: RoutingOutcome[], historicalBaseline: number): {
|
|
52
|
+
emerging: boolean;
|
|
53
|
+
trend: 'increasing' | 'decreasing' | 'stable';
|
|
54
|
+
confidence: number;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Get suggested keyword mappings from emergent patterns
|
|
58
|
+
*/
|
|
59
|
+
suggestKeywordMappings(emergentPatterns: EmergentPattern[]): Array<{
|
|
60
|
+
keywords: string[];
|
|
61
|
+
suggestedAgent: string;
|
|
62
|
+
suggestedSkill: string;
|
|
63
|
+
confidence: number;
|
|
64
|
+
reason: string;
|
|
65
|
+
}>;
|
|
66
|
+
}
|
|
67
|
+
export declare const emergingPatternDetector: EmergingPatternDetector;
|
|
68
|
+
//# sourceMappingURL=emerging-pattern-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emerging-pattern-detector.d.ts","sourceRoot":"","sources":["../../src/analytics/emerging-pattern-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAK;IAC3C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAO;IAC9C,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAO;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAMvB;IAEH;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACH,OAAO,CAAC,YAAY;IA0DpB;;OAEG;IACH,sBAAsB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,sBAAsB;IAyH1E;;OAEG;IACH,iBAAiB,CACf,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,cAAc,EAAE,EAChC,kBAAkB,EAAE,MAAM,GACzB;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAgC3F;;OAEG;IACH,sBAAsB,CAAC,gBAAgB,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;QACjE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CA+BH;AAGD,eAAO,MAAM,uBAAuB,yBAAgC,CAAC"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Emerging Pattern Detector for P9 - ADAPTIVE_PATTERN_LEARNING
|
|
3
|
+
*
|
|
4
|
+
* Discovers new routing patterns from recent task requests,
|
|
5
|
+
* identifies emergent behaviors, and suggests new pattern candidates.
|
|
6
|
+
*
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @since 2026-03-05
|
|
9
|
+
*/
|
|
10
|
+
import { frameworkLogger } from "../core/framework-logger.js";
|
|
11
|
+
export class EmergingPatternDetector {
|
|
12
|
+
minFrequencyThreshold = 3;
|
|
13
|
+
minConfidenceThreshold = 0.6;
|
|
14
|
+
clusterSimilarityThreshold = 0.4;
|
|
15
|
+
maxClusters = 20;
|
|
16
|
+
stopWords = new Set([
|
|
17
|
+
'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
|
|
18
|
+
'of', 'with', 'as', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
19
|
+
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
20
|
+
'should', 'may', 'might', 'must', 'can', 'this', 'that', 'these',
|
|
21
|
+
'those', 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'what', 'which'
|
|
22
|
+
]);
|
|
23
|
+
/**
|
|
24
|
+
* Extract meaningful keywords from task description
|
|
25
|
+
*/
|
|
26
|
+
extractKeywords(text) {
|
|
27
|
+
const words = text.toLowerCase()
|
|
28
|
+
.replace(/[^\w\s]/g, ' ')
|
|
29
|
+
.split(/\s+/)
|
|
30
|
+
.filter(word => word.length > 2)
|
|
31
|
+
.filter(word => !this.stopWords.has(word));
|
|
32
|
+
return [...new Set(words)];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Calculate Jaccard similarity between two keyword sets
|
|
36
|
+
*/
|
|
37
|
+
calculateSimilarity(keywords1, keywords2) {
|
|
38
|
+
if (keywords1.length === 0 || keywords2.length === 0)
|
|
39
|
+
return 0;
|
|
40
|
+
const set1 = new Set(keywords1);
|
|
41
|
+
const set2 = new Set(keywords2);
|
|
42
|
+
const intersection = new Set([...set1].filter(x => set2.has(x)));
|
|
43
|
+
const union = new Set([...set1, ...set2]);
|
|
44
|
+
return intersection.size / union.size;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Cluster similar task descriptions
|
|
48
|
+
*/
|
|
49
|
+
clusterTasks(tasks) {
|
|
50
|
+
const clusters = [];
|
|
51
|
+
const assigned = new Set();
|
|
52
|
+
// Sort by frequency (most frequent first)
|
|
53
|
+
const sortedTasks = [...tasks].sort((a, b) => b.keywords.length - a.keywords.length);
|
|
54
|
+
for (const task of sortedTasks) {
|
|
55
|
+
if (assigned.has(task.id))
|
|
56
|
+
continue;
|
|
57
|
+
// Create new cluster
|
|
58
|
+
const clusterKeywords = new Set(task.keywords);
|
|
59
|
+
const clusterDescriptions = [task.description];
|
|
60
|
+
const clusterIds = [task.id];
|
|
61
|
+
let clusterFrequency = 1;
|
|
62
|
+
// Find similar tasks
|
|
63
|
+
for (const otherTask of sortedTasks) {
|
|
64
|
+
if (assigned.has(otherTask.id) || otherTask.id === task.id)
|
|
65
|
+
continue;
|
|
66
|
+
const similarity = this.calculateSimilarity([...clusterKeywords], otherTask.keywords);
|
|
67
|
+
if (similarity >= this.clusterSimilarityThreshold) {
|
|
68
|
+
otherTask.keywords.forEach(kw => clusterKeywords.add(kw));
|
|
69
|
+
clusterDescriptions.push(otherTask.description);
|
|
70
|
+
clusterIds.push(otherTask.id);
|
|
71
|
+
clusterFrequency++;
|
|
72
|
+
assigned.add(otherTask.id);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
assigned.add(task.id);
|
|
76
|
+
// Extract unique keywords
|
|
77
|
+
const uniqueKeywords = [...clusterKeywords].slice(0, 10);
|
|
78
|
+
// Calculate confidence based on frequency and uniqueness
|
|
79
|
+
const confidence = Math.min(1, clusterFrequency * 0.15 + uniqueKeywords.length * 0.05);
|
|
80
|
+
clusters.push({
|
|
81
|
+
clusterId: `cluster_${clusters.length}`,
|
|
82
|
+
patterns: clusterDescriptions.slice(0, 5),
|
|
83
|
+
frequency: clusterFrequency,
|
|
84
|
+
keywords: uniqueKeywords,
|
|
85
|
+
suggestedAgents: [],
|
|
86
|
+
suggestedSkills: [],
|
|
87
|
+
confidence
|
|
88
|
+
});
|
|
89
|
+
if (clusters.length >= this.maxClusters)
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
return clusters;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Detect emergent patterns from recent routing outcomes
|
|
96
|
+
*/
|
|
97
|
+
detectEmergingPatterns(outcomes) {
|
|
98
|
+
if (outcomes.length < this.minFrequencyThreshold) {
|
|
99
|
+
return {
|
|
100
|
+
emergentPatterns: [],
|
|
101
|
+
clusters: [],
|
|
102
|
+
recommendations: ['Insufficient data for pattern detection']
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Extract keywords and group by outcome
|
|
106
|
+
const taskData = outcomes.map(outcome => {
|
|
107
|
+
const keywords = this.extractKeywords(outcome.taskDescription || '');
|
|
108
|
+
return {
|
|
109
|
+
id: outcome.taskId,
|
|
110
|
+
keywords,
|
|
111
|
+
description: outcome.taskDescription || '',
|
|
112
|
+
agent: outcome.routedAgent,
|
|
113
|
+
skill: outcome.routedSkill,
|
|
114
|
+
success: outcome.success,
|
|
115
|
+
confidence: outcome.confidence
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
// Cluster similar tasks
|
|
119
|
+
const clusters = this.clusterTasks(taskData);
|
|
120
|
+
// Analyze clusters for emergent patterns
|
|
121
|
+
const emergentPatterns = [];
|
|
122
|
+
const recommendations = [];
|
|
123
|
+
for (const cluster of clusters) {
|
|
124
|
+
if (cluster.frequency < this.minFrequencyThreshold)
|
|
125
|
+
continue;
|
|
126
|
+
if (cluster.confidence < this.minConfidenceThreshold)
|
|
127
|
+
continue;
|
|
128
|
+
// Get success metrics for this cluster
|
|
129
|
+
const clusterOutcomes = taskData.filter(t => cluster.patterns.includes(t.description));
|
|
130
|
+
const successCount = clusterOutcomes.filter(t => t.success).length;
|
|
131
|
+
const successRate = clusterOutcomes.length > 0 ? successCount / clusterOutcomes.length : 0;
|
|
132
|
+
const avgConfidence = clusterOutcomes.length > 0
|
|
133
|
+
? clusterOutcomes.reduce((sum, t) => sum + t.confidence, 0) / clusterOutcomes.length
|
|
134
|
+
: 0;
|
|
135
|
+
// Determine suggested agent/skill based on most common
|
|
136
|
+
const agentCounts = new Map();
|
|
137
|
+
const skillCounts = new Map();
|
|
138
|
+
for (const task of clusterOutcomes) {
|
|
139
|
+
agentCounts.set(task.agent, (agentCounts.get(task.agent) || 0) + 1);
|
|
140
|
+
skillCounts.set(task.skill, (skillCounts.get(task.skill) || 0) + 1);
|
|
141
|
+
}
|
|
142
|
+
const suggestedAgent = [...agentCounts.entries()]
|
|
143
|
+
.sort((a, b) => b[1] - a[1])[0]?.[0] || 'unknown';
|
|
144
|
+
const suggestedSkill = [...skillCounts.entries()]
|
|
145
|
+
.sort((a, b) => b[1] - a[1])[0]?.[0] || 'unknown';
|
|
146
|
+
cluster.suggestedAgents = [suggestedAgent];
|
|
147
|
+
cluster.suggestedSkills = [suggestedSkill];
|
|
148
|
+
// Create emergent pattern
|
|
149
|
+
const emergentPattern = {
|
|
150
|
+
pattern: cluster.keywords.join(' | '),
|
|
151
|
+
confidence: cluster.confidence,
|
|
152
|
+
frequency: cluster.frequency,
|
|
153
|
+
firstSeen: clusterOutcomes[0]?.success ? new Date() : new Date(),
|
|
154
|
+
lastSeen: new Date(),
|
|
155
|
+
evidence: cluster.patterns.slice(0, 3),
|
|
156
|
+
suggestedAction: successRate < 0.7
|
|
157
|
+
? 'Improve routing for this pattern'
|
|
158
|
+
: successRate > 0.9
|
|
159
|
+
? 'Add as new keyword mapping'
|
|
160
|
+
: 'Monitor pattern performance'
|
|
161
|
+
};
|
|
162
|
+
// Determine if pattern is truly emergent (not in existing mappings)
|
|
163
|
+
const isNewPattern = successRate > 0.7 && cluster.frequency >= 5;
|
|
164
|
+
if (isNewPattern) {
|
|
165
|
+
emergentPatterns.push(emergentPattern);
|
|
166
|
+
}
|
|
167
|
+
// Generate recommendations
|
|
168
|
+
if (successRate > 0.9 && cluster.frequency >= 5) {
|
|
169
|
+
recommendations.push(`High-performing pattern "${cluster.keywords.slice(0, 3).join(', ')}" (${cluster.frequency} uses, ${(successRate * 100).toFixed(0)}% success) - Consider adding as new keyword mapping`);
|
|
170
|
+
}
|
|
171
|
+
else if (successRate < 0.6 && cluster.frequency >= 3) {
|
|
172
|
+
recommendations.push(`Underperforming pattern "${cluster.keywords.slice(0, 3).join(', ')}" (${cluster.frequency} uses, ${(successRate * 100).toFixed(0)}% success) - Review routing logic`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Sort emergent patterns by confidence
|
|
176
|
+
emergentPatterns.sort((a, b) => b.confidence - a.confidence);
|
|
177
|
+
if (recommendations.length === 0) {
|
|
178
|
+
recommendations.push('No significant emergent patterns detected');
|
|
179
|
+
}
|
|
180
|
+
frameworkLogger.log("emerging-pattern-detector", "analysis-complete", "info", {
|
|
181
|
+
emergentPatternsCount: emergentPatterns.length,
|
|
182
|
+
clustersCount: clusters.length,
|
|
183
|
+
recommendationsCount: recommendations.length
|
|
184
|
+
}, undefined);
|
|
185
|
+
return {
|
|
186
|
+
emergentPatterns,
|
|
187
|
+
clusters,
|
|
188
|
+
recommendations
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Check if a specific pattern is emerging
|
|
193
|
+
*/
|
|
194
|
+
isPatternEmerging(pattern, recentOutcomes, historicalBaseline) {
|
|
195
|
+
const keywords = this.extractKeywords(pattern);
|
|
196
|
+
const recentKeywords = recentOutcomes.slice(-20).map(o => this.extractKeywords(o.taskDescription || ''));
|
|
197
|
+
// Count matches in recent outcomes
|
|
198
|
+
let matches = 0;
|
|
199
|
+
for (const recentKw of recentKeywords) {
|
|
200
|
+
if (this.calculateSimilarity(keywords, recentKw) > this.clusterSimilarityThreshold) {
|
|
201
|
+
matches++;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const recentFrequency = matches / Math.max(recentKeywords.length, 1);
|
|
205
|
+
const baselineFrequency = historicalBaseline;
|
|
206
|
+
// Determine trend
|
|
207
|
+
let trend;
|
|
208
|
+
if (recentFrequency > baselineFrequency * 1.3) {
|
|
209
|
+
trend = 'increasing';
|
|
210
|
+
}
|
|
211
|
+
else if (recentFrequency < baselineFrequency * 0.7) {
|
|
212
|
+
trend = 'decreasing';
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
trend = 'stable';
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
emerging: trend === 'increasing' && recentFrequency > 0.1,
|
|
219
|
+
trend,
|
|
220
|
+
confidence: Math.min(1, recentFrequency * 2)
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get suggested keyword mappings from emergent patterns
|
|
225
|
+
*/
|
|
226
|
+
suggestKeywordMappings(emergentPatterns) {
|
|
227
|
+
const suggestions = [];
|
|
228
|
+
for (const pattern of emergentPatterns) {
|
|
229
|
+
if (pattern.confidence < this.minConfidenceThreshold)
|
|
230
|
+
continue;
|
|
231
|
+
// Extract top keywords as potential mapping
|
|
232
|
+
const keywords = pattern.pattern.split(' | ').slice(0, 5);
|
|
233
|
+
// Extract agent/skill from evidence
|
|
234
|
+
// In real implementation, this would analyze the evidence
|
|
235
|
+
const suggestedAgent = 'orchestrator'; // Default fallback
|
|
236
|
+
const suggestedSkill = 'orchestrator';
|
|
237
|
+
suggestions.push({
|
|
238
|
+
keywords,
|
|
239
|
+
suggestedAgent,
|
|
240
|
+
suggestedSkill,
|
|
241
|
+
confidence: pattern.confidence,
|
|
242
|
+
reason: `Emerging pattern with ${pattern.frequency} occurrences`
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
return suggestions;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Singleton instance
|
|
249
|
+
export const emergingPatternDetector = new EmergingPatternDetector();
|
|
250
|
+
//# sourceMappingURL=emerging-pattern-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emerging-pattern-detector.js","sourceRoot":"","sources":["../../src/analytics/emerging-pattern-detector.ts"],"names":[],"mappings":"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"}
|