@hongmaple0820/scale-engine 0.40.2 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -2
- package/dist/api/cli.js +19 -0
- package/dist/api/cli.js.map +1 -1
- package/dist/api/quickstart.d.ts +11 -0
- package/dist/api/quickstart.js +98 -1
- package/dist/api/quickstart.js.map +1 -1
- package/dist/artifact/fsmDefinitions.js +15 -2
- package/dist/artifact/fsmDefinitions.js.map +1 -1
- package/dist/artifact/types.d.ts +1 -1
- package/dist/artifact/types.js.map +1 -1
- package/dist/cache/ScanCache.d.ts +41 -0
- package/dist/cache/ScanCache.js +120 -0
- package/dist/cache/ScanCache.js.map +1 -0
- package/dist/capabilities/BrowserQACapability.d.ts +14 -0
- package/dist/capabilities/BrowserQACapability.js +94 -0
- package/dist/capabilities/BrowserQACapability.js.map +1 -1
- package/dist/cli/autofixCommands.d.ts +22 -0
- package/dist/cli/autofixCommands.js +32 -0
- package/dist/cli/autofixCommands.js.map +1 -0
- package/dist/cli/cortexCommands.d.ts +71 -0
- package/dist/cli/cortexCommands.js +335 -0
- package/dist/cli/cortexCommands.js.map +1 -0
- package/dist/cli/costCommands.d.ts +13 -0
- package/dist/cli/costCommands.js +48 -0
- package/dist/cli/costCommands.js.map +1 -0
- package/dist/cli/orchCommands.d.ts +43 -0
- package/dist/cli/orchCommands.js +135 -0
- package/dist/cli/orchCommands.js.map +1 -0
- package/dist/cli/phaseCommands.js +1 -2
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/cli/qaCommands.d.ts +22 -0
- package/dist/cli/qaCommands.js +84 -0
- package/dist/cli/qaCommands.js.map +1 -0
- package/dist/cli/quickstartCommands.d.ts +17 -0
- package/dist/cli/quickstartCommands.js +47 -0
- package/dist/cli/quickstartCommands.js.map +1 -0
- package/dist/cli/shieldCommands.d.ts +30 -0
- package/dist/cli/shieldCommands.js +212 -0
- package/dist/cli/shieldCommands.js.map +1 -0
- package/dist/cli/tuiCommands.d.ts +7 -0
- package/dist/cli/tuiCommands.js +33 -0
- package/dist/cli/tuiCommands.js.map +1 -0
- package/dist/config/profiles.js +26 -0
- package/dist/config/profiles.js.map +1 -1
- package/dist/cortex/GovernanceMetrics.d.ts +66 -0
- package/dist/cortex/GovernanceMetrics.js +230 -0
- package/dist/cortex/GovernanceMetrics.js.map +1 -0
- package/dist/cortex/InstinctExtractor.d.ts +61 -0
- package/dist/cortex/InstinctExtractor.js +184 -0
- package/dist/cortex/InstinctExtractor.js.map +1 -0
- package/dist/cortex/InstinctStore.d.ts +54 -0
- package/dist/cortex/InstinctStore.js +266 -0
- package/dist/cortex/InstinctStore.js.map +1 -0
- package/dist/cortex/ReflexionEngine.d.ts +34 -0
- package/dist/cortex/ReflexionEngine.js +157 -0
- package/dist/cortex/ReflexionEngine.js.map +1 -0
- package/dist/cortex/SessionInjector.d.ts +44 -0
- package/dist/cortex/SessionInjector.js +127 -0
- package/dist/cortex/SessionInjector.js.map +1 -0
- package/dist/cortex/adapters/ClaudeAdapter.d.ts +17 -0
- package/dist/cortex/adapters/ClaudeAdapter.js +61 -0
- package/dist/cortex/adapters/ClaudeAdapter.js.map +1 -0
- package/dist/cortex/adapters/CodexAdapter.d.ts +10 -0
- package/dist/cortex/adapters/CodexAdapter.js +52 -0
- package/dist/cortex/adapters/CodexAdapter.js.map +1 -0
- package/dist/cortex/adapters/CursorAdapter.d.ts +10 -0
- package/dist/cortex/adapters/CursorAdapter.js +46 -0
- package/dist/cortex/adapters/CursorAdapter.js.map +1 -0
- package/dist/cortex/adapters/GeminiAdapter.d.ts +11 -0
- package/dist/cortex/adapters/GeminiAdapter.js +48 -0
- package/dist/cortex/adapters/GeminiAdapter.js.map +1 -0
- package/dist/eval/BenchmarkPublisher.d.ts +25 -0
- package/dist/eval/BenchmarkPublisher.js +27 -0
- package/dist/eval/BenchmarkPublisher.js.map +1 -0
- package/dist/guardrails/DependencyAuditor.js +10 -1
- package/dist/guardrails/DependencyAuditor.js.map +1 -1
- package/dist/orchestrator/OrchestratorDaemon.d.ts +44 -0
- package/dist/orchestrator/OrchestratorDaemon.js +150 -0
- package/dist/orchestrator/OrchestratorDaemon.js.map +1 -0
- package/dist/orchestrator/PolicyLoader.d.ts +80 -0
- package/dist/orchestrator/PolicyLoader.js +229 -0
- package/dist/orchestrator/PolicyLoader.js.map +1 -0
- package/dist/orchestrator/ReconciliationLoop.d.ts +71 -0
- package/dist/orchestrator/ReconciliationLoop.js +266 -0
- package/dist/orchestrator/ReconciliationLoop.js.map +1 -0
- package/dist/orchestrator/TrackerAdapter.d.ts +60 -0
- package/dist/orchestrator/TrackerAdapter.js +147 -0
- package/dist/orchestrator/TrackerAdapter.js.map +1 -0
- package/dist/orchestrator/WorkspaceManager.d.ts +66 -0
- package/dist/orchestrator/WorkspaceManager.js +257 -0
- package/dist/orchestrator/WorkspaceManager.js.map +1 -0
- package/dist/qa/BrowserDaemon.d.ts +23 -0
- package/dist/qa/BrowserDaemon.js +79 -0
- package/dist/qa/BrowserDaemon.js.map +1 -0
- package/dist/qa/E2ETestOrchestrator.d.ts +14 -0
- package/dist/qa/E2ETestOrchestrator.js +19 -0
- package/dist/qa/E2ETestOrchestrator.js.map +1 -0
- package/dist/review/CrossModelReviewer.d.ts +35 -0
- package/dist/review/CrossModelReviewer.js +75 -0
- package/dist/review/CrossModelReviewer.js.map +1 -0
- package/dist/review/ReviewAggregator.d.ts +13 -0
- package/dist/review/ReviewAggregator.js +28 -0
- package/dist/review/ReviewAggregator.js.map +1 -0
- package/dist/review/reviewCommands.d.ts +15 -0
- package/dist/review/reviewCommands.js +24 -0
- package/dist/review/reviewCommands.js.map +1 -0
- package/dist/routing/LocalModelProvider.d.ts +11 -0
- package/dist/routing/LocalModelProvider.js +21 -0
- package/dist/routing/LocalModelProvider.js.map +1 -0
- package/dist/routing/ModelRouter.d.ts +12 -0
- package/dist/routing/ModelRouter.js +31 -4
- package/dist/routing/ModelRouter.js.map +1 -1
- package/dist/runtime/AiOsRuntime.d.ts +1 -0
- package/dist/runtime/AiOsRuntime.js +15 -0
- package/dist/runtime/AiOsRuntime.js.map +1 -1
- package/dist/runtime/CostAnalyzer.d.ts +53 -0
- package/dist/runtime/CostAnalyzer.js +160 -0
- package/dist/runtime/CostAnalyzer.js.map +1 -0
- package/dist/runtime/CostOptimizer.d.ts +11 -0
- package/dist/runtime/CostOptimizer.js +21 -0
- package/dist/runtime/CostOptimizer.js.map +1 -0
- package/dist/shield/PolicyCompiler.d.ts +70 -0
- package/dist/shield/PolicyCompiler.js +540 -0
- package/dist/shield/PolicyCompiler.js.map +1 -0
- package/dist/shield/ProtectedPaths.d.ts +39 -0
- package/dist/shield/ProtectedPaths.js +179 -0
- package/dist/shield/ProtectedPaths.js.map +1 -0
- package/dist/shield/ShieldProtocol.d.ts +50 -0
- package/dist/shield/ShieldProtocol.js +103 -0
- package/dist/shield/ShieldProtocol.js.map +1 -0
- package/dist/skills/SkillMdStandard.d.ts +33 -0
- package/dist/skills/SkillMdStandard.js +88 -0
- package/dist/skills/SkillMdStandard.js.map +1 -0
- package/dist/skills/SkillRegistry.d.ts +9 -1
- package/dist/skills/SkillRegistry.js +20 -0
- package/dist/skills/SkillRegistry.js.map +1 -1
- package/dist/skills/interop/GStackInterop.d.ts +15 -0
- package/dist/skills/interop/GStackInterop.js +34 -0
- package/dist/skills/interop/GStackInterop.js.map +1 -0
- package/dist/skills/interop/OMCInterop.d.ts +15 -0
- package/dist/skills/interop/OMCInterop.js +34 -0
- package/dist/skills/interop/OMCInterop.js.map +1 -0
- package/dist/tui/TuiDashboard.d.ts +3 -0
- package/dist/tui/TuiDashboard.js +120 -0
- package/dist/tui/TuiDashboard.js.map +1 -0
- package/dist/workflow/GateCatalog.d.ts +2 -0
- package/dist/workflow/GateCatalog.js +59 -3
- package/dist/workflow/GateCatalog.js.map +1 -1
- package/dist/workflow/GovernanceTemplatePacks.d.ts +1 -1
- package/dist/workflow/GovernanceTemplatePacks.js +15 -0
- package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
- package/dist/workflow/TddLoop.d.ts +2 -0
- package/dist/workflow/TddLoop.js +2 -0
- package/dist/workflow/TddLoop.js.map +1 -1
- package/dist/workflow/UpgradeManager.d.ts +10 -1
- package/dist/workflow/UpgradeManager.js +55 -0
- package/dist/workflow/UpgradeManager.js.map +1 -1
- package/dist/workflow/VerificationProfile.d.ts +8 -0
- package/dist/workflow/VerificationProfile.js +61 -0
- package/dist/workflow/VerificationProfile.js.map +1 -1
- package/dist/workflow/VerificationSchema.d.ts +46 -0
- package/dist/workflow/VerificationSchema.js +97 -0
- package/dist/workflow/VerificationSchema.js.map +1 -0
- package/dist/workflow/autofix/AutoFixEngine.d.ts +37 -0
- package/dist/workflow/autofix/AutoFixEngine.js +169 -0
- package/dist/workflow/autofix/AutoFixEngine.js.map +1 -0
- package/dist/workflow/execution/RalphEngine.d.ts +18 -0
- package/dist/workflow/execution/RalphEngine.js +22 -0
- package/dist/workflow/execution/RalphEngine.js.map +1 -1
- package/dist/workflow/gates/EnhancedGates.d.ts +74 -0
- package/dist/workflow/gates/EnhancedGates.js +653 -0
- package/dist/workflow/gates/EnhancedGates.js.map +1 -0
- package/dist/workflow/gates/GateSystem.d.ts +3 -0
- package/dist/workflow/gates/GateSystem.js +94 -1
- package/dist/workflow/gates/GateSystem.js.map +1 -1
- package/dist/workflow/types.d.ts +1 -1
- package/docs/README.md +3 -0
- package/docs/guides/DEVELOPMENT_WORKFLOW.md +28 -9
- package/docs/guides/GETTING_STARTED.md +19 -0
- package/docs/guides/MIGRATION.md +119 -0
- package/docs/workflow/GATES_AND_SCORE.md +34 -1
- package/docs/workflow/README.md +58 -10
- package/package.json +5 -17
- package/docs/ACTIVE_SECURITY_VISUAL_GATES.md +0 -87
- package/docs/AI_ENGINEERING_OS_POSITIONING.md +0 -607
- package/docs/BACKGROUND_HUNTER.md +0 -62
- package/docs/CODE_INTELLIGENCE.md +0 -180
- package/docs/CONTEXT_BUDGET.md +0 -165
- package/docs/DEPENDENCY_AUDIT.md +0 -118
- package/docs/EVOLUTION_SHADOW_MODE.md +0 -63
- package/docs/GITLAB_FLOW.md +0 -125
- package/docs/GOVERNANCE_DASHBOARD.md +0 -92
- package/docs/MEMORY_BRAIN.md +0 -104
- package/docs/MEMORY_FABRIC.md +0 -161
- package/docs/RESOURCE_GOVERNANCE.md +0 -92
- package/docs/RUNTIME_EVIDENCE.md +0 -101
- package/docs/WORKFLOW_EVAL.md +0 -151
- package/image/wechat-public.jpg +0 -0
- package/image/wxPay.jpg +0 -0
- package/image/zfb.jpg +0 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
// SCALE Cortex — Instinct Store
|
|
2
|
+
// 对齐 ECC: hierarchical filesystem-based storage under .scale/instincts/
|
|
3
|
+
// Future: SQLite-backed in Cortex v2
|
|
4
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { logger } from '../core/logger.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// InstinctStore
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
export class InstinctStore {
|
|
12
|
+
constructor(baseDir = join(process.cwd(), '.scale', 'instincts')) {
|
|
13
|
+
this.baseDir = baseDir;
|
|
14
|
+
if (!existsSync(baseDir))
|
|
15
|
+
mkdirSync(baseDir, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Save an instinct to disk.
|
|
19
|
+
* Deduplication: if an instinct with the same trigger exists, only keep the higher-confidence one.
|
|
20
|
+
*/
|
|
21
|
+
save(instinct) {
|
|
22
|
+
const existing = this.findByTrigger(instinct.trigger);
|
|
23
|
+
if (existing && existing.confidence >= instinct.confidence) {
|
|
24
|
+
// Keep existing. Increment observation count.
|
|
25
|
+
existing.observations += instinct.observations;
|
|
26
|
+
existing.updatedAt = new Date().toISOString();
|
|
27
|
+
this.writeInstinctFile(existing);
|
|
28
|
+
return existing.id;
|
|
29
|
+
}
|
|
30
|
+
// New or higher-confidence instinct replaces existing
|
|
31
|
+
if (existing) {
|
|
32
|
+
this.delete(existing.id);
|
|
33
|
+
}
|
|
34
|
+
instinct.updatedAt = new Date().toISOString();
|
|
35
|
+
this.writeInstinctFile(instinct);
|
|
36
|
+
return instinct.id;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Load all instincts from disk.
|
|
40
|
+
*/
|
|
41
|
+
loadAll() {
|
|
42
|
+
const instincts = [];
|
|
43
|
+
if (!existsSync(this.baseDir))
|
|
44
|
+
return instincts;
|
|
45
|
+
try {
|
|
46
|
+
for (const domain of readdirSync(this.baseDir)) {
|
|
47
|
+
const domainDir = join(this.baseDir, domain);
|
|
48
|
+
if (!domain.endsWith('.yaml') && existsSync(domainDir) && !domain.startsWith('.')) {
|
|
49
|
+
// Directory-based domain
|
|
50
|
+
try {
|
|
51
|
+
for (const file of readdirSync(domainDir)) {
|
|
52
|
+
if (!file.endsWith('.yaml'))
|
|
53
|
+
continue;
|
|
54
|
+
const instinct = this.parseInstinctFile(join(domainDir, file));
|
|
55
|
+
if (instinct)
|
|
56
|
+
instincts.push(instinct);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch { /* skip unreadable domains */ }
|
|
60
|
+
}
|
|
61
|
+
else if (domain.endsWith('.yaml')) {
|
|
62
|
+
// Flat file in root
|
|
63
|
+
const instinct = this.parseInstinctFile(join(this.baseDir, domain));
|
|
64
|
+
if (instinct)
|
|
65
|
+
instincts.push(instinct);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
logger.warn({ err }, 'Failed to load instincts');
|
|
71
|
+
}
|
|
72
|
+
return instincts.sort((a, b) => b.confidence - a.confidence);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get instincts filtered by confidence threshold and scope.
|
|
76
|
+
*/
|
|
77
|
+
query(options) {
|
|
78
|
+
let instincts = this.loadAll();
|
|
79
|
+
if (options.minConfidence) {
|
|
80
|
+
instincts = instincts.filter(i => i.confidence >= options.minConfidence);
|
|
81
|
+
}
|
|
82
|
+
if (options.domain) {
|
|
83
|
+
instincts = instincts.filter(i => i.domain === options.domain);
|
|
84
|
+
}
|
|
85
|
+
if (options.scope) {
|
|
86
|
+
instincts = instincts.filter(i => i.scope === options.scope);
|
|
87
|
+
}
|
|
88
|
+
if (options.projectId) {
|
|
89
|
+
instincts = instincts.filter(i => !i.projectId || i.projectId === options.projectId);
|
|
90
|
+
}
|
|
91
|
+
return instincts;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get high-confidence instincts for SessionStart injection (0.7+).
|
|
95
|
+
*/
|
|
96
|
+
getInjectionInstincts(projectId) {
|
|
97
|
+
return this.query({ minConfidence: 0.7, projectId });
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Find an instinct by trigger pattern.
|
|
101
|
+
*/
|
|
102
|
+
findByTrigger(trigger) {
|
|
103
|
+
const hash = createHash('sha256').update(trigger).digest('hex').slice(0, 10);
|
|
104
|
+
const id = `instinct-${hash}`;
|
|
105
|
+
return this.findById(id);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Find an instinct by ID.
|
|
109
|
+
*/
|
|
110
|
+
findById(id) {
|
|
111
|
+
// Search all domain directories
|
|
112
|
+
if (!existsSync(this.baseDir))
|
|
113
|
+
return null;
|
|
114
|
+
try {
|
|
115
|
+
for (const entry of readdirSync(this.baseDir)) {
|
|
116
|
+
const full = join(this.baseDir, entry);
|
|
117
|
+
if (existsSync(full) && !entry.startsWith('.')) {
|
|
118
|
+
if (!entry.endsWith('.yaml')) {
|
|
119
|
+
// Domain directory
|
|
120
|
+
const filePath = join(full, `${id}.yaml`);
|
|
121
|
+
if (existsSync(filePath))
|
|
122
|
+
return this.parseInstinctFile(filePath);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch { /* skip */ }
|
|
128
|
+
// Flat file search
|
|
129
|
+
const flatPath = join(this.baseDir, `${id}.yaml`);
|
|
130
|
+
if (existsSync(flatPath))
|
|
131
|
+
return this.parseInstinctFile(flatPath);
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Delete an instinct by ID.
|
|
136
|
+
*/
|
|
137
|
+
delete(id) {
|
|
138
|
+
const instinct = this.findById(id);
|
|
139
|
+
if (!instinct)
|
|
140
|
+
return false;
|
|
141
|
+
const domainDir = join(this.baseDir, instinct.domain);
|
|
142
|
+
const filePath = join(domainDir, `${id}.yaml`);
|
|
143
|
+
try {
|
|
144
|
+
if (existsSync(filePath))
|
|
145
|
+
unlinkSync(filePath);
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
logger.warn({ err, id }, 'Failed to delete instinct');
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Record an instinct was applied (for hit rate tracking).
|
|
155
|
+
*/
|
|
156
|
+
recordApplication(id, success) {
|
|
157
|
+
const instinct = this.findById(id);
|
|
158
|
+
if (!instinct)
|
|
159
|
+
return;
|
|
160
|
+
instinct.appliedCount++;
|
|
161
|
+
instinct.hitRate = instinct.observations > 0
|
|
162
|
+
? instinct.appliedCount / instinct.observations
|
|
163
|
+
: 0;
|
|
164
|
+
instinct.updatedAt = new Date().toISOString();
|
|
165
|
+
this.writeInstinctFile(instinct);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get store statistics.
|
|
169
|
+
*/
|
|
170
|
+
stats() {
|
|
171
|
+
const all = this.loadAll();
|
|
172
|
+
const byDomain = {};
|
|
173
|
+
const byConfidence = {
|
|
174
|
+
'near-certain (0.9)': 0,
|
|
175
|
+
'strong (0.7)': 0,
|
|
176
|
+
'moderate (0.5)': 0,
|
|
177
|
+
'tentative (0.3)': 0,
|
|
178
|
+
};
|
|
179
|
+
for (const i of all) {
|
|
180
|
+
byDomain[i.domain] = (byDomain[i.domain] ?? 0) + 1;
|
|
181
|
+
if (i.confidence >= 0.9)
|
|
182
|
+
byConfidence['near-certain (0.9)']++;
|
|
183
|
+
else if (i.confidence >= 0.7)
|
|
184
|
+
byConfidence['strong (0.7)']++;
|
|
185
|
+
else if (i.confidence >= 0.5)
|
|
186
|
+
byConfidence['moderate (0.5)']++;
|
|
187
|
+
else
|
|
188
|
+
byConfidence['tentative (0.3)']++;
|
|
189
|
+
}
|
|
190
|
+
return { total: all.length, byDomain, byConfidence };
|
|
191
|
+
}
|
|
192
|
+
// -----------------------------------------------------------------------
|
|
193
|
+
// Internal
|
|
194
|
+
// -----------------------------------------------------------------------
|
|
195
|
+
writeInstinctFile(instinct) {
|
|
196
|
+
const domainDir = join(this.baseDir, instinct.domain);
|
|
197
|
+
if (!existsSync(domainDir))
|
|
198
|
+
mkdirSync(domainDir, { recursive: true });
|
|
199
|
+
const filePath = join(domainDir, `${instinct.id}.yaml`);
|
|
200
|
+
const yaml = this.serializeInstinct(instinct);
|
|
201
|
+
writeFileSync(filePath, yaml, 'utf-8');
|
|
202
|
+
}
|
|
203
|
+
serializeInstinct(instinct) {
|
|
204
|
+
const frontmatter = [
|
|
205
|
+
`id: ${instinct.id}`,
|
|
206
|
+
`trigger: "${instinct.trigger.replace(/"/g, '\\"')}"`,
|
|
207
|
+
`confidence: ${instinct.confidence}`,
|
|
208
|
+
`domain: ${instinct.domain}`,
|
|
209
|
+
`source: "${instinct.source}"`,
|
|
210
|
+
`scope: ${instinct.scope}`,
|
|
211
|
+
`project_id: ${instinct.projectId ?? ''}`,
|
|
212
|
+
`observations: ${instinct.observations}`,
|
|
213
|
+
`applied_count: ${instinct.appliedCount}`,
|
|
214
|
+
`hit_rate: ${instinct.hitRate.toFixed(2)}`,
|
|
215
|
+
`created_at: ${instinct.createdAt}`,
|
|
216
|
+
`updated_at: ${instinct.updatedAt}`,
|
|
217
|
+
].join('\n');
|
|
218
|
+
const evidence = instinct.evidence.map(e => ` - "${e}"`).join('\n');
|
|
219
|
+
return [
|
|
220
|
+
'---',
|
|
221
|
+
frontmatter,
|
|
222
|
+
'---',
|
|
223
|
+
'',
|
|
224
|
+
instinct.action,
|
|
225
|
+
'',
|
|
226
|
+
'## Evidence',
|
|
227
|
+
evidence,
|
|
228
|
+
'',
|
|
229
|
+
].join('\n');
|
|
230
|
+
}
|
|
231
|
+
parseInstinctFile(filePath) {
|
|
232
|
+
try {
|
|
233
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
234
|
+
const fmMatch = raw.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
235
|
+
if (!fmMatch)
|
|
236
|
+
return null;
|
|
237
|
+
const frontmatter = fmMatch[1];
|
|
238
|
+
const body = fmMatch[2] ?? '';
|
|
239
|
+
const getYamlVal = (key) => {
|
|
240
|
+
const m = frontmatter.match(new RegExp(`^${key}:\\s*(.+?)$`, 'm'));
|
|
241
|
+
return m ? m[1].trim().replace(/^"(.*)"$/, '$1') : '';
|
|
242
|
+
};
|
|
243
|
+
return {
|
|
244
|
+
id: getYamlVal('id'),
|
|
245
|
+
trigger: getYamlVal('trigger'),
|
|
246
|
+
confidence: parseFloat(getYamlVal('confidence')) || 0.3,
|
|
247
|
+
domain: getYamlVal('domain') || 'general',
|
|
248
|
+
source: getYamlVal('source'),
|
|
249
|
+
scope: getYamlVal('scope') || 'project',
|
|
250
|
+
projectId: getYamlVal('project_id') || undefined,
|
|
251
|
+
action: body.trim(),
|
|
252
|
+
evidence: [],
|
|
253
|
+
observations: parseInt(getYamlVal('observations'), 10) || 0,
|
|
254
|
+
createdAt: getYamlVal('created_at') || new Date().toISOString(),
|
|
255
|
+
updatedAt: getYamlVal('updated_at') || new Date().toISOString(),
|
|
256
|
+
appliedCount: parseInt(getYamlVal('applied_count'), 10) || 0,
|
|
257
|
+
hitRate: parseFloat(getYamlVal('hit_rate')) || 0,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
logger.warn({ err, path: filePath }, 'Failed to parse instinct file');
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=InstinctStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstinctStore.js","sourceRoot":"","sources":["../../src/cortex/InstinctStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Observation, Instinct } from './InstinctExtractor.js';
|
|
2
|
+
export interface ReflexionResult {
|
|
3
|
+
rootCause: string;
|
|
4
|
+
confidence: number;
|
|
5
|
+
suggestedAction: string;
|
|
6
|
+
relatedFailures: string[];
|
|
7
|
+
instinct: Instinct | null;
|
|
8
|
+
modelUsed: string;
|
|
9
|
+
tokensUsed: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class ReflexionEngine {
|
|
12
|
+
private modelEndpoint;
|
|
13
|
+
private modelName;
|
|
14
|
+
private enabled;
|
|
15
|
+
constructor(options?: {
|
|
16
|
+
endpoint?: string;
|
|
17
|
+
model?: string;
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* Reflect on a set of failed observations to produce root cause analysis.
|
|
21
|
+
*/
|
|
22
|
+
reflect(observations: Observation[]): Promise<ReflexionResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Reflect on gate failure patterns and generate improvement instincts.
|
|
25
|
+
*/
|
|
26
|
+
reflectOnGate(gateName: string, failures: Observation[]): Promise<ReflexionResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Batch reflect across all failing gates and merge results.
|
|
29
|
+
*/
|
|
30
|
+
reflectAll(observations: Observation[]): Promise<ReflexionResult[]>;
|
|
31
|
+
private llmReflect;
|
|
32
|
+
private heuristicReflect;
|
|
33
|
+
private buildReflectionPrompt;
|
|
34
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// SCALE Cortex — Reflexion Engine
|
|
2
|
+
// 对齐 ECC: local LLM (Qwen/GLM/DeepSeek) reflection on failure evidence
|
|
3
|
+
// Output: root cause analysis + improvement suggestions + actionable instincts
|
|
4
|
+
// Cost: $0 API fees (local model)
|
|
5
|
+
import { logger } from '../core/logger.js';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// ReflexionEngine
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
export class ReflexionEngine {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.modelEndpoint = options?.endpoint ?? process.env.SCALE_LOCAL_BASE_URL ?? 'http://localhost:11434';
|
|
12
|
+
this.modelName = options?.model ?? process.env.SCALE_LOCAL_MODEL ?? 'qwen-2.5';
|
|
13
|
+
this.enabled = !!process.env.SCALE_LOCAL_MODEL || !!options?.model;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Reflect on a set of failed observations to produce root cause analysis.
|
|
17
|
+
*/
|
|
18
|
+
async reflect(observations) {
|
|
19
|
+
if (observations.length === 0) {
|
|
20
|
+
return {
|
|
21
|
+
rootCause: 'No observations to reflect on',
|
|
22
|
+
confidence: 0,
|
|
23
|
+
suggestedAction: 'Collect more data',
|
|
24
|
+
relatedFailures: [],
|
|
25
|
+
instinct: null,
|
|
26
|
+
modelUsed: 'none',
|
|
27
|
+
tokensUsed: 0,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (!this.enabled) {
|
|
31
|
+
return this.heuristicReflect(observations);
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
return await this.llmReflect(observations);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
logger.warn({ err }, 'LLM reflection failed, falling back to heuristic');
|
|
38
|
+
return this.heuristicReflect(observations);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reflect on gate failure patterns and generate improvement instincts.
|
|
43
|
+
*/
|
|
44
|
+
async reflectOnGate(gateName, failures) {
|
|
45
|
+
const gateFailures = failures.filter(o => o.gateName === gateName && o.gateStatus === 'FAIL');
|
|
46
|
+
return this.reflect(gateFailures);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Batch reflect across all failing gates and merge results.
|
|
50
|
+
*/
|
|
51
|
+
async reflectAll(observations) {
|
|
52
|
+
const failures = observations.filter(o => o.gateStatus === 'FAIL');
|
|
53
|
+
const byGate = new Map();
|
|
54
|
+
for (const obs of failures) {
|
|
55
|
+
if (!byGate.has(obs.gateName))
|
|
56
|
+
byGate.set(obs.gateName, []);
|
|
57
|
+
byGate.get(obs.gateName).push(obs);
|
|
58
|
+
}
|
|
59
|
+
const results = [];
|
|
60
|
+
for (const [gate, obs] of byGate) {
|
|
61
|
+
results.push(await this.reflectOnGate(gate, obs));
|
|
62
|
+
}
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
// -----------------------------------------------------------------------
|
|
66
|
+
// Internal
|
|
67
|
+
// -----------------------------------------------------------------------
|
|
68
|
+
async llmReflect(observations) {
|
|
69
|
+
const prompt = this.buildReflectionPrompt(observations);
|
|
70
|
+
const response = await fetch(`${this.modelEndpoint}/v1/chat/completions`, {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
headers: { 'Content-Type': 'application/json' },
|
|
73
|
+
body: JSON.stringify({
|
|
74
|
+
model: this.modelName,
|
|
75
|
+
messages: [
|
|
76
|
+
{ role: 'system', content: 'You are a root cause analysis engine. Analyze the following gate failures and output structured JSON only.' },
|
|
77
|
+
{ role: 'user', content: prompt },
|
|
78
|
+
],
|
|
79
|
+
temperature: 0.3,
|
|
80
|
+
max_tokens: 500,
|
|
81
|
+
}),
|
|
82
|
+
signal: AbortSignal.timeout(15000),
|
|
83
|
+
});
|
|
84
|
+
if (!response.ok)
|
|
85
|
+
throw new Error(`LLM endpoint returned ${response.status}`);
|
|
86
|
+
const data = await response.json();
|
|
87
|
+
const content = data.choices?.[0]?.message?.content ?? '';
|
|
88
|
+
try {
|
|
89
|
+
const parsed = JSON.parse(content);
|
|
90
|
+
return {
|
|
91
|
+
rootCause: parsed.rootCause ?? 'Unknown',
|
|
92
|
+
confidence: parsed.confidence ?? 0.5,
|
|
93
|
+
suggestedAction: parsed.suggestedAction ?? 'Manual investigation recommended',
|
|
94
|
+
relatedFailures: parsed.relatedFailures ?? [],
|
|
95
|
+
instinct: null, // Caller should create instinct from this
|
|
96
|
+
modelUsed: this.modelName,
|
|
97
|
+
tokensUsed: data.usage?.total_tokens ?? 0,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// If LLM didn't return valid JSON, use heuristic
|
|
102
|
+
return this.heuristicReflect(observations);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
heuristicReflect(observations) {
|
|
106
|
+
const gateName = observations[0]?.gateName ?? 'unknown';
|
|
107
|
+
const errorPatterns = observations
|
|
108
|
+
.map(o => o.errorPattern)
|
|
109
|
+
.filter(Boolean);
|
|
110
|
+
// Most common error pattern
|
|
111
|
+
const patternCounts = new Map();
|
|
112
|
+
for (const p of errorPatterns) {
|
|
113
|
+
patternCounts.set(p, (patternCounts.get(p) ?? 0) + 1);
|
|
114
|
+
}
|
|
115
|
+
let dominantPattern = '';
|
|
116
|
+
let maxCount = 0;
|
|
117
|
+
for (const [p, c] of patternCounts) {
|
|
118
|
+
if (c > maxCount) {
|
|
119
|
+
maxCount = c;
|
|
120
|
+
dominantPattern = p;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const rootCause = dominantPattern
|
|
124
|
+
? `Gate "${gateName}" recurring failure: "${dominantPattern}" (${maxCount}/${observations.length} occurrences)`
|
|
125
|
+
: `Gate "${gateName}" failed ${observations.length} time(s) — investigate patterns`;
|
|
126
|
+
return {
|
|
127
|
+
rootCause,
|
|
128
|
+
confidence: maxCount > 2 ? 0.7 : 0.4,
|
|
129
|
+
suggestedAction: dominantPattern
|
|
130
|
+
? `Run 'scale auto-fix' targeting ${gateName} failures. Check the most recent evidence for resolution clues.`
|
|
131
|
+
: `Collect more failure data for gate "${gateName}" to identify patterns.`,
|
|
132
|
+
relatedFailures: errorPatterns.slice(0, 5),
|
|
133
|
+
instinct: null,
|
|
134
|
+
modelUsed: 'heuristic',
|
|
135
|
+
tokensUsed: 0,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
buildReflectionPrompt(observations) {
|
|
139
|
+
const failures = observations
|
|
140
|
+
.map(o => `[${o.timestamp}] Gate: ${o.gateName} | Pattern: ${o.errorPattern ?? 'unknown'} | RC: ${o.rootCause ?? 'unknown'}`)
|
|
141
|
+
.join('\n');
|
|
142
|
+
return [
|
|
143
|
+
'Analyze these gate failures and output JSON:',
|
|
144
|
+
'',
|
|
145
|
+
failures,
|
|
146
|
+
'',
|
|
147
|
+
'Output format:',
|
|
148
|
+
'{',
|
|
149
|
+
' "rootCause": "primary root cause",',
|
|
150
|
+
' "confidence": 0.0-1.0,',
|
|
151
|
+
' "suggestedAction": "concrete actionable step",',
|
|
152
|
+
' "relatedFailures": ["pattern1", "pattern2"]',
|
|
153
|
+
'}',
|
|
154
|
+
].join('\n');
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=ReflexionEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReflexionEngine.js","sourceRoot":"","sources":["../../src/cortex/ReflexionEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { InstinctStore } from './InstinctStore.js';
|
|
2
|
+
export interface SessionInjection {
|
|
3
|
+
/** Rendered text injected into session start */
|
|
4
|
+
content: string;
|
|
5
|
+
/** Number of instincts injected */
|
|
6
|
+
instinctCount: number;
|
|
7
|
+
/** Metadata for metrics */
|
|
8
|
+
metadata: {
|
|
9
|
+
projectId?: string;
|
|
10
|
+
projectType?: string;
|
|
11
|
+
packageManager?: string;
|
|
12
|
+
instinctsApplied: string[];
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface PriorSessionBrief {
|
|
16
|
+
sessionId: string;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
summary: string;
|
|
19
|
+
taskCompleted: string;
|
|
20
|
+
filesChanged: string[];
|
|
21
|
+
gatesPassed: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare class SessionInjector {
|
|
24
|
+
private instinctStore;
|
|
25
|
+
constructor(instinctStore: InstinctStore);
|
|
26
|
+
/**
|
|
27
|
+
* Build the full SessionStart injection payload.
|
|
28
|
+
*/
|
|
29
|
+
build(projectId?: string, priorSessions?: PriorSessionBrief[]): SessionInjection;
|
|
30
|
+
/**
|
|
31
|
+
* Build a minimal injection suitable for constrained context budgets.
|
|
32
|
+
*/
|
|
33
|
+
buildMinimal(projectId?: string): SessionInjection;
|
|
34
|
+
/**
|
|
35
|
+
* Detect project type from filesystem.
|
|
36
|
+
*/
|
|
37
|
+
detectProject(projectDir?: string): {
|
|
38
|
+
projectType: string;
|
|
39
|
+
packageManager: string;
|
|
40
|
+
hasGit: boolean;
|
|
41
|
+
};
|
|
42
|
+
private renderInstinctBlock;
|
|
43
|
+
private renderPriorSession;
|
|
44
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// SCALE Cortex — Session Injector
|
|
2
|
+
// 对齐 ECC: SessionStart injection of high-confidence instincts
|
|
3
|
+
// Historical context wrapped in narrative sentinels (anti-replay protection)
|
|
4
|
+
// Injects: instincts + prior session summary + learned skills + project detection
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// SessionInjector
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
const HISTORICAL_SENTINEL_START = '<!-- HISTORICAL CONTEXT — DO NOT RE-EXECUTE COMMANDS BELOW -->';
|
|
9
|
+
const HISTORICAL_SENTINEL_END = '<!-- END HISTORICAL CONTEXT -->';
|
|
10
|
+
export class SessionInjector {
|
|
11
|
+
constructor(instinctStore) {
|
|
12
|
+
this.instinctStore = instinctStore;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build the full SessionStart injection payload.
|
|
16
|
+
*/
|
|
17
|
+
build(projectId, priorSessions = []) {
|
|
18
|
+
const instincts = this.instinctStore.getInjectionInstincts(projectId);
|
|
19
|
+
const sections = [];
|
|
20
|
+
// 1. High-confidence instincts (main payload)
|
|
21
|
+
if (instincts.length > 0) {
|
|
22
|
+
sections.push('## SCALE Cortex — Learned Instincts\n');
|
|
23
|
+
sections.push('The following patterns have been learned from prior sessions. Use them to avoid repeating mistakes.\n');
|
|
24
|
+
for (const instinct of instincts) {
|
|
25
|
+
sections.push(this.renderInstinctBlock(instinct));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// 2. Prior session summaries (with stale replay protection)
|
|
29
|
+
if (priorSessions.length > 0) {
|
|
30
|
+
sections.push('## Recent Session History\n');
|
|
31
|
+
sections.push(HISTORICAL_SENTINEL_START);
|
|
32
|
+
sections.push('The following is historical context only. Do NOT re-execute any commands mentioned.\n');
|
|
33
|
+
for (const session of priorSessions.slice(0, 3)) {
|
|
34
|
+
sections.push(this.renderPriorSession(session));
|
|
35
|
+
}
|
|
36
|
+
sections.push(HISTORICAL_SENTINEL_END);
|
|
37
|
+
}
|
|
38
|
+
// 3. Cortex usage hint
|
|
39
|
+
sections.push('---');
|
|
40
|
+
sections.push('_SCALE Cortex is active. Run `scale cortex metrics` for ROI dashboard._');
|
|
41
|
+
const content = sections.join('\n');
|
|
42
|
+
const instinctIds = instincts.map(i => i.id);
|
|
43
|
+
return {
|
|
44
|
+
content,
|
|
45
|
+
instinctCount: instincts.length,
|
|
46
|
+
metadata: {
|
|
47
|
+
projectId,
|
|
48
|
+
instinctsApplied: instinctIds,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Build a minimal injection suitable for constrained context budgets.
|
|
54
|
+
*/
|
|
55
|
+
buildMinimal(projectId) {
|
|
56
|
+
const instincts = this.instinctStore.getInjectionInstincts(projectId);
|
|
57
|
+
if (instincts.length === 0) {
|
|
58
|
+
return {
|
|
59
|
+
content: '',
|
|
60
|
+
instinctCount: 0,
|
|
61
|
+
metadata: { projectId, instinctsApplied: [] },
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// One-liner format for minimal context consumption
|
|
65
|
+
const lines = instincts.map(i => `[Cortex ${i.confidence}] ${i.domain}: ${i.action.split('\n')[0]?.replace(/^##\s*/, '')?.slice(0, 120)}`);
|
|
66
|
+
return {
|
|
67
|
+
content: `SCALE Cortex Instincts (${instincts.length}):\n${lines.join('\n')}`,
|
|
68
|
+
instinctCount: instincts.length,
|
|
69
|
+
metadata: { projectId, instinctsApplied: instincts.map(i => i.id) },
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Detect project type from filesystem.
|
|
74
|
+
*/
|
|
75
|
+
detectProject(projectDir = process.cwd()) {
|
|
76
|
+
const { existsSync } = require('fs');
|
|
77
|
+
const { join } = require('path');
|
|
78
|
+
let projectType = 'generic';
|
|
79
|
+
let packageManager = 'none';
|
|
80
|
+
if (existsSync(join(projectDir, 'package.json'))) {
|
|
81
|
+
projectType = 'node';
|
|
82
|
+
if (existsSync(join(projectDir, 'pnpm-lock.yaml')))
|
|
83
|
+
packageManager = 'pnpm';
|
|
84
|
+
else if (existsSync(join(projectDir, 'yarn.lock')))
|
|
85
|
+
packageManager = 'yarn';
|
|
86
|
+
else
|
|
87
|
+
packageManager = 'npm';
|
|
88
|
+
}
|
|
89
|
+
else if (existsSync(join(projectDir, 'go.mod'))) {
|
|
90
|
+
projectType = 'go';
|
|
91
|
+
packageManager = 'go modules';
|
|
92
|
+
}
|
|
93
|
+
else if (existsSync(join(projectDir, 'pyproject.toml'))) {
|
|
94
|
+
projectType = 'python';
|
|
95
|
+
packageManager = 'pip/poetry';
|
|
96
|
+
}
|
|
97
|
+
else if (existsSync(join(projectDir, 'Cargo.toml'))) {
|
|
98
|
+
projectType = 'rust';
|
|
99
|
+
packageManager = 'cargo';
|
|
100
|
+
}
|
|
101
|
+
const hasGit = existsSync(join(projectDir, '.git'));
|
|
102
|
+
return { projectType, packageManager, hasGit };
|
|
103
|
+
}
|
|
104
|
+
// -----------------------------------------------------------------------
|
|
105
|
+
// Internal
|
|
106
|
+
// -----------------------------------------------------------------------
|
|
107
|
+
renderInstinctBlock(instinct) {
|
|
108
|
+
const confidenceLabel = instinct.confidence >= 0.9 ? 'NEAR-CERTAIN' :
|
|
109
|
+
instinct.confidence >= 0.7 ? 'STRONG' :
|
|
110
|
+
instinct.confidence >= 0.5 ? 'MODERATE' : 'TENTATIVE';
|
|
111
|
+
return [
|
|
112
|
+
`### [${confidenceLabel}] ${instinct.domain}/${instinct.id}`,
|
|
113
|
+
`**Confidence:** ${(instinct.confidence * 100).toFixed(0)}% | **Observed:** ${instinct.observations} times | **Hit Rate:** ${(instinct.hitRate * 100).toFixed(0)}%`,
|
|
114
|
+
'',
|
|
115
|
+
instinct.action,
|
|
116
|
+
'',
|
|
117
|
+
].join('\n');
|
|
118
|
+
}
|
|
119
|
+
renderPriorSession(session) {
|
|
120
|
+
return [
|
|
121
|
+
`- **${session.timestamp.slice(0, 10)}**: ${session.summary}`,
|
|
122
|
+
` Files: ${session.filesChanged.slice(0, 5).join(', ')}${session.filesChanged.length > 5 ? '...' : ''}`,
|
|
123
|
+
` Gates: ${session.gatesPassed ? 'PASS' : 'FAIL'} | Task: ${session.taskCompleted}`,
|
|
124
|
+
].join('\n');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=SessionInjector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionInjector.js","sourceRoot":"","sources":["../../src/cortex/SessionInjector.ts"],"names":[],"mappings":"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"}
|