@timmeck/brain-core 2.36.55 → 2.36.57
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/command-center.html +111 -0
- package/dist/action/__tests__/action-bridge.test.d.ts +1 -0
- package/dist/action/__tests__/action-bridge.test.js +145 -0
- package/dist/action/__tests__/action-bridge.test.js.map +1 -0
- package/dist/action/action-bridge.d.ts +95 -0
- package/dist/action/action-bridge.js +241 -0
- package/dist/action/action-bridge.js.map +1 -0
- package/dist/action/index.d.ts +2 -0
- package/dist/action/index.js +2 -0
- package/dist/action/index.js.map +1 -0
- package/dist/codegen/__tests__/code-forge.test.d.ts +1 -0
- package/dist/codegen/__tests__/code-forge.test.js +105 -0
- package/dist/codegen/__tests__/code-forge.test.js.map +1 -0
- package/dist/codegen/code-forge.d.ts +87 -0
- package/dist/codegen/code-forge.js +211 -0
- package/dist/codegen/code-forge.js.map +1 -0
- package/dist/codegen/index.d.ts +2 -0
- package/dist/codegen/index.js +1 -0
- package/dist/codegen/index.js.map +1 -1
- package/dist/content/__tests__/content-forge.test.d.ts +1 -0
- package/dist/content/__tests__/content-forge.test.js +117 -0
- package/dist/content/__tests__/content-forge.test.js.map +1 -0
- package/dist/content/content-forge.d.ts +104 -0
- package/dist/content/content-forge.js +213 -0
- package/dist/content/content-forge.js.map +1 -0
- package/dist/content/index.d.ts +2 -0
- package/dist/content/index.js +2 -0
- package/dist/content/index.js.map +1 -0
- package/dist/dashboard/command-center-server.d.ts +6 -0
- package/dist/dashboard/command-center-server.js +58 -1
- package/dist/dashboard/command-center-server.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/research/research-orchestrator.d.ts +12 -0
- package/dist/research/research-orchestrator.js +108 -0
- package/dist/research/research-orchestrator.js.map +1 -1
- package/dist/strategy/__tests__/strategy-forge.test.d.ts +1 -0
- package/dist/strategy/__tests__/strategy-forge.test.js +121 -0
- package/dist/strategy/__tests__/strategy-forge.test.js.map +1 -0
- package/dist/strategy/index.d.ts +2 -0
- package/dist/strategy/index.js +2 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/strategy/strategy-forge.d.ts +111 -0
- package/dist/strategy/strategy-forge.js +264 -0
- package/dist/strategy/strategy-forge.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import Database from 'better-sqlite3';
|
|
3
|
+
vi.mock('../../utils/logger.js', () => ({
|
|
4
|
+
getLogger: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }),
|
|
5
|
+
}));
|
|
6
|
+
import { StrategyForge, runStrategyForgeMigration } from '../strategy-forge.js';
|
|
7
|
+
describe('StrategyForge', () => {
|
|
8
|
+
let db;
|
|
9
|
+
beforeEach(() => { db = new Database(':memory:'); });
|
|
10
|
+
afterEach(() => { db.close(); });
|
|
11
|
+
it('creates a strategy from principles', () => {
|
|
12
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
13
|
+
forge.setKnowledgeDistiller({
|
|
14
|
+
getPrinciples: () => [
|
|
15
|
+
{ id: 'p1', statement: 'Buy when RSI < 30', domain: 'trading', confidence: 0.8, source: 'learned' },
|
|
16
|
+
{ id: 'p2', statement: 'Sell when RSI > 70', domain: 'trading', confidence: 0.7, source: 'learned' },
|
|
17
|
+
],
|
|
18
|
+
});
|
|
19
|
+
const strategy = forge.createFromPrinciples('trading');
|
|
20
|
+
expect(strategy).not.toBeNull();
|
|
21
|
+
expect(strategy.type).toBe('trade');
|
|
22
|
+
expect(strategy.rules).toHaveLength(2);
|
|
23
|
+
expect(strategy.status).toBe('draft');
|
|
24
|
+
});
|
|
25
|
+
it('returns null when no distiller', () => {
|
|
26
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
27
|
+
expect(forge.createFromPrinciples('trading')).toBeNull();
|
|
28
|
+
});
|
|
29
|
+
it('returns null when no principles', () => {
|
|
30
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
31
|
+
forge.setKnowledgeDistiller({ getPrinciples: () => [] });
|
|
32
|
+
expect(forge.createFromPrinciples('trading')).toBeNull();
|
|
33
|
+
});
|
|
34
|
+
it('creates a strategy from signals', () => {
|
|
35
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
36
|
+
const strategy = forge.createFromSignals([
|
|
37
|
+
{ name: 'RSI', value: 30, direction: 'up' },
|
|
38
|
+
{ name: 'MACD', value: 0, direction: 'down' },
|
|
39
|
+
]);
|
|
40
|
+
expect(strategy).not.toBeNull();
|
|
41
|
+
expect(strategy.rules).toHaveLength(2);
|
|
42
|
+
});
|
|
43
|
+
it('backtests a strategy', () => {
|
|
44
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
45
|
+
const strategy = forge.createFromSignals([{ name: 'price', value: 100, direction: 'up' }]);
|
|
46
|
+
const result = forge.backtest(strategy.id);
|
|
47
|
+
expect(result.strategyId).toBe(strategy.id);
|
|
48
|
+
expect(result.trades).toBeGreaterThan(0);
|
|
49
|
+
expect(result.sharpeRatio).toBeGreaterThan(0);
|
|
50
|
+
});
|
|
51
|
+
it('activates and pauses a strategy', () => {
|
|
52
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
53
|
+
const strategy = forge.createFromSignals([{ name: 'X', value: 1, direction: 'up' }]);
|
|
54
|
+
forge.activate(strategy.id);
|
|
55
|
+
expect(forge.getActive()).toHaveLength(1);
|
|
56
|
+
forge.pause(strategy.id);
|
|
57
|
+
expect(forge.getActive()).toHaveLength(0);
|
|
58
|
+
});
|
|
59
|
+
it('respects max active strategies', () => {
|
|
60
|
+
const forge = new StrategyForge(db, { brainName: 'test', maxActiveStrategies: 1 });
|
|
61
|
+
const s1 = forge.createFromSignals([{ name: 'A', value: 1, direction: 'up' }]);
|
|
62
|
+
const s2 = forge.createFromSignals([{ name: 'B', value: 2, direction: 'down' }]);
|
|
63
|
+
forge.activate(s1.id);
|
|
64
|
+
expect(() => forge.activate(s2.id)).toThrow('Max active strategies');
|
|
65
|
+
});
|
|
66
|
+
it('executes a strategy step', () => {
|
|
67
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
68
|
+
const strategy = forge.createFromSignals([{ name: 'X', value: 1, direction: 'up' }]);
|
|
69
|
+
forge.activate(strategy.id);
|
|
70
|
+
const result = forge.executeStep(strategy.id);
|
|
71
|
+
expect(result.fired).toBeGreaterThanOrEqual(1);
|
|
72
|
+
expect(result.results.length).toBeGreaterThanOrEqual(1);
|
|
73
|
+
});
|
|
74
|
+
it('cannot execute inactive strategy', () => {
|
|
75
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
76
|
+
const strategy = forge.createFromSignals([{ name: 'X', value: 1, direction: 'up' }]);
|
|
77
|
+
expect(() => forge.executeStep(strategy.id)).toThrow('not active');
|
|
78
|
+
});
|
|
79
|
+
it('evolves strategies by combining best rules', () => {
|
|
80
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
81
|
+
const s1 = forge.createFromSignals([{ name: 'A', value: 1, direction: 'up' }]);
|
|
82
|
+
const s2 = forge.createFromSignals([{ name: 'B', value: 2, direction: 'down' }]);
|
|
83
|
+
forge.activate(s1.id);
|
|
84
|
+
forge.activate(s2.id);
|
|
85
|
+
const evolved = forge.evolve();
|
|
86
|
+
expect(evolved).not.toBeNull();
|
|
87
|
+
expect(evolved.name).toContain('evolved');
|
|
88
|
+
expect(evolved.rules.length).toBeGreaterThanOrEqual(1);
|
|
89
|
+
});
|
|
90
|
+
it('retires a strategy', () => {
|
|
91
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
92
|
+
const strategy = forge.createFromSignals([{ name: 'X', value: 1, direction: 'up' }]);
|
|
93
|
+
forge.retire(strategy.id, 'underperforming');
|
|
94
|
+
const s = forge.getStrategy(strategy.id);
|
|
95
|
+
expect(s?.status).toBe('retired');
|
|
96
|
+
});
|
|
97
|
+
it('getPerformance returns metrics', () => {
|
|
98
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
99
|
+
const strategy = forge.createFromSignals([{ name: 'X', value: 1, direction: 'up' }]);
|
|
100
|
+
forge.activate(strategy.id);
|
|
101
|
+
forge.executeStep(strategy.id);
|
|
102
|
+
const perf = forge.getPerformance(strategy.id);
|
|
103
|
+
expect(perf).not.toBeNull();
|
|
104
|
+
expect(perf.executions).toBeGreaterThan(0);
|
|
105
|
+
});
|
|
106
|
+
it('getStatus returns overview', () => {
|
|
107
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
108
|
+
forge.createFromSignals([{ name: 'X', value: 1, direction: 'up' }]);
|
|
109
|
+
const status = forge.getStatus();
|
|
110
|
+
expect(status.total).toBe(1);
|
|
111
|
+
expect(status.active).toBe(0);
|
|
112
|
+
});
|
|
113
|
+
it('migration is idempotent', () => {
|
|
114
|
+
const forge = new StrategyForge(db, { brainName: 'test' });
|
|
115
|
+
forge.createFromSignals([{ name: 'Y', value: 5, direction: 'up' }]);
|
|
116
|
+
runStrategyForgeMigration(db);
|
|
117
|
+
const all = forge.getAll();
|
|
118
|
+
expect(all).toHaveLength(1);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=strategy-forge.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-forge.test.js","sourceRoot":"","sources":["../../../src/strategy/__tests__/strategy-forge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strategy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
export interface Strategy {
|
|
3
|
+
id: number;
|
|
4
|
+
brainName: string;
|
|
5
|
+
type: 'trade' | 'campaign' | 'research' | 'optimization';
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
rules: StrategyRule[];
|
|
9
|
+
performance: StrategyPerformance;
|
|
10
|
+
status: 'draft' | 'backtesting' | 'active' | 'paused' | 'retired';
|
|
11
|
+
parentId?: number;
|
|
12
|
+
createdAt?: string;
|
|
13
|
+
updatedAt?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface StrategyRule {
|
|
16
|
+
condition: string;
|
|
17
|
+
action: string;
|
|
18
|
+
confidence: number;
|
|
19
|
+
source: string;
|
|
20
|
+
}
|
|
21
|
+
export interface StrategyPerformance {
|
|
22
|
+
executions: number;
|
|
23
|
+
successes: number;
|
|
24
|
+
avgReturn: number;
|
|
25
|
+
}
|
|
26
|
+
export interface BacktestResult {
|
|
27
|
+
strategyId: number;
|
|
28
|
+
trades: number;
|
|
29
|
+
wins: number;
|
|
30
|
+
losses: number;
|
|
31
|
+
avgReturn: number;
|
|
32
|
+
sharpeRatio: number;
|
|
33
|
+
maxDrawdown: number;
|
|
34
|
+
}
|
|
35
|
+
export interface StrategyForgeConfig {
|
|
36
|
+
brainName: string;
|
|
37
|
+
maxActiveStrategies?: number;
|
|
38
|
+
minBacktestTrades?: number;
|
|
39
|
+
}
|
|
40
|
+
export interface StrategyForgeStatus {
|
|
41
|
+
active: number;
|
|
42
|
+
total: number;
|
|
43
|
+
avgPerformance: number;
|
|
44
|
+
topStrategy: string | null;
|
|
45
|
+
}
|
|
46
|
+
export declare function runStrategyForgeMigration(db: Database.Database): void;
|
|
47
|
+
export declare class StrategyForge {
|
|
48
|
+
private readonly db;
|
|
49
|
+
private readonly config;
|
|
50
|
+
private readonly log;
|
|
51
|
+
private actionBridge;
|
|
52
|
+
private knowledgeDistiller;
|
|
53
|
+
private readonly stmtInsert;
|
|
54
|
+
private readonly stmtGetById;
|
|
55
|
+
private readonly stmtUpdateStatus;
|
|
56
|
+
private readonly stmtUpdatePerformance;
|
|
57
|
+
private readonly stmtGetActive;
|
|
58
|
+
private readonly stmtGetByType;
|
|
59
|
+
private readonly stmtGetAll;
|
|
60
|
+
private readonly stmtCountByStatus;
|
|
61
|
+
constructor(db: Database.Database, config: StrategyForgeConfig);
|
|
62
|
+
setActionBridge(bridge: import('../action/action-bridge.js').ActionBridgeEngine): void;
|
|
63
|
+
setKnowledgeDistiller(distiller: {
|
|
64
|
+
getPrinciples: (domain?: string, limit?: number) => Array<{
|
|
65
|
+
id: string;
|
|
66
|
+
statement: string;
|
|
67
|
+
domain: string;
|
|
68
|
+
confidence: number;
|
|
69
|
+
source: string;
|
|
70
|
+
}>;
|
|
71
|
+
}): void;
|
|
72
|
+
/** Create a strategy from learned principles */
|
|
73
|
+
createFromPrinciples(domain: string): Strategy | null;
|
|
74
|
+
/** Create a strategy from observed signals */
|
|
75
|
+
createFromSignals(signals: Array<{
|
|
76
|
+
name: string;
|
|
77
|
+
value: number;
|
|
78
|
+
direction: string;
|
|
79
|
+
}>): Strategy | null;
|
|
80
|
+
/** Backtest a strategy (simplified) */
|
|
81
|
+
backtest(strategyId: number, data?: Array<{
|
|
82
|
+
date: string;
|
|
83
|
+
value: number;
|
|
84
|
+
}>): BacktestResult;
|
|
85
|
+
/** Activate a strategy */
|
|
86
|
+
activate(strategyId: number): void;
|
|
87
|
+
/** Pause a strategy */
|
|
88
|
+
pause(strategyId: number): void;
|
|
89
|
+
/** Execute one step of a strategy (check rules, fire actions) */
|
|
90
|
+
executeStep(strategyId: number): {
|
|
91
|
+
fired: number;
|
|
92
|
+
results: string[];
|
|
93
|
+
};
|
|
94
|
+
/** Evolve best strategies by combining their rules */
|
|
95
|
+
evolve(strategyIds?: number[]): Strategy | null;
|
|
96
|
+
/** Get active strategies */
|
|
97
|
+
getActive(): Strategy[];
|
|
98
|
+
/** Get strategy by ID */
|
|
99
|
+
getStrategy(id: number): Strategy | null;
|
|
100
|
+
/** Get performance report */
|
|
101
|
+
getPerformance(strategyId: number): StrategyPerformance | null;
|
|
102
|
+
/** Retire a strategy */
|
|
103
|
+
retire(strategyId: number, reason?: string): void;
|
|
104
|
+
/** Get all strategies */
|
|
105
|
+
getAll(limit?: number): Strategy[];
|
|
106
|
+
/** Get status overview */
|
|
107
|
+
getStatus(): StrategyForgeStatus;
|
|
108
|
+
private storeStrategy;
|
|
109
|
+
private domainToType;
|
|
110
|
+
private inferAction;
|
|
111
|
+
}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
// ── Migration ──────────────────────────────────────────────
|
|
3
|
+
export function runStrategyForgeMigration(db) {
|
|
4
|
+
db.exec(`
|
|
5
|
+
CREATE TABLE IF NOT EXISTS strategies (
|
|
6
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
7
|
+
brain_name TEXT NOT NULL,
|
|
8
|
+
type TEXT NOT NULL,
|
|
9
|
+
name TEXT NOT NULL,
|
|
10
|
+
description TEXT,
|
|
11
|
+
rules TEXT DEFAULT '[]',
|
|
12
|
+
performance TEXT DEFAULT '{"executions":0,"successes":0,"avgReturn":0}',
|
|
13
|
+
status TEXT DEFAULT 'draft',
|
|
14
|
+
parent_id INTEGER,
|
|
15
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
16
|
+
updated_at TEXT
|
|
17
|
+
);
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_strategy_status ON strategies(status);
|
|
19
|
+
CREATE INDEX IF NOT EXISTS idx_strategy_type ON strategies(type);
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_strategy_brain ON strategies(brain_name);
|
|
21
|
+
`);
|
|
22
|
+
}
|
|
23
|
+
// ── Engine ──────────────────────────────────────────────────
|
|
24
|
+
export class StrategyForge {
|
|
25
|
+
db;
|
|
26
|
+
config;
|
|
27
|
+
log = getLogger();
|
|
28
|
+
actionBridge = null;
|
|
29
|
+
knowledgeDistiller = null;
|
|
30
|
+
// Prepared statements
|
|
31
|
+
stmtInsert;
|
|
32
|
+
stmtGetById;
|
|
33
|
+
stmtUpdateStatus;
|
|
34
|
+
stmtUpdatePerformance;
|
|
35
|
+
stmtGetActive;
|
|
36
|
+
stmtGetByType;
|
|
37
|
+
stmtGetAll;
|
|
38
|
+
stmtCountByStatus;
|
|
39
|
+
constructor(db, config) {
|
|
40
|
+
this.db = db;
|
|
41
|
+
this.config = {
|
|
42
|
+
brainName: config.brainName,
|
|
43
|
+
maxActiveStrategies: config.maxActiveStrategies ?? 10,
|
|
44
|
+
minBacktestTrades: config.minBacktestTrades ?? 5,
|
|
45
|
+
};
|
|
46
|
+
runStrategyForgeMigration(db);
|
|
47
|
+
this.stmtInsert = db.prepare(`
|
|
48
|
+
INSERT INTO strategies (brain_name, type, name, description, rules, performance, status, parent_id)
|
|
49
|
+
VALUES (?, ?, ?, ?, ?, ?, 'draft', ?)
|
|
50
|
+
`);
|
|
51
|
+
this.stmtGetById = db.prepare(`SELECT * FROM strategies WHERE id = ?`);
|
|
52
|
+
this.stmtUpdateStatus = db.prepare(`UPDATE strategies SET status = ?, updated_at = datetime('now') WHERE id = ?`);
|
|
53
|
+
this.stmtUpdatePerformance = db.prepare(`UPDATE strategies SET performance = ?, updated_at = datetime('now') WHERE id = ?`);
|
|
54
|
+
this.stmtGetActive = db.prepare(`SELECT * FROM strategies WHERE status = 'active' ORDER BY created_at DESC`);
|
|
55
|
+
this.stmtGetByType = db.prepare(`SELECT * FROM strategies WHERE type = ? ORDER BY created_at DESC LIMIT ?`);
|
|
56
|
+
this.stmtGetAll = db.prepare(`SELECT * FROM strategies ORDER BY created_at DESC LIMIT ?`);
|
|
57
|
+
this.stmtCountByStatus = db.prepare(`SELECT status, COUNT(*) as count FROM strategies GROUP BY status`);
|
|
58
|
+
}
|
|
59
|
+
setActionBridge(bridge) { this.actionBridge = bridge; }
|
|
60
|
+
setKnowledgeDistiller(distiller) { this.knowledgeDistiller = distiller; }
|
|
61
|
+
/** Create a strategy from learned principles */
|
|
62
|
+
createFromPrinciples(domain) {
|
|
63
|
+
if (!this.knowledgeDistiller)
|
|
64
|
+
return null;
|
|
65
|
+
const principles = this.knowledgeDistiller.getPrinciples(domain, 10);
|
|
66
|
+
if (principles.length === 0)
|
|
67
|
+
return null;
|
|
68
|
+
const type = this.domainToType(domain);
|
|
69
|
+
const rules = principles.slice(0, 5).map(p => ({
|
|
70
|
+
condition: p.statement,
|
|
71
|
+
action: this.inferAction(p.statement, type),
|
|
72
|
+
confidence: p.confidence,
|
|
73
|
+
source: p.source,
|
|
74
|
+
}));
|
|
75
|
+
const name = `${domain}-strategy-${Date.now()}`;
|
|
76
|
+
const description = `Strategy from ${principles.length} ${domain} principles`;
|
|
77
|
+
return this.storeStrategy(type, name, description, rules);
|
|
78
|
+
}
|
|
79
|
+
/** Create a strategy from observed signals */
|
|
80
|
+
createFromSignals(signals) {
|
|
81
|
+
if (signals.length === 0)
|
|
82
|
+
return null;
|
|
83
|
+
const rules = signals.map(s => ({
|
|
84
|
+
condition: `${s.name} ${s.direction === 'up' ? '>' : '<'} ${s.value}`,
|
|
85
|
+
action: s.direction === 'up' ? 'buy' : 'sell',
|
|
86
|
+
confidence: 0.5,
|
|
87
|
+
source: 'signal',
|
|
88
|
+
}));
|
|
89
|
+
const name = `signal-strategy-${Date.now()}`;
|
|
90
|
+
return this.storeStrategy('trade', name, `Strategy from ${signals.length} signals`, rules);
|
|
91
|
+
}
|
|
92
|
+
/** Backtest a strategy (simplified) */
|
|
93
|
+
backtest(strategyId, data) {
|
|
94
|
+
const row = this.stmtGetById.get(strategyId);
|
|
95
|
+
if (!row)
|
|
96
|
+
throw new Error(`Strategy #${strategyId} not found`);
|
|
97
|
+
this.stmtUpdateStatus.run('backtesting', strategyId);
|
|
98
|
+
// Simplified backtest — in production would use real market data
|
|
99
|
+
const trades = data?.length ?? 10;
|
|
100
|
+
const wins = Math.floor(trades * 0.6);
|
|
101
|
+
const losses = trades - wins;
|
|
102
|
+
const avgReturn = 0.02;
|
|
103
|
+
const sharpeRatio = 1.2;
|
|
104
|
+
const maxDrawdown = 0.1;
|
|
105
|
+
// Update status back to draft after backtest
|
|
106
|
+
this.stmtUpdateStatus.run('draft', strategyId);
|
|
107
|
+
this.log.info(`[strategy-forge] Backtest #${strategyId}: ${wins}/${trades} wins, sharpe=${sharpeRatio.toFixed(2)}`);
|
|
108
|
+
return { strategyId, trades, wins, losses, avgReturn, sharpeRatio, maxDrawdown };
|
|
109
|
+
}
|
|
110
|
+
/** Activate a strategy */
|
|
111
|
+
activate(strategyId) {
|
|
112
|
+
const active = this.getActive();
|
|
113
|
+
if (active.length >= this.config.maxActiveStrategies) {
|
|
114
|
+
throw new Error(`Max active strategies (${this.config.maxActiveStrategies}) reached`);
|
|
115
|
+
}
|
|
116
|
+
this.stmtUpdateStatus.run('active', strategyId);
|
|
117
|
+
this.log.info(`[strategy-forge] Activated strategy #${strategyId}`);
|
|
118
|
+
}
|
|
119
|
+
/** Pause a strategy */
|
|
120
|
+
pause(strategyId) {
|
|
121
|
+
this.stmtUpdateStatus.run('paused', strategyId);
|
|
122
|
+
this.log.info(`[strategy-forge] Paused strategy #${strategyId}`);
|
|
123
|
+
}
|
|
124
|
+
/** Execute one step of a strategy (check rules, fire actions) */
|
|
125
|
+
executeStep(strategyId) {
|
|
126
|
+
const row = this.stmtGetById.get(strategyId);
|
|
127
|
+
if (!row)
|
|
128
|
+
throw new Error(`Strategy #${strategyId} not found`);
|
|
129
|
+
if (row.status !== 'active')
|
|
130
|
+
throw new Error(`Strategy #${strategyId} is not active`);
|
|
131
|
+
const strategy = deserializeStrategy(row);
|
|
132
|
+
const results = [];
|
|
133
|
+
let fired = 0;
|
|
134
|
+
for (const rule of strategy.rules) {
|
|
135
|
+
// Simple condition evaluation: always fire for now (real eval would check market data)
|
|
136
|
+
if (rule.confidence >= 0.5) {
|
|
137
|
+
results.push(`Rule fired: ${rule.condition} → ${rule.action}`);
|
|
138
|
+
fired++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Update performance
|
|
142
|
+
const perf = strategy.performance;
|
|
143
|
+
perf.executions += fired;
|
|
144
|
+
if (fired > 0)
|
|
145
|
+
perf.successes += 1;
|
|
146
|
+
this.stmtUpdatePerformance.run(JSON.stringify(perf), strategyId);
|
|
147
|
+
return { fired, results };
|
|
148
|
+
}
|
|
149
|
+
/** Evolve best strategies by combining their rules */
|
|
150
|
+
evolve(strategyIds) {
|
|
151
|
+
let strategies;
|
|
152
|
+
if (strategyIds && strategyIds.length > 0) {
|
|
153
|
+
strategies = strategyIds.map(id => {
|
|
154
|
+
const row = this.stmtGetById.get(id);
|
|
155
|
+
return row ? deserializeStrategy(row) : null;
|
|
156
|
+
}).filter((s) => s !== null);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
strategies = this.getActive();
|
|
160
|
+
}
|
|
161
|
+
if (strategies.length < 2)
|
|
162
|
+
return null;
|
|
163
|
+
// Take best rules from top strategies
|
|
164
|
+
const allRules = strategies.flatMap(s => s.rules);
|
|
165
|
+
const bestRules = allRules
|
|
166
|
+
.sort((a, b) => b.confidence - a.confidence)
|
|
167
|
+
.slice(0, 5);
|
|
168
|
+
const parentIds = strategies.map(s => s.id);
|
|
169
|
+
const type = strategies[0].type;
|
|
170
|
+
const name = `evolved-${type}-${Date.now()}`;
|
|
171
|
+
const description = `Evolved from strategies: ${parentIds.join(', ')}`;
|
|
172
|
+
return this.storeStrategy(type, name, description, bestRules, parentIds[0]);
|
|
173
|
+
}
|
|
174
|
+
/** Get active strategies */
|
|
175
|
+
getActive() {
|
|
176
|
+
return this.stmtGetActive.all().map(deserializeStrategy);
|
|
177
|
+
}
|
|
178
|
+
/** Get strategy by ID */
|
|
179
|
+
getStrategy(id) {
|
|
180
|
+
const row = this.stmtGetById.get(id);
|
|
181
|
+
return row ? deserializeStrategy(row) : null;
|
|
182
|
+
}
|
|
183
|
+
/** Get performance report */
|
|
184
|
+
getPerformance(strategyId) {
|
|
185
|
+
const row = this.stmtGetById.get(strategyId);
|
|
186
|
+
if (!row)
|
|
187
|
+
return null;
|
|
188
|
+
return JSON.parse(row.performance || '{"executions":0,"successes":0,"avgReturn":0}');
|
|
189
|
+
}
|
|
190
|
+
/** Retire a strategy */
|
|
191
|
+
retire(strategyId, reason) {
|
|
192
|
+
this.stmtUpdateStatus.run('retired', strategyId);
|
|
193
|
+
this.log.info(`[strategy-forge] Retired strategy #${strategyId}: ${reason ?? 'no reason'}`);
|
|
194
|
+
}
|
|
195
|
+
/** Get all strategies */
|
|
196
|
+
getAll(limit) {
|
|
197
|
+
return this.stmtGetAll.all(limit ?? 100).map(deserializeStrategy);
|
|
198
|
+
}
|
|
199
|
+
/** Get status overview */
|
|
200
|
+
getStatus() {
|
|
201
|
+
const counts = this.stmtCountByStatus.all();
|
|
202
|
+
const countMap = {};
|
|
203
|
+
let total = 0;
|
|
204
|
+
for (const c of counts) {
|
|
205
|
+
countMap[c.status] = c.count;
|
|
206
|
+
total += c.count;
|
|
207
|
+
}
|
|
208
|
+
const active = this.getActive();
|
|
209
|
+
const topStrategy = active.length > 0
|
|
210
|
+
? active.sort((a, b) => b.performance.successes - a.performance.successes)[0].name
|
|
211
|
+
: null;
|
|
212
|
+
const avgPerformance = active.length > 0
|
|
213
|
+
? active.reduce((sum, s) => sum + (s.performance.executions > 0 ? s.performance.successes / s.performance.executions : 0), 0) / active.length
|
|
214
|
+
: 0;
|
|
215
|
+
return {
|
|
216
|
+
active: countMap['active'] ?? 0,
|
|
217
|
+
total,
|
|
218
|
+
avgPerformance,
|
|
219
|
+
topStrategy,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
// ── Private ──────────────────────────────────────────────
|
|
223
|
+
storeStrategy(type, name, description, rules, parentId) {
|
|
224
|
+
const perf = { executions: 0, successes: 0, avgReturn: 0 };
|
|
225
|
+
const result = this.stmtInsert.run(this.config.brainName, type, name, description, JSON.stringify(rules), JSON.stringify(perf), parentId ?? null);
|
|
226
|
+
const id = Number(result.lastInsertRowid);
|
|
227
|
+
this.log.info(`[strategy-forge] Created strategy #${id}: ${name} (${type}, ${rules.length} rules)`);
|
|
228
|
+
return { id, brainName: this.config.brainName, type, name, description, rules, performance: perf, status: 'draft', parentId };
|
|
229
|
+
}
|
|
230
|
+
domainToType(domain) {
|
|
231
|
+
if (domain.includes('trad') || domain.includes('market') || domain.includes('crypto'))
|
|
232
|
+
return 'trade';
|
|
233
|
+
if (domain.includes('content') || domain.includes('market') || domain.includes('campaign'))
|
|
234
|
+
return 'campaign';
|
|
235
|
+
if (domain.includes('research') || domain.includes('learn'))
|
|
236
|
+
return 'research';
|
|
237
|
+
return 'optimization';
|
|
238
|
+
}
|
|
239
|
+
inferAction(statement, type) {
|
|
240
|
+
if (type === 'trade')
|
|
241
|
+
return 'evaluate_position';
|
|
242
|
+
if (type === 'campaign')
|
|
243
|
+
return 'schedule_content';
|
|
244
|
+
if (type === 'research')
|
|
245
|
+
return 'start_mission';
|
|
246
|
+
return 'adjust_parameter';
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function deserializeStrategy(row) {
|
|
250
|
+
return {
|
|
251
|
+
id: row.id,
|
|
252
|
+
brainName: row.brain_name,
|
|
253
|
+
type: row.type,
|
|
254
|
+
name: row.name,
|
|
255
|
+
description: row.description,
|
|
256
|
+
rules: JSON.parse(row.rules || '[]'),
|
|
257
|
+
performance: JSON.parse(row.performance || '{"executions":0,"successes":0,"avgReturn":0}'),
|
|
258
|
+
status: row.status,
|
|
259
|
+
parentId: row.parent_id ?? undefined,
|
|
260
|
+
createdAt: row.created_at,
|
|
261
|
+
updatedAt: row.updated_at ?? undefined,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=strategy-forge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-forge.js","sourceRoot":"","sources":["../../src/strategy/strategy-forge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAsD/C,8DAA8D;AAE9D,MAAM,UAAU,yBAAyB,CAAC,EAAqB;IAC7D,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;GAiBP,CAAC,CAAC;AACL,CAAC;AAED,+DAA+D;AAE/D,MAAM,OAAO,aAAa;IACP,EAAE,CAAoB;IACtB,MAAM,CAAgC;IACtC,GAAG,GAAG,SAAS,EAAE,CAAC;IAE3B,YAAY,GAAmE,IAAI,CAAC;IACpF,kBAAkB,GAAgK,IAAI,CAAC;IAE/L,sBAAsB;IACL,UAAU,CAAC;IACX,WAAW,CAAC;IACZ,gBAAgB,CAAC;IACjB,qBAAqB,CAAC;IACtB,aAAa,CAAC;IACd,aAAa,CAAC;IACd,UAAU,CAAC;IACX,iBAAiB,CAAC;IAEnC,YAAY,EAAqB,EAAE,MAA2B;QAC5D,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG;YACZ,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,EAAE;YACrD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,CAAC;SACjD,CAAC;QACF,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAE9B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACvE,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAAC,6EAA6E,CAAC,CAAC;QAClH,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC,OAAO,CAAC,kFAAkF,CAAC,CAAC;QAC5H,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC,2EAA2E,CAAC,CAAC;QAC7G,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC;QAC5G,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC;QAC1F,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC;IAC1G,CAAC;IAED,eAAe,CAAC,MAA+D,IAAU,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC;IACtH,qBAAqB,CAAC,SAA+J,IAAU,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC,CAAC;IAErO,gDAAgD;IAChD,oBAAoB,CAAC,MAAc;QACjC,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO,IAAI,CAAC;QAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEzC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAmB,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7D,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC;YAC3C,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,GAAG,GAAG,MAAM,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,iBAAiB,UAAU,CAAC,MAAM,IAAI,MAAM,aAAa,CAAC;QAE9E,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,8CAA8C;IAC9C,iBAAiB,CAAC,OAAkE;QAClF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,MAAM,KAAK,GAAmB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9C,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE;YACrE,MAAM,EAAE,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YAC7C,UAAU,EAAE,GAAG;YACf,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,GAAG,mBAAmB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,iBAAiB,OAAO,CAAC,MAAM,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7F,CAAC;IAED,uCAAuC;IACvC,QAAQ,CAAC,UAAkB,EAAE,IAA6C;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAA4B,CAAC;QACxE,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,UAAU,YAAY,CAAC,CAAC;QAE/D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAErD,iEAAiE;QACjE,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC;QACvB,MAAM,WAAW,GAAG,GAAG,CAAC;QACxB,MAAM,WAAW,GAAG,GAAG,CAAC;QAExB,6CAA6C;QAC7C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAE/C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8BAA8B,UAAU,KAAK,IAAI,IAAI,MAAM,iBAAiB,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEpH,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IACnF,CAAC;IAED,0BAA0B;IAC1B,QAAQ,CAAC,UAAkB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,CAAC,mBAAmB,WAAW,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,uBAAuB;IACvB,KAAK,CAAC,UAAkB;QACtB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,iEAAiE;IACjE,WAAW,CAAC,UAAkB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAA4B,CAAC;QACxE,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,UAAU,YAAY,CAAC,CAAC;QAC/D,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,UAAU,gBAAgB,CAAC,CAAC;QAEtF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClC,uFAAuF;YACvF,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC/D,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC;QAClC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;QACzB,IAAI,KAAK,GAAG,CAAC;YAAE,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;QAEjE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED,sDAAsD;IACtD,MAAM,CAAC,WAAsB;QAC3B,IAAI,UAAsB,CAAC;QAC3B,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAA4B,CAAC;gBAChE,OAAO,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/C,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvC,sCAAsC;QACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,QAAQ;aACvB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;aAC3C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEf,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChC,MAAM,IAAI,GAAG,WAAW,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,4BAA4B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAEvE,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,4BAA4B;IAC5B,SAAS;QACP,OAAQ,IAAI,CAAC,aAAa,CAAC,GAAG,EAAoB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC9E,CAAC;IAED,yBAAyB;IACzB,WAAW,CAAC,EAAU;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAA4B,CAAC;QAChE,OAAO,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAED,6BAA6B;IAC7B,cAAc,CAAC,UAAkB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAA4B,CAAC;QACxE,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,IAAI,8CAA8C,CAAC,CAAC;IACvF,CAAC;IAED,wBAAwB;IACxB,MAAM,CAAC,UAAkB,EAAE,MAAe;QACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,UAAU,KAAK,MAAM,IAAI,WAAW,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,yBAAyB;IACzB,MAAM,CAAC,KAAc;QACnB,OAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAmB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACvF,CAAC;IAED,0BAA0B;IAC1B,SAAS;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAA8C,CAAC;QACxF,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;QAAC,CAAC;QAE3E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;YACnC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YAClF,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;YACtC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM;YAC7I,CAAC,CAAC,CAAC,CAAC;QAEN,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC/B,KAAK;YACL,cAAc;YACd,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,4DAA4D;IAEpD,aAAa,CAAC,IAAsB,EAAE,IAAY,EAAE,WAAmB,EAAE,KAAqB,EAAE,QAAiB;QACvH,MAAM,IAAI,GAAwB,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QAChF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAChC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAC9C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,IAAI,IAAI,CAC9D,CAAC;QACF,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;QACpG,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAChI,CAAC;IAEO,YAAY,CAAC,MAAc;QACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,OAAO,CAAC;QACtG,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC;QAC9G,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,UAAU,CAAC;QAC/E,OAAO,cAAc,CAAC;IACxB,CAAC;IAEO,WAAW,CAAC,SAAiB,EAAE,IAAsB;QAC3D,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,mBAAmB,CAAC;QACjD,IAAI,IAAI,KAAK,UAAU;YAAE,OAAO,kBAAkB,CAAC;QACnD,IAAI,IAAI,KAAK,UAAU;YAAE,OAAO,eAAe,CAAC;QAChD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;CACF;AAkBD,SAAS,mBAAmB,CAAC,GAAgB;IAC3C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,IAAI,EAAE,GAAG,CAAC,IAAwB;QAClC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC;QACpC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,IAAI,8CAA8C,CAAC;QAC1F,MAAM,EAAE,GAAG,CAAC,MAA4B;QACxC,QAAQ,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;QACpC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;KACvC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED