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.
Files changed (189) hide show
  1. package/.opencode/hooks/post-commit +152 -55
  2. package/.opencode/hooks/post-commit.backup +110 -174
  3. package/.opencode/hooks/post-push +47 -64
  4. package/.opencode/hooks/post-push.backup +34 -38
  5. package/.opencode/strray/features.json +3 -3
  6. package/.opencode/strray/routing-mappings.json +90 -34
  7. package/AGENTS.md +7 -2
  8. package/dist/analytics/anonymization-engine.d.ts +108 -0
  9. package/dist/analytics/anonymization-engine.d.ts.map +1 -0
  10. package/dist/analytics/anonymization-engine.js +352 -0
  11. package/dist/analytics/anonymization-engine.js.map +1 -0
  12. package/dist/analytics/consent-manager.d.ts +94 -0
  13. package/dist/analytics/consent-manager.d.ts.map +1 -0
  14. package/dist/analytics/consent-manager.js +257 -0
  15. package/dist/analytics/consent-manager.js.map +1 -0
  16. package/dist/analytics/emerging-pattern-detector.d.ts +68 -0
  17. package/dist/analytics/emerging-pattern-detector.d.ts.map +1 -0
  18. package/dist/analytics/emerging-pattern-detector.js +250 -0
  19. package/dist/analytics/emerging-pattern-detector.js.map +1 -0
  20. package/dist/analytics/pattern-learning-engine.d.ts +81 -0
  21. package/dist/analytics/pattern-learning-engine.d.ts.map +1 -0
  22. package/dist/analytics/pattern-learning-engine.js +262 -0
  23. package/dist/analytics/pattern-learning-engine.js.map +1 -0
  24. package/dist/analytics/pattern-performance-tracker.d.ts +89 -0
  25. package/dist/analytics/pattern-performance-tracker.d.ts.map +1 -0
  26. package/dist/analytics/pattern-performance-tracker.js +289 -0
  27. package/dist/analytics/pattern-performance-tracker.js.map +1 -0
  28. package/dist/analytics/prompt-pattern-analyzer.d.ts +100 -0
  29. package/dist/analytics/prompt-pattern-analyzer.d.ts.map +1 -0
  30. package/dist/analytics/prompt-pattern-analyzer.js +372 -0
  31. package/dist/analytics/prompt-pattern-analyzer.js.map +1 -0
  32. package/dist/analytics/routing-performance-analyzer.d.ts +102 -0
  33. package/dist/analytics/routing-performance-analyzer.d.ts.map +1 -0
  34. package/dist/analytics/routing-performance-analyzer.js +342 -0
  35. package/dist/analytics/routing-performance-analyzer.js.map +1 -0
  36. package/dist/analytics/routing-refiner.d.ts +105 -0
  37. package/dist/analytics/routing-refiner.d.ts.map +1 -0
  38. package/dist/analytics/routing-refiner.js +381 -0
  39. package/dist/analytics/routing-refiner.js.map +1 -0
  40. package/dist/cli/commands/analytics-disable.d.ts +10 -0
  41. package/dist/cli/commands/analytics-disable.d.ts.map +1 -0
  42. package/dist/cli/commands/analytics-disable.js +73 -0
  43. package/dist/cli/commands/analytics-disable.js.map +1 -0
  44. package/dist/cli/commands/analytics-enable-action.d.ts +9 -0
  45. package/dist/cli/commands/analytics-enable-action.d.ts.map +1 -0
  46. package/dist/cli/commands/analytics-enable-action.js +83 -0
  47. package/dist/cli/commands/analytics-enable-action.js.map +1 -0
  48. package/dist/cli/commands/analytics-preview.d.ts +10 -0
  49. package/dist/cli/commands/analytics-preview.d.ts.map +1 -0
  50. package/dist/cli/commands/analytics-preview.js +107 -0
  51. package/dist/cli/commands/analytics-preview.js.map +1 -0
  52. package/dist/cli/commands/analytics-status.d.ts +10 -0
  53. package/dist/cli/commands/analytics-status.d.ts.map +1 -0
  54. package/dist/cli/commands/analytics-status.js +68 -0
  55. package/dist/cli/commands/analytics-status.js.map +1 -0
  56. package/dist/cli/index.js +6 -3
  57. package/dist/cli/index.js.map +1 -1
  58. package/dist/core/adaptive-kernel.d.ts +110 -0
  59. package/dist/core/adaptive-kernel.d.ts.map +1 -0
  60. package/dist/core/adaptive-kernel.js +193 -0
  61. package/dist/core/adaptive-kernel.js.map +1 -0
  62. package/dist/core/kernel-patterns.d.ts +105 -0
  63. package/dist/core/kernel-patterns.d.ts.map +1 -0
  64. package/dist/core/kernel-patterns.js +328 -0
  65. package/dist/core/kernel-patterns.js.map +1 -0
  66. package/dist/core/orchestrator.d.ts +1 -0
  67. package/dist/core/orchestrator.d.ts.map +1 -1
  68. package/dist/core/orchestrator.js +40 -11
  69. package/dist/core/orchestrator.js.map +1 -1
  70. package/dist/delegation/agent-delegator.d.ts +1 -0
  71. package/dist/delegation/agent-delegator.d.ts.map +1 -1
  72. package/dist/delegation/agent-delegator.js +24 -2
  73. package/dist/delegation/agent-delegator.js.map +1 -1
  74. package/dist/delegation/task-skill-router.d.ts +269 -5
  75. package/dist/delegation/task-skill-router.d.ts.map +1 -1
  76. package/dist/delegation/task-skill-router.js +810 -23
  77. package/dist/delegation/task-skill-router.js.map +1 -1
  78. package/dist/postprocessor/PostProcessor.d.ts +10 -0
  79. package/dist/postprocessor/PostProcessor.d.ts.map +1 -1
  80. package/dist/postprocessor/PostProcessor.js +87 -17
  81. package/dist/postprocessor/PostProcessor.js.map +1 -1
  82. package/dist/processors/agents-md-validation-processor.d.ts +1 -0
  83. package/dist/processors/agents-md-validation-processor.d.ts.map +1 -1
  84. package/dist/processors/agents-md-validation-processor.js +34 -12
  85. package/dist/processors/agents-md-validation-processor.js.map +1 -1
  86. package/dist/processors/processor-manager.d.ts +7 -0
  87. package/dist/processors/processor-manager.d.ts.map +1 -1
  88. package/dist/processors/processor-manager.js +93 -0
  89. package/dist/processors/processor-manager.js.map +1 -1
  90. package/dist/processors/test-auto-creation-processor.d.ts.map +1 -1
  91. package/dist/processors/test-auto-creation-processor.js +52 -38
  92. package/dist/processors/test-auto-creation-processor.js.map +1 -1
  93. package/dist/scripts/analytics/daily-routing-analysis.d.ts +18 -0
  94. package/dist/scripts/analytics/daily-routing-analysis.d.ts.map +1 -0
  95. package/dist/scripts/analytics/daily-routing-analysis.js +268 -0
  96. package/dist/scripts/analytics/daily-routing-analysis.js.map +1 -0
  97. package/dist/scripts/analytics/index.d.ts +15 -0
  98. package/dist/scripts/analytics/index.d.ts.map +1 -0
  99. package/dist/scripts/analytics/index.js +17 -0
  100. package/dist/scripts/analytics/index.js.map +1 -0
  101. package/dist/scripts/test-p9.d.ts +15 -0
  102. package/dist/scripts/test-p9.d.ts.map +1 -0
  103. package/dist/scripts/test-p9.js +220 -0
  104. package/dist/scripts/test-p9.js.map +1 -0
  105. package/package.json +6 -2
  106. package/scripts/node/kernel-e2e-test.mjs +168 -0
  107. package/scripts/node/kernel-framework-test.mjs +127 -0
  108. package/scripts/node/kernel-live-test.mjs +147 -0
  109. package/scripts/node/kernel-real-framework-test.mjs +103 -0
  110. package/scripts/node/kernel-update.cjs +379 -0
  111. package/scripts/node/reflection-check.sh +245 -27
  112. package/scripts/node/test-simple-names-comprehensive.mjs +221 -0
  113. package/scripts/node/test-simple-names.mjs +39 -0
  114. package/dist/agents/documentation-writer.d.ts +0 -9
  115. package/dist/agents/documentation-writer.d.ts.map +0 -1
  116. package/dist/agents/documentation-writer.js +0 -85
  117. package/dist/agents/documentation-writer.js.map +0 -1
  118. package/dist/agents/explore.d.ts +0 -8
  119. package/dist/agents/explore.d.ts.map +0 -1
  120. package/dist/agents/explore.js +0 -55
  121. package/dist/agents/explore.js.map +0 -1
  122. package/dist/agents/librarian.d.ts +0 -3
  123. package/dist/agents/librarian.d.ts.map +0 -1
  124. package/dist/agents/librarian.js +0 -84
  125. package/dist/agents/librarian.js.map +0 -1
  126. package/dist/agents/marketing-expert.d.ts +0 -9
  127. package/dist/agents/marketing-expert.d.ts.map +0 -1
  128. package/dist/agents/marketing-expert.js +0 -112
  129. package/dist/agents/marketing-expert.js.map +0 -1
  130. package/dist/agents/oracle.d.ts +0 -8
  131. package/dist/agents/oracle.d.ts.map +0 -1
  132. package/dist/agents/oracle.js +0 -51
  133. package/dist/agents/oracle.js.map +0 -1
  134. package/dist/agents/seo-copywriter.d.ts +0 -10
  135. package/dist/agents/seo-copywriter.d.ts.map +0 -1
  136. package/dist/agents/seo-copywriter.js +0 -73
  137. package/dist/agents/seo-copywriter.js.map +0 -1
  138. package/dist/agents/seo-specialist.d.ts +0 -9
  139. package/dist/agents/seo-specialist.d.ts.map +0 -1
  140. package/dist/agents/seo-specialist.js +0 -54
  141. package/dist/agents/seo-specialist.js.map +0 -1
  142. package/dist/agents/test-architect.d.ts +0 -3
  143. package/dist/agents/test-architect.d.ts.map +0 -1
  144. package/dist/agents/test-architect.js +0 -96
  145. package/dist/agents/test-architect.js.map +0 -1
  146. package/dist/mcps/enhanced-orchestrator.server.d.ts +0 -14
  147. package/dist/mcps/enhanced-orchestrator.server.d.ts.map +0 -1
  148. package/dist/mcps/enhanced-orchestrator.server.js +0 -266
  149. package/dist/mcps/enhanced-orchestrator.server.js.map +0 -1
  150. package/dist/mcps/knowledge-skills/analyzer.server.d.ts +0 -7
  151. package/dist/mcps/knowledge-skills/analyzer.server.d.ts.map +0 -1
  152. package/dist/mcps/knowledge-skills/analyzer.server.js +0 -282
  153. package/dist/mcps/knowledge-skills/analyzer.server.js.map +0 -1
  154. package/dist/mcps/knowledge-skills/documentation-generation.server.d.ts +0 -48
  155. package/dist/mcps/knowledge-skills/documentation-generation.server.d.ts.map +0 -1
  156. package/dist/mcps/knowledge-skills/documentation-generation.server.js +0 -1238
  157. package/dist/mcps/knowledge-skills/documentation-generation.server.js.map +0 -1
  158. package/dist/mcps/knowledge-skills/explore.server.d.ts +0 -21
  159. package/dist/mcps/knowledge-skills/explore.server.d.ts.map +0 -1
  160. package/dist/mcps/knowledge-skills/explore.server.js +0 -582
  161. package/dist/mcps/knowledge-skills/explore.server.js.map +0 -1
  162. package/dist/mcps/knowledge-skills/marketing-expert.server.d.ts +0 -8
  163. package/dist/mcps/knowledge-skills/marketing-expert.server.d.ts.map +0 -1
  164. package/dist/mcps/knowledge-skills/marketing-expert.server.js +0 -356
  165. package/dist/mcps/knowledge-skills/marketing-expert.server.js.map +0 -1
  166. package/dist/mcps/knowledge-skills/oracle.server.d.ts +0 -25
  167. package/dist/mcps/knowledge-skills/oracle.server.d.ts.map +0 -1
  168. package/dist/mcps/knowledge-skills/oracle.server.js +0 -569
  169. package/dist/mcps/knowledge-skills/oracle.server.js.map +0 -1
  170. package/dist/mcps/knowledge-skills/seo-copywriter.server.d.ts +0 -8
  171. package/dist/mcps/knowledge-skills/seo-copywriter.server.d.ts.map +0 -1
  172. package/dist/mcps/knowledge-skills/seo-copywriter.server.js +0 -251
  173. package/dist/mcps/knowledge-skills/seo-copywriter.server.js.map +0 -1
  174. package/dist/mcps/knowledge-skills/seo-specialist.server.d.ts +0 -8
  175. package/dist/mcps/knowledge-skills/seo-specialist.server.d.ts.map +0 -1
  176. package/dist/mcps/knowledge-skills/seo-specialist.server.js +0 -211
  177. package/dist/mcps/knowledge-skills/seo-specialist.server.js.map +0 -1
  178. package/dist/mcps/librarian.server.d.ts +0 -17
  179. package/dist/mcps/librarian.server.d.ts.map +0 -1
  180. package/dist/mcps/librarian.server.js +0 -382
  181. package/dist/mcps/librarian.server.js.map +0 -1
  182. package/dist/optimization/performance-optimizer.d.ts +0 -179
  183. package/dist/optimization/performance-optimizer.d.ts.map +0 -1
  184. package/dist/optimization/performance-optimizer.js +0 -556
  185. package/dist/optimization/performance-optimizer.js.map +0 -1
  186. package/dist/utils/memory-pool.d.ts +0 -90
  187. package/dist/utils/memory-pool.d.ts.map +0 -1
  188. package/dist/utils/memory-pool.js +0 -245
  189. 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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"}