@livefolio/sdk 0.2.0 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +20 -146
  2. package/dist/portfolio/client.d.ts.map +1 -1
  3. package/dist/portfolio/client.js +7 -1
  4. package/dist/portfolio/client.js.map +1 -1
  5. package/dist/portfolio/index.d.ts +2 -0
  6. package/dist/portfolio/index.d.ts.map +1 -1
  7. package/dist/portfolio/index.js +21 -1
  8. package/dist/portfolio/index.js.map +1 -1
  9. package/dist/portfolio/rebalance.d.ts +62 -0
  10. package/dist/portfolio/rebalance.d.ts.map +1 -0
  11. package/dist/portfolio/rebalance.js +205 -0
  12. package/dist/portfolio/rebalance.js.map +1 -0
  13. package/dist/portfolio/symbols.d.ts +13 -0
  14. package/dist/portfolio/symbols.d.ts.map +1 -0
  15. package/dist/portfolio/symbols.js +112 -0
  16. package/dist/portfolio/symbols.js.map +1 -0
  17. package/dist/portfolio/types.d.ts +10 -0
  18. package/dist/portfolio/types.d.ts.map +1 -1
  19. package/dist/strategy/backtest.d.ts +3 -0
  20. package/dist/strategy/backtest.d.ts.map +1 -0
  21. package/dist/strategy/backtest.js +7 -0
  22. package/dist/strategy/backtest.js.map +1 -0
  23. package/dist/strategy/cache.d.ts +7 -0
  24. package/dist/strategy/cache.d.ts.map +1 -0
  25. package/dist/strategy/cache.js +312 -0
  26. package/dist/strategy/cache.js.map +1 -0
  27. package/dist/strategy/client.d.ts.map +1 -1
  28. package/dist/strategy/client.js +9 -333
  29. package/dist/strategy/client.js.map +1 -1
  30. package/dist/strategy/get.d.ts +5 -0
  31. package/dist/strategy/get.d.ts.map +1 -0
  32. package/dist/strategy/get.js +25 -0
  33. package/dist/strategy/get.js.map +1 -0
  34. package/dist/strategy/index.d.ts +5 -1
  35. package/dist/strategy/index.d.ts.map +1 -1
  36. package/dist/strategy/index.js +10 -1
  37. package/dist/strategy/index.js.map +1 -1
  38. package/dist/strategy/stream.d.ts +5 -0
  39. package/dist/strategy/stream.d.ts.map +1 -0
  40. package/dist/strategy/stream.js +58 -0
  41. package/dist/strategy/stream.js.map +1 -0
  42. package/dist/strategy/types.d.ts +6 -0
  43. package/dist/strategy/types.d.ts.map +1 -1
  44. package/package.json +1 -1
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ETF_LEVERAGE_MAP = exports.BASE_TICKER_ALIASES = exports.FRED_TRADABLE_MAP = void 0;
4
+ exports.mapTickerToTradable = mapTickerToTradable;
5
+ /** Maps FRED rate symbols to tradable equivalents. `null` = hold as cash. */
6
+ exports.FRED_TRADABLE_MAP = {
7
+ DTB3: null,
8
+ DFF: 'USFR',
9
+ };
10
+ /** Normalizes equivalent base tickers to a canonical symbol for leverage lookups. */
11
+ exports.BASE_TICKER_ALIASES = {
12
+ VOO: 'SPY',
13
+ IVV: 'SPY',
14
+ };
15
+ /** Maps "SYMBOL:LEVERAGE" to the actual leveraged/inverse ETF ticker. Covers bull (2x/3x) and inverse (-1x/-2x/-3x). */
16
+ exports.ETF_LEVERAGE_MAP = {
17
+ // Bull — Broad market
18
+ 'SPY:2': 'SSO',
19
+ 'SPY:3': 'UPRO',
20
+ 'QQQ:2': 'QLD',
21
+ 'QQQ:3': 'TQQQ',
22
+ 'IWM:2': 'UWM',
23
+ 'IWM:3': 'TNA',
24
+ 'DIA:2': 'DDM',
25
+ 'DIA:3': 'UDOW',
26
+ 'MDY:2': 'MVV',
27
+ 'MDY:3': 'UMDD',
28
+ // Bull — Bonds
29
+ 'TLT:2': 'UBT',
30
+ 'TLT:3': 'TMF',
31
+ // Bull — Sectors
32
+ 'XLF:2': 'UYG',
33
+ 'XLF:3': 'FAS',
34
+ 'XLE:2': 'DIG',
35
+ 'XLK:2': 'ROM',
36
+ 'XLK:3': 'TECL',
37
+ 'XLV:2': 'RXL',
38
+ 'XLV:3': 'CURE',
39
+ 'XLU:2': 'UPW',
40
+ 'XLB:2': 'UYM',
41
+ 'XLP:2': 'UGE',
42
+ 'XLY:2': 'UCC',
43
+ 'XLI:2': 'UXI',
44
+ 'XLI:3': 'DUSL',
45
+ 'XLRE:2': 'URE',
46
+ 'XLRE:3': 'DRN',
47
+ 'SOXX:2': 'USD',
48
+ 'SOXX:3': 'SOXL',
49
+ // Bull — International
50
+ 'EEM:2': 'EET',
51
+ 'EEM:3': 'EDC',
52
+ 'EFA:2': 'EFO',
53
+ 'FXI:3': 'YINN',
54
+ // Bull — Commodities
55
+ 'GLD:2': 'UGL',
56
+ 'SLV:2': 'AGQ',
57
+ 'USO:2': 'UCO',
58
+ 'GDX:2': 'NUGT',
59
+ // Bull — Crypto
60
+ 'BTC-USD:2': 'BITU',
61
+ // Inverse — Broad market
62
+ 'SPY:-1': 'SH',
63
+ 'SPY:-2': 'SDS',
64
+ 'SPY:-3': 'SPXU',
65
+ 'QQQ:-1': 'PSQ',
66
+ 'QQQ:-2': 'QID',
67
+ 'QQQ:-3': 'SQQQ',
68
+ 'IWM:-1': 'RWM',
69
+ 'IWM:-2': 'TWM',
70
+ 'IWM:-3': 'TZA',
71
+ 'DIA:-1': 'DOG',
72
+ 'DIA:-2': 'DXD',
73
+ 'DIA:-3': 'SDOW',
74
+ 'MDY:-3': 'SMDD',
75
+ // Inverse — Bonds
76
+ 'TLT:-1': 'TBF',
77
+ 'TLT:-2': 'TBT',
78
+ 'TLT:-3': 'TMV',
79
+ // Inverse — Sectors
80
+ 'XLF:-2': 'SKF',
81
+ 'XLF:-3': 'FAZ',
82
+ 'XLE:-2': 'DUG',
83
+ 'XLK:-3': 'TECS',
84
+ 'SOXX:-3': 'SOXS',
85
+ // Inverse — International
86
+ 'EEM:-2': 'EEV',
87
+ 'EEM:-3': 'EDZ',
88
+ // Inverse — Commodities
89
+ 'GLD:-2': 'GLL',
90
+ };
91
+ /**
92
+ * Maps a strategy ticker to its tradable symbol.
93
+ * Pipeline: FRED mapping -> leveraged/inverse ETF lookup (with alias normalization) -> passthrough.
94
+ */
95
+ function mapTickerToTradable(ticker) {
96
+ const { symbol, leverage } = ticker;
97
+ // FRED mapping takes priority
98
+ if (symbol in exports.FRED_TRADABLE_MAP)
99
+ return exports.FRED_TRADABLE_MAP[symbol];
100
+ // Leveraged/inverse ETF lookup
101
+ if (leverage !== 1) {
102
+ const canonical = exports.BASE_TICKER_ALIASES[symbol] ?? symbol;
103
+ const key = `${canonical}:${leverage}`;
104
+ const mapped = exports.ETF_LEVERAGE_MAP[key];
105
+ if (!mapped) {
106
+ throw new Error(`No leveraged ETF mapping for ${symbol} at ${leverage}x`);
107
+ }
108
+ return mapped;
109
+ }
110
+ return symbol;
111
+ }
112
+ //# sourceMappingURL=symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../src/portfolio/symbols.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,13 @@
1
+ import type { Ticker } from '../strategy/types';
2
+ import type { RebalancePlanInput, RebalancePlan } from './rebalance';
1
3
  export interface PortfolioModule {
4
+ buildRebalancePlan(input: RebalancePlanInput): RebalancePlan;
5
+ computePortfolioDriftPercentPoints(input: {
6
+ targetWeights: Record<string, number>;
7
+ currentValues: Record<string, number>;
8
+ cashValue: number;
9
+ totalValue: number;
10
+ }): number;
11
+ mapTickerToTradable(ticker: Ticker): string | null;
2
12
  }
