@hongmaple0820/scale-engine 0.40.1 → 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.
Files changed (228) hide show
  1. package/README.md +30 -2
  2. package/dist/api/cli.js +286 -7
  3. package/dist/api/cli.js.map +1 -1
  4. package/dist/api/doctor.js +1 -1
  5. package/dist/api/doctor.js.map +1 -1
  6. package/dist/api/quickstart.d.ts +11 -0
  7. package/dist/api/quickstart.js +98 -1
  8. package/dist/api/quickstart.js.map +1 -1
  9. package/dist/artifact/fsmDefinitions.js +15 -2
  10. package/dist/artifact/fsmDefinitions.js.map +1 -1
  11. package/dist/artifact/types.d.ts +1 -1
  12. package/dist/artifact/types.js.map +1 -1
  13. package/dist/bootstrap/DependencyBootstrap.d.ts +1 -0
  14. package/dist/bootstrap/DependencyBootstrap.js +137 -25
  15. package/dist/bootstrap/DependencyBootstrap.js.map +1 -1
  16. package/dist/cache/ScanCache.d.ts +41 -0
  17. package/dist/cache/ScanCache.js +120 -0
  18. package/dist/cache/ScanCache.js.map +1 -0
  19. package/dist/capabilities/BrowserQACapability.d.ts +14 -0
  20. package/dist/capabilities/BrowserQACapability.js +94 -0
  21. package/dist/capabilities/BrowserQACapability.js.map +1 -1
  22. package/dist/capabilities/InstalledSkillsIntegration.js +29 -9
  23. package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -1
  24. package/dist/cli/autofixCommands.d.ts +22 -0
  25. package/dist/cli/autofixCommands.js +32 -0
  26. package/dist/cli/autofixCommands.js.map +1 -0
  27. package/dist/cli/cortexCommands.d.ts +71 -0
  28. package/dist/cli/cortexCommands.js +335 -0
  29. package/dist/cli/cortexCommands.js.map +1 -0
  30. package/dist/cli/costCommands.d.ts +13 -0
  31. package/dist/cli/costCommands.js +48 -0
  32. package/dist/cli/costCommands.js.map +1 -0
  33. package/dist/cli/orchCommands.d.ts +43 -0
  34. package/dist/cli/orchCommands.js +135 -0
  35. package/dist/cli/orchCommands.js.map +1 -0
  36. package/dist/cli/phaseCommands.js +1 -2
  37. package/dist/cli/phaseCommands.js.map +1 -1
  38. package/dist/cli/qaCommands.d.ts +22 -0
  39. package/dist/cli/qaCommands.js +84 -0
  40. package/dist/cli/qaCommands.js.map +1 -0
  41. package/dist/cli/quickstartCommands.d.ts +17 -0
  42. package/dist/cli/quickstartCommands.js +47 -0
  43. package/dist/cli/quickstartCommands.js.map +1 -0
  44. package/dist/cli/shieldCommands.d.ts +30 -0
  45. package/dist/cli/shieldCommands.js +212 -0
  46. package/dist/cli/shieldCommands.js.map +1 -0
  47. package/dist/cli/tuiCommands.d.ts +7 -0
  48. package/dist/cli/tuiCommands.js +33 -0
  49. package/dist/cli/tuiCommands.js.map +1 -0
  50. package/dist/config/profiles.js +26 -0
  51. package/dist/config/profiles.js.map +1 -1
  52. package/dist/context/ContextBudget.js +2 -2
  53. package/dist/core/GbrainRuntime.d.ts +25 -0
  54. package/dist/core/GbrainRuntime.js +270 -0
  55. package/dist/core/GbrainRuntime.js.map +1 -0
  56. package/dist/cortex/GovernanceMetrics.d.ts +66 -0
  57. package/dist/cortex/GovernanceMetrics.js +230 -0
  58. package/dist/cortex/GovernanceMetrics.js.map +1 -0
  59. package/dist/cortex/InstinctExtractor.d.ts +61 -0
  60. package/dist/cortex/InstinctExtractor.js +184 -0
  61. package/dist/cortex/InstinctExtractor.js.map +1 -0
  62. package/dist/cortex/InstinctStore.d.ts +54 -0
  63. package/dist/cortex/InstinctStore.js +266 -0
  64. package/dist/cortex/InstinctStore.js.map +1 -0
  65. package/dist/cortex/ReflexionEngine.d.ts +34 -0
  66. package/dist/cortex/ReflexionEngine.js +157 -0
  67. package/dist/cortex/ReflexionEngine.js.map +1 -0
  68. package/dist/cortex/SessionInjector.d.ts +44 -0
  69. package/dist/cortex/SessionInjector.js +127 -0
  70. package/dist/cortex/SessionInjector.js.map +1 -0
  71. package/dist/cortex/adapters/ClaudeAdapter.d.ts +17 -0
  72. package/dist/cortex/adapters/ClaudeAdapter.js +61 -0
  73. package/dist/cortex/adapters/ClaudeAdapter.js.map +1 -0
  74. package/dist/cortex/adapters/CodexAdapter.d.ts +10 -0
  75. package/dist/cortex/adapters/CodexAdapter.js +52 -0
  76. package/dist/cortex/adapters/CodexAdapter.js.map +1 -0
  77. package/dist/cortex/adapters/CursorAdapter.d.ts +10 -0
  78. package/dist/cortex/adapters/CursorAdapter.js +46 -0
  79. package/dist/cortex/adapters/CursorAdapter.js.map +1 -0
  80. package/dist/cortex/adapters/GeminiAdapter.d.ts +11 -0
  81. package/dist/cortex/adapters/GeminiAdapter.js +48 -0
  82. package/dist/cortex/adapters/GeminiAdapter.js.map +1 -0
  83. package/dist/env/EnvironmentDoctor.js +221 -5
  84. package/dist/env/EnvironmentDoctor.js.map +1 -1
  85. package/dist/eval/BenchmarkPublisher.d.ts +25 -0
  86. package/dist/eval/BenchmarkPublisher.js +27 -0
  87. package/dist/eval/BenchmarkPublisher.js.map +1 -0
  88. package/dist/guardrails/DependencyAuditor.js +10 -1
  89. package/dist/guardrails/DependencyAuditor.js.map +1 -1
  90. package/dist/memory/MemoryProviders.js +38 -91
  91. package/dist/memory/MemoryProviders.js.map +1 -1
  92. package/dist/orchestrator/OrchestratorDaemon.d.ts +44 -0
  93. package/dist/orchestrator/OrchestratorDaemon.js +150 -0
  94. package/dist/orchestrator/OrchestratorDaemon.js.map +1 -0
  95. package/dist/orchestrator/PolicyLoader.d.ts +80 -0
  96. package/dist/orchestrator/PolicyLoader.js +229 -0
  97. package/dist/orchestrator/PolicyLoader.js.map +1 -0
  98. package/dist/orchestrator/ReconciliationLoop.d.ts +71 -0
  99. package/dist/orchestrator/ReconciliationLoop.js +266 -0
  100. package/dist/orchestrator/ReconciliationLoop.js.map +1 -0
  101. package/dist/orchestrator/TrackerAdapter.d.ts +60 -0
  102. package/dist/orchestrator/TrackerAdapter.js +147 -0
  103. package/dist/orchestrator/TrackerAdapter.js.map +1 -0
  104. package/dist/orchestrator/WorkspaceManager.d.ts +66 -0
  105. package/dist/orchestrator/WorkspaceManager.js +257 -0
  106. package/dist/orchestrator/WorkspaceManager.js.map +1 -0
  107. package/dist/qa/BrowserDaemon.d.ts +23 -0
  108. package/dist/qa/BrowserDaemon.js +79 -0
  109. package/dist/qa/BrowserDaemon.js.map +1 -0
  110. package/dist/qa/E2ETestOrchestrator.d.ts +14 -0
  111. package/dist/qa/E2ETestOrchestrator.js +19 -0
  112. package/dist/qa/E2ETestOrchestrator.js.map +1 -0
  113. package/dist/review/CrossModelReviewer.d.ts +35 -0
  114. package/dist/review/CrossModelReviewer.js +75 -0
  115. package/dist/review/CrossModelReviewer.js.map +1 -0
  116. package/dist/review/ReviewAggregator.d.ts +13 -0
  117. package/dist/review/ReviewAggregator.js +28 -0
  118. package/dist/review/ReviewAggregator.js.map +1 -0
  119. package/dist/review/reviewCommands.d.ts +15 -0
  120. package/dist/review/reviewCommands.js +24 -0
  121. package/dist/review/reviewCommands.js.map +1 -0
  122. package/dist/routing/LocalModelProvider.d.ts +11 -0
  123. package/dist/routing/LocalModelProvider.js +21 -0
  124. package/dist/routing/LocalModelProvider.js.map +1 -0
  125. package/dist/routing/ModelRouter.d.ts +12 -0
  126. package/dist/routing/ModelRouter.js +31 -4
  127. package/dist/routing/ModelRouter.js.map +1 -1
  128. package/dist/runtime/AiOsRuntime.d.ts +1 -0
  129. package/dist/runtime/AiOsRuntime.js +15 -0
  130. package/dist/runtime/AiOsRuntime.js.map +1 -1
  131. package/dist/runtime/CostAnalyzer.d.ts +53 -0
  132. package/dist/runtime/CostAnalyzer.js +160 -0
  133. package/dist/runtime/CostAnalyzer.js.map +1 -0
  134. package/dist/runtime/CostOptimizer.d.ts +11 -0
  135. package/dist/runtime/CostOptimizer.js +21 -0
  136. package/dist/runtime/CostOptimizer.js.map +1 -0
  137. package/dist/runtime/ModelUsageLedger.d.ts +53 -2
  138. package/dist/runtime/ModelUsageLedger.js +243 -39
  139. package/dist/runtime/ModelUsageLedger.js.map +1 -1
  140. package/dist/setup/SetupVerification.d.ts +42 -0
  141. package/dist/setup/SetupVerification.js +180 -0
  142. package/dist/setup/SetupVerification.js.map +1 -0
  143. package/dist/shield/PolicyCompiler.d.ts +70 -0
  144. package/dist/shield/PolicyCompiler.js +540 -0
  145. package/dist/shield/PolicyCompiler.js.map +1 -0
  146. package/dist/shield/ProtectedPaths.d.ts +39 -0
  147. package/dist/shield/ProtectedPaths.js +179 -0
  148. package/dist/shield/ProtectedPaths.js.map +1 -0
  149. package/dist/shield/ShieldProtocol.d.ts +50 -0
  150. package/dist/shield/ShieldProtocol.js +103 -0
  151. package/dist/shield/ShieldProtocol.js.map +1 -0
  152. package/dist/skills/SkillMdStandard.d.ts +33 -0
  153. package/dist/skills/SkillMdStandard.js +88 -0
  154. package/dist/skills/SkillMdStandard.js.map +1 -0
  155. package/dist/skills/SkillRegistry.d.ts +9 -1
  156. package/dist/skills/SkillRegistry.js +20 -0
  157. package/dist/skills/SkillRegistry.js.map +1 -1
  158. package/dist/skills/interop/GStackInterop.d.ts +15 -0
  159. package/dist/skills/interop/GStackInterop.js +34 -0
  160. package/dist/skills/interop/GStackInterop.js.map +1 -0
  161. package/dist/skills/interop/OMCInterop.d.ts +15 -0
  162. package/dist/skills/interop/OMCInterop.js +34 -0
  163. package/dist/skills/interop/OMCInterop.js.map +1 -0
  164. package/dist/tools/ToolCapabilityRegistry.js +10 -0
  165. package/dist/tools/ToolCapabilityRegistry.js.map +1 -1
  166. package/dist/tui/TuiDashboard.d.ts +3 -0
  167. package/dist/tui/TuiDashboard.js +120 -0
  168. package/dist/tui/TuiDashboard.js.map +1 -0
  169. package/dist/workflow/GateCatalog.d.ts +2 -0
  170. package/dist/workflow/GateCatalog.js +59 -3
  171. package/dist/workflow/GateCatalog.js.map +1 -1
  172. package/dist/workflow/GovernanceTemplatePacks.d.ts +1 -1
  173. package/dist/workflow/GovernanceTemplatePacks.js +15 -0
  174. package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
  175. package/dist/workflow/TddLoop.d.ts +2 -0
  176. package/dist/workflow/TddLoop.js +2 -0
  177. package/dist/workflow/TddLoop.js.map +1 -1
  178. package/dist/workflow/UpgradeManager.d.ts +10 -1
  179. package/dist/workflow/UpgradeManager.js +55 -0
  180. package/dist/workflow/UpgradeManager.js.map +1 -1
  181. package/dist/workflow/VerificationProfile.d.ts +8 -0
  182. package/dist/workflow/VerificationProfile.js +62 -1
  183. package/dist/workflow/VerificationProfile.js.map +1 -1
  184. package/dist/workflow/VerificationSchema.d.ts +46 -0
  185. package/dist/workflow/VerificationSchema.js +97 -0
  186. package/dist/workflow/VerificationSchema.js.map +1 -0
  187. package/dist/workflow/autofix/AutoFixEngine.d.ts +37 -0
  188. package/dist/workflow/autofix/AutoFixEngine.js +169 -0
  189. package/dist/workflow/autofix/AutoFixEngine.js.map +1 -0
  190. package/dist/workflow/execution/RalphEngine.d.ts +18 -0
  191. package/dist/workflow/execution/RalphEngine.js +22 -0
  192. package/dist/workflow/execution/RalphEngine.js.map +1 -1
  193. package/dist/workflow/gates/EnhancedGates.d.ts +74 -0
  194. package/dist/workflow/gates/EnhancedGates.js +653 -0
  195. package/dist/workflow/gates/EnhancedGates.js.map +1 -0
  196. package/dist/workflow/gates/GateSystem.d.ts +3 -0
  197. package/dist/workflow/gates/GateSystem.js +94 -1
  198. package/dist/workflow/gates/GateSystem.js.map +1 -1
  199. package/dist/workflow/types.d.ts +1 -1
  200. package/docs/README.md +3 -0
  201. package/docs/guides/DEVELOPMENT_WORKFLOW.md +28 -9
  202. package/docs/guides/GETTING_STARTED.md +19 -0
  203. package/docs/guides/MIGRATION.md +119 -0
  204. package/docs/start/quickstart.md +1 -0
  205. package/docs/workflow/GATES_AND_SCORE.md +34 -1
  206. package/docs/workflow/README.md +58 -10
  207. package/package.json +7 -18
  208. package/scripts/workflow/lib/gbrain-runtime.mjs +185 -0
  209. package/scripts/workflow/lib/report-output.mjs +107 -0
  210. package/scripts/workflow/provider-rehearsal.mjs +129 -48
  211. package/scripts/workflow/setup-smoke.mjs +142 -8
  212. package/docs/ACTIVE_SECURITY_VISUAL_GATES.md +0 -87
  213. package/docs/AI_ENGINEERING_OS_POSITIONING.md +0 -607
  214. package/docs/BACKGROUND_HUNTER.md +0 -62
  215. package/docs/CODE_INTELLIGENCE.md +0 -180
  216. package/docs/CONTEXT_BUDGET.md +0 -155
  217. package/docs/DEPENDENCY_AUDIT.md +0 -118
  218. package/docs/EVOLUTION_SHADOW_MODE.md +0 -63
  219. package/docs/GITLAB_FLOW.md +0 -125
  220. package/docs/GOVERNANCE_DASHBOARD.md +0 -85
  221. package/docs/MEMORY_BRAIN.md +0 -104
  222. package/docs/MEMORY_FABRIC.md +0 -161
  223. package/docs/RESOURCE_GOVERNANCE.md +0 -92
  224. package/docs/RUNTIME_EVIDENCE.md +0 -101
  225. package/docs/WORKFLOW_EVAL.md +0 -151
  226. package/image/wechat-public.jpg +0 -0
  227. package/image/wxPay.jpg +0 -0
  228. package/image/zfb.jpg +0 -0
