dexbot 1.5.3 → 1.6.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/CHANGELOG.md +62 -0
- package/README.md +4 -3
- package/analysis/README.md +1 -2
- package/analysis/ama_fitting/fetch_lp_candles.ts +1 -9
- package/analysis/ama_fitting/package.json +1 -1
- package/analysis/analyze_derivatives.ts +1 -1
- package/analysis/bot_usage/discover_bot_accounts.ts +12 -6
- package/analysis/resolve_source.ts +9 -2
- package/analysis/tradingview/README.md +29 -11
- package/analysis/tradingview/analyze_tradingview.ts +92 -3
- package/analysis/tradingview/tradingview_uplot_chart_generator.ts +1120 -182
- package/analysis/trend_detection/package.json +1 -1
- package/claw/docs/DEXBOT2_TUNING_CHEAT_SHEET.md +1 -1
- package/claw/modules/dexbot_profiles.ts +22 -2
- package/claw/package.json +1 -1
- package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
- package/claw/runtimes/openclaw-plugin/package.json +1 -1
- package/claw/skills/launcher-ops/references/launcher-workflow.md +1 -1
- package/claw/tests/test_claw_mcp_transport.ts +2 -2
- package/claw/tests/test_dexbot_profiles.ts +65 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.js +1 -9
- package/dist/analysis/ama_fitting/fetch_lp_candles.js.map +1 -1
- package/dist/analysis/analyze_derivatives.js +1 -1
- package/dist/analysis/bot_usage/discover_bot_accounts.js +11 -6
- package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -1
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +2 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -1
- package/dist/analysis/resolve_source.d.ts +1 -0
- package/dist/analysis/resolve_source.d.ts.map +1 -1
- package/dist/analysis/resolve_source.js +6 -2
- package/dist/analysis/resolve_source.js.map +1 -1
- package/dist/analysis/tradingview/analyze_tradingview.d.ts +5 -0
- package/dist/analysis/tradingview/analyze_tradingview.d.ts.map +1 -1
- package/dist/analysis/tradingview/analyze_tradingview.js +112 -3
- package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -1
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts +5 -1
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -1
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +1118 -182
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -1
- package/dist/bot.js +1 -1
- package/dist/bot.js.map +1 -1
- package/dist/dexbot.js +3 -3
- package/dist/dexbot.js.map +1 -1
- package/dist/market_adapter/ama_signal_runner.js +2 -2
- package/dist/market_adapter/candle_utils.d.ts +6 -0
- package/dist/market_adapter/candle_utils.d.ts.map +1 -1
- package/dist/market_adapter/candle_utils.js +6 -0
- package/dist/market_adapter/candle_utils.js.map +1 -1
- package/dist/market_adapter/core/kibana_candles.d.ts +17 -1
- package/dist/market_adapter/core/kibana_candles.d.ts.map +1 -1
- package/dist/market_adapter/core/kibana_candles.js +101 -19
- package/dist/market_adapter/core/kibana_candles.js.map +1 -1
- package/dist/market_adapter/core/kibana_client.d.ts +2 -0
- package/dist/market_adapter/core/kibana_client.d.ts.map +1 -1
- package/dist/market_adapter/core/kibana_client.js +31 -4
- package/dist/market_adapter/core/kibana_client.js.map +1 -1
- package/dist/market_adapter/core/market_adapter_service.d.ts.map +1 -1
- package/dist/market_adapter/core/market_adapter_service.js +0 -6
- package/dist/market_adapter/core/market_adapter_service.js.map +1 -1
- package/dist/market_adapter/inputs/fetch_book_data.d.ts +14 -0
- package/dist/market_adapter/inputs/fetch_book_data.d.ts.map +1 -0
- package/dist/market_adapter/inputs/fetch_book_data.js +138 -0
- package/dist/market_adapter/inputs/fetch_book_data.js.map +1 -0
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +1 -1
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts +16 -2
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
- package/dist/market_adapter/inputs/fetch_lp_data.js +109 -281
- package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
- package/dist/market_adapter/inputs/kibana_feed_source.d.ts +87 -0
- package/dist/market_adapter/inputs/kibana_feed_source.d.ts.map +1 -0
- package/dist/market_adapter/inputs/kibana_feed_source.js +570 -0
- package/dist/market_adapter/inputs/kibana_feed_source.js.map +1 -0
- package/dist/market_adapter/inputs/kibana_source.d.ts.map +1 -1
- package/dist/market_adapter/inputs/kibana_source.js +10 -5
- package/dist/market_adapter/inputs/kibana_source.js.map +1 -1
- package/dist/market_adapter/inputs/window_cache.d.ts +166 -0
- package/dist/market_adapter/inputs/window_cache.d.ts.map +1 -0
- package/dist/market_adapter/inputs/window_cache.js +500 -0
- package/dist/market_adapter/inputs/window_cache.js.map +1 -0
- package/dist/market_adapter/interval_utils.d.ts +8 -1
- package/dist/market_adapter/interval_utils.d.ts.map +1 -1
- package/dist/market_adapter/interval_utils.js +14 -1
- package/dist/market_adapter/interval_utils.js.map +1 -1
- package/dist/modules/account_bots.d.ts +1 -0
- package/dist/modules/account_bots.d.ts.map +1 -1
- package/dist/modules/account_bots.js +21 -5
- package/dist/modules/account_bots.js.map +1 -1
- package/dist/modules/account_orders.d.ts +25 -4
- package/dist/modules/account_orders.d.ts.map +1 -1
- package/dist/modules/account_orders.js +67 -4
- package/dist/modules/account_orders.js.map +1 -1
- package/dist/modules/bitshares-native/chain_client.d.ts +2 -0
- package/dist/modules/bitshares-native/chain_client.d.ts.map +1 -1
- package/dist/modules/bitshares-native/chain_client.js +3 -1
- package/dist/modules/bitshares-native/chain_client.js.map +1 -1
- package/dist/modules/bitshares-native/subscriptions.d.ts.map +1 -1
- package/dist/modules/bitshares-native/subscriptions.js +13 -3
- package/dist/modules/bitshares-native/subscriptions.js.map +1 -1
- package/dist/modules/bitshares-native/transport.d.ts +2 -0
- package/dist/modules/bitshares-native/transport.d.ts.map +1 -1
- package/dist/modules/bitshares-native/transport.js +122 -28
- package/dist/modules/bitshares-native/transport.js.map +1 -1
- package/dist/modules/bitshares_client.d.ts.map +1 -1
- package/dist/modules/bitshares_client.js +59 -8
- package/dist/modules/bitshares_client.js.map +1 -1
- package/dist/modules/bot_settings.d.ts.map +1 -1
- package/dist/modules/bot_settings.js +11 -0
- package/dist/modules/bot_settings.js.map +1 -1
- package/dist/modules/constants.d.ts +13 -0
- package/dist/modules/constants.d.ts.map +1 -1
- package/dist/modules/constants.js +68 -4
- package/dist/modules/constants.js.map +1 -1
- package/dist/modules/dexbot_class.d.ts +8 -0
- package/dist/modules/dexbot_class.d.ts.map +1 -1
- package/dist/modules/dexbot_class.js +57 -2
- package/dist/modules/dexbot_class.js.map +1 -1
- package/dist/modules/dexbot_cow_runtime.d.ts +26 -1
- package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_cow_runtime.js +157 -28
- package/dist/modules/dexbot_cow_runtime.js.map +1 -1
- package/dist/modules/dexbot_fill_runtime.d.ts +41 -1
- package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_fill_runtime.js +135 -5
- package/dist/modules/dexbot_fill_runtime.js.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.d.ts +79 -12
- package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.js +554 -46
- package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
- package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_startup_runtime.js +13 -0
- package/dist/modules/dexbot_startup_runtime.js.map +1 -1
- package/dist/modules/dexbot_state_recovery.d.ts +15 -1
- package/dist/modules/dexbot_state_recovery.d.ts.map +1 -1
- package/dist/modules/dexbot_state_recovery.js +36 -7
- package/dist/modules/dexbot_state_recovery.js.map +1 -1
- package/dist/modules/fund_registry.d.ts +1 -1
- package/dist/modules/fund_registry.js +1 -1
- package/dist/modules/node_connect_policy.d.ts +52 -0
- package/dist/modules/node_connect_policy.d.ts.map +1 -0
- package/dist/modules/node_connect_policy.js +35 -0
- package/dist/modules/node_connect_policy.js.map +1 -0
- package/dist/modules/node_manager.d.ts +32 -0
- package/dist/modules/node_manager.d.ts.map +1 -1
- package/dist/modules/node_manager.js +76 -9
- package/dist/modules/node_manager.js.map +1 -1
- package/dist/modules/order/accounting.d.ts +30 -0
- package/dist/modules/order/accounting.d.ts.map +1 -1
- package/dist/modules/order/accounting.js +176 -3
- package/dist/modules/order/accounting.js.map +1 -1
- package/dist/modules/order/export.d.ts.map +1 -1
- package/dist/modules/order/export.js +1 -0
- package/dist/modules/order/export.js.map +1 -1
- package/dist/modules/order/grid.d.ts.map +1 -1
- package/dist/modules/order/grid.js +143 -15
- package/dist/modules/order/grid.js.map +1 -1
- package/dist/modules/order/grid_reconcile.d.ts.map +1 -1
- package/dist/modules/order/grid_reconcile.js +5 -3
- package/dist/modules/order/grid_reconcile.js.map +1 -1
- package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
- package/dist/modules/order/grid_reconcile_internal.js +182 -6
- package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
- package/dist/modules/order/manager.d.ts +64 -2
- package/dist/modules/order/manager.d.ts.map +1 -1
- package/dist/modules/order/manager.js +231 -14
- package/dist/modules/order/manager.js.map +1 -1
- package/dist/modules/order/strategy.d.ts +3 -0
- package/dist/modules/order/strategy.d.ts.map +1 -1
- package/dist/modules/order/strategy.js +79 -7
- package/dist/modules/order/strategy.js.map +1 -1
- package/dist/modules/order/sync_engine.d.ts.map +1 -1
- package/dist/modules/order/sync_engine.js +16 -1
- package/dist/modules/order/sync_engine.js.map +1 -1
- package/dist/modules/order/utils/math.d.ts +11 -1
- package/dist/modules/order/utils/math.d.ts.map +1 -1
- package/dist/modules/order/utils/math.js +24 -1
- package/dist/modules/order/utils/math.js.map +1 -1
- package/dist/modules/order/utils/order.d.ts +258 -13
- package/dist/modules/order/utils/order.d.ts.map +1 -1
- package/dist/modules/order/utils/order.js +662 -12
- package/dist/modules/order/utils/order.js.map +1 -1
- package/dist/modules/order/utils/system.d.ts +36 -0
- package/dist/modules/order/utils/system.d.ts.map +1 -1
- package/dist/modules/order/utils/system.js +102 -6
- package/dist/modules/order/utils/system.js.map +1 -1
- package/dist/modules/order/utils/validate.d.ts.map +1 -1
- package/dist/modules/order/utils/validate.js +6 -2
- package/dist/modules/order/utils/validate.js.map +1 -1
- package/dist/modules/paths.d.ts +2 -0
- package/dist/modules/paths.d.ts.map +1 -1
- package/dist/modules/paths.js +1 -0
- package/dist/modules/paths.js.map +1 -1
- package/dist/modules/runtime_settings.d.ts +13 -0
- package/dist/modules/runtime_settings.d.ts.map +1 -1
- package/dist/modules/runtime_settings.js +20 -0
- package/dist/modules/runtime_settings.js.map +1 -1
- package/dist/modules/utils/errors.d.ts +16 -0
- package/dist/modules/utils/errors.d.ts.map +1 -1
- package/dist/modules/utils/errors.js +31 -0
- package/dist/modules/utils/errors.js.map +1 -1
- package/dist/pm2.js +7 -7
- package/dist/scripts/analyze-credit.d.ts.map +1 -1
- package/dist/scripts/analyze-credit.js +13 -3
- package/dist/scripts/analyze-credit.js.map +1 -1
- package/dist/scripts/analyze-orders.js +2 -2
- package/dist/scripts/analyze-orders.js.map +1 -1
- package/dist/scripts/diagnose-kibana-candles.d.ts.map +1 -1
- package/dist/scripts/diagnose-kibana-candles.js +0 -1
- package/dist/scripts/diagnose-kibana-candles.js.map +1 -1
- package/dist/scripts/test-credit-renewal.js +1 -1
- package/dist/scripts/test-credit-renewal.js.map +1 -1
- package/dist/scripts/tv.d.ts +24 -2
- package/dist/scripts/tv.d.ts.map +1 -1
- package/dist/scripts/tv.js +190 -65
- package/dist/scripts/tv.js.map +1 -1
- package/docs/BITSHARES_ONBOARDING.md +9 -2
- package/docs/COW_INVARIANTS.md +18 -1
- package/docs/DEXBOT_COMPARISON.md +3 -3
- package/docs/EVOLUTION.md +8 -7
- package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +21 -9
- package/docs/GRID_RECALCULATION.md +5 -6
- package/docs/GRID_RECONCILE.md +12 -2
- package/docs/MPA_CREDIT_USAGE.md +2 -2
- package/docs/README.md +5 -6
- package/docs/architecture.md +0 -58
- package/docs/developer_guide.md +2 -1
- package/docs/docker.md +1 -1
- package/market_adapter/README.md +4 -0
- package/modules/README.md +1 -1
- package/package.json +1 -1
- package/scripts/README.md +5 -3
- package/tests/README.md +2 -2
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* WINDOW CACHE — generic persistent bucket cache for windowed Kibana candle fetches.
|
|
4
|
+
*
|
|
5
|
+
* Problem: callers anchor their range at floored-"now", so every run shifts all
|
|
6
|
+
* windows and an exact time-range match would invalidate the whole cache.
|
|
7
|
+
* This module makes reuse range-aware instead: sibling chunk files are loaded
|
|
8
|
+
* once, buckets inside the new window are kept, and only missing buckets are
|
|
9
|
+
* queried (plus a tail refresh for late-indexed trades).
|
|
10
|
+
*
|
|
11
|
+
* Chunk files live next to `outPath`:
|
|
12
|
+
* `<base>.chunk_<ii>_<YYYY-MM-DD>_<YYYY-MM-DD><ext>`
|
|
13
|
+
* each holding `{ meta, candles }`. Callers supply:
|
|
14
|
+
* - `requestKey` — opaque identity object stored in each chunk's meta,
|
|
15
|
+
* - `isMatch(meta, requestKey)` — same-pool/feed/interval/assets check,
|
|
16
|
+
* - `fetchRange(gteIso, lteIso)` — query one (sub-)range, gap-filled grid,
|
|
17
|
+
* - `metaForWindow(window)` — meta to persist with a (re)fetched chunk.
|
|
18
|
+
*
|
|
19
|
+
* Node-only (disk I/O via storage). Browser-safe code must not import this.
|
|
20
|
+
*/
|
|
21
|
+
import { path } from '../../modules/path_api.js';
|
|
22
|
+
import { getStorage } from '../../modules/storage/index.js';
|
|
23
|
+
import { writeJsonAtomic } from '../utils/atomic_write.js';
|
|
24
|
+
import { getErrorMessage, sleepMs } from '../../modules/utils/errors.js';
|
|
25
|
+
import { mergeCandles } from '../candle_utils.js';
|
|
26
|
+
const storage = getStorage();
|
|
27
|
+
const { readJSON } = storage;
|
|
28
|
+
// Trailing overlap always re-fetched on the newest window. Kibana indexing
|
|
29
|
+
// can lag minutes–hours, so buckets cached as zero-volume fills may gain
|
|
30
|
+
// real trades after the fact. 48h bounds the extra query to a small range.
|
|
31
|
+
const TAIL_REFRESH_HOURS = 48;
|
|
32
|
+
// Windows fully in the past are immutable: blockchain history does not change
|
|
33
|
+
// and Kibana indexing lag (minutes–hours) is long past. Leading buckets with
|
|
34
|
+
// no trades stay empty forever, so re-querying them every shifted rerun is
|
|
35
|
+
// pure waste. Only the recent past is re-checked (see TAIL_REFRESH_HOURS).
|
|
36
|
+
const IMMUTABLE_WINDOW_AGE_MS = 7 * 24 * 3600 * 1000;
|
|
37
|
+
function siblingChunkFiles(outPath) {
|
|
38
|
+
const resolved = path.resolve(outPath);
|
|
39
|
+
const parsed = path.parse(resolved);
|
|
40
|
+
if (!storage.exists(parsed.dir))
|
|
41
|
+
return [];
|
|
42
|
+
const prefix = `${parsed.name}.chunk_`;
|
|
43
|
+
return storage.readdir(parsed.dir)
|
|
44
|
+
.filter((name) => name.startsWith(prefix) && name.endsWith(parsed.ext))
|
|
45
|
+
.map((name) => path.join(parsed.dir, name))
|
|
46
|
+
.sort();
|
|
47
|
+
}
|
|
48
|
+
function chunkPathFor(outPath, index, window) {
|
|
49
|
+
const parsed = path.parse(outPath);
|
|
50
|
+
const start = String(window.gte).slice(0, 10);
|
|
51
|
+
const end = String(window.lte).slice(0, 10);
|
|
52
|
+
return path.join(parsed.dir, `${parsed.name}.chunk_${String(index).padStart(2, '0')}_${start}_${end}${parsed.ext}`);
|
|
53
|
+
}
|
|
54
|
+
function readCacheChunk(chunkFile, requestKey, isMatch) {
|
|
55
|
+
// Same-identity check WITHOUT the timeRange match — any chunk for this
|
|
56
|
+
// request can contribute buckets.
|
|
57
|
+
try {
|
|
58
|
+
const parsed = readJSON(chunkFile);
|
|
59
|
+
const meta = parsed?.meta || {};
|
|
60
|
+
if (!isMatch(meta, requestKey))
|
|
61
|
+
return null;
|
|
62
|
+
if (!Array.isArray(parsed.candles))
|
|
63
|
+
return null;
|
|
64
|
+
const rangeGte = Date.parse(String(meta.timeRange?.gte || ''));
|
|
65
|
+
const rangeLte = Date.parse(String(meta.timeRange?.lte || ''));
|
|
66
|
+
const gte = Number.isFinite(rangeGte) ? rangeGte : null;
|
|
67
|
+
const lte = Number.isFinite(rangeLte) ? rangeLte : null;
|
|
68
|
+
// Ranges actually queried to produce these candles. Pre-fix files
|
|
69
|
+
// predate sub-range fetches (full-window only), so their timeRange
|
|
70
|
+
// claim is exact and serves as the fallback.
|
|
71
|
+
const queried = Array.isArray(meta.queriedRanges)
|
|
72
|
+
? meta.queriedRanges
|
|
73
|
+
.filter((q) => Number.isFinite(Number(q?.gte)) && Number.isFinite(Number(q?.lte)))
|
|
74
|
+
.map((q) => ({ gte: Number(q.gte), lte: Number(q.lte) }))
|
|
75
|
+
: (gte !== null && lte !== null ? [{ gte, lte }] : []);
|
|
76
|
+
return {
|
|
77
|
+
candles: parsed.candles,
|
|
78
|
+
fetchedAt: meta.fetchedAt || null,
|
|
79
|
+
file: chunkFile,
|
|
80
|
+
rangeGte: gte,
|
|
81
|
+
rangeLte: lte,
|
|
82
|
+
queried,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (_) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Previously-proven coverage surviving a same-filename overwrite, clipped
|
|
90
|
+
// to the window being persisted. Sound: any in-window range the old file
|
|
91
|
+
// vouched for was really queried, and had it held trades those candles
|
|
92
|
+
// would be in that same file (hence carried forward as reusable, never
|
|
93
|
+
// missing). Out-of-window parts are dropped by the clip, so nothing is
|
|
94
|
+
// vouched for beyond what the rewritten file can testify to.
|
|
95
|
+
function priorQueriedInWindow(chunkFile, requestKey, isMatch, gteMs, lteMs) {
|
|
96
|
+
const chunk = readCacheChunk(chunkFile, requestKey, isMatch);
|
|
97
|
+
if (!chunk)
|
|
98
|
+
return [];
|
|
99
|
+
return chunk.queried
|
|
100
|
+
.filter((q) => q.lte > gteMs && q.gte < lteMs)
|
|
101
|
+
.map((q) => ({ gte: Math.max(q.gte, gteMs), lte: Math.min(q.lte, lteMs) }));
|
|
102
|
+
}
|
|
103
|
+
function loadBucketCache(outPath, requestKey, isMatch) {
|
|
104
|
+
const byTs = new Map();
|
|
105
|
+
const fileCover = [];
|
|
106
|
+
let files = 0;
|
|
107
|
+
for (const file of siblingChunkFiles(outPath)) {
|
|
108
|
+
const chunk = readCacheChunk(file, requestKey, isMatch);
|
|
109
|
+
if (!chunk)
|
|
110
|
+
continue;
|
|
111
|
+
files += 1;
|
|
112
|
+
fileCover.push({ gte: chunk.rangeGte, lte: chunk.rangeLte, count: chunk.candles.length, queried: chunk.queried });
|
|
113
|
+
for (const c of chunk.candles) {
|
|
114
|
+
if (!Array.isArray(c))
|
|
115
|
+
continue;
|
|
116
|
+
const ts = Number(c[0]);
|
|
117
|
+
if (!Number.isFinite(ts))
|
|
118
|
+
continue;
|
|
119
|
+
const prev = byTs.get(ts);
|
|
120
|
+
if (!prev || Number(c[5] || 0) > Number(prev[5] || 0))
|
|
121
|
+
byTs.set(ts, c);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return { byTs, files, fileCover };
|
|
125
|
+
}
|
|
126
|
+
function cachedCandlesInRange(localCache, gteMs, lteMs) {
|
|
127
|
+
const out = [];
|
|
128
|
+
for (const [ts, c] of localCache.byTs) {
|
|
129
|
+
if (ts >= gteMs && ts <= lteMs)
|
|
130
|
+
out.push(c);
|
|
131
|
+
}
|
|
132
|
+
out.sort((a, b) => a[0] - b[0]);
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
function addUtcMonths(date, months) {
|
|
136
|
+
const result = new Date(date.getTime());
|
|
137
|
+
const day = result.getUTCDate();
|
|
138
|
+
result.setUTCDate(1);
|
|
139
|
+
result.setUTCMonth(result.getUTCMonth() + months);
|
|
140
|
+
const lastDay = new Date(Date.UTC(result.getUTCFullYear(), result.getUTCMonth() + 1, 0)).getUTCDate();
|
|
141
|
+
result.setUTCDate(Math.min(day, lastDay));
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
function normalizeDateInput(raw, label) {
|
|
145
|
+
const ms = Date.parse(String(raw || ''));
|
|
146
|
+
if (!Number.isFinite(ms)) {
|
|
147
|
+
throw new Error(`Invalid ${label} date: ${raw}`);
|
|
148
|
+
}
|
|
149
|
+
return new Date(ms);
|
|
150
|
+
}
|
|
151
|
+
function buildFetchWindowsFromRange(timeRange, chunkMonths) {
|
|
152
|
+
const start = normalizeDateInput(timeRange.gte, 'start');
|
|
153
|
+
const end = normalizeDateInput(timeRange.lte, 'end');
|
|
154
|
+
if (start >= end) {
|
|
155
|
+
throw new Error(`Invalid fetch range: ${start.toISOString()} must be earlier than ${end.toISOString()}`);
|
|
156
|
+
}
|
|
157
|
+
const windows = [];
|
|
158
|
+
let cursor = start;
|
|
159
|
+
while (cursor < end) {
|
|
160
|
+
const next = addUtcMonths(cursor, chunkMonths);
|
|
161
|
+
const windowEnd = next < end ? next : end;
|
|
162
|
+
windows.push({
|
|
163
|
+
gte: cursor.toISOString(),
|
|
164
|
+
lte: windowEnd.toISOString(),
|
|
165
|
+
});
|
|
166
|
+
cursor = windowEnd;
|
|
167
|
+
}
|
|
168
|
+
return windows;
|
|
169
|
+
}
|
|
170
|
+
function findMissingBucketRanges(gteMs, lteMs, bucketMs, haveTs) {
|
|
171
|
+
const first = Math.floor(gteMs / bucketMs) * bucketMs;
|
|
172
|
+
const last = Math.floor(lteMs / bucketMs) * bucketMs;
|
|
173
|
+
const missing = [];
|
|
174
|
+
let runStart = null;
|
|
175
|
+
for (let ts = first; ts <= last; ts += bucketMs) {
|
|
176
|
+
if (haveTs.has(ts)) {
|
|
177
|
+
if (runStart !== null) {
|
|
178
|
+
missing.push({ gte: runStart, lte: ts - bucketMs, hours: Math.round((ts - runStart) / bucketMs) });
|
|
179
|
+
runStart = null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if (runStart === null) {
|
|
183
|
+
runStart = ts;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (runStart !== null) {
|
|
187
|
+
missing.push({ gte: runStart, lte: last, hours: Math.round((last - runStart) / bucketMs) + 1 });
|
|
188
|
+
}
|
|
189
|
+
return missing;
|
|
190
|
+
}
|
|
191
|
+
function pruneImmutableGaps(missing, lteMs, fileCover, nowMs = Date.now()) {
|
|
192
|
+
const windowOld = lteMs < nowMs - IMMUTABLE_WINDOW_AGE_MS;
|
|
193
|
+
return missing.filter((m) => {
|
|
194
|
+
// Absence of local buckets is NEVER proof of emptiness: stray
|
|
195
|
+
// buckets from a sibling window's file (e.g. boundary over-fetch)
|
|
196
|
+
// must not vouch for anything. Only queriedRanges count, and only
|
|
197
|
+
// for old windows — recent files may predate late-indexed trades.
|
|
198
|
+
// (A former "leading no-trade gap" heuristic pruned everything
|
|
199
|
+
// before the first local bucket; it once certified a whole month
|
|
200
|
+
// as empty from 5 stray boundary buckets of the next window.)
|
|
201
|
+
// Ranges an existing chunk file actually queried (only trusted for
|
|
202
|
+
// old windows — recent files may predate late-indexed trades).
|
|
203
|
+
// Coverage comes from meta.queriedRanges, not the file's overall
|
|
204
|
+
// timeRange: a chunk rewritten from reused buckets plus sub-range
|
|
205
|
+
// fetches only proves its fetched sub-ranges empty, never the
|
|
206
|
+
// ranges it merely copied forward.
|
|
207
|
+
if (windowOld) {
|
|
208
|
+
for (const f of fileCover) {
|
|
209
|
+
for (const q of f.queried || []) {
|
|
210
|
+
if (q.gte <= m.gte && q.lte >= m.lte)
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return true;
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
function persistCacheChunk(chunkFile, meta, candles) {
|
|
219
|
+
const payload = {
|
|
220
|
+
meta: {
|
|
221
|
+
...meta,
|
|
222
|
+
candleCount: candles.length,
|
|
223
|
+
firstTs: candles.length > 0 ? new Date(candles[0][0]).toISOString() : null,
|
|
224
|
+
lastTs: candles.length > 0 ? new Date(candles[candles.length - 1][0]).toISOString() : null,
|
|
225
|
+
},
|
|
226
|
+
candles,
|
|
227
|
+
};
|
|
228
|
+
writeJsonAtomic(chunkFile, payload);
|
|
229
|
+
}
|
|
230
|
+
// Stale chunk files accumulate when shifted windows change date-based file
|
|
231
|
+
// names (an hour shift crossing midnight orphans the old name). Only files
|
|
232
|
+
// whose embedded meta matches this request are eligible, and only once the
|
|
233
|
+
// caller has completed all windows — a failed run never deletes.
|
|
234
|
+
function cleanupOrphanCacheChunks(outPath, requestKey, isMatch, activeFiles) {
|
|
235
|
+
const removed = [];
|
|
236
|
+
try {
|
|
237
|
+
for (const file of siblingChunkFiles(outPath)) {
|
|
238
|
+
if (activeFiles.has(path.resolve(file)))
|
|
239
|
+
continue;
|
|
240
|
+
if (!readCacheChunk(file, requestKey, isMatch))
|
|
241
|
+
continue;
|
|
242
|
+
try {
|
|
243
|
+
storage.unlink(file);
|
|
244
|
+
removed.push(file);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
console.warn(` Could not remove orphan chunk ${path.relative(process.cwd(), file)}: ${getErrorMessage(err)}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
console.warn(` Orphan chunk cleanup skipped: ${getErrorMessage(err)}`);
|
|
253
|
+
return [];
|
|
254
|
+
}
|
|
255
|
+
return removed;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Reuse plan for one window: buckets already on disk + the ranges that still
|
|
259
|
+
* need querying. When `allowSubFetch` is false (data with cross-range state
|
|
260
|
+
* such as forward-filled crosses), the tail widening is skipped and the
|
|
261
|
+
* caller must take full-window fetches — reuse (zero queries) still applies.
|
|
262
|
+
*/
|
|
263
|
+
function planWindowReuse(localCache, opts) {
|
|
264
|
+
const { gteMs, lteMs, bucketMs, isTail } = opts;
|
|
265
|
+
const allowSubFetch = opts.allowSubFetch !== false;
|
|
266
|
+
const nowMs = opts.nowMs != null ? opts.nowMs : Date.now();
|
|
267
|
+
const valid = Number.isFinite(gteMs) && Number.isFinite(lteMs) && Number.isFinite(bucketMs) && bucketMs > 0;
|
|
268
|
+
const reusable = valid
|
|
269
|
+
? cachedCandlesInRange(localCache, gteMs, lteMs)
|
|
270
|
+
: [];
|
|
271
|
+
let missing = valid
|
|
272
|
+
? findMissingBucketRanges(gteMs, lteMs, bucketMs, new Set(reusable.map((c) => Number(c[0]))))
|
|
273
|
+
: [];
|
|
274
|
+
// Immutable history (pruned again after the tail widening below, which
|
|
275
|
+
// reintroduces the leading gap via its refresh set).
|
|
276
|
+
const prune = () => {
|
|
277
|
+
missing = pruneImmutableGaps(missing, lteMs, localCache.fileCover, nowMs);
|
|
278
|
+
};
|
|
279
|
+
prune();
|
|
280
|
+
// Late-indexing guard: the newest window always re-fetches its
|
|
281
|
+
// trailing overlap so zero-volume fills can gain real trades.
|
|
282
|
+
if (allowSubFetch && isTail && reusable.length > 0) {
|
|
283
|
+
const refreshFromMs = lteMs - TAIL_REFRESH_HOURS * 3600 * 1000;
|
|
284
|
+
if (refreshFromMs > gteMs) {
|
|
285
|
+
const refreshSet = new Set(reusable.filter((c) => Number(c[0]) < refreshFromMs).map((c) => Number(c[0])));
|
|
286
|
+
const refreshed = findMissingBucketRanges(gteMs, lteMs, bucketMs, refreshSet);
|
|
287
|
+
// Only widen, never narrow: keep previously-missing buckets.
|
|
288
|
+
const seen = new Set(missing.map((m) => `${m.gte}-${m.lte}`));
|
|
289
|
+
for (const m of refreshed) {
|
|
290
|
+
if (!seen.has(`${m.gte}-${m.lte}`))
|
|
291
|
+
missing.push(m);
|
|
292
|
+
}
|
|
293
|
+
missing.sort((a, b) => a.gte - b.gte);
|
|
294
|
+
prune();
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const missingHours = missing.reduce((sum, m) => sum + m.hours, 0);
|
|
298
|
+
const windowHours = valid ? Math.max(1, Math.round((lteMs - gteMs) / bucketMs)) : 1;
|
|
299
|
+
return { reusable, missing, missingHours, windowHours, inputsValid: valid };
|
|
300
|
+
}
|
|
301
|
+
// ─── Shared progress output ───────────────────────────────────────────────────
|
|
302
|
+
// Both fetch modes (pool chunks, feed windows) print the same per-window
|
|
303
|
+
// lines so the output is comparable: one line per cached/reused window and
|
|
304
|
+
// one line per executed range query.
|
|
305
|
+
function formatWindowLine(unit, index, total, gte, lte, detail = '') {
|
|
306
|
+
return ` ${unit} ${index}/${total}: ${gte} → ${lte}${detail ? ` ${detail}` : ''}`;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Per-range fetch budget shared by every cached candle fetcher (pool, book,
|
|
310
|
+
* feed). Retries a failing range up to `attempts` times with linear backoff
|
|
311
|
+
* and an optional per-attempt timeout (aborted via signal passed as the 4th
|
|
312
|
+
* fetchRange argument — fetchers that ignore it simply get no abort).
|
|
313
|
+
* Defaults (attempts 1, no timeout) preserve the old single-shot behavior.
|
|
314
|
+
*/
|
|
315
|
+
async function fetchRangeWithRetry(fetchRange, opts) {
|
|
316
|
+
const attempts = Number.isFinite(Number(opts.attempts)) && Number(opts.attempts) >= 1 ? Math.floor(Number(opts.attempts)) : 1;
|
|
317
|
+
const backoffBaseMs = Number.isFinite(Number(opts.backoffBaseMs)) && Number(opts.backoffBaseMs) >= 0 ? Number(opts.backoffBaseMs) : 0;
|
|
318
|
+
const timeoutMs = Number.isFinite(Number(opts.timeoutMs)) && Number(opts.timeoutMs) > 0 ? Number(opts.timeoutMs) : 0;
|
|
319
|
+
let lastErr = null;
|
|
320
|
+
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
321
|
+
let signal;
|
|
322
|
+
let timer = null;
|
|
323
|
+
let timedOut = false;
|
|
324
|
+
const timeoutMessage = `${opts.label} timed out after ${Math.round(timeoutMs / 1000)}s`;
|
|
325
|
+
if (timeoutMs > 0) {
|
|
326
|
+
const controller = new AbortController();
|
|
327
|
+
signal = controller.signal;
|
|
328
|
+
timer = setTimeout(() => {
|
|
329
|
+
timedOut = true;
|
|
330
|
+
controller.abort(new Error(timeoutMessage));
|
|
331
|
+
}, timeoutMs);
|
|
332
|
+
}
|
|
333
|
+
try {
|
|
334
|
+
const candles = await fetchRange(opts.gte, opts.lte, opts.window, signal);
|
|
335
|
+
return { candles, attempts: attempt };
|
|
336
|
+
}
|
|
337
|
+
catch (err) {
|
|
338
|
+
lastErr = timedOut && (err?.name === 'AbortError' || err?.message === timeoutMessage)
|
|
339
|
+
? new Error(timeoutMessage)
|
|
340
|
+
: err;
|
|
341
|
+
if (attempt < attempts) {
|
|
342
|
+
const backoffMs = backoffBaseMs * attempt;
|
|
343
|
+
try {
|
|
344
|
+
opts.onRetry?.({ attempt, attempts, backoffMs, error: lastErr, gte: opts.gte, lte: opts.lte });
|
|
345
|
+
}
|
|
346
|
+
catch (_) { /* logging must never fail the fetch */ }
|
|
347
|
+
if (backoffMs > 0)
|
|
348
|
+
await sleepMs(backoffMs);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
finally {
|
|
352
|
+
if (timer)
|
|
353
|
+
clearTimeout(timer);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
throw lastErr;
|
|
357
|
+
}
|
|
358
|
+
async function fetchRangeLogged(fetchRange, opts) {
|
|
359
|
+
const startMs = Date.now();
|
|
360
|
+
const label = `${opts.unit} ${opts.index}/${opts.total}`;
|
|
361
|
+
const { candles: raw, attempts } = await fetchRangeWithRetry(fetchRange, {
|
|
362
|
+
gte: opts.gte,
|
|
363
|
+
lte: opts.lte,
|
|
364
|
+
window: opts.window,
|
|
365
|
+
label,
|
|
366
|
+
attempts: opts.retry?.attempts,
|
|
367
|
+
backoffBaseMs: opts.retry?.backoffBaseMs,
|
|
368
|
+
timeoutMs: opts.retry?.timeoutMs,
|
|
369
|
+
onRetry: opts.retry?.onRetry,
|
|
370
|
+
});
|
|
371
|
+
// A fetcher may return { candles, complete: false } for a partial result
|
|
372
|
+
// (e.g. one swap direction failed). Partial candles are still merged
|
|
373
|
+
// into this run's output, but the caller must not persist them as full
|
|
374
|
+
// coverage — otherwise the missing side would never be re-queried.
|
|
375
|
+
const complete = !Array.isArray(raw) && raw?.complete === false ? false : true;
|
|
376
|
+
const candles = Array.isArray(raw) ? raw : (raw?.candles ?? []);
|
|
377
|
+
const attemptNote = attempts > 1 ? ` (attempt ${attempts})` : '';
|
|
378
|
+
const partialNote = complete ? '' : ' (partial — not cached)';
|
|
379
|
+
const note = opts.note ? `${opts.note}` : '';
|
|
380
|
+
console.log(formatWindowLine(opts.unit, opts.index, opts.total, opts.gte, opts.lte, `-> ${candles.length} candles (${((Date.now() - startMs) / 1000).toFixed(1)}s)${attemptNote}${partialNote}${note}`));
|
|
381
|
+
return { candles, complete };
|
|
382
|
+
}
|
|
383
|
+
function higherVolumeWins(existing, incoming) {
|
|
384
|
+
return incoming[5] > existing[5] ? incoming : existing;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Run windows with bucket-level reuse. `windows` entries are
|
|
388
|
+
* `{ index, gte, lte, file }` (1-based index). Returns merged candles.
|
|
389
|
+
*
|
|
390
|
+
* Fetch policy per window: exact reuse when nothing is missing, sub-range
|
|
391
|
+
* queries merged over local when gaps are small (and `allowSubFetch`), else
|
|
392
|
+
* one full-window fetch merged over local. Fresh data wins collisions by
|
|
393
|
+
* volume/count, output is clamped to the window and sorted. A window whose
|
|
394
|
+
* fetch reports partial (`{ candles, complete: false }`) is merged into
|
|
395
|
+
* this run's output but NOT persisted, so the missing side is re-queried
|
|
396
|
+
* on the next run instead of being baked in as gap-filled zeros.
|
|
397
|
+
*/
|
|
398
|
+
async function runCachedWindows(opts) {
|
|
399
|
+
const { windows, outPath, requestKey, isMatch, metaForWindow, fetchRange, bucketMs } = opts;
|
|
400
|
+
const allowSubFetch = opts.allowSubFetch !== false;
|
|
401
|
+
const nowMs = opts.nowMs != null ? opts.nowMs : Date.now();
|
|
402
|
+
const total = windows.length;
|
|
403
|
+
const retry = {
|
|
404
|
+
attempts: opts.fetchAttempts,
|
|
405
|
+
backoffBaseMs: opts.fetchBackoffBaseMs,
|
|
406
|
+
timeoutMs: opts.fetchTimeoutMs,
|
|
407
|
+
onRetry: opts.onFetchRetry,
|
|
408
|
+
};
|
|
409
|
+
const localCache = loadBucketCache(outPath, requestKey, isMatch);
|
|
410
|
+
if (localCache.files > 0) {
|
|
411
|
+
console.log(` Local cache: ${localCache.files} chunk files, ${localCache.byTs.size} buckets — fetching only what is missing`);
|
|
412
|
+
}
|
|
413
|
+
let merged = [];
|
|
414
|
+
for (const windowEntry of windows) {
|
|
415
|
+
const tag = formatWindowLine('Chunk', windowEntry.index, total, windowEntry.gte, windowEntry.lte);
|
|
416
|
+
const gteMs = Date.parse(String(windowEntry.gte));
|
|
417
|
+
const lteMs = Date.parse(String(windowEntry.lte));
|
|
418
|
+
// Exact-match fast path: chunk file already holds this exact range.
|
|
419
|
+
const exact = readCacheChunk(windowEntry.file, requestKey, isMatch);
|
|
420
|
+
if (exact && exact.rangeGte === gteMs && exact.rangeLte === lteMs) {
|
|
421
|
+
console.log(`${tag} (cached ${exact.candles.length} candles)`);
|
|
422
|
+
merged = merged.length === 0
|
|
423
|
+
? exact.candles
|
|
424
|
+
: mergeCandles(merged, exact.candles, { onCollision: higherVolumeWins });
|
|
425
|
+
continue;
|
|
426
|
+
}
|
|
427
|
+
const plan = planWindowReuse(localCache, {
|
|
428
|
+
gteMs, lteMs, bucketMs,
|
|
429
|
+
isTail: windowEntry.index === total,
|
|
430
|
+
allowSubFetch, nowMs,
|
|
431
|
+
});
|
|
432
|
+
const { reusable, missing, missingHours, windowHours, inputsValid } = plan;
|
|
433
|
+
const reusableNote = reusable.length > 0 ? `, ${reusable.length} buckets local` : '';
|
|
434
|
+
if (inputsValid && missing.length === 0 && (reusable.length > 0 || localCache.files > 0)) {
|
|
435
|
+
console.log(`${tag} (reused ${reusable.length} local buckets, nothing missing)`);
|
|
436
|
+
persistCacheChunk(windowEntry.file, { ...metaForWindow(windowEntry), fetchedAt: new Date().toISOString(), queriedRanges: priorQueriedInWindow(windowEntry.file, requestKey, isMatch, gteMs, lteMs) }, reusable);
|
|
437
|
+
merged = merged.length === 0
|
|
438
|
+
? reusable
|
|
439
|
+
: mergeCandles(merged, reusable, { onCollision: higherVolumeWins });
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
let candles;
|
|
443
|
+
let queriedRanges;
|
|
444
|
+
// A partial sub-range makes the whole window partial: gap-filled
|
|
445
|
+
// buckets from the surviving side would otherwise claim coverage
|
|
446
|
+
// the failed side never earned, baking the skew into the cache.
|
|
447
|
+
let windowComplete = true;
|
|
448
|
+
if (allowSubFetch && reusable.length > 0 && missing.length > 0 && missingHours <= windowHours / 2 && missing.length <= 3) {
|
|
449
|
+
// Small gaps: query only the missing sub-ranges, merge over local.
|
|
450
|
+
console.log(`${tag} (local cover${reusableNote}; fetching ${missingHours}h in ${missing.length} sub-range(s))`);
|
|
451
|
+
let mergedLocal = reusable.slice();
|
|
452
|
+
for (const m of missing) {
|
|
453
|
+
// Extend lte past the final bucket start: the ES range is
|
|
454
|
+
// inclusive and m.lte is a bucket *start*, so without this
|
|
455
|
+
// the bucket's real trades are cut off and the gap-filler
|
|
456
|
+
// freezes it as a zero-volume candle. Over-fetch is safe —
|
|
457
|
+
// merged output is clamped to the window below.
|
|
458
|
+
const part = await fetchRangeLogged(fetchRange, { unit: 'Chunk', index: windowEntry.index, total, gte: new Date(m.gte).toISOString(), lte: new Date(m.lte + bucketMs).toISOString(), window: windowEntry, retry });
|
|
459
|
+
if (!part.complete)
|
|
460
|
+
windowComplete = false;
|
|
461
|
+
mergedLocal = mergeCandles(mergedLocal, part.candles, { onCollision: higherVolumeWins });
|
|
462
|
+
}
|
|
463
|
+
// Clamp to the window (drops the one-bucket over-fetch above).
|
|
464
|
+
candles = mergedLocal.filter((c) => Number(c[0]) >= gteMs && Number(c[0]) <= lteMs);
|
|
465
|
+
// Claimed coverage is the canonical missing ranges (a conservative
|
|
466
|
+
// subset of what was actually queried with the +1-bucket overlap),
|
|
467
|
+
// plus previously-proven in-window coverage surviving the rewrite.
|
|
468
|
+
queriedRanges = missing.map((m) => ({ gte: m.gte, lte: m.lte }))
|
|
469
|
+
.concat(priorQueriedInWindow(windowEntry.file, requestKey, isMatch, gteMs, lteMs));
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
if (reusable.length > 0) {
|
|
473
|
+
console.log(`${tag} (local cover${reusableNote}; gap too large — full window fetch)`);
|
|
474
|
+
}
|
|
475
|
+
const fresh = await fetchRangeLogged(fetchRange, { unit: 'Chunk', index: windowEntry.index, total, gte: windowEntry.gte, lte: windowEntry.lte, window: windowEntry, retry });
|
|
476
|
+
if (!fresh.complete)
|
|
477
|
+
windowComplete = false;
|
|
478
|
+
candles = reusable.length > 0
|
|
479
|
+
? mergeCandles(reusable, fresh.candles, { onCollision: higherVolumeWins }).filter((c) => Number(c[0]) >= gteMs && Number(c[0]) <= lteMs).sort((a, b) => a[0] - b[0])
|
|
480
|
+
: fresh.candles;
|
|
481
|
+
queriedRanges = [{ gte: gteMs, lte: lteMs }];
|
|
482
|
+
}
|
|
483
|
+
if (windowComplete) {
|
|
484
|
+
persistCacheChunk(windowEntry.file, { ...metaForWindow(windowEntry), fetchedAt: new Date().toISOString(), queriedRanges }, candles);
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
console.log(`${tag} (partial — kept for this run, not cached; will re-query next run)`);
|
|
488
|
+
}
|
|
489
|
+
merged = merged.length === 0
|
|
490
|
+
? candles
|
|
491
|
+
: mergeCandles(merged, candles, { onCollision: higherVolumeWins });
|
|
492
|
+
}
|
|
493
|
+
const removed = cleanupOrphanCacheChunks(outPath, requestKey, isMatch, new Set(windows.map((w) => path.resolve(w.file))));
|
|
494
|
+
if (removed.length > 0) {
|
|
495
|
+
console.log(` Cleaned ${removed.length} orphan chunk file(s): ${removed.map((f) => path.basename(f)).join(', ')}`);
|
|
496
|
+
}
|
|
497
|
+
return merged;
|
|
498
|
+
}
|
|
499
|
+
export { TAIL_REFRESH_HOURS, IMMUTABLE_WINDOW_AGE_MS, siblingChunkFiles, chunkPathFor, readCacheChunk, priorQueriedInWindow, loadBucketCache, cachedCandlesInRange, addUtcMonths, normalizeDateInput, buildFetchWindowsFromRange, findMissingBucketRanges, pruneImmutableGaps, persistCacheChunk, cleanupOrphanCacheChunks, planWindowReuse, formatWindowLine, fetchRangeLogged, fetchRangeWithRetry, runCachedWindows, };
|
|
500
|
+
//# sourceMappingURL=window_cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window_cache.js","sourceRoot":"","sources":["../../../market_adapter/inputs/window_cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
declare function toIntervalLabel(intervalSeconds: any): string;
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Filename-safe slug: lowercase, non-alphanumerics collapsed to a single
|
|
4
|
+
* underscore, no leading/trailing underscores. Single home for the helper
|
|
5
|
+
* previously copied into fetch_lp_data.ts, kibana_feed_source.ts,
|
|
6
|
+
* fetch_book_data.ts and scripts/tv.ts.
|
|
7
|
+
*/
|
|
8
|
+
declare function slugPart(value: any): string;
|
|
9
|
+
export { toIntervalLabel, slugPart };
|
|
3
10
|
//# sourceMappingURL=interval_utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interval_utils.d.ts","sourceRoot":"","sources":["../../market_adapter/interval_utils.ts"],"names":[],"mappings":"AAEA,iBAAS,eAAe,CAAC,eAAe,EAAE,GAAG,UAK5C;AAED,OAAO,EAAE,eAAe,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"interval_utils.d.ts","sourceRoot":"","sources":["../../market_adapter/interval_utils.ts"],"names":[],"mappings":"AAEA,iBAAS,eAAe,CAAC,eAAe,EAAE,GAAG,UAK5C;AAED;;;;;GAKG;AACH,iBAAS,QAAQ,CAAC,KAAK,EAAE,GAAG,UAM3B;AAED,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAA"}
|
|
@@ -8,5 +8,18 @@ function toIntervalLabel(intervalSeconds) {
|
|
|
8
8
|
return `${intervalSeconds / 60}m`;
|
|
9
9
|
return `${intervalSeconds}s`;
|
|
10
10
|
}
|
|
11
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Filename-safe slug: lowercase, non-alphanumerics collapsed to a single
|
|
13
|
+
* underscore, no leading/trailing underscores. Single home for the helper
|
|
14
|
+
* previously copied into fetch_lp_data.ts, kibana_feed_source.ts,
|
|
15
|
+
* fetch_book_data.ts and scripts/tv.ts.
|
|
16
|
+
*/
|
|
17
|
+
function slugPart(value) {
|
|
18
|
+
return String(value || '')
|
|
19
|
+
.trim()
|
|
20
|
+
.toLowerCase()
|
|
21
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
22
|
+
.replace(/^_+|_+$/g, '') || 'unknown';
|
|
23
|
+
}
|
|
24
|
+
export { toIntervalLabel, slugPart };
|
|
12
25
|
//# sourceMappingURL=interval_utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interval_utils.js","sourceRoot":"","sources":["../../market_adapter/interval_utils.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,SAAS,eAAe,CAAC,eAAoB;IACzC,IAAI,eAAe,GAAG,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,CAAC;IACxE,IAAI,eAAe,GAAG,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,IAAI,GAAG,CAAC;IACtE,IAAI,eAAe,GAAG,EAAE,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,EAAE,GAAG,CAAC;IAClE,OAAO,GAAG,eAAe,GAAG,CAAC;AACjC,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"interval_utils.js","sourceRoot":"","sources":["../../market_adapter/interval_utils.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,SAAS,eAAe,CAAC,eAAoB;IACzC,IAAI,eAAe,GAAG,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,CAAC;IACxE,IAAI,eAAe,GAAG,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,IAAI,GAAG,CAAC;IACtE,IAAI,eAAe,GAAG,EAAE,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,EAAE,GAAG,CAAC;IAClE,OAAO,GAAG,eAAe,GAAG,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,KAAU;IACxB,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACrB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;AAC9C,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAA"}
|
|
@@ -62,6 +62,7 @@
|
|
|
62
62
|
* "weightDistribution": { "sell": 1, "buy": 1 },
|
|
63
63
|
* "botFunds": { "sell": "100%", "buy": "100%" },
|
|
64
64
|
* "activeOrders": { "sell": 20, "buy": 20 },
|
|
65
|
+
* "reserveOrders": { "buy": 0, "sell": 0 }, // Edge reserves: extra live orders (buy: floor, sell: ceiling)
|
|
65
66
|
* "debtPolicy": "ignore", // Debt policy: "ignore", "warn", or "block"
|
|
66
67
|
* "min_BTS_value": 0, // Minimum BTS value threshold for operations
|
|
67
68
|
* }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account_bots.d.ts","sourceRoot":"","sources":["../../modules/account_bots.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"account_bots.d.ts","sourceRoot":"","sources":["../../modules/account_bots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AAUH,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AA4gBhE;;;;;GAKG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAetE;AAED;;;;;GAKG;AACH,iBAAS,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIvD;AAmWD;;;;;GAKG;AACH,iBAAS,iBAAiB,CAAC,IAAI,KAAK,OAoBnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,iBAAe,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,SAAQ,EAAE,KAAK,UAAQ,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA8D5I;AAqUD;;;GAGG;AACH,iBAAe,IAAI,kBAwGlB;AAED,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAA"}
|