3
13
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/portfolio/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;CAE/B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/portfolio/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAAC;IAC7D,kCAAkC,CAAC,KAAK,EAAE;QACxC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,MAAM,CAAC;IACX,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACpD"}
@@ -0,0 +1,3 @@
1
+ import type { Strategy, BacktestOptions, BacktestResult } from './types';
2
+ export declare function backtest(_strategy: Strategy, _options: BacktestOptions): Promise<BacktestResult>;
3
+ //# sourceMappingURL=backtest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtest.d.ts","sourceRoot":"","sources":["../../src/strategy/backtest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzE,wBAAsB,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAEtG"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.backtest = backtest;
4
+ async function backtest(_strategy, _options) {
5
+ throw new Error('Not implemented');
6
+ }
7
+ //# sourceMappingURL=backtest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtest.js","sourceRoot":"","sources":["../../src/strategy/backtest.ts"],"names":[],"mappings":";;AAEA,4BAEC;AAFM,KAAK,UAAU,QAAQ,CAAC,SAAmB,EAAE,QAAyB;IAC3E,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TypedSupabaseClient } from '../types';
2
+ import type { MarketModule } from '../market/types';
3
+ import type { Strategy, StrategyEvaluation } from './types';
4
+ export declare function fetchSignalStates(client: TypedSupabaseClient, strategyId: number): Promise<Record<string, boolean>>;
5
+ export declare function fetchIndicatorMetadata(client: TypedSupabaseClient, strategyId: number): Promise<Record<string, unknown>>;
6
+ export declare function evaluateCached(client: TypedSupabaseClient, market: MarketModule, strategy: Strategy, at: Date): Promise<StrategyEvaluation>;
7
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/strategy/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAIV,QAAQ,EACR,kBAAkB,EAKnB,MAAM,SAAS,CAAC;AAoEjB,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,mBAAmB,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6ClC;AA4HD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+BlC;AAgDD,wBAAsB,cAAc,CAClC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,QAAQ,EAClB,EAAE,EAAE,IAAI,GACP,OAAO,CAAC,kBAAkB,CAAC,CAwF7B"}
@@ -0,0 +1,312 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchSignalStates = fetchSignalStates;
4
+ exports.fetchIndicatorMetadata = fetchIndicatorMetadata;
5
+ exports.evaluateCached = evaluateCached;
6
+ const evaluate_1 = require("./evaluate");
7
+ const symbols_1 = require("./symbols");
8
+ // ---------------------------------------------------------------------------
9
+ // Row → domain mapping helpers
10
+ // ---------------------------------------------------------------------------
11
+ function mapTicker(row) {
12
+ return { symbol: row.symbol, leverage: row.leverage };
13
+ }
14
+ function mapIndicator(row) {
15
+ return {
16
+ type: row.type,
17
+ ticker: row.tickers ? mapTicker(row.tickers) : { symbol: '', leverage: 1 },
18
+ lookback: row.lookback,
19
+ delay: row.delay,
20
+ unit: row.unit ?? null,
21
+ threshold: row.threshold,
22
+ };
23
+ }
24
+ function mapSignal(row) {
25
+ return {
26
+ left: mapIndicator(row.indicator_1),
27
+ comparison: row.comparison,
28
+ right: mapIndicator(row.indicator_2),
29
+ tolerance: row.tolerance,
30
+ };
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // DB helpers
34
+ // ---------------------------------------------------------------------------
35
+ async function fetchSignalStates(client, strategyId) {
36
+ const db = client;
37
+ const { data: nsRows, error: nsErr } = await db
38
+ .from('named_signals')
39
+ .select(`
40
+ signal_id,
41
+ signals:signal_id (
42
+ id,
43
+ indicator_1:indicator_id_1 ( type, tickers:ticker_id ( symbol, leverage ), lookback, delay, unit, threshold ),
44
+ indicator_2:indicator_id_2 ( type, tickers:ticker_id ( symbol, leverage ), lookback, delay, unit, threshold ),
45
+ comparison,
46
+ tolerance
47
+ )
48
+ `)
49
+ .eq('strategy_id', strategyId);
50
+ if (nsErr || !nsRows || nsRows.length === 0)
51
+ return {};
52
+ const signalIds = nsRows.map((r) => r.signal_id);
53
+ const { data: evalRows, error: evalErr } = await client
54
+ .from('signal_evaluations')
55
+ .select('signal_id, result, trading_day_id')
56
+ .in('signal_id', signalIds)
57
+ .order('trading_day_id', { ascending: false });
58
+ if (evalErr || !evalRows)
59
+ return {};
60
+ const latestBySignalId = new Map();
61
+ for (const row of evalRows) {
62
+ if (!latestBySignalId.has(row.signal_id)) {
63
+ latestBySignalId.set(row.signal_id, row.result);
64
+ }
65
+ }
66
+ const result = {};
67
+ for (const nsRow of nsRows) {
68
+ const signal = mapSignal(nsRow.signals);
69
+ const key = (0, evaluate_1.signalKey)(signal);
70
+ const val = latestBySignalId.get(nsRow.signal_id);
71
+ if (val !== undefined) {
72
+ result[key] = val;
73
+ }
74
+ }
75
+ return result;
76
+ }
77
+ async function fetchSignalStatesForDay(client, strategyId, tradingDayId) {
78
+ const db = client;
79
+ const { data: nsRows, error: nsErr } = await db
80
+ .from('named_signals')
81
+ .select(`
82
+ signal_id,
83
+ signals:signal_id (
84
+ id,
85
+ indicator_1:indicator_id_1 ( type, tickers:ticker_id ( symbol, leverage ), lookback, delay, unit, threshold ),
86
+ indicator_2:indicator_id_2 ( type, tickers:ticker_id ( symbol, leverage ), lookback, delay, unit, threshold ),
87
+ comparison,
88
+ tolerance
89
+ )
90
+ `)
91
+ .eq('strategy_id', strategyId);
92
+ if (nsErr || !nsRows || nsRows.length === 0)
93
+ return {};
94
+ const signalIds = nsRows.map((r) => r.signal_id);
95
+ const { data: evalRows, error: evalErr } = await client
96
+ .from('signal_evaluations')
97
+ .select('signal_id, result')
98
+ .in('signal_id', signalIds)
99
+ .eq('trading_day_id', tradingDayId);
100
+ if (evalErr || !evalRows)
101
+ return {};
102
+ const signalIdToResult = new Map();
103
+ for (const row of evalRows) {
104
+ signalIdToResult.set(row.signal_id, row.result);
105
+ }
106
+ const result = {};
107
+ for (const nsRow of nsRows) {
108
+ const signal = mapSignal(nsRow.signals);
109
+ const key = (0, evaluate_1.signalKey)(signal);
110
+ const val = signalIdToResult.get(nsRow.signal_id);
111
+ if (val !== undefined) {
112
+ result[key] = val;
113
+ }
114
+ }
115
+ return result;
116
+ }
117
+ async function fetchIndicatorKeyMap(client, strategyId) {
118
+ const db = client;
119
+ const { data: nsRows, error: nsErr } = await db
120
+ .from('named_signals')
121
+ .select(`
122
+ signals:signal_id (
123
+ indicator_1:indicator_id_1 ( id, type, tickers:ticker_id ( symbol, leverage ), lookback, delay, unit, threshold ),
124
+ indicator_2:indicator_id_2 ( id, type, tickers:ticker_id ( symbol, leverage ), lookback, delay, unit, threshold )
125
+ )
126
+ `)
127
+ .eq('strategy_id', strategyId);
128
+ if (nsErr || !nsRows || nsRows.length === 0)
129
+ return new Map();
130
+ const keyToId = new Map();
131
+ for (const nsRow of nsRows) {
132
+ for (const ind of [nsRow.signals.indicator_1, nsRow.signals.indicator_2]) {
133
+ const key = (0, evaluate_1.indicatorKey)(mapIndicator(ind));
134
+ if (!keyToId.has(key)) {
135
+ keyToId.set(key, ind.id);
136
+ }
137
+ }
138
+ }
139
+ return keyToId;
140
+ }
141
+ async function fetchIndicatorEvaluationsForDay(client, strategyId, tradingDayId) {
142
+ const db = client;
143
+ const keyToId = await fetchIndicatorKeyMap(client, strategyId);
144
+ if (keyToId.size === 0)
145
+ return {};
146
+ const indicatorIds = [...keyToId.values()];
147
+ const { data: evalRows, error: evalErr } = await db
148
+ .from('indicator_evaluations')
149
+ .select('indicator_id, value, metadata, trading_days!inner(post)')
150
+ .in('indicator_id', indicatorIds)
151
+ .eq('trading_day_id', tradingDayId);
152
+ if (evalErr || !evalRows)
153
+ return {};
154
+ const byIndicatorId = new Map();
155
+ for (const row of evalRows) {
156
+ byIndicatorId.set(row.indicator_id, {
157
+ value: Number(row.value),
158
+ metadata: row.metadata,
159
+ post: row.trading_days.post,
160
+ });
161
+ }
162
+ const result = {};
163
+ for (const [key, id] of keyToId) {
164
+ const entry = byIndicatorId.get(id);
165
+ if (entry) {
166
+ result[key] = {
167
+ timestamp: entry.post,
168
+ value: entry.value,
169
+ ...(entry.metadata != null ? { metadata: entry.metadata } : {}),
170
+ };
171
+ }
172
+ }
173
+ return result;
174
+ }
175
+ async function fetchIndicatorMetadata(client, strategyId) {
176
+ const db = client;
177
+ const keyToId = await fetchIndicatorKeyMap(client, strategyId);
178
+ if (keyToId.size === 0)
179
+ return {};
180
+ const indicatorIds = [...keyToId.values()];
181
+ const { data: evalRows, error: evalErr } = await db
182
+ .from('indicator_evaluations')
183
+ .select('indicator_id, metadata, trading_day_id')
184
+ .in('indicator_id', indicatorIds)
185
+ .order('trading_day_id', { ascending: false });
186
+ if (evalErr || !evalRows)
187
+ return {};
188
+ const latestByIndicatorId = new Map();
189
+ for (const row of evalRows) {
190
+ if (!latestByIndicatorId.has(row.indicator_id) && row.metadata != null) {
191
+ latestByIndicatorId.set(row.indicator_id, row.metadata);
192
+ }
193
+ }
194
+ const result = {};
195
+ for (const [key, id] of keyToId) {
196
+ const meta = latestByIndicatorId.get(id);
197
+ if (meta !== undefined) {
198
+ result[key] = meta;
199
+ }
200
+ }
201
+ return result;
202
+ }
203
+ async function storeResult(client, strategy, result, tradingDayId) {
204
+ const db = client;
205
+ const { data: stratRow } = await client
206
+ .from('strategies')
207
+ .select('id')
208
+ .eq('link_id', strategy.linkId)
209
+ .limit(1)
210
+ .maybeSingle();
211
+ const signalResults = Object.entries(result.signals).map(([_key, sigResult]) => {
212
+ const ns = strategy.signals.find((ns) => (0, evaluate_1.signalKey)(ns.signal) === _key);
213
+ return { name: ns?.name ?? _key, result: sigResult };
214
+ });
215
+ const keyToId = stratRow ? await fetchIndicatorKeyMap(client, stratRow.id) : new Map();
216
+ const indicatorResults = Object.entries(result.indicators)
217
+ .filter(([key]) => keyToId.has(key))
218
+ .map(([key, indResult]) => ({
219
+ indicatorId: keyToId.get(key),
220
+ value: indResult.value,
221
+ metadata: indResult.metadata ?? null,
222
+ }));
223
+ const { error } = await db.rpc('upsert_evaluation', {
224
+ p_link_id: strategy.linkId,
225
+ p_allocation_name: result.allocation.name,
226
+ p_signal_results: signalResults,
227
+ p_indicator_results: indicatorResults,
228
+ p_trading_day_id: tradingDayId,
229
+ });
230
+ if (error)
231
+ throw new Error(`Failed to store evaluation: ${error.message}`);
232
+ }
233
+ // ---------------------------------------------------------------------------
234
+ // Cache-through evaluation (exported)
235
+ // ---------------------------------------------------------------------------
236
+ async function evaluateCached(client, market, strategy, at) {
237
+ const db = client;
238
+ // 1. Fetch series + resolve strategy_id in parallel
239
+ const symbols = (0, symbols_1.extractSymbols)(strategy);
240
+ const [batchSeries, stratRow] = await Promise.all([
241
+ market.getBatchSeries(symbols),
242
+ client
243
+ .from('strategies')
244
+ .select('id')
245
+ .eq('link_id', strategy.linkId)
246
+ .limit(1)
247
+ .maybeSingle()
248
+ .then(({ data }) => data),
249
+ ]);
250
+ // 2. Build options for pure evaluation
251
+ const options = { at, batchSeries };
252
+ const evaluationDate = (0, evaluate_1.getEvaluationDate)(strategy.trading, options);
253
+ // 3. No DB strategy → pure eval
254
+ if (!stratRow)
255
+ return (0, evaluate_1.evaluate)(strategy, options);
256
+ // 4. Resolve trading_day_id
257
+ const { data: tdRow } = await db
258
+ .from('trading_days')
259
+ .select('id')
260
+ .lte('post', evaluationDate.toISOString())
261
+ .order('post', { ascending: false })
262
+ .limit(1)
263
+ .maybeSingle();
264
+ if (!tdRow)
265
+ return (0, evaluate_1.evaluate)(strategy, options);
266
+ // 5. Check cache
267
+ const { data: cacheRow } = await db
268
+ .from('strategy_evaluations')
269
+ .select('allocation_id')
270
+ .eq('strategy_id', stratRow.id)
271
+ .eq('trading_day_id', tdRow.id)
272
+ .limit(1)
273
+ .maybeSingle();
274
+ if (cacheRow) {
275
+ // CACHE HIT — reconstruct result
276
+ const { data: allocRow } = await db
277
+ .from('allocations')
278
+ .select('name')
279
+ .eq('id', cacheRow.allocation_id)
280
+ .limit(1)
281
+ .maybeSingle();
282
+ const namedAlloc = strategy.allocations.find(na => na.name === allocRow?.name)
283
+ ?? strategy.allocations[strategy.allocations.length - 1];
284
+ const [signals, indicators] = await Promise.all([
285
+ fetchSignalStatesForDay(client, stratRow.id, tdRow.id),
286
+ fetchIndicatorEvaluationsForDay(client, stratRow.id, tdRow.id),
287
+ ]);
288
+ return {
289
+ allocation: {
290
+ name: namedAlloc.name,
291
+ holdings: namedAlloc.allocation.holdings,
292
+ },
293
+ asOf: evaluationDate,
294
+ signals,
295
+ indicators,
296
+ };
297
+ }
298
+ // 6. CACHE MISS — fetch prior state, evaluate, store
299
+ const [prevSignals, prevMeta] = await Promise.all([
300
+ fetchSignalStates(client, stratRow.id),
301
+ fetchIndicatorMetadata(client, stratRow.id),
302
+ ]);
303
+ const result = (0, evaluate_1.evaluate)(strategy, {
304
+ ...options,
305
+ previousSignalStates: prevSignals,
306
+ previousIndicatorMetadata: prevMeta,
307
+ });
308
+ // Store (non-blocking)
309
+ storeResult(client, strategy, result, tdRow.id).catch(err => console.error('Failed to store evaluation:', err));
310
+ return result;
311
+ }
312
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/strategy/cache.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/strategy/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAMV,cAAc,EAOf,MAAM,SAAS,CAAC;AAwEjB,wBAAgB,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAwX1E"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/strategy/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAc9C,wBAAgB,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAc1E"}