@@ -0,0 +1,184 @@
1
+ // SCALE Cortex — Instinct Extractor
2
+ // 对齐 ECC: Observation Log → Pattern Detection → Instinct Creation
3
+ // Confidence scoring: 0.3 tentative → 0.5 moderate → 0.7 strong → 0.9 near-certain
4
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ import { createHash } from 'node:crypto';
7
+ import { logger } from '../core/logger.js';
8
+ // ---------------------------------------------------------------------------
9
+ // InstinctExtractor
10
+ // ---------------------------------------------------------------------------
11
+ export class InstinctExtractor {
12
+ constructor(baseDir = join(process.cwd(), '.scale')) {
13
+ this.observationsDir = join(baseDir, 'observations');
14
+ this.instinctsDir = join(baseDir, 'instincts');
15
+ }
16
+ /**
17
+ * Load observations from .scale/observations/ directory.
18
+ */
19
+ loadObservations() {
20
+ if (!existsSync(this.observationsDir))
21
+ return [];
22
+ const observations = [];
23
+ try {
24
+ for (const file of readdirSync(this.observationsDir)) {
25
+ if (!file.endsWith('.jsonl'))
26
+ continue;
27
+ const lines = readFileSync(join(this.observationsDir, file), 'utf-8')
28
+ .split('\n')
29
+ .filter(Boolean);
30
+ for (const line of lines) {
31
+ try {
32
+ observations.push(JSON.parse(line));
33
+ }
34
+ catch { /* skip malformed */ }
35
+ }
36
+ }
37
+ }
38
+ catch (err) {
39
+ logger.warn({ err }, 'Failed to load observations');
40
+ }
41
+ return observations;
42
+ }
43
+ /**
44
+ * Detect patterns from observations.
45
+ * Groups failures by error pattern, finds recurring root causes.
46
+ */
47
+ detectPatterns(observations) {
48
+ const failures = observations.filter(o => o.gateStatus === 'FAIL');
49
+ const patterns = new Map();
50
+ for (const obs of failures) {
51
+ const key = obs.errorPattern ?? obs.gateName;
52
+ if (!patterns.has(key)) {
53
+ patterns.set(key, {
54
+ pattern: key,
55
+ count: 0,
56
+ observations: [],
57
+ rootCauses: [],
58
+ resolutions: [],
59
+ });
60
+ }
61
+ const match = patterns.get(key);
62
+ match.count++;
63
+ match.observations.push(obs);
64
+ if (obs.rootCause && !match.rootCauses.includes(obs.rootCause)) {
65
+ match.rootCauses.push(obs.rootCause);
66
+ }
67
+ if (obs.resolution && !match.resolutions.includes(obs.resolution)) {
68
+ match.resolutions.push(obs.resolution);
69
+ }
70
+ }
71
+ // Sort by count descending
72
+ return Array.from(patterns.values()).sort((a, b) => b.count - a.count);
73
+ }
74
+ /**
75
+ * Extract instincts from detected patterns.
76
+ */
77
+ extract(patterns) {
78
+ const instincts = [];
79
+ for (const pattern of patterns) {
80
+ if (pattern.count < 1)
81
+ continue;
82
+ // Compute confidence
83
+ const confidence = this.computeConfidence(pattern.count, pattern.rootCauses.length);
84
+ // Determine domain
85
+ const domain = this.inferDomain(pattern.pattern);
86
+ // Generate trigger from pattern
87
+ const trigger = this.generateTrigger(pattern);
88
+ // Build action
89
+ const action = this.buildAction(pattern);
90
+ const id = `instinct-${createHash('sha256').update(pattern.pattern).digest('hex').slice(0, 10)}`;
91
+ instincts.push({
92
+ id,
93
+ trigger,
94
+ confidence,
95
+ domain,
96
+ source: `extracted from ${pattern.count} observations`,
97
+ scope: confidence >= 0.7 ? 'global' : 'project',
98
+ action,
99
+ evidence: pattern.observations.slice(0, 5).map(o => `[${o.timestamp}] ${o.gateName}: ${o.errorPattern ?? 'failure'}`),
100
+ observations: pattern.count,
101
+ createdAt: new Date().toISOString(),
102
+ updatedAt: new Date().toISOString(),
103
+ appliedCount: 0,
104
+ hitRate: 0,
105
+ });
106
+ }
107
+ return instincts.sort((a, b) => b.confidence - a.confidence);
108
+ }
109
+ /**
110
+ * Record an observation for future instinct extraction.
111
+ */
112
+ recordObservation(obs) {
113
+ if (!existsSync(this.observationsDir)) {
114
+ mkdirSync(this.observationsDir, { recursive: true });
115
+ }
116
+ const today = new Date().toISOString().slice(0, 10);
117
+ const file = join(this.observationsDir, `${today}.jsonl`);
118
+ writeFileSync(file, JSON.stringify(obs) + '\n', { flag: 'a' });
119
+ }
120
+ // -----------------------------------------------------------------------
121
+ // Internal
122
+ // -----------------------------------------------------------------------
123
+ computeConfidence(count, rootCauseCount) {
124
+ if (count >= 10 && rootCauseCount >= 3)
125
+ return 0.9; // near-certain
126
+ if (count >= 5)
127
+ return 0.7; // strong
128
+ if (count >= 2)
129
+ return 0.5; // moderate
130
+ return 0.3; // tentative
131
+ }
132
+ inferDomain(pattern) {
133
+ const lower = pattern.toLowerCase();
134
+ if (lower.includes('security') || lower.includes('secret') || lower.includes('vuln'))
135
+ return 'security';
136
+ if (lower.includes('test') || lower.includes('coverage') || lower.includes('assert'))
137
+ return 'testing';
138
+ if (lower.includes('lint') || lower.includes('style') || lower.includes('format'))
139
+ return 'code-quality';
140
+ if (lower.includes('build') || lower.includes('compile') || lower.includes('type'))
141
+ return 'build';
142
+ if (lower.includes('governance') || lower.includes('gate') || lower.includes('policy'))
143
+ return 'governance';
144
+ if (lower.includes('import') || lower.includes('dependency') || lower.includes('module'))
145
+ return 'dependencies';
146
+ return 'general';
147
+ }
148
+ generateTrigger(pattern) {
149
+ // Use the most frequent root cause as trigger
150
+ if (pattern.rootCauses.length > 0) {
151
+ return pattern.rootCauses[0];
152
+ }
153
+ return `gate:${pattern.pattern}`;
154
+ }
155
+ buildAction(pattern) {
156
+ const lines = [
157
+ `## Trigger`,
158
+ `${pattern.pattern}`,
159
+ '',
160
+ `## Observed Behavior`,
161
+ `This failure pattern has been observed ${pattern.count} time(s).`,
162
+ '',
163
+ ];
164
+ if (pattern.rootCauses.length > 0) {
165
+ lines.push('## Root Causes');
166
+ for (const rc of pattern.rootCauses.slice(0, 3)) {
167
+ lines.push(`- ${rc}`);
168
+ }
169
+ lines.push('');
170
+ }
171
+ if (pattern.resolutions.length > 0) {
172
+ lines.push('## Known Resolutions');
173
+ for (const r of pattern.resolutions.slice(0, 3)) {
174
+ lines.push(`- ${r}`);
175
+ }
176
+ lines.push('');
177
+ }
178
+ lines.push('## Recommended Action');
179
+ lines.push(`Before performing actions matching "${pattern.pattern}", review the known resolutions above.`);
180
+ lines.push(`If this is a recurrence, escalate by running: scale auto-fix`);
181
+ return lines.join('\n');
182
+ }
183
+ }
184
+ //# sourceMappingURL=InstinctExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstinctExtractor.js","sourceRoot":"","sources":["../../src/cortex/InstinctExtractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { Instinct } from './InstinctExtractor.js';
2
+ export declare class InstinctStore {
3
+ private baseDir;
4
+ constructor(baseDir?: string);
5
+ /**
6
+ * Save an instinct to disk.
7
+ * Deduplication: if an instinct with the same trigger exists, only keep the higher-confidence one.
8
+ */
9
+ save(instinct: Instinct): string;
10
+ /**
11
+ * Load all instincts from disk.
12
+ */
13
+ loadAll(): Instinct[];
14
+ /**
15
+ * Get instincts filtered by confidence threshold and scope.
16
+ */
17
+ query(options: {
18
+ minConfidence?: number;
19
+ domain?: string;
20
+ scope?: 'project' | 'global';
21
+ projectId?: string;
22
+ }): Instinct[];
23
+ /**
24
+ * Get high-confidence instincts for SessionStart injection (0.7+).
25
+ */
26
+ getInjectionInstincts(projectId?: string): Instinct[];
27
+ /**
28
+ * Find an instinct by trigger pattern.
29
+ */
30
+ findByTrigger(trigger: string): Instinct | null;
31
+ /**
32
+ * Find an instinct by ID.
33
+ */
34
+ findById(id: string): Instinct | null;
35
+ /**
36
+ * Delete an instinct by ID.
37
+ */
38
+ delete(id: string): boolean;
39
+ /**
40
+ * Record an instinct was applied (for hit rate tracking).
41
+ */
42
+ recordApplication(id: string, success: boolean): void;
43
+ /**
44
+ * Get store statistics.
45
+ */
46
+ stats(): {
47
+ total: number;
48
+ byDomain: Record<string, number>;
49
+ byConfidence: Record<string, number>;
50
+ };
51
+ private writeInstinctFile;
52
+ private serializeInstinct;
53
+ private parseInstinctFile;
54
+ }
@@ -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
+